xref: /original-bsd/old/ratfor/r2.c (revision c3e32dec)
1 /*-
2  * %sccs.include.proprietary.c%
3  */
4 
5 #ifndef lint
6 static char sccsid[] = "@(#)r2.c	8.1 (Berkeley) 06/06/93";
7 #endif /* not lint */
8 
9 #include "r.h"
10 
11 extern int hollerith;
12 
13 char	outbuf[80];
14 int	outp	= 0;
15 int	cont	= 0;
16 int	contchar	= '&';
17 
18 char	comment[320];
19 int	comptr	= 0;
20 int	indent	= 0;
21 
22 outdon() {
23 	outbuf[outp] = '\0';
24 	if (outp > 0)
25 		fprintf(outfil, "%s\n", outbuf);
26 	outp = cont = 0;
27 }
28 
29 putcom(s) char *s; {
30 	if (printcom) {
31 		ptc('c');
32 		outtab();
33 		pts(s);
34 		outdon();
35 	}
36 }
37 
38 outcode(xp) char *xp; {
39 	register c, c1, j;
40 	char *q, *p;
41 
42 	p = (char *) xp;	/* shut lint up */
43 	if (cont == 0 && comptr > 0)	/* flush comment if not on continuation */
44 		flushcom();
45 	while( (c = *p++) ){
46 		c1 = *p;
47 		if (type[c] == LET || type[c] == DIG) {
48 			pts(p-1);
49 			break;
50 		}
51 		switch(c){
52 
53 		case '"': case '\'':
54 			j = 0;
55 			for (q=p; *q; q++) {
56 				if (*q == '\\')
57 					q++;
58 				j++;
59 			}
60 			if (outp+j+2 > 71)
61 				contcard();
62 			if (hollerith) {
63 				outnum(--j);
64 				ptc('h');
65 			} else
66 				ptc(c);
67 			while (*p != c) {
68 				if (*p == '\\')
69 					p++;
70 				ptc(*p++);
71 			}
72 			if (!hollerith)
73 				ptc(c);
74 			p++;
75 			break;
76 		case '$': case '\\':
77 			if (strlen(p-1)+outp > 71)
78 				contcard();
79 			if (c1 == '"' || c1 == '\'') {
80 				ptc(c1);
81 				p++;
82 			} else
83 				for (p--; *p; p++)
84 					ptc(*p);
85 			break;
86 		case '%':
87 			outp = 0;
88 			while (*p)
89 				ptc(*p++);
90 			break;
91 		case '>':
92 			if( c1=='=' ){
93 				pts(".ge."); p++;
94 			} else
95 				pts(".gt.");
96 			break;
97 		case '<':
98 			if( c1=='=' ){
99 				pts(".le."); p++;
100 			} else if( c1=='>' ){
101 				pts(".ne."); p++;
102 			} else
103 				pts(".lt.");
104 			break;
105 		case '=':
106 			if( c1=='=' ){
107 				pts(".eq."); p++;
108 			} else
109 				ptc('=');
110 			break;
111 		case '!': case '^':
112 			if( c1=='=' ){
113 				pts(".ne."); p++;
114 			} else
115 				pts(".not.");
116 			break;
117 		case '&':
118 			if( c1=='&' )
119 				p++;
120 			pts(".and.");
121 			break;
122 		case '|':
123 			if( c1=='|' )
124 				p++;
125 			pts(".or.");
126 			break;
127 		case '\t':
128 			outtab();
129 			break;
130 		case '\n':
131 			ptc(' ');
132 			break;
133 		default:
134 			ptc(c);
135 			break;
136 		}
137 	}
138 }
139 
140 ptc(c) char c; {
141 	if( outp > 71 )
142 		contcard();
143 	outbuf[outp++] = c;
144 }
145 
146 pts(s) char *s; {
147 	if (strlen(s)+outp > 71)
148 		contcard();
149 	while(*s)
150 		ptc(*s++);
151 }
152 
153 contcard(){
154 	int n;
155 	outbuf[outp] = '\0';
156 	fprintf(outfil, "%s\n", outbuf);
157 	n = 6;
158 	if (printcom) {
159 		n += INDENT * indent + 1;
160 		if (n > 35) n = 35;
161 	}
162 	for( outp=0; outp<n; outbuf[outp++] = ' ' );
163 	outbuf[contfld-1] = contchar;
164 	cont++;
165 	if (cont > 19)
166 		error("more than 19 continuation cards");
167 }
168 
169 outtab(){
170 	int n;
171 	n = 6;
172 	if (printcom) {
173 		n += INDENT * indent;
174 		if (n > 35) n = 35;
175 	}
176 	while (outp < n)
177 		ptc(' ');
178 }
179 
180 outnum(n) int n; {
181 	int a;
182 	if( a = n/10 )
183 		outnum(a);
184 	ptc(n%10 + '0');
185 }
186 
187 outcont(n) int n; {
188 	transfer = 0;
189 	if (n == 0 && outp == 0)
190 		return;
191 	if( n > 0 )
192 		outnum(n);
193 	outcode("\tcontinue");
194 	outdon();
195 }
196 
197 outgoto(n) int n; {
198 	if (transfer != 0)
199 		return;
200 	outcode("\tgoto ");
201 	outnum(n);
202 	outdon();
203 }
204 
205 flushcom() {
206 	int i, j;
207 	if (printcom == 0)
208 		comptr = 0;
209 	else if (cont == 0 && comptr > 0) {
210 		for (i=j=0; i < comptr; i++)
211 			if (comment[i] == '\n') {
212 				comment[i] = '\0';
213 				fprintf(outfil, "%s\n", &comment[j]);
214 				j = i + 1;
215 			}
216 		comptr = 0;
217 	}
218 }
219