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