- size_t newsz, len;
-
- if (~b->f&(BF_ALLOC | BF_WRITE))
- { b->f |= BF_BROKEN; return (-1); }
- db = (dbuf *)b;
- len = BLEN(&db->_b); sz += len;
- if (db->sz >= sz)
- newsz = db->sz;
- else {
- newsz = db->sz ? 2*db->sz : 64;
- while (newsz < sz) { assert(newsz < ((size_t)-1)/2); newsz *= 2; }
- if (!db->_b.base) db->_b.base = x_alloc(db->a, newsz);
- else db->_b.base = x_realloc(db->a, db->_b.base, newsz, db->sz);
- db->_b.p = db->_b.base + len; db->sz = newsz;
+ size_t want, len;
+
+ if (sz <= BLEFT(b)) return (0);
+ if (~b->f&(BF_ALLOC | BF_WRITE)) { b->f |= BF_BROKEN; return (-1); }
+
+ db = (dbuf *)b; len = DBLEN(db); want = sz + len;
+ if (db->sz < want) {
+ GROWBUF_EXTEND(size_t, db->a, db->_b.base, db->sz, want, 64, 1);
+ db->_b.p = db->_b.base + len;