X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.main.git;a=blobdiff_plain;f=yarrg%2Fconvert.c;h=adccb1cfdae6e52acf51fa6243600cc3fbaeb9f9;hp=782167f8312bdb9461f45e835c3beadbcae3904d;hb=f650f849de1ef7d6b22b0c399d1a05dc4e63f9bc;hpb=33f3a4cd5821208321f0bf61e2ae6c07504c8b86;ds=sidebyside diff --git a/yarrg/convert.c b/yarrg/convert.c index 782167f..adccb1c 100644 --- a/yarrg/convert.c +++ b/yarrg/convert.c @@ -37,13 +37,19 @@ const char *get_libdir(void) { return "."; } enum outmodekind { - omk_unset, omk_upload, omk_str, omk_raw, omk_none + omk_unset, omk_raw, omk_str, omk_upload_yarrg, omk_upload_pctb }; -static enum outmodekind o_outmode_kind; -static const char *o_outmode_str= 0; + +typedef struct { + enum outmodekind kind; /* unset is sentinel */ + const char *str; /* non-0 iff not unset or raw */ +} OutputMode; + +static OutputMode o_outmodes[10]; static char *o_screenshot_fn; -static const char *o_serv_pctb, *o_serv_dict_fetch, *o_serv_dict_submit; +static const char *o_serv_pctb, *o_serv_yarrg; +static const char *o_serv_dict_fetch, *o_serv_dict_submit; const char *o_resolver= "./dictionary-manager"; FILE *screenshot_file; @@ -81,6 +87,7 @@ static void open_screenshot_file(int for_write) { static void run_analysis(void) { FILE *tf; + OutputMode *om; sysassert( tf= tmpfile() ); progress("running recognition..."); @@ -92,18 +99,26 @@ static void run_analysis(void) { " (--single-page specified). Specify an output mode?"); } - sysassert( fseek(tf,0,SEEK_SET) == 0); + for (om=o_outmodes; om->kind != omk_unset; om++) { + sysassert( fseek(tf,0,SEEK_SET) == 0); - progress_log("processing results (--%s)...", o_outmode_str); - pid_t processor; - sysassert( (processor= fork()) != -1 ); + progress_log("processing results (--%s)...", om->str); + pid_t processor; + sysassert( (processor= fork()) != -1 ); - if (!processor) { - sysassert( dup2(fileno(tf),0) ==0 ); - EXECLP_HELPER("commod-results-processor", o_outmode_str, (char*)0); - } + if (!processor) { + sysassert( dup2(fileno(tf),0) ==0 ); + if (om->kind==omk_raw) { + execlp("cat","cat",(char*)0); + sysassert(!"execute cat"); + } else { + EXECLP_HELPER("commod-results-processor", om->str, (char*)0); + } + } - waitpid_check_exitstatus(processor, "output processor/uploader", 0); + waitpid_check_exitstatus(processor, "output processor/uploader", 0); + } + fclose(tf); progress_log("all complete."); } @@ -137,6 +152,32 @@ static void rsync_core(const char *stem, const char *suffix, void fetch_with_rsync_gz(const char *stem) { rsync_core(stem,".gz",""); } void fetch_with_rsync(const char *stem) { rsync_core(stem,"","z"); } +static void get_timestamp(void) { + FILE *tf; + pid_t child; + sysassert( tf= tmpfile() ); + + sysassert( (child= fork()) != -1 ); + if (!child) { + sysassert( dup2(fileno(tf),1)==1 ); + EXECLP_HELPER("database-info-fetch","timestamp",(char*)0); + } + waitpid_check_exitstatus(child,"timestamp request",0); + + sysassert( fseek(tf,0,SEEK_SET) == 0 ); + static char lbuf[30]; + int l= fread(lbuf,1,sizeof(lbuf),tf); + sysassert( !ferror(tf) ); + assert( feof(tf) ); + assert( l>1 ); + l--; + assert( lbuf[l]=='\n' ); + lbuf[l]= 0; + + sysassert(! setenv("YPPSC_DATA_TIMESTAMP",lbuf,1) ); + fclose(tf); +} + static void set_server(const char *envname, const char *defprotocol, const char *defvalue, const char *defvalue_test, const char *userspecified, @@ -175,6 +216,23 @@ static void set_server(const char *envname, const char *defprotocol, sysassert(! setenv(envname,value,1) ); } +static void outputmode(enum outmodekind kind, const char *str) { + OutputMode *om= o_outmodes; + OutputMode *sentinel= o_outmodes + ARRAYSIZE(o_outmodes) - 1; + for (;;) { + if (om==sentinel) badusage("too many output modes specified"); + if (!om->kind) break; + om++; + } + om->kind= kind; + om->str= str; +} + +static void outputmode_uploads(void) { + outputmode(omk_upload_yarrg, "upload-yarrg"); + outputmode(omk_upload_pctb, "upload-pctb"); +} + int main(int argc, char **argv) { const char *arg; @@ -204,15 +262,16 @@ int main(int argc, char **argv) { else if (IS("--dict-read-only")) o_flags &= (~ffs_dict | ff_dict_fetch); else if (IS("--dict-anon")) o_flags &= ~ff_dict_pirate; else if (IS("--dict-submit")) o_flags |= ff_dict_fetch|ff_dict_submit; - else if (IS("--raw-tsv")) o_outmode_kind= omk_raw; - else if (IS("--upload")) o_outmode_kind= omk_upload; + else if (IS("--raw-tsv")) outputmode(omk_raw,0); + else if (IS("--upload")) outputmode_uploads(); + else if (IS("--upload-yarrg")) outputmode(omk_upload_yarrg,arg+2); + else if (IS("--upload-pctb")) outputmode(omk_upload_pctb,arg+2); else if (IS("--arbitrage") || IS("--tsv") || - IS("--best-prices")) o_outmode_kind=omk_str, - o_outmode_str=arg+2; - + IS("--best-prices")) outputmode(omk_str,arg+2); else if (IS("--screenshot-file")|| IS("--screenshots-file")) o_screenshot_fn= ARGVAL; + else if (IS("--yarrg-server")) o_serv_yarrg= ARGVAL; else if (IS("--pctb-server")) o_serv_pctb= ARGVAL; else if (IS("--dict-submit-server")) o_serv_dict_submit= ARGVAL; else if (IS("--dict-update-server")) o_serv_dict_fetch= ARGVAL; @@ -235,42 +294,64 @@ int main(int argc, char **argv) { /* Consequential changes to options */ if (o_mode & mf_analyse) { - if (!o_outmode_kind) { + if (!o_outmodes[0].kind) { if (o_flags & ff_printisland) { - o_outmode_kind= omk_none; o_flags |= ff_singlepage; } else { - o_outmode_kind= omk_upload; + outputmode_uploads(); } } + } else { + if (o_outmodes[0].kind) + badusage("overall mode does not include analysis but output option(s)" + " (eg `--%s') specified", o_outmodes[0].str); + } - if (o_outmode_kind==omk_upload) { - o_flags |= ffs_upload; - o_outmode_str= "upload"; + OutputMode *om; + for (om=o_outmodes; om->kind; om++) { + switch (om->kind) { + case omk_upload_yarrg: o_flags |= ffs_upload | ff_use_yarrg; break; + case omk_upload_pctb: o_flags |= ffs_upload | ff_use_pctb; break; + default: ; } } - /* Defaults */ + if ((o_flags & (ff_needisland|ff_upload)) && + !(o_flags & (ffm_use))) + o_flags |= ffm_use; /* all */ + + if (o_serv_yarrg && !o_serv_dict_submit) + o_serv_dict_submit= o_serv_yarrg; + /* Defaults */ + + set_server("YPPSC_YARRG_YARRG", + "http://", "upload.yarrg.chiark.net", + "upload.yarrg.chiark.net/test", + o_serv_yarrg, o_flags & ff_use_yarrg); + set_server("YPPSC_YARRG_PCTB", "http://", "pctb.ilk.org" /*pctb.crabdance.com*/, "pctb.ilk.org", - o_serv_pctb, o_flags & (ff_needisland|ff_upload)); + o_serv_pctb, o_flags & ff_use_pctb); set_server("YPPSC_YARRG_DICT_UPDATE", - "rsync://", "rsync.pctb.chiark.greenend.org.uk/pctb", - "rsync.pctb.chiark.greenend.org.uk/pctb/test", + "rsync://", "rsync.yarrg.chiark.net/yarrg", + "rsync.yarrg.chiark.net/yarrg/test", o_serv_dict_fetch, o_flags & ff_dict_fetch); set_server("YPPSC_YARRG_DICT_SUBMIT", - "http://", "dictup.pctb.chiark.greenend.org.uk", - "dictup.pctb.chiark.greenend.org.uk/test", + "http://", "upload.yarrg.chiark.net", + "upload.yarrg.chiark.net/test", o_serv_dict_submit, o_flags & ff_dict_submit); if (!o_screenshot_fn) o_screenshot_fn= masprintf("%s/_pages.ppm.gz", get_vardir()); /* Actually do the work */ + + if ((o_flags & ff_upload) && (o_flags & ff_use_yarrg)) + get_timestamp(); canon_colour_prepare(); @@ -320,12 +401,10 @@ int main(int argc, char **argv) { printf("%s, %s\n", archipelago, island); sysassert(! setenv("YPPSC_ISLAND",island,1) ); } - switch (o_outmode_kind) { - case omk_upload: case omk_str: run_analysis(); break; - case omk_raw: analyse(stdout); break; - case omk_none: break; - default: abort(); - } + if (o_outmodes[0].kind==omk_raw && o_outmodes[1].kind==omk_unset) + analyse(stdout); + else + run_analysis(); } progress_log("Finished."); return 0;