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=4a663b18cd4c6d728ceff29ef35a5b1875e797a0;hp=8b12f3a06c62f19214658dd2a1870e63bcbbe4a0;hb=52210ae670b22ce2d187bd2dc943fd8ae3f4a8c0;hpb=4d7eb93b7c82da31f928349ac7c6cd551d78ca57 diff --git a/pctb/convert.c b/pctb/convert.c index 8b12f3a..4a663b1 100644 --- a/pctb/convert.c +++ b/pctb/convert.c @@ -1,25 +1,24 @@ #include "convert.h" - void debug_flush(void) { - eassert(!fflush(debug)); - eassert(!ferror(debug)); + sysassert(!ferror(debug)); + sysassert(!fflush(debug)); } - const char *get_vardir(void) { return "."; } static enum { - mf_findwindow= 01, - mf_screenshot= 02, - mf_analyse= 04, + mf_findwindow= 0001, + mf_screenshot= 0010, + mf_readscreenshot= 0020, + mf_analyse= 0100, - mode_findwindow= 01, - mode_screenshot= 03, - mode_analyse= 04, + mode_findwindow= 0001, + mode_screenshot= 0011, + mode_analyse= 0120, - mode_all= 07, + mode_all= 0111, } o_mode= mode_all; static char *o_screenshots_fn; @@ -27,10 +26,29 @@ static int o_single_page, o_quiet; FILE *screenshots_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); + exit(12); +} + +static void open_screenshots_file(const char *mode) { + screenshots_file= fopen(o_screenshots_fn, mode); + if (!screenshots_file) + fatal("could not open screenshots file `%s': %s", + o_screenshots_fn, strerror(errno)); +} + int main(int argc, char **argv) { const char *arg; int r; +#define ARGVAL ((*++argv) ? *argv : \ + badusage("missing value for option %s",arg),(char*)0) + while ((arg=*++argv)) { if (!strcmp(arg,"--find-window-only")) o_mode= mode_findwindow; @@ -43,7 +61,7 @@ int main(int argc, char **argv) { else if (!strcmp(arg,"--quiet")) o_quiet= 1; else if (!strcmp(arg,"--screenshots-file")) - eassert( o_screenshots_fn= *++argv ); + o_screenshots_fn= ARGVAL; #define DF(f) \ else if (!strcmp(arg,"-D" #f)) \ debug_flags |= dbg_##f; @@ -51,17 +69,16 @@ int main(int argc, char **argv) { #undef DF else if (!strcmp(arg,"--window-id")) { char *ep; - eassert((arg=*++argv)); - unsigned long windowid= strtoul(arg,&ep,0); - eassert(!*ep); + unsigned long windowid= strtoul(ARGVAL,&ep,0); + if (*ep) badusage("invalid window id"); set_yppclient_window(windowid); } else - eassert(!"bad option"); + badusage("unknown option `%s'",arg); } if (!o_screenshots_fn) { r= asprintf(&o_screenshots_fn,"%s/#pages#.ppm",get_vardir()); - eassert(r>=0); eassert(o_screenshots_fn); + sysassert(r>=0); } if (o_mode & mf_findwindow) { @@ -69,11 +86,12 @@ int main(int argc, char **argv) { find_yppclient_window(); } if (o_mode & mf_screenshot) { - screenshots_file= fopen(o_screenshots_fn, "w"); eassert(screenshots_file); + open_screenshots_file("w"); if (o_single_page) take_one_screenshot(); else take_screenshots(); - } else { - screenshots_file= fopen(o_screenshots_fn, "r"); eassert(screenshots_file); + } + if (o_mode & mf_readscreenshot) { + open_screenshots_file("r"); if (o_single_page) read_one_screenshot(); else read_screenshots(); } @@ -87,10 +105,11 @@ int main(int argc, char **argv) { -DEFINE_VWRAPPERF(, progress) -DEFINE_VWRAPPERF(, progress_log) -DEFINE_VWRAPPERF(, progress_spinner) -DEFINE_VWRAPPERF(, warning) +DEFINE_VWRAPPERF(, progress, ) +DEFINE_VWRAPPERF(, progress_log, ) +DEFINE_VWRAPPERF(, progress_spinner, ) +DEFINE_VWRAPPERF(, warning, ) +DEFINE_VWRAPPERF(, fatal, NORET) static int last_progress_len; @@ -104,7 +123,6 @@ static void vprogress_core(int spinner, const char *fmt, va_list al) { putc('\r',stderr); r= vfprintf(stderr,fmt,al); - eassert(r>=0); if (spinner) { putc(spinner,stderr); @@ -117,7 +135,8 @@ static void vprogress_core(int spinner, const char *fmt, va_list al) { else while (last_progress_len-- > r) putc('\b',stderr); } last_progress_len= r; - fflush(stderr); + + if (ferror(stderr) || fflush(stderr)) _exit(16); } void vprogress(const char *fmt, va_list al) { vprogress_core(0,fmt,al); } @@ -141,7 +160,41 @@ void vprogress_log(const char *fmt, va_list al) { void vwarning(const char *fmt, va_list al) { progress(""); - fputs("warning: ",stderr); + fputs("Warning: ",stderr); vfprintf(stderr,fmt,al); + fputs("\n",stderr); fflush(stderr); } + +void vfatal(const char *fmt, va_list al) { + progress(""); + fputs("\n\nFatal error: ",stderr); + vfprintf(stderr,fmt,al); + fflush(stderr); + fputs("\n\n",stderr); + _exit(4); +} + +void sysassert_fail(const char *file, int line, const char *what) { + int e= errno; + progress(""); + fprintf(stderr, + "\nfatal operational error:\n" + " unsuccessful execution of: %s\n" + " %s:%d: %s\n\n", + what, file,line, strerror(e)); + _exit(16); +} + +void *mmalloc(size_t sz) { + void *r; + if (!sz) return 0; + sysassert( r= malloc(sz) ); + return r; +} +void *mrealloc(void *p, size_t sz) { + assert(sz); + void *r; + sysassert( r= realloc(p,sz) ); + return r; +}