From 9394bf058a6806354aa119f5c3ef99a1d6ac85f5 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 29 Jul 2009 19:26:48 +0100 Subject: [PATCH] wip yarrg upload too: multiple output modes and set env vars; untested --- yarrg/README | 7 +-- yarrg/convert.c | 124 +++++++++++++++++++++++++++++++++--------------- yarrg/convert.h | 5 ++ 3 files changed, 96 insertions(+), 40 deletions(-) diff --git a/yarrg/README b/yarrg/README index a41493e..f3ff5f6 100644 --- a/yarrg/README +++ b/yarrg/README @@ -65,10 +65,11 @@ Please do not use options marked * with --upload. See README.privacy. Options to override which servers we talk to: --yarrg-server HOST|URL When uploading to YARRG, use HOST or URL. - --pctb-server HOST|URL Talk to the PCTB database at HOST or URL. - --dict-submit-url URL Submit dictionary entries with HTTP POST under URL. + --pctb-server HOST|URL When talking to PCTB, use HOST or URL. + --dict-submit-url URL Submit dictionary updates here (default: use yarrg). --dict-update-from SRC Fetch updated master dictionary with rsync from SRC. -Or set the environment variables YPPSC_YARRG{_PCTB, _DICT_UPDATE, _DICT_SUBMIT} +Or set the environment variables + YPPSC_YARRG{_YARRG, _PCTB, _DICT_UPDATE, _DICT_SUBMIT} Installation requirements diff --git a/yarrg/convert.c b/yarrg/convert.c index 782167f..42467f2 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,19 +99,27 @@ 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); - fclose(tf); + waitpid_check_exitstatus(processor, "output processor/uploader", 0); + fclose(tf); + } + progress_log("all complete."); } @@ -175,6 +190,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 +236,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,36 +268,55 @@ 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/pctb", + "rsync.yarrg.chiark.net/pctb/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) @@ -320,12 +372,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; diff --git a/yarrg/convert.h b/yarrg/convert.h index 6c01118..82ea369 100644 --- a/yarrg/convert.h +++ b/yarrg/convert.h @@ -121,6 +121,11 @@ enum flags { ff_needisland= 001000, ff_printisland= 002000, ff_upload= 004000, + + ff_use_yarrg= 010000, + ff_use_pctb= 020000, + ffm_use= 070000, + ffs_printisland= 003000, ffs_upload= 005000, }; -- 2.30.2