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:
M | special.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;
}