/* This file is in the public domain. */ #include #include #include #include #include "stdio-util.h" typedef struct accpriv ACCPRIV; struct accpriv { char **sp; int *lp; char *b; int a; int l; } ; static int acc_w(void *pv, const char *buf, int len) { ACCPRIV *p; p = pv; if (p->sp) { if (p->l+len > p->a) { p->b = realloc(p->b,p->a=p->l+len+1); } bcopy(buf,p->b+p->l,len); } p->l += len; return(len); } static int acc_c(void *pv) { ACCPRIV *p; p = pv; acc_w(p,"",1); p->l --; if (p->sp) *p->sp = p->b; if (p->lp) *p->lp = p->l; free(p); return(0); } FILE *fopen_accum(char **sp, int *lp) { ACCPRIV *p; FILE *f; p = malloc(sizeof(ACCPRIV)); if (p == 0) return(0); f = funopen(p,0,&acc_w,0,&acc_c); if (! f) { free(p); return(0); } p->sp = sp; p->lp = lp; p->b = 0; p->a = 0; p->l = 0; return(f); }