#include #include #include #include #include "es.h" #include "prf.h" typedef struct prf_priv PRF_PRIV; struct prf_priv { ES s; } ; static AIO_OQ *q; void prf_setup(AIO_OQ *oq) { q = oq; } void prf(const char *fmt, ...) { va_list ap; char *s; int l; va_start(ap,fmt); l = vasprintf(&s,fmt,ap); va_end(ap); l = strnlen(s,l); aio_oq_queue_point(q,"P",1); aio_oq_queue_free(q,s,l); aio_oq_queue_point(q,"",1); } static int prf_w(void *pv, const char *s, int l) { es_append_n(&((PRF_PRIV *)pv)->s,s,l); return(l); } static int prf_c(void *pv) { PRF_PRIV *p; p = pv; aio_oq_queue_point(q,"P",1); aio_oq_queue_copy(q,es_ptr(&p->s),es_len(&p->s)); aio_oq_queue_point(q,"",1); es_done(&p->s); free(p); return(0); } FILE *prf_open(void) { PRF_PRIV *p; FILE *f; p = malloc(sizeof(PRF_PRIV)); if (! p) return(0); f = funopen(p,0,&prf_w,0,&prf_c); if (! f) { free(p); return(0); } es_init(&p->s); return(f); }