xref: /original-bsd/old/eqn/common_source/shift.c (revision e59fb703)
1 /*-
2  * Copyright (c) 1991 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.proprietary.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)shift.c	4.4 (Berkeley) 04/17/91";
10 #endif /* not lint */
11 
12 # include "e.h"
13 #include "e.def"
14 
15 bshiftb(p1, dir, p2) int p1, dir, p2; {
16 	int shval, d1, h1, b1, h2, b2;
17 #ifndef NEQN
18 	int diffps, effps, effps2;
19 	char *sh1, *sh2;
20 #endif NEQN
21 
22 	yyval = p1;
23 	h1 = eht[p1];
24 	b1 = ebase[p1];
25 	h2 = eht[p2];
26 	b2 = ebase[p2];
27 #ifndef NEQN
28 	effps = EFFPS(ps);
29 	effps2 = EFFPS(ps+deltaps);
30 	diffps = deltaps;
31 	sh1 = sh2 = "";
32 #endif NEQN
33 	if( dir == SUB ) {	/* subscript */
34 #ifndef NEQN
35 		/* top 1/2m above bottom of main box */
36 		d1 = VERT( (effps2*6)/2 );
37 #else NEQN
38 		d1 = VERT(1);
39 #endif NEQN
40 		shval = - d1 + h2 - b2;
41 		if( d1+b1 > h2 ) /* move little sub down */
42 			shval = b1-b2;
43 		ebase[yyval] = b1 + max(0, h2-b1-d1);
44 		eht[yyval] = h1 + max(0, h2-b1-d1);
45 #ifndef NEQN
46 		if (rfont[p1] == ITAL && lfont[p2] == ROM)
47 			sh1 = "\\|";
48 		if (rfont[p2] == ITAL)
49 			sh2 = "\\|";
50 #endif NEQN
51 	} else {	/* superscript */
52 #ifndef NEQN
53 		/* 4/10 up main box */
54 		d1 = VERT( (effps*6*2)/10 );
55 #else NEQN
56 		d1 = VERT(1);
57 #endif NEQN
58 		ebase[yyval] = b1;
59 #ifndef NEQN
60 		shval = -VERT( (4 * (h1-b1)) / 10 ) - b2;
61 		if( VERT(4*(h1-b1)/10) + h2 < h1-b1 )	/* raise little super */
62 #else NEQN
63 		shval = -VERT(1) - b2;
64 		if( VERT(1) + h2 < h1-b1 )	/* raise little super */
65 #endif NEQN
66 			shval = -(h1-b1) + h2-b2 - d1;
67 #ifndef NEQN
68 		eht[yyval] = h1 + max(0, h2-VERT((6*(h1-b1))/10));
69 		if (rfont[p1] == ITAL)
70 			sh1 = "\\|";
71 		if (rfont[p2] == ITAL)
72 			sh2 = "\\|";
73 #else NEQN
74 		eht[yyval] = h1 + max(0, h2 - VERT(1));
75 #endif NEQN
76 	}
77 	if(dbg)printf(".\tb:b shift b: S%d <- S%d vert %d S%d vert %d; b=%d, h=%d\n",
78 		yyval, p1, shval, p2, -shval, ebase[yyval], eht[yyval]);
79 #ifndef NEQN
80 	printf(".as %d \\v'%du'\\s-%d%s\\*(%d\\s+%d%s\\v'%du'\n",
81 		yyval, shval, diffps, sh1, p2, diffps, sh2, -shval);
82 	ps += deltaps;
83 	if (rfont[p2] == ITAL)
84 		rfont[p1] = 0;
85 	else
86 		rfont[p1] = rfont[p2];
87 #else NEQN
88 	printf(".as %d \\v'%du'\\*(%d\\v'%du'\n",
89 		yyval, shval, p2, -shval);
90 #endif NEQN
91 	ofree(p2);
92 }
93 
94 shift(p1) int p1; {
95 	ps -= deltaps;
96 	yyval = p1;
97 	if(dbg)printf(".\tshift: %d;ps=%d\n", yyval, ps);
98 }
99 
100 shift2(p1, p2, p3) int p1, p2, p3; {
101 	int effps, h1, h2, h3, b1, b2, b3, subsh, d1, d2, supsh, treg;
102 #ifndef NEQN
103 	int effps2;
104 #endif NEQN
105 
106 	treg = oalloc();
107 	yyval = p1;
108 	if(dbg)printf(".\tshift2 s%d <- %d %d %d\n", yyval, p1, p2, p3);
109 	effps = EFFPS(ps+deltaps);
110 #ifndef NEQN
111 	eht[p3] = h3 = VERT( (eht[p3] * effps) / EFFPS(ps) );
112 	ps += deltaps;
113 	effps2 = EFFPS(ps+deltaps);
114 #endif NEQN
115 	h1 = eht[p1]; b1 = ebase[p1];
116 	h2 = eht[p2]; b2 = ebase[p2];
117 #ifndef NEQN
118 	b3 = ebase[p3];
119 	d1 = VERT( (effps2*6)/2 );
120 #else NEQN
121 	h3 = eht[p3]; b3 = ebase[p3];
122 	d1 = VERT(1);
123 #endif NEQN
124 	subsh = -d1+h2-b2;
125 	if( d1+b1 > h2 ) /* move little sub down */
126 		subsh = b1-b2;
127 #ifndef NEQN
128 	supsh = -VERT( (4*(h1-b1))/10 ) - b3;
129 	d2 = VERT( (effps*6*2)/10 );
130 	if( VERT(4*(h1-b1)/10)+h3 < h1-b1 )
131 #else NEQN
132 	supsh = - VERT(1) - b3;
133 	d2 = VERT(1);
134 	if( VERT(1)+h3 < h1-b1 )
135 #endif NEQN
136 		supsh = -(h1-b1) + (h3-b3) - d2;
137 #ifndef NEQN
138 	eht[yyval] = h1 + max(0, h3-VERT( (6*(h1-b1))/10 )) + max(0, h2-b1-d1);
139 #else NEQN
140 	eht[yyval] = h1 + max(0, h3-VERT(1)) + max(0, h2-b1-d1);
141 #endif NEQN
142 	ebase[yyval] = b1+max(0, h2-b1-d1);
143 #ifndef NEQN
144 	if (rfont[p1] == ITAL && lfont[p2] == ROM)
145 		printf(".ds %d \\|\\*(%d\n", p2, p2);
146 	if (rfont[p2] == ITAL)
147 		printf(".as %d \\|\n", p2);
148 #endif NEQN
149 	nrwid(p2, effps, p2);
150 #ifndef NEQN
151 	if (rfont[p1] == ITAL && lfont[p3] == ROM)
152 		printf(".ds %d \\|\\|\\*(%d\n", p3, p3);
153 	else
154 		printf(".ds %d \\|\\*(%d\n", p3, p3);
155 #endif NEQN
156 	nrwid(p3, effps, p3);
157 	printf(".nr %d \\n(%d\n", treg, p3);
158 	printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", p2, treg, treg, p2);
159 #ifndef NEQN
160 	printf(".as %d \\v'%du'\\s%d\\*(%d\\h'-\\n(%du'\\v'%du'\\\n",
161 		p1, subsh, effps, p2, p2, -subsh+supsh);
162 	printf("\\s%d\\*(%d\\h'-\\n(%du+\\n(%du'\\s%d\\v'%du'\n",
163 		effps, p3, p3, treg, effps2, -supsh);
164 #else NEQN
165 	printf(".as %d \\v'%du'\\*(%d\\h'-\\n(%du'\\v'%du'\\\n",
166 		p1, subsh, p2, p2, -subsh+supsh);
167 	printf("\\*(%d\\h'-\\n(%du+\\n(%du'\\v'%du'\n",
168 		p3, p3, treg, -supsh);
169 #endif NEQN
170 	ps += deltaps;
171 #ifndef NEQN
172 	if (rfont[p2] == ITAL)
173 		rfont[yyval] = 0;	/* lie */
174 #endif NEQN
175 	ofree(p2); ofree(p3); ofree(treg);
176 }
177