X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.web-live.git;a=blobdiff_plain;f=pctb%2Fconvert.c;h=eb7536d6fac4bcc3014f2b7c35880602febc3820;hp=bac41d90ef37b1e0229d4ad98644318f9c973fe4;hb=e9825058f1499f656335b3215cc3c79bf0ef4715;hpb=f2c5d45ada202f2ad2640b260cac2fd7bb83eb3e diff --git a/pctb/convert.c b/pctb/convert.c index bac41d9..eb7536d 100644 --- a/pctb/convert.c +++ b/pctb/convert.c @@ -47,47 +47,84 @@ static enum { mode_all= 0111, } o_mode= mode_all; -static char *o_screenshots_fn; +static char *o_screenshot_fn; static int o_single_page, o_quiet; +static const char *o_outputmode= "upload"; -FILE *screenshots_file; +FILE *screenshot_file; -static void badusage(const char *fmt, ...) - __attribute__((format(printf,1,2),noreturn)); -static void badusage(const char *fmt, ...) { - va_list al; - va_start(al,fmt); +static void vbadusage(const char *fmt, va_list) FMT(1,0) NORET; +static void vbadusage(const char *fmt, va_list al) { + fputs("bad usage: ",stderr); + vfprintf(stderr,fmt,al); + fputc('\n',stderr); exit(12); } +DEFINE_VWRAPPERF(static, badusage, NORET); -static void open_screenshots_file(const char *mode) { - screenshots_file= fopen(o_screenshots_fn, mode); - if (!screenshots_file) +static void open_screenshot_file(const char *mode) { + screenshot_file= fopen(o_screenshot_fn, mode); + if (!screenshot_file) fatal("could not open screenshots file `%s': %s", - o_screenshots_fn, strerror(errno)); + o_screenshot_fn, strerror(errno)); } +static void run_analysis(void) { + FILE *tf; + + sysassert( tf= tmpfile() ); + progress("running recognition..."); + analyse(tf); + + sysassert( fseek(tf,0,SEEK_SET) == 0); + + progress_log("processing results (--%s)...", o_outputmode); + pid_t processor; + sysassert( (processor= fork()) != -1 ); + + if (!processor) { + sysassert( dup2(fileno(tf),0) ==0 ); + execlp("./yppsc-commod-processor", "yppsc-commod-processor", + o_outputmode, (char*)0); + sysassert(!"execlp commod-processor failed"); + } + + waitpid_check_exitstatus(processor, "output processor/uploader"); + fclose(tf); + progress_log("all complete."); +} + int main(int argc, char **argv) { const char *arg; int r; #define ARGVAL ((*++argv) ? *argv : \ - badusage("missing value for option %s",arg),(char*)0) + (badusage("missing value for option %s",arg),(char*)0)) while ((arg=*++argv)) { if (!strcmp(arg,"--find-window-only")) o_mode= mode_findwindow; else if (!strcmp(arg,"--screenshot-only")) o_mode= mode_screenshot; - else if (!strcmp(arg,"--analyse-only")) + else if (!strcmp(arg,"--analyse-only") || + !strcmp(arg,"--same")) o_mode= mode_analyse; + else if (!strcmp(arg,"--everything")) + o_mode= mode_all; else if (!strcmp(arg,"--single-page")) o_single_page= 1; else if (!strcmp(arg,"--quiet")) o_quiet= 1; - else if (!strcmp(arg,"--screenshots-file")) - o_screenshots_fn= ARGVAL; + else if (!strcmp(arg,"--raw-tsv")) + o_outputmode= 0; + else if (!strcmp(arg,"--upload") || + !strcmp(arg,"--arbitrage") || + !strcmp(arg,"--tsv") || + !strcmp(arg,"--best-prices")) + o_outputmode= arg+2; + else if (!strcmp(arg,"--screenshot-file")) + o_screenshot_fn= ARGVAL; #define DF(f) \ else if (!strcmp(arg,"-D" #f)) \ debug_flags |= dbg_##f; @@ -102,8 +139,8 @@ int main(int argc, char **argv) { badusage("unknown option `%s'",arg); } - if (!o_screenshots_fn) { - r= asprintf(&o_screenshots_fn,"%s/#pages#.ppm",get_vardir()); + if (!o_screenshot_fn) { + r= asprintf(&o_screenshot_fn,"%s/#pages#.ppm",get_vardir()); sysassert(r>=0); } @@ -112,18 +149,20 @@ int main(int argc, char **argv) { find_yppclient_window(); } if (o_mode & mf_screenshot) { - open_screenshots_file("w"); + open_screenshot_file("w"); if (o_single_page) take_one_screenshot(); else take_screenshots(); } if (o_mode & mf_readscreenshot) { - open_screenshots_file("r"); + open_screenshot_file("r"); if (o_single_page) read_one_screenshot(); else read_screenshots(); } if (o_mode & mf_analyse) { - analyse(); - //output_tsv(); + if (o_outputmode) + run_analysis(); + else + analyse(stdout); } return 0; } @@ -224,3 +263,25 @@ void *mrealloc(void *p, size_t sz) { sysassert( r= realloc(p,sz) ); return r; } + +void waitpid_check_exitstatus(pid_t pid, const char *what) { + pid_t got; + int st; + for (;;) { + got= waitpid(pid, &st, 0); + if (pid==-1) { sysassert(errno==EINTR); continue; } + break; + } + sysassert( got==pid ); + + if (WIFEXITED(st)) { + if (WEXITSTATUS(st)) + fatal("%s failed with nonzero exit status %d", + what, WEXITSTATUS(st)); + } else if (WIFSIGNALED(st)) { + fatal("%s died due to signal %s%s", what, + strsignal(WTERMSIG(st)), WCOREDUMP(st)?" (core dumped)":""); + } else { + fatal("%s gave strange wait status %d", what, st); + } +}