| Line | Source | Count | 
|---|
| 1 |  | - | 
| 2 |  | - | 
| 3 |  | - | 
| 4 |  | - | 
| 5 |  | - | 
| 6 |  | - | 
| 7 |  | - | 
| 8 |  | - | 
| 9 |  | - | 
| 10 |  | - | 
| 11 |  | - | 
| 12 |  | - | 
| 13 |  | - | 
| 14 |  | - | 
| 15 |  | - | 
| 16 |  | - | 
| 17 |  | - | 
| 18 |  | - | 
| 19 |  | - | 
| 20 | #ifdef _LIBC | - | 
| 21 | # include <obstack.h> | - | 
| 22 | #else | - | 
| 23 | # include <config.h> | - | 
| 24 | # include "obstack.h" | - | 
| 25 | #endif | - | 
| 26 |  | - | 
| 27 |  | - | 
| 28 |  | - | 
| 29 |  | - | 
| 30 |  | - | 
| 31 |  | - | 
| 32 |  | - | 
| 33 |  | - | 
| 34 |  | - | 
| 35 |  | - | 
| 36 |  | - | 
| 37 |  | - | 
| 38 |  | - | 
| 39 | #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 | - | 
| 40 | # include <gnu-versions.h> | - | 
| 41 | # if (_GNU_OBSTACK_INTERFACE_VERSION == _OBSTACK_INTERFACE_VERSION	      \ | - | 
| 42 | || (_GNU_OBSTACK_INTERFACE_VERSION == 1				      \ | - | 
| 43 | && _OBSTACK_INTERFACE_VERSION == 2				      \ | - | 
| 44 | && defined SIZEOF_INT && defined SIZEOF_SIZE_T		      \ | - | 
| 45 | && SIZEOF_INT == SIZEOF_SIZE_T)) | - | 
| 46 | #  define _OBSTACK_ELIDE_CODE | - | 
| 47 | # endif | - | 
| 48 | #endif | - | 
| 49 |  | - | 
| 50 | #ifndef _OBSTACK_ELIDE_CODE | - | 
| 51 |  | - | 
| 52 |  | - | 
| 53 |  | - | 
| 54 | # if !defined __GNUC__ && !defined __alignof__ | - | 
| 55 | #  include <alignof.h> | - | 
| 56 | #  define __alignof__(type) alignof_type (type) | - | 
| 57 | # endif | - | 
| 58 | # include <stdlib.h> | - | 
| 59 | # include <stdint.h> | - | 
| 60 |  | - | 
| 61 | # ifndef MAX | - | 
| 62 | #  define MAX(a,b) ((a) > (b) ? (a) : (b)) | - | 
| 63 | # endif | - | 
| 64 |  | - | 
| 65 |  | - | 
| 66 |  | - | 
| 67 |  | - | 
| 68 |  | - | 
| 69 |  | - | 
| 70 |  | - | 
| 71 |  | - | 
| 72 | #define DEFAULT_ALIGNMENT MAX (__alignof__ (long double),		      \ | - | 
| 73 | MAX (__alignof__ (uintmax_t),		      \ | - | 
| 74 | __alignof__ (void *))) | - | 
| 75 | #define DEFAULT_ROUNDING MAX (sizeof (long double),			      \ | - | 
| 76 | MAX (sizeof (uintmax_t),			      \ | - | 
| 77 | sizeof (void *))) | - | 
| 78 |  | - | 
| 79 |  | - | 
| 80 |  | - | 
| 81 |  | - | 
| 82 |  | - | 
| 83 | static void * | - | 
| 84 | call_chunkfun (struct obstack *h, size_t size) | - | 
| 85 | { | - | 
| 86 | if (h->use_extra_arg) | TRUE | never evaluated |  | FALSE | evaluated 79 times by 4 tests | 
 | 0-79 | 
| 87 | return h->chunkfun.extra (h->extra_arg, size); never executed: return h->chunkfun.extra (h->extra_arg, size); | 0 | 
| 88 | else | - | 
| 89 | return h->chunkfun.plain (size); executed 79 times by 4 tests:  return h->chunkfun.plain (size); | 79 | 
| 90 | } | - | 
| 91 |  | - | 
| 92 | static void | - | 
| 93 | call_freefun (struct obstack *h, void *old_chunk) | - | 
| 94 | { | - | 
| 95 | if (h->use_extra_arg) | TRUE | never evaluated |  | FALSE | evaluated 33 times by 1 test | 
 | 0-33 | 
| 96 | h->freefun.extra (h->extra_arg, old_chunk); never executed: h->freefun.extra (h->extra_arg, old_chunk); | 0 | 
| 97 | else | - | 
| 98 | h->freefun.plain (old_chunk); executed 33 times by 1 test:  h->freefun.plain (old_chunk); | 33 | 
| 99 | } | - | 
| 100 |  | - | 
| 101 |  | - | 
| 102 |  | - | 
| 103 |  | - | 
| 104 |  | - | 
| 105 |  | - | 
| 106 |  | - | 
| 107 |  | - | 
| 108 | static int | - | 
| 109 | _obstack_begin_worker (struct obstack *h, | - | 
| 110 | _OBSTACK_SIZE_T size, _OBSTACK_SIZE_T alignment) | - | 
| 111 | { | - | 
| 112 | struct _obstack_chunk *chunk; | - | 
| 113 |  | - | 
| 114 | if (alignment == 0) | TRUE | evaluated 79 times by 4 tests |  | FALSE | never evaluated | 
 | 0-79 | 
| 115 | alignment = DEFAULT_ALIGNMENT; executed 79 times by 4 tests:  alignment = ((__alignof__ (long double)) > (((__alignof__ (uintmax_t)) > (__alignof__ (void *)) ? (__alignof__ (uintmax_t)) : (__alignof__ (void *)))) ? (__alignof__ (long double)) : (((__alignof__ (uintmax_t)) > (__alignof__ (void *)) ? (__alignof__ (uintmax_t)) : (__alignof__ (void *))))); | TRUE | evaluated 79 times by 4 tests |  | FALSE | never evaluated | 
| TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0-79 | 
| 116 | if (size == 0) | TRUE | evaluated 79 times by 4 tests |  | FALSE | never evaluated | 
 | 0-79 | 
| 117 |  | - | 
| 118 | { | - | 
| 119 |  | - | 
| 120 |  | - | 
| 121 |  | - | 
| 122 |  | - | 
| 123 |  | - | 
| 124 |  | - | 
| 125 |  | - | 
| 126 |  | - | 
| 127 | int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) | TRUE | evaluated 79 times by 4 tests |  | FALSE | never evaluated | 
| TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0-79 | 
| 128 | + 4 + DEFAULT_ROUNDING - 1) | TRUE | evaluated 79 times by 4 tests |  | FALSE | never evaluated | 
| TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0-79 | 
| 129 | & ~(DEFAULT_ROUNDING - 1)); | - | 
| 130 | size = 4096 - extra; | - | 
| 131 | } executed 79 times by 4 tests:  end of block | 79 | 
| 132 |  | - | 
| 133 | h->chunk_size = size; | - | 
| 134 | h->alignment_mask = alignment - 1; | - | 
| 135 |  | - | 
| 136 | chunk = h->chunk = call_chunkfun (h, h->chunk_size); | - | 
| 137 | if (!chunk) | TRUE | never evaluated |  | FALSE | evaluated 79 times by 4 tests | 
 | 0-79 | 
| 138 | (*obstack_alloc_failed_handler) (); never executed: (*obstack_alloc_failed_handler) (); | 0 | 
| 139 | h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents, | TRUE | never evaluated |  | FALSE | evaluated 79 times by 4 tests | 
| TRUE | never evaluated |  | FALSE | evaluated 79 times by 4 tests | 
 | 0-79 | 
| 140 | alignment - 1); | - | 
| 141 | h->chunk_limit = chunk->limit = (char *) chunk + h->chunk_size; | - | 
| 142 | chunk->prev = 0; | - | 
| 143 |  | - | 
| 144 | h->maybe_empty_object = 0; | - | 
| 145 | h->alloc_failed = 0; | - | 
| 146 | return 1; executed 79 times by 4 tests:  return 1; | 79 | 
| 147 | } | - | 
| 148 |  | - | 
| 149 | int | - | 
| 150 | _obstack_begin (struct obstack *h, | - | 
| 151 | _OBSTACK_SIZE_T size, _OBSTACK_SIZE_T alignment, | - | 
| 152 | void *(*chunkfun) (size_t), | - | 
| 153 | void (*freefun) (void *)) | - | 
| 154 | { | - | 
| 155 | h->chunkfun.plain = chunkfun; | - | 
| 156 | h->freefun.plain = freefun; | - | 
| 157 | h->use_extra_arg = 0; | - | 
| 158 | return _obstack_begin_worker (h, size, alignment); executed 79 times by 4 tests:  return _obstack_begin_worker (h, size, alignment); | 79 | 
| 159 | } | - | 
| 160 |  | - | 
| 161 | int | - | 
| 162 | _obstack_begin_1 (struct obstack *h, | - | 
| 163 | _OBSTACK_SIZE_T size, _OBSTACK_SIZE_T alignment, | - | 
| 164 | void *(*chunkfun) (void *, size_t), | - | 
| 165 | void (*freefun) (void *, void *), | - | 
| 166 | void *arg) | - | 
| 167 | { | - | 
| 168 | h->chunkfun.extra = chunkfun; | - | 
| 169 | h->freefun.extra = freefun; | - | 
| 170 | h->extra_arg = arg; | - | 
| 171 | h->use_extra_arg = 1; | - | 
| 172 | return _obstack_begin_worker (h, size, alignment); never executed: return _obstack_begin_worker (h, size, alignment); | 0 | 
| 173 | } | - | 
| 174 |  | - | 
| 175 |  | - | 
| 176 |  | - | 
| 177 |  | - | 
| 178 |  | - | 
| 179 |  | - | 
| 180 |  | - | 
| 181 | void | - | 
| 182 | _obstack_newchunk (struct obstack *h, _OBSTACK_SIZE_T length) | - | 
| 183 | { | - | 
| 184 | struct _obstack_chunk *old_chunk = h->chunk; | - | 
| 185 | struct _obstack_chunk *new_chunk = 0; | - | 
| 186 | size_t obj_size = h->next_free - h->object_base; | - | 
| 187 | char *object_base; | - | 
| 188 |  | - | 
| 189 |  | - | 
| 190 | size_t sum1 = obj_size + length; | - | 
| 191 | size_t sum2 = sum1 + h->alignment_mask; | - | 
| 192 | size_t new_size = sum2 + (obj_size >> 3) + 100; | - | 
| 193 | if (new_size < sum2) | TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0 | 
| 194 | new_size = sum2; never executed: new_size = sum2; | 0 | 
| 195 | if (new_size < h->chunk_size) | TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0 | 
| 196 | new_size = h->chunk_size; never executed: new_size = h->chunk_size; | 0 | 
| 197 |  | - | 
| 198 |  | - | 
| 199 | if (obj_size <= sum1 && sum1 <= sum2) | TRUE | never evaluated |  | FALSE | never evaluated | 
| TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0 | 
| 200 | new_chunk = call_chunkfun (h, new_size); never executed: new_chunk = call_chunkfun (h, new_size); | 0 | 
| 201 | if (!new_chunk) | TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0 | 
| 202 | (*obstack_alloc_failed_handler)(); never executed: (*obstack_alloc_failed_handler)(); | 0 | 
| 203 | h->chunk = new_chunk; | - | 
| 204 | new_chunk->prev = old_chunk; | - | 
| 205 | new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size; | - | 
| 206 |  | - | 
| 207 |  | - | 
| 208 | object_base = | - | 
| 209 | __PTR_ALIGN ((char *) new_chunk, new_chunk->contents, h->alignment_mask); | TRUE | never evaluated |  | FALSE | never evaluated | 
| TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0 | 
| 210 |  | - | 
| 211 |  | - | 
| 212 | memcpy (object_base, h->object_base, obj_size); | - | 
| 213 |  | - | 
| 214 |  | - | 
| 215 |  | - | 
| 216 |  | - | 
| 217 | if (!h->maybe_empty_object | TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0 | 
| 218 | && (h->object_base | TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0 | 
| 219 | == __PTR_ALIGN ((char *) old_chunk, old_chunk->contents, | TRUE | never evaluated |  | FALSE | never evaluated | 
| TRUE | never evaluated |  | FALSE | never evaluated | 
| TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0 | 
| 220 | h->alignment_mask))) | TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0 | 
| 221 | { | - | 
| 222 | new_chunk->prev = old_chunk->prev; | - | 
| 223 | call_freefun (h, old_chunk); | - | 
| 224 | } never executed: end of block | 0 | 
| 225 |  | - | 
| 226 | h->object_base = object_base; | - | 
| 227 | h->next_free = h->object_base + obj_size; | - | 
| 228 |  | - | 
| 229 | h->maybe_empty_object = 0; | - | 
| 230 | } never executed: end of block | 0 | 
| 231 |  | - | 
| 232 |  | - | 
| 233 |  | - | 
| 234 |  | - | 
| 235 |  | - | 
| 236 |  | - | 
| 237 |  | - | 
| 238 | int _obstack_allocated_p (struct obstack *h, void *obj) __attribute_pure__; | - | 
| 239 |  | - | 
| 240 | int | - | 
| 241 | _obstack_allocated_p (struct obstack *h, void *obj) | - | 
| 242 | { | - | 
| 243 | struct _obstack_chunk *lp; | - | 
| 244 | struct _obstack_chunk *plp; | - | 
| 245 |  | - | 
| 246 | lp = (h)->chunk; | - | 
| 247 |  | - | 
| 248 |  | - | 
| 249 |  | - | 
| 250 | while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj)) | TRUE | never evaluated |  | FALSE | never evaluated | 
| TRUE | never evaluated |  | FALSE | never evaluated | 
| TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0 | 
| 251 | { | - | 
| 252 | plp = lp->prev; | - | 
| 253 | lp = plp; | - | 
| 254 | } never executed: end of block | 0 | 
| 255 | return lp != 0; never executed: return lp != 0; | 0 | 
| 256 | } | - | 
| 257 |  | - | 
| 258 |  | - | 
| 259 |  | - | 
| 260 |  | - | 
| 261 | void | - | 
| 262 | _obstack_free (struct obstack *h, void *obj) | - | 
| 263 | { | - | 
| 264 | struct _obstack_chunk *lp; | - | 
| 265 | struct _obstack_chunk *plp; | - | 
| 266 |  | - | 
| 267 | lp = h->chunk; | - | 
| 268 |  | - | 
| 269 |  | - | 
| 270 |  | - | 
| 271 | while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj)) | TRUE | evaluated 33 times by 1 test |  | FALSE | evaluated 33 times by 1 test | 
| TRUE | evaluated 33 times by 1 test |  | FALSE | never evaluated | 
| TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0-33 | 
| 272 | { | - | 
| 273 | plp = lp->prev; | - | 
| 274 | call_freefun (h, lp); | - | 
| 275 | lp = plp; | - | 
| 276 |  | - | 
| 277 |  | - | 
| 278 | h->maybe_empty_object = 1; | - | 
| 279 | } executed 33 times by 1 test:  end of block | 33 | 
| 280 | if (lp) | TRUE | never evaluated |  | FALSE | evaluated 33 times by 1 test | 
 | 0-33 | 
| 281 | { | - | 
| 282 | h->object_base = h->next_free = (char *) (obj); | - | 
| 283 | h->chunk_limit = lp->limit; | - | 
| 284 | h->chunk = lp; | - | 
| 285 | } never executed: end of block | 0 | 
| 286 | else if (obj != 0) | TRUE | never evaluated |  | FALSE | evaluated 33 times by 1 test | 
 | 0-33 | 
| 287 |  | - | 
| 288 | abort (); never executed: abort (); | 0 | 
| 289 | } executed 33 times by 1 test:  end of block | 33 | 
| 290 |  | - | 
| 291 | _OBSTACK_SIZE_T | - | 
| 292 | _obstack_memory_used (struct obstack *h) | - | 
| 293 | { | - | 
| 294 | struct _obstack_chunk *lp; | - | 
| 295 | _OBSTACK_SIZE_T nbytes = 0; | - | 
| 296 |  | - | 
| 297 | for (lp = h->chunk; lp != 0; lp = lp->prev) | TRUE | never evaluated |  | FALSE | never evaluated | 
 | 0 | 
| 298 | { | - | 
| 299 | nbytes += lp->limit - (char *) lp; | - | 
| 300 | } never executed: end of block | 0 | 
| 301 | return nbytes; never executed: return nbytes; | 0 | 
| 302 | } | - | 
| 303 |  | - | 
| 304 | # ifndef _OBSTACK_NO_ERROR_HANDLER | - | 
| 305 |  | - | 
| 306 | #  include <stdio.h> | - | 
| 307 |  | - | 
| 308 |  | - | 
| 309 | #  ifdef _LIBC | - | 
| 310 | int obstack_exit_failure = EXIT_FAILURE; | - | 
| 311 | #  else | - | 
| 312 | #   include "exitfail.h" | - | 
| 313 | #   define obstack_exit_failure exit_failure | - | 
| 314 | #  endif | - | 
| 315 |  | - | 
| 316 | #  ifdef _LIBC | - | 
| 317 | #   include <libintl.h> | - | 
| 318 | #  else | - | 
| 319 | #   include "gettext.h" | - | 
| 320 | #  endif | - | 
| 321 | #  ifndef _ | - | 
| 322 | #   define _(msgid) gettext (msgid) | - | 
| 323 | #  endif | - | 
| 324 |  | - | 
| 325 | #  ifdef _LIBC | - | 
| 326 | #   include <libio/iolibio.h> | - | 
| 327 | #  endif | - | 
| 328 |  | - | 
| 329 | static _Noreturn void | - | 
| 330 | print_and_abort (void) | - | 
| 331 | { | - | 
| 332 |  | - | 
| 333 |  | - | 
| 334 |  | - | 
| 335 |  | - | 
| 336 |  | - | 
| 337 | #  ifdef _LIBC | - | 
| 338 | (void) __fxprintf (NULL, "%s\n", _("memory exhausted")); | - | 
| 339 | #  else | - | 
| 340 | fprintf (stderr, "%s\n", _("memory exhausted")); | - | 
| 341 | #  endif | - | 
| 342 | exit (obstack_exit_failure); never executed: exit (exit_failure); | 0 | 
| 343 | } | - | 
| 344 |  | - | 
| 345 |  | - | 
| 346 |  | - | 
| 347 |  | - | 
| 348 |  | - | 
| 349 |  | - | 
| 350 |  | - | 
| 351 | __attribute_noreturn__ void (*obstack_alloc_failed_handler) (void) | - | 
| 352 | = print_and_abort; | - | 
| 353 | # endif /* !_OBSTACK_NO_ERROR_HANDLER */ | - | 
| 354 | #endif /* !_OBSTACK_ELIDE_CODE */ | - | 
|  |  |  |