X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=lib%2Fgocr%2Fprogress.c;fp=lib%2Fgocr%2Fprogress.c;h=14804ed8d27c99b842da61131c6394d6b48b5992;hb=8154e11e1c06aefe18c16b33f2b12d6de21273a4;hp=0000000000000000000000000000000000000000;hpb=e8fe2f290123fc66181709a8a5263ad9e91c6939;p=swftools.git diff --git a/lib/gocr/progress.c b/lib/gocr/progress.c new file mode 100644 index 0000000..14804ed --- /dev/null +++ b/lib/gocr/progress.c @@ -0,0 +1,87 @@ +/* ---------------------------- progress output ---------------------- */ +#include +#include +#include "progress.h" + +FILE *fp=NULL; /* output stream for progress info */ +time_t printinterval = 10; /* approx. seconds between printouts, 1.. */ + +/* initialization of progress output, fname="","","-" */ +int ini_progress(char *fname){ + int fd; + if (fp) { fclose(fp); fp=NULL; } + if (fname) if (fname[0]) { + fd=atoi(fname); + if(fd>255 || fname[((fd>99)?3:((fd>9)?2:1))]) fd=-1; /* be sure */ + if (fname[0]=='-' && fname[1]==0) { fp=stdout; } +#ifdef __USE_POSIX + else if (fd>0) { fp=fdopen(fd,"w"); } /* not sure that "w" is ok ???? */ +#endif + else { fp=fopen(fname,"w");if(!fp)fp=fopen(fname,"a"); } + if (!fp) { + fprintf(stderr,"could not open %s for progress output\n",fname); + return -1; /* no success */ + } + } + /* fprintf(stderr,"# progress: fd=%d\n",fileno(fp)); */ + return 0; /* no error */ +} + +progress_counter_t *open_progress(int maxcount, const char *name){ + progress_counter_t *pc; + pc = (progress_counter_t*) malloc( sizeof(progress_counter_t) ); + if (!pc) return 0; /* nonfatal */ + pc->starttime = time(NULL); + pc->maxcount = maxcount; + pc->numskip = 0; + pc->lastprintcount = -1; + pc->name = name; + pc->lastprinttime = pc->starttime; + return pc; +} +/* free counter */ +int close_progress(progress_counter_t *counter){ + if (counter) free(counter); + return 0; +} +/* progress meter output + * only 1output/10s, + estimated endtime (test on pixelfields) + * ToDo: to stderr by default? remove subprogress, ini_progress? rm_progress? + * test on tcl + */ +int progress(int counter, progress_counter_t *pc){ + /* we try to save computing time, so we skip early */ + if ((!fp) || counter - pc->lastprintcount <= pc->numskip) return 0; + { + char cr='\n'; + time_t now = time(NULL); +#if 0 /* debugging */ + if (counter) + fprintf(fp," progress %s %3d / %d time %d skip %d\n", + pc->name,counter,pc->maxcount,(int)(now - pc->starttime), + pc->numskip); fflush(fp); +#endif + if (5*(now - pc->lastprinttime) < 2*printinterval + && counter - pc->lastprintcount >= pc->numskip) { /* save for tests */ + if (pc->numskip < 1024) pc->numskip += pc->numskip+1; + } + if (3*(now - pc->lastprinttime) < 2*printinterval ) { + return 0; /* to early for printing */ + } + if (2*(now - pc->lastprinttime) > 3*printinterval ) { + pc->numskip >>= 1; /* to late for printing */ + } + if (fileno(fp)<3) cr='\r'; /* may be choosen in ini? */ + if (counter) + fprintf(fp," progress %s %5d / %d time[s] %5d / %5d (skip=%d)%c", + pc->name,counter,pc->maxcount, + (int)(now - pc->starttime), /* time gone since start */ + (int)(now - pc->starttime)*pc->maxcount/(counter), /* estimated */ + pc->numskip, cr); + fflush(fp); + pc->lastprintcount=counter; + pc->lastprinttime=now; + } + return 0; /* no error */ +} +/* --------------------- end of progress output ---------------------- */