#include #include #include "stdio-util.h" typedef struct indent_priv INDENT_PRIV; struct indent_priv { FILE *inner; int atnl; const char *(*pfx)(void *); void *pfxarg; } ; static int indent_w(void *pv, const char *data, int len) { INDENT_PRIV *p; int x0; int x; p = pv; x0 = -1; for (x=0;x= 0) { if (p->atnl) fputs((*p->pfx)(p->pfxarg),p->inner); fwrite(data+x0,1,x-x0,p->inner); x0 = -1; } putc('\n',p->inner); p->atnl = 1; } else { if (x0 < 0) x0 = x; } } if (x0 >= 0) { if (p->atnl) fputs((*p->pfx)(p->pfxarg),p->inner); fwrite(data+x0,1,x-x0,p->inner); p->atnl = 0; } return(len); } static int indent_c(void *pv) { INDENT_PRIV *p; p = pv; if (! p->atnl) putc('\n',p->inner); free(p); return(0); } FILE *indent_wrap(FILE *inner, const char *(*pfx)(void *), void *pfxarg) { INDENT_PRIV *p; FILE *f; p = malloc(sizeof(INDENT_PRIV)); if (! p) return(0); f = funopen(p,0,&indent_w,0,&indent_c); if (! f) { free(p); return(0); } p->inner = inner; p->atnl = 1; p->pfx = pfx; p->pfxarg = pfxarg; return(f); }