#include #include #include #include #include "stdio-util.h" typedef struct oa_priv OA_PRIV; struct oa_priv { char **sp; int *lp; char *b; int l; } ; static int w_oa(void *pv, const char *data, int len) { OA_PRIV *p; char *newb; p = pv; if (p->l < 0) { errno = EIO; return(-1); } if (p->sp) { newb = realloc(p->b,p->l+len+1); if (! newb) { free(p->b); p->b = 0; p->l = -1; errno = ENOMEM; return(-1); } p->b = newb; bcopy(data,p->b+p->l,len); } p->l += len; return(len); } static int c_oa(void *pv) { OA_PRIV *p; p = pv; if (p->b) p->b[p->l] = '\0'; if (p->sp) *p->sp = p->b; if (p->lp) *p->lp = p->l; free(p); return(0); } FILE *stdio_open_alloc(char **sp, int *lp) { OA_PRIV *p; FILE *f; p = malloc(sizeof(OA_PRIV)); if (! p) return(0); if (sp) { p->b = malloc(1); if (! p->b) { free(p); return(0); } } else { p->b = 0; } p->l = 0; f = funopen(p,0,&w_oa,0,&c_oa); if (! f) { free(p->b); free(p); return(0); } p->sp = sp; p->lp = lp; return(f); }