wdvi

network DVI viewer
Log | Files | Refs

commit ac7a3840bc033cee335f721b02fcba7d37ca9e09
parent 62b6a0f52fa7bfcece13b42102fcb98f6e15ae86
Author: Kyle Milz <krwmilz@gmail.com>
Date:   Mon, 13 Mar 2023 03:37:26 +0000

replace lots of hand rolled parsing code with scanf()

Diffstat:
Mspecial.c | 80++++++++++++++++++-------------------------------------------------------------
1 file changed, 18 insertions(+), 62 deletions(-)

diff --git a/special.c b/special.c @@ -944,30 +944,16 @@ color_special(const char *cp) static int -atopix(const char *arg, Boolean allow_minus) +atopix(const float val, const char unit[2]) { - int len = strlen(arg); - const char *arg_end = arg; - char tmp[11]; double factor; - if (allow_minus && *arg_end == '-') - ++arg_end; - while ((*arg_end >= '0' && *arg_end <= '9') || *arg_end == '.') - if (arg_end >= arg + XtNumber(tmp) - 1) - return 0; - else - ++arg_end; - bcopy(arg, tmp, arg_end - arg); - tmp[arg_end - arg] = '\0'; - #if A4 factor = 1.0 / 2.54; /* cm */ #else factor = 1.0; /* inches */ #endif - if (len > 2) - switch (arg[len - 2] << 8 | arg[len - 1]) { + switch (unit[0] << 8 | unit[1]) { #if A4 case 'i' << 8 | 'n': factor = 1.0; break; #else @@ -981,63 +967,33 @@ atopix(const char *arg, Boolean allow_minus) case 'c' << 8 | 'c': factor = 12 * 1238.0 / 1157.0 / 72.27; break; case 's' << 8 | 'p': factor = 1.0 / 72.27 / 65536; break; - } - - return (int) (factor * atof(tmp) * pixels_per_inch + 0.5); -} - - -static unsigned int -myatopix(const char **pp) -{ - unsigned int value; - const char *cp = *pp; - char scr[16]; - const char *p0, *p1; - - p0 = cp; - while ((*cp >= '0' && *cp <= '9') || *cp == '.') - ++cp; - p1 = cp; - while (isspace(*cp)) - ++cp; - if (*cp >= 'a' && *cp <= 'z' && cp[1] >= 'a' && cp[1] <= 'z') { - /* if units are present */ - if (p1 - p0 <= XtNumber(scr) - 3) { - sprintf(scr, "%.*s%c%c", (int) (p1 - p0), p0, *cp, cp[1]); - value = atopix(scr, False); - } - else value = 0; - cp += 2; } - else - value = atopix(p0, False); - *pp = cp; - return value; + return (int) (factor * val * pixels_per_inch + 0.5); } static void -scan_papersize(const char *cp0) +scan_papersize(const char *cp) { - const char *cp = cp0; + float wf, hf; + char wu[3], hu[3]; unsigned int w, h; - double mag = 1.; - w = myatopix(&cp) * mag + 0.5; - - while (isspace(*cp)) ++cp; - if (*cp == ',') - do ++cp; while (isspace(*cp)); + if (sscanf(cp, "%f%2s,%f%2s", &wf, wu, &hf, hu) != 4) { + warnx("error parsing papersize special '%s'", cp); + return; + } - h = myatopix(&cp) * mag + 0.5; + w = atopix(wf, wu); + h = atopix(hf, hu); - if (w == 0 || h == 0) - warnx("invalid papersize special '%s'", cp0); - else { - page_info[scanned_page + 1].pw = page_info[scanned_page + 1].ww = w; - page_info[scanned_page + 1].ph = page_info[scanned_page + 1].wh = h; + if (w == 0 || h == 0) { + warnx("invalid papersize special '%s'", cp); + return; } + + page_info[scanned_page + 1].pw = page_info[scanned_page + 1].ww = w; + page_info[scanned_page + 1].ph = page_info[scanned_page + 1].wh = h; }