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