#include #include #include #include #include #include #include "irdr.h" #include "plot.h" #include "istack.h" #include "dirimpl.h" #include "dir-output.h" static char *lastfn = 0; static char *new_fn(const char *prevfn) { int l; int i; char *t; int dig; int dot; if (prevfn == 0) return(strdup("plot0001.pnm")); l = strlen(prevfn); t = malloc(l+2); bcopy(prevfn,t,l+1); dig = -1; dot = -1; for (i=0;i (dig >= 0) { switch (t[dig]) { case '9': t[dig] = '0'; dig --; break; case '0': t[dig] = '1'; return(t); break; case '1': t[dig] = '2'; return(t); break; case '2': t[dig] = '3'; return(t); break; case '3': t[dig] = '4'; return(t); break; case '4': t[dig] = '5'; return(t); break; case '5': t[dig] = '6'; return(t); break; case '6': t[dig] = '7'; return(t); break; case '7': t[dig] = '8'; return(t); break; case '8': t[dig] = '9'; return(t); break; default: break <"carry">; } } dig ++; bcopy(t+dig,t+dig+1,l+1-dot); t[dig] = '1'; return(t); } DIRRV dir_output(void **privp __attribute__((__unused__)), DIROP op, ...) { va_list ap; char *fn; FILE *f; va_start(ap,op); switch (op) { case DIROP_INIT: return(DIRRV_MORE); break; case DIROP_ARG: fn = va_arg(ap,char *); fn = fn ? strdup(fn) : new_fn(lastfn); f = fopen(fn,"w"); if (! f) { istack_err("%s: %s",fn,strerror(errno)); return(DIRRV_NOMORE); } plot_output(f); fclose(f); if (lastfn) free(lastfn); lastfn = fn; return(DIRRV_NOMORE); break; } va_end(ap); abort(); }