summaryrefslogtreecommitdiff
path: root/dviware/beebe/src/inch.h
blob: d99a7ece10c188b1de33eb58105fc8d487141f78 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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);
}