mode_all= 0111,
} o_mode= mode_all;
-static char *o_screenshots_fn;
+static char *o_screenshot_fn;
static int o_single_page, o_quiet;
+static const char *o_outputmode= "upload";
-FILE *screenshots_file;
+FILE *screenshot_file;
-static void badusage(const char *fmt, ...)
- __attribute__((format(printf,1,2),noreturn));
-static void badusage(const char *fmt, ...) {
- va_list al;
- va_start(al,fmt);
+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_screenshots_file(const char *mode) {
- screenshots_file= fopen(o_screenshots_fn, mode);
- if (!screenshots_file)
+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_screenshots_fn, strerror(errno));
+ o_screenshot_fn, strerror(errno));
}
+static void run_analysis(void) {
+ FILE *tf;
+
+ sysassert( tf= tmpfile() );
+ progress("running recognition...");
+ analyse(tf);
+
+ sysassert( fseek(tf,0,SEEK_SET) == 0);
+
+ progress_log("processing results (--%s)...", o_outputmode);
+ 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");
+ }
+
+ waitpid_check_exitstatus(processor, "output processor/uploader");
+ fclose(tf);
+ progress_log("all complete.");
+}
+
int main(int argc, char **argv) {
const char *arg;
int r;
#define ARGVAL ((*++argv) ? *argv : \
- badusage("missing value for option %s",arg),(char*)0)
+ (badusage("missing value for option %s",arg),(char*)0))
while ((arg=*++argv)) {
if (!strcmp(arg,"--find-window-only"))
o_mode= mode_findwindow;
else if (!strcmp(arg,"--screenshot-only"))
o_mode= mode_screenshot;
- else if (!strcmp(arg,"--analyse-only"))
+ else if (!strcmp(arg,"--analyse-only") ||
+ !strcmp(arg,"--same"))
o_mode= mode_analyse;
else if (!strcmp(arg,"--single-page"))
o_single_page= 1;
else if (!strcmp(arg,"--quiet"))
o_quiet= 1;
- else if (!strcmp(arg,"--screenshots-file"))
- o_screenshots_fn= ARGVAL;
+ else if (!strcmp(arg,"--raw-tsv"))
+ o_outputmode= 0;
+ else if (!strcmp(arg,"--upload") ||
+ !strcmp(arg,"--arbitrage") ||
+ !strcmp(arg,"--tsv") ||
+ !strcmp(arg,"--best-prices"))
+ o_outputmode= arg+2;
+ else if (!strcmp(arg,"--screenshot-file"))
+ o_screenshot_fn= ARGVAL;
#define DF(f) \
else if (!strcmp(arg,"-D" #f)) \
debug_flags |= dbg_##f;
badusage("unknown option `%s'",arg);
}
- if (!o_screenshots_fn) {
- r= asprintf(&o_screenshots_fn,"%s/#pages#.ppm",get_vardir());
+ if (!o_screenshot_fn) {
+ r= asprintf(&o_screenshot_fn,"%s/#pages#.ppm",get_vardir());
sysassert(r>=0);
}
find_yppclient_window();
}
if (o_mode & mf_screenshot) {
- open_screenshots_file("w");
+ open_screenshot_file("w");
if (o_single_page) take_one_screenshot();
else take_screenshots();
}
if (o_mode & mf_readscreenshot) {
- open_screenshots_file("r");
+ open_screenshot_file("r");
if (o_single_page) read_one_screenshot();
else read_screenshots();
}
if (o_mode & mf_analyse) {
- analyse();
- //output_tsv();
+ if (o_outputmode)
+ run_analysis();
+ else
+ analyse(stdout);
}
return 0;
}
sysassert( r= realloc(p,sz) );
return r;
}
+
+void waitpid_check_exitstatus(pid_t pid, const char *what) {
+ pid_t got;
+ int st;
+ for (;;) {
+ got= waitpid(pid, &st, 0);
+ if (pid==-1) { sysassert(errno==EINTR); continue; }
+ break;
+ }
+ sysassert( got==pid );
+
+ if (WIFEXITED(st)) {
+ if (WEXITSTATUS(st))
+ 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)":"");
+ } else {
+ fatal("%s gave strange wait status %d", what, st);
+ }
+}