home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / tex / dvivga9.arc / INCH.H < prev    next >
C/C++ Source or Header  |  1988-05-30  |  3KB  |  105 lines

  1. /* -*-C-*- inch.h */
  2. /*-->inch*/
  3. /**********************************************************************/
  4. /******************************** inch ********************************/
  5. /**********************************************************************/
  6.  
  7. float
  8. inch(s)
  9. char *s;
  10.  
  11. /***********************************************************************
  12. Convert a value field in s[] of the form
  13.  
  14.     ------        ------------------------------
  15.     value            units implied
  16.     ------        ------------------------------
  17.     #.##bp        big point (1in = 72bp)
  18.     #.##cc        cicero (1cc = 12dd)
  19.     #.##cm        centimeter
  20.     #.##dd        didot point (1157dd = 1238pt)
  21.     #.##in        inch
  22.     #.##mm        millimeter (10mm = 1cm)
  23.     #.##pc        pica (1pc = 12pt)
  24.     #.##pt        point (72.27pt = 1in)
  25.     #.##sp        scaled point (65536sp = 1pt)
  26.     ------        ------------------------------
  27.  
  28. to inches, returning it as the function value.  A leading plus or  minus
  29. sign is optional.  The letter case of the dimension name is ignored.  No
  30. space is permitted between the number and the dimension.
  31. ***********************************************************************/
  32.  
  33. {
  34.     BOOLEAN neg;
  35.     register char *tc;
  36.     register double flnum, pten;
  37.  
  38.     flnum = 0.0;
  39.     tc = s;
  40.     neg = FALSE;
  41.  
  42.     if (*tc == '-')
  43.     {
  44.     ++tc;
  45.     neg = TRUE;
  46.     }
  47.     else if (*tc == '+')
  48.     {
  49.     ++tc;
  50.     neg = FALSE;
  51.     }
  52.  
  53.     /* we do not use sprintf() here because we want to be able to easily
  54.     find the dimension string */
  55.  
  56.     for (; isdigit(*tc); ++tc)    /* collect integer part */
  57.     flnum = flnum*10.0 + (double)((*tc) - '0');
  58.  
  59.     if (*tc == '.')            /* collect fractional part */
  60.     for ((pten = 10.0, ++tc); isdigit(*tc); (pten *= 10.0,++tc))
  61.         flnum += ((double)((*tc) - '0'))/pten;
  62.  
  63.     if (strcm2(tc,"in") == 0)        /* inches */
  64.     ;
  65.     else if (strcm2(tc,"cm") == 0)    /* centimeters */
  66.     flnum /= 2.54;
  67.     else if (strcm2(tc,"pt") == 0)    /* points */
  68.     flnum /= 72.27;
  69.     else if (strcm2(tc,"bp") == 0)    /* big points */
  70.     flnum /= 72.0;
  71.     else if (strcm2(tc,"cc") == 0)    /* cicero */
  72.     flnum *= 12.0 * (1238.0 / 1157.0) / 72.27;
  73.     else if (strcm2(tc,"dd") == 0)    /* didot points */
  74.     flnum *= (1238.0 / 1157.0) / 72.27;
  75.     else if (strcm2(tc,"mm") == 0)    /* millimeters */
  76.     flnum /= 25.4;
  77.     else if (strcm2(tc,"pc") == 0)    /* pica */
  78.     flnum *= 12.0 / 72.27;
  79.     else if (strcm2(tc,"sp") == 0)    /* scaled points */
  80.     flnum /= (65536.0 * 72.27);
  81.     else                /* unknown units -- error */
  82.  
  83. #if    PXLID                            /* must be in DVI driver */
  84.     {
  85.     (void)sprintf(message,
  86.         "inch():  Unrecognized dimension string [%s];\nexpected one of \
  87. bp, cc, cm, dd, in, mm, pc, pt or sp\n",s);
  88.         (void)fatal(message);
  89.     }
  90. #else                                   /* some other program then */
  91.     {
  92.         (void)fprintf(stderr,"inch():  Unrecognized dimension string [%s];",s);
  93.     NEWLINE(stderr);
  94.     (void)fprintf(stderr,
  95.         "expected one of bp, cc, cm, dd, in, mm, pc, pt or sp");
  96.     NEWLINE(stderr);
  97.         EXIT(1);
  98.     }
  99. #endif
  100.  
  101.     if (neg)
  102.     flnum = -flnum;
  103.     return((float)flnum);
  104. }
  105.