diff --git a/src/growbag.c b/src/growbag.c index d5a73c0..2007246 100644 --- a/src/growbag.c +++ b/src/growbag.c @@ -97,21 +97,23 @@ gbag_get(gbag_t *gb) assert(gb && gb->max && gb->b); char *end = gb->b + (gb->max * gb->z); char *from = gb->n; - size_t nm, cz; + size_t nc, oc, ocz; char *b = NULL; + char *rv = NULL; if (gb->ref == gb->max) goto grow; scan: - do + while(gb->n < end) { if (!*gb->n) { gb->ref++; - return gb->n; + rv = gb->n; + gb->n += gb->z; + return rv; } gb->n += gb->z; } - while(gb->n < end); if (from != gb->b) { end = from; @@ -122,19 +124,21 @@ scan: else { grow: - cz = gb->max * gb->z; - nm = gb->max << 1; - b = (char*) realloc(gb->b, nm * gb->z); - if (b == NULL) + ocz = gb->max * gb->z; + oc = gb->max; + nc = gb->max << 1; + b = (char*) realloc(gb->b, nc * gb->z); + if (!b) return NULL; - memset(b + cz, 0, cz); - gb->max = nm; + rv = b + ocz; + memset(rv, 0, ocz); if (gb->mv && gb->b != b) - gb->mv(b, cz); - gb->b = b; - gb->n = b + cz; + gb->mv(b, oc); + gb->max = nc; gb->ref++; - return gb->n; + gb->b = b; + gb->n = rv + gb->z; + return rv; } return NULL; } @@ -188,13 +192,13 @@ gbag_first(gbag_t *gb) char *s = gb->b; char *e = gb->b + (gb->max * gb->z); gb->ni = s; - do + while (sz; + gb->ni = s; } - while (s