diff options
Diffstat (limited to 'dviware/beebe/src/inch.h')
-rw-r--r-- | dviware/beebe/src/inch.h | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/dviware/beebe/src/inch.h b/dviware/beebe/src/inch.h new file mode 100644 index 0000000000..d99a7ece10 --- /dev/null +++ b/dviware/beebe/src/inch.h @@ -0,0 +1,104 @@ +/* -*-C-*- inch.h */ +/*-->inch*/ +/**********************************************************************/ +/******************************** inch ********************************/ +/**********************************************************************/ + +float +inch(s) +char *s; + +/*********************************************************************** +Convert a value field in s[] of the form + + ------ ------------------------------ + value units implied + ------ ------------------------------ + #.##bp big point (1in = 72bp) + #.##cc cicero (1cc = 12dd) + #.##cm centimeter + #.##dd didot point (1157dd = 1238pt) + #.##in inch + #.##mm millimeter (10mm = 1cm) + #.##pc pica (1pc = 12pt) + #.##pt point (72.27pt = 1in) + #.##sp scaled point (65536sp = 1pt) + ------ ------------------------------ + +to inches, returning it as the function value. A leading plus or minus +sign is optional. The letter case of the dimension name is ignored. No +space is permitted between the number and the dimension. +***********************************************************************/ + +{ + BOOLEAN neg; + register char *tc; + register double flnum, pten; + + flnum = 0.0; + tc = s; + neg = FALSE; + + if (*tc == '-') + { + ++tc; + neg = TRUE; + } + else if (*tc == '+') + { + ++tc; + neg = FALSE; + } + + /* we do not use sprintf() here because we want to be able to easily + find the dimension string */ + + for (; isdigit(*tc); ++tc) /* collect integer part */ + flnum = flnum*10.0 + (double)((*tc) - '0'); + + if (*tc == '.') /* collect fractional part */ + for ((pten = 10.0, ++tc); isdigit(*tc); (pten *= 10.0,++tc)) + flnum += ((double)((*tc) - '0'))/pten; + + if (strcm2(tc,"in") == 0) /* inches */ + ; + else if (strcm2(tc,"cm") == 0) /* centimeters */ + flnum /= 2.54; + else if (strcm2(tc,"pt") == 0) /* points */ + flnum /= 72.27; + else if (strcm2(tc,"bp") == 0) /* big points */ + flnum /= 72.0; + else if (strcm2(tc,"cc") == 0) /* cicero */ + flnum *= 12.0 * (1238.0 / 1157.0) / 72.27; + else if (strcm2(tc,"dd") == 0) /* didot points */ + flnum *= (1238.0 / 1157.0) / 72.27; + else if (strcm2(tc,"mm") == 0) /* millimeters */ + flnum /= 25.4; + else if (strcm2(tc,"pc") == 0) /* pica */ + flnum *= 12.0 / 72.27; + else if (strcm2(tc,"sp") == 0) /* scaled points */ + flnum /= (65536.0 * 72.27); + else /* unknown units -- error */ + +#if PXLID /* must be in DVI driver */ + { + (void)sprintf(message, + "inch(): Unrecognized dimension string [%s];\nexpected one of \ +bp, cc, cm, dd, in, mm, pc, pt or sp\n",s); + (void)fatal(message); + } +#else /* some other program then */ + { + (void)fprintf(stderr,"inch(): Unrecognized dimension string [%s];",s); + NEWLINE(stderr); + (void)fprintf(stderr, + "expected one of bp, cc, cm, dd, in, mm, pc, pt or sp"); + NEWLINE(stderr); + EXIT(1); + } +#endif + + if (neg) + flnum = -flnum; + return((float)flnum); +} |