Especially thinking of the common C idiom where we don't know the right buffer size in advance, and keep trying increasing powers-of-two until we find one that works. Pseudo-code:
for (n = 32; n < size_limit; n *= 2) { ___SCMOBJ vector = ___EXT(___alloc_scmobj)(NULL, ___sFooVECTOR, n * sizeof(foo_t)); foo_t *body = ___CAST(foo_t *, ___BODY(vector)); int result = get_value_from_some_c_api(body, n); ___EXT(___release_scmobj)(vector); if (result == success) { ___return(vector); } else if (result != buffer_too_small) { ___return(___FAL); } // dispose of the vector here } ___return(___FAL);
Another option would be to do the above loop using standard C realloc(), but then have a Gambit API that "takes ownership" of a buffer that comes from malloc() and adds a Scheme object header to it. Does that kind of approach make any sense in Gambit?