home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3.4.17 [SPARC, PA-RISC] / nextstep33_risc.iso / NextLibrary / TeX / tex / src / texview / papersiz.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-02-07  |  2.8 KB  |  123 lines

  1. /*
  2.  *   This function calculates approximately (whole + num/den) * sf.
  3.  *   No need for real extreme accuracy; one twenty thousandth of an
  4.  *   inch should be sufficient.
  5.  *
  6.  *   No `sf' parameter means to use an old one; inches are assumed
  7.  *   originally.
  8.  *
  9.  *   Assumptions:
  10.  *
  11.  *      0 <= num < den <= 20000
  12.  *      0 <= whole
  13.  */
  14. void error() ;
  15. static long scale(whole, num, den, sf)
  16. long whole, num, den, sf ;
  17. {
  18.    long v ;
  19.  
  20.    v = whole * sf + num * (sf / den) ;
  21.    if (v / sf != whole || v < 0 || v > 0x40000000L)
  22.       error("! arithmetic overflow in parameter") ;
  23.    sf = sf % den ;
  24.    v += (sf * num * 2 + den) / (2 * den) ;
  25.    return(v) ;
  26. }
  27. /*
  28.  *   Convert a sequence of digits into a long; return -1 if no digits.
  29.  *   Advance the passed pointer as well.
  30.  */
  31. static long myatol(s)
  32. char **s ;
  33. {
  34.    register char *p ;
  35.    register long result ;
  36.  
  37.    result = 0 ;
  38.    p = *s ;
  39.    while ('0' <= *p && *p <= '9') {
  40.       if (result > 100000000)
  41.          error("! arithmetic overflow in parameter") ;
  42.       result = 10 * result + *p++ - '0' ;
  43.    }
  44.    if (p == *s) {
  45.       error("expected number!  returning 10") ;
  46.       return 10 ;
  47.    } else {
  48.       *s = p ;
  49.       return(result) ;
  50.    }
  51. }
  52. /*
  53.  *   Get a dimension, allowing all the various extensions, and
  54.  *   defaults.  Returns a value in scaled points.
  55.  */
  56. static long scalevals[] = { 1864680L, 65536L, 786432L, 186468L,
  57.                             1L, 65782L, 70124L, 841489L, 4736286L } ;
  58. static char *scalenames = "cmptpcmmspbpddccin" ;
  59. long myatodim(s)
  60. char **s ;
  61. {
  62.    register long w, num, den, sc ;
  63.    register char *q ;
  64.    char *p ;
  65.    int negative = 0, i ;
  66.  
  67.    p = *s ;
  68.    if (**s == '-') {
  69.       p++ ;
  70.       negative = 1 ;
  71.    }
  72.    w = myatol(&p) ;
  73.    if (w < 0) {
  74.       error("number too large; 1000 used") ;
  75.       w = 1000 ;
  76.    }
  77.    num = 0 ;
  78.    den = 1 ;
  79.    if (*p == '.') {
  80.       p++ ;
  81.       while ('0' <= *p && *p <= '9') {
  82.          if (den <= 1000) {
  83.             den *= 10 ;
  84.             num = num * 10 + *p - '0' ;
  85.          } else if (den == 10000) {
  86.             den *= 2 ;
  87.             num = num * 2 + (*p - '0') / 5 ;
  88.          }
  89.          p++ ;
  90.       }
  91.    }
  92.    while (*p == ' ')
  93.       p++ ;
  94.    for (i=0, q=scalenames; ; i++, q += 2)
  95.       if (*q == 0) {
  96.          error("expected units!  assuming inches.") ;
  97.          sc = scalevals[8] ;
  98.          break ;
  99.       } else if (*p == *q && p[1] == q[1]) {
  100.          sc = scalevals[i] ;
  101.          p += 2 ;
  102.          break ;
  103.       }
  104.    w = scale(w, num, den, sc) ;
  105.    *s = p ;
  106.    return(negative?-w:w) ;
  107. }
  108. /*
  109.  *   The routine where we handle the paper size special.  We need to pass in
  110.  *   the string after the `papersize=' specification.
  111.  */
  112. void handlepapersize(p, x, y)
  113. char *p ;
  114. long *x, *y ;
  115.    while (*p == ' ')
  116.       p++ ;
  117.    *x = myatodim(&p) ;
  118.    while (*p == ' ' || *p == ',')
  119.       p++ ;
  120.    *y = myatodim(&p) ;
  121. }
  122.