]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
<rdar://problem/14065748> pwgMediaForPWG: roll_max_36.1025x3622.0472in becomes 91700...
authormsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Wed, 5 Jun 2013 17:25:22 +0000 (17:25 +0000)
committermsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Wed, 5 Jun 2013 17:25:22 +0000 (17:25 +0000)
Convert fractional portion separately to avoid integer overflow.

git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@11011 a1ca3aef-8c08-0410-bb20-df032aa958be

cups/pwg-media.c
cups/testpwg.c

index 3a4cb970938d9aca63af5e25c5b5bbd13d08543c..49f69297f15ec0f32fff48cfd0bf0004d419d2f4 100644 (file)
@@ -1132,6 +1132,7 @@ pwg_scan_measurement(
     int        denom)                  /* I - Denominator from units */
 {
   int  value = 0,                      /* Measurement value */
+       fractional = 0,                 /* Fractional value */
        divisor = 1,                    /* Fractional divisor */
        digits = 10 * numer * denom;    /* Maximum fractional value to read */
 
@@ -1153,7 +1154,7 @@ pwg_scan_measurement(
 
     while (divisor < digits && *buf >= '0' && *buf <= '9')
     {
-      value = value * 10 + (*buf++) - '0';
+      fractional = fractional * 10 + (*buf++) - '0';
       divisor *= 10;
     }
 
@@ -1168,7 +1169,7 @@ pwg_scan_measurement(
   if (bufptr)
     *bufptr = (char *)buf;
 
-  return (value * numer / denom / divisor);
+  return (value * numer / denom + fractional * numer / denom / divisor);
 }
 
 
index b3d5cead52fddfcca1949036e30e32e1639552a1..58f6f73e4a3358fab61a9f27f2e7d52d206488cd 100644 (file)
@@ -170,6 +170,20 @@ main(int  argc,                            /* I - Number of command-line args */
   else
     puts("PASS");
 
+  fputs("pwgMediaForPWG(\"roll_max_36.1025x3622.0472in\"): ", stdout);
+  if ((pwgmedia = pwgMediaForPWG("roll_max_36.1025x3622.0472in")) == NULL)
+  {
+    puts("FAIL (not found)");
+    status ++;
+  }
+  else if (pwgmedia->width != 91700 || pwgmedia->length != 9199999)
+  {
+    printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
+    status ++;
+  }
+  else
+    printf("PASS (%dx%d)\n", pwgmedia->width, pwgmedia->length);
+
   fputs("pwgMediaForLegacy(\"na-letter\"): ", stdout);
   if ((pwgmedia = pwgMediaForLegacy("na-letter")) == NULL)
   {