+const char *get_libdir(void) { return "."; }
+
+
+enum mode {
+ mf_findwindow= 00001,
+ mf_screenshot= 00010,
+ mf_readscreenshot= 00020,
+ mf_analyse= 00100,
+ mfm_special= 07000,
+
+ mode_findwindow= 00001,
+ mode_screenshot= 00011,
+ mode_analyse= 00120,
+ mode_showcharset= 01000,
+
+ 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 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_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) {
+ fputs("bad usage: ",stderr);
+ vfprintf(stderr,fmt,al);
+ fputc('\n',stderr);
+ exit(12);
+}
+DEFINE_VWRAPPERF(static, badusage, NORET);
+
+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_screenshot_fn, strerror(errno));
+}
+
+static void run_analysis(void) {
+ FILE *tf;
+
+ sysassert( tf= tmpfile() );
+ progress("running recognition...");
+ analyse(tf);
+
+ if (o_flags & ff_upload) {
+ 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_outmode_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);
+ }
+
+ waitpid_check_exitstatus(processor, "output processor/uploader", 0);
+ fclose(tf);
+ progress_log("all complete.");
+}
+
+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%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, "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"); }