X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-test.git;a=blobdiff_plain;f=pctb%2Fconvert.c;h=e6e0102e6b02b69fb7031d52de2a43a80dc03e18;hp=b9325e88dcfacaf05be5ce374b6400e5fdae3915;hb=373a139d8c902f3c7af960d05c7665048cf4d5c0;hpb=6a3c0962283d32bc6e5f6c47c929baf37ddc642f diff --git a/pctb/convert.c b/pctb/convert.c index b9325e8..e6e0102 100644 --- a/pctb/convert.c +++ b/pctb/convert.c @@ -37,28 +37,38 @@ const char *get_libdir(void) { return "."; } enum mode { - mf_findwindow= 0001, - mf_screenshot= 0010, - mf_readscreenshot= 0020, - mf_analyse= 0100, + mf_findwindow= 00001, + mf_screenshot= 00010, + mf_readscreenshot= 00020, + mf_analyse= 00100, + mfm_special= 07000, - mode_findwindow= 0001, - mode_screenshot= 0011, - mode_analyse= 0120, + mode_findwindow= 00001, + mode_screenshot= 00011, + mode_analyse= 00120, + mode_showcharset= 01000, - mode_all= 0111, + mode_all= 00111, }; +enum outmodekind { + omk_unset, omk_upload, omk_str, omk_raw, omk_none +}; +static enum outmodekind o_outmode_kind; +static const char *o_outmode_str= 0; + static enum mode o_mode= mode_all; static char *o_screenshot_fn; -static int o_quiet; -static const char *o_outputmode= "upload"; static const char *o_serv_pctb, *o_serv_dict_fetch, *o_serv_dict_submit; const char *o_resolver= "./dictionary-manager"; FILE *screenshot_file; +const char *o_ocean, *o_pirate; +int o_quiet; -enum flags o_flags= ff_dict_fetch|ff_dict_submit|ff_dict_pirate; +enum flags o_flags= + ff_charset_allowedit | + ff_dict_fetch|ff_dict_submit|ff_dict_pirate; static void vbadusage(const char *fmt, va_list) FMT(1,0) NORET; static void vbadusage(const char *fmt, va_list al) { @@ -84,51 +94,59 @@ static void run_analysis(void) { analyse(tf); if (o_flags & ff_upload) { - if (o_flags & ff_singlepage) + if (npages<=1) fatal("Recognition successful, but refusing to upload partial data\n" " (--single-page specified). Specify an output mode?"); } sysassert( fseek(tf,0,SEEK_SET) == 0); - progress_log("processing results (--%s)...", o_outputmode); + progress_log("processing results (--%s)...", o_outmode_str); 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"); + EXECLP_HELPER("commod-results-processor", o_outmode_str, (char*)0); } - waitpid_check_exitstatus(processor, "output processor/uploader"); + waitpid_check_exitstatus(processor, "output processor/uploader", 0); fclose(tf); progress_log("all complete."); } -void fetch_with_rsync(const char *stem) { +static void rsync_core(const char *stem, const char *suffix, + const char *zopt) { pid_t fetcher; + progress("Updating dictionary %s...",stem); + sysassert( (fetcher= fork()) != -1 ); if (!fetcher) { const char *rsync= getenv("YPPSC_PCTB_RSYNC"); if (!rsync) rsync= "rsync"; const char *src= getenv("YPPSC_PCTB_DICT_UPDATE"); - char *remote= masprintf("%s/master-%s.txt", src, stem); - char *local= masprintf("#master-%s#.txt", stem); - execlp(rsync, "rsync", - DEBUGP(rsync) ? "-vLt" : "-Lt", - "--",remote,local,(char*)0); + char *remote= masprintf("%s/master-%s.txt%s", src, stem, suffix); + char *local= masprintf("_master-%s.txt%s", stem, suffix); + if (DEBUGP(rsync)) + fprintf(stderr,"executing rsync to fetch %s to %s\n",remote,local); + char *opts= masprintf("-Lt%s%s", + zopt, + DEBUGP(rsync) ? "v" : ""); + execlp(rsync, "rsync",opts,"--",remote,local,(char*)0); sysassert(!"exec rsync failed"); } - waitpid_check_exitstatus(fetcher, "dictionary-manager --update"); + waitpid_check_exitstatus(fetcher, "rsync", 0); } +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 set_server(const char *envname, const char *defprotocol, - const char *defvalue, const char *userspecified, + const char *defvalue, const char *defvalue_test, + const char *userspecified, int enable) { const char *value; @@ -138,6 +156,8 @@ static void set_server(const char *envname, const char *defprotocol, value= userspecified; else if ((value= getenv(envname))) ; + else if (o_flags & ff_testservers) + value= defvalue_test; else value= defvalue; @@ -153,7 +173,10 @@ static void set_server(const char *envname, const char *defprotocol, /* rsync :: protocol specification - anyway, adding scheme:// won't help */ goto ok; - value= masprintf("%s%s", defprotocol, value); + int vallen= strlen(value); + + value= masprintf("%s%s%s", defprotocol, value, + vallen && value[vallen-1]=='/' ? "" : "/"); ok: sysassert(! setenv(envname,value,1) ); @@ -174,25 +197,34 @@ int main(int argc, char **argv) { while ((arg=*++argv)) { if (IS("--find-window-only")) o_mode= mode_findwindow; else if (IS("--screenshot-only")) o_mode= mode_screenshot; + else if (IS("--show-charset")) o_mode= mode_showcharset; else if (IS("--analyse-only") || IS("--same")) o_mode= mode_analyse; else if (IS("--everything")) o_mode= mode_all; + else if (IS("--find-island")) o_flags |= ffs_printisland; else if (IS("--single-page")) o_flags |= ff_singlepage; else if (IS("--quiet")) o_quiet= 1; - else if (IS("--edit-charset")) o_flags |= ff_editcharset; + else if (IS("--edit-charset")) o_flags |= ff_charset_edit; + else if (IS("--no-edit-charset")) o_flags &= ~(ffm_charset); + else if (IS("--test-servers")) o_flags |= ff_testservers; else if (IS("--dict-local-only")) o_flags &= ~ffs_dict; 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("--upload") || - IS("--arbitrage") || + else if (IS("--raw-tsv")) o_outmode_kind= omk_raw; + else if (IS("--upload")) o_outmode_kind= omk_upload; + else if (IS("--arbitrage") || IS("--tsv") || - IS("--best-prices")) o_outputmode= arg+2; - else if (IS("--raw-tsv")) o_outputmode= 0; - else if (IS("--screenshot-file")) o_screenshot_fn= ARGVAL; + IS("--best-prices")) o_outmode_kind=omk_str, + o_outmode_str=arg+2; + + else if (IS("--screenshot-file")|| + IS("--screenshots-file")) o_screenshot_fn= 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; + else if (IS("--ocean")) o_ocean= ARGVAL; + else if (IS("--pirate")) o_pirate= ARGVAL; #define DF(f) \ else if (IS("-D" #f)) \ debug_flags |= dbg_##f; @@ -208,50 +240,98 @@ int main(int argc, char **argv) { } /* Consequential changes to options */ - - if (!strcmp("upload",o_outputmode)) - o_flags |= ffs_upload; + + if (o_mode & mf_analyse) { + if (!o_outmode_kind) { + if (o_flags & ff_printisland) { + o_outmode_kind= omk_none; + o_flags |= ff_singlepage; + } else { + o_outmode_kind= omk_upload; + } + } + + if (o_outmode_kind==omk_upload) { + o_flags |= ffs_upload; + o_outmode_str= "upload"; + } + } /* Defaults */ set_server("YPPSC_PCTB_PCTB", - "http://", "pctb.ilk.org", - o_serv_pctb, o_flags & (ff_needisland|ff_upload)); + "http://", "pctb.ilk.org" /*pctb.crabdance.com*/, + "pctb.ilk.org", + o_serv_pctb, o_flags & (ff_needisland|ff_upload)); set_server("YPPSC_PCTB_DICT_UPDATE", - "rsync://", "rsync.pctb.chiark.greenend.org.uk/pctb", + "rsync://", "rsync.pctb.chiark.greenend.org.uk/pctb", + "rsync.pctb.chiark.greenend.org.uk/pctb/test", o_serv_dict_fetch, o_flags & ff_dict_fetch); set_server("YPPSC_PCTB_DICT_SUBMIT", "http://", "dictup.pctb.chiark.greenend.org.uk", + "dictup.pctb.chiark.greenend.org.uk/test", o_serv_dict_submit, o_flags & ff_dict_submit); if (!o_screenshot_fn) - o_screenshot_fn= masprintf("%s/#pages#.ppm",get_vardir()); + o_screenshot_fn= masprintf("%s/_pages.ppm",get_vardir()); /* Actually do the work */ + canon_colour_prepare(); + if (o_mode & mf_findwindow) { screenshot_startup(); find_yppclient_window(); } + if (!ocean) ocean= o_ocean; + if (!pirate) pirate= o_pirate; + + if (o_flags & ff_needisland) + if (!ocean) + badusage("need --ocean option when not using actual YPP client window" + " (consider supplying --pirate too)"); + if (ocean) + sysassert(! setenv("YPPSC_OCEAN",ocean,1) ); + if (pirate && (o_flags & ff_dict_pirate)) + sysassert(! setenv("YPPSC_PIRATE",pirate,1) ); + + switch (o_mode & mfm_special) { + case 0: break; + case mode_showcharset: ocr_showcharsets(); exit(0); + default: abort(); + } + if (o_mode & mf_screenshot) { open_screenshot_file("w"); if (o_flags & ff_singlepage) take_one_screenshot(); else take_screenshots(); + progress_log("OK for you to move the mouse now, and you can" + " use the YPP client again."); } if (o_mode & mf_readscreenshot) { + if ((o_flags & ff_upload) && !(o_flags & ff_testservers)) + badusage("must not reuse screenshots for upload to live PCTB database"); open_screenshot_file("r"); if (o_flags & ff_singlepage) read_one_screenshot(); else read_screenshots(); } if (o_mode & mf_analyse) { - find_islandname(); - if (o_outputmode) - run_analysis(); - else - analyse(stdout); + if (o_flags & ff_needisland) { + find_islandname(); + if (o_flags & ff_printisland) + 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(); + } } + progress_log("Finished."); return 0; } @@ -339,7 +419,7 @@ void sysassert_fail(const char *file, int line, const char *what) { _exit(16); } -void waitpid_check_exitstatus(pid_t pid, const char *what) { +void waitpid_check_exitstatus(pid_t pid, const char *what, int sigpipeok) { pid_t got; int st; for (;;) { @@ -354,8 +434,9 @@ void waitpid_check_exitstatus(pid_t pid, const char *what) { 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)":""); + if (!sigpipeok || WTERMSIG(st) != SIGPIPE) + 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); }