const char *get_libdir(void) { return "."; }
-enum mode {
- mf_findwindow= 0001,
- mf_screenshot= 0010,
- mf_readscreenshot= 0020,
- mf_analyse= 0100,
-
- mode_findwindow= 0001,
- mode_screenshot= 0011,
- mode_analyse= 0120,
-
- mode_all= 0111,
-};
-
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_ocean, *o_pirate;
int o_quiet;
-enum flags o_flags= ff_dict_fetch|ff_dict_submit|ff_dict_pirate;
+static pid_t screenshot_compressor=-1;
+
+enum mode o_mode= mode_all;
+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) {
}
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 open_screenshot_file(int for_write) {
+ if (!fnmatch("*.gz",o_screenshot_fn,0)) {
+ int mode= for_write ? O_WRONLY|O_CREAT|O_TRUNC : O_RDONLY;
+ sysassert(! gzopen(o_screenshot_fn, mode, &screenshot_file,
+ &screenshot_compressor, "-1") );
+ } else {
+ screenshot_file= fopen(o_screenshot_fn, for_write ? "w" : "r");
+ if (!screenshot_file)
+ fatal("could not open screenshots file `%s': %s",
+ o_screenshot_fn, strerror(errno));
+ }
}
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?");
}
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, "rsync");
+ 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 *defvalue_test,
const char *userspecified,
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);
IS("--best-prices")) o_outmode_kind=omk_str,
o_outmode_str=arg+2;
- else if (IS("--screenshot-file")) o_screenshot_fn= ARGVAL;
+ 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;
o_outmode_kind= omk_none;
o_flags |= ff_singlepage;
} else {
- o_outmode_kind= omk_str;
+ o_outmode_kind= omk_upload;
}
}
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.gz", get_vardir());
/* Actually do the work */
+ canon_colour_prepare();
+
if (o_mode & mf_findwindow) {
screenshot_startup();
find_yppclient_window();
if (o_flags & ff_needisland)
if (!ocean)
- badusage("need --ocean option when replaying images"
+ 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");
+ open_screenshot_file(1);
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.");
+ progress("Finishing handling screenshots...");
+ gzclose(&screenshot_file,&screenshot_compressor,"screenshots output");
}
if (o_mode & mf_readscreenshot) {
- open_screenshot_file("r");
+ if ((o_flags & ff_upload) && !(o_flags & ff_testservers))
+ badusage("must not reuse screenshots for upload to live PCTB database");
+ open_screenshot_file(0);
if (o_flags & ff_singlepage) read_one_screenshot();
else read_screenshots();
+ gzclose(&screenshot_file,&screenshot_compressor,"screenshots input");
}
if (o_mode & mf_analyse) {
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;
int r;
if (o_quiet) return;
- if (!isatty(2)) return;
+ if (!debug_flags && !isatty(2)) return;
if (last_progress_len)
putc('\r',stderr);
_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 (;;) {
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);
}