xref: /csrg-svn/old/ratfor/r2.c (revision 62208)
148064Sbostic /*-
248064Sbostic  * %sccs.include.proprietary.c%
348064Sbostic  */
448064Sbostic 
514503Ssam #ifndef lint
6*62208Sbostic static char sccsid[] = "@(#)r2.c	8.1 (Berkeley) 06/06/93";
748064Sbostic #endif /* not lint */
814503Ssam 
99727Sclemc #include "r.h"
109727Sclemc 
119727Sclemc extern int hollerith;
129727Sclemc 
139727Sclemc char	outbuf[80];
149727Sclemc int	outp	= 0;
159727Sclemc int	cont	= 0;
169727Sclemc int	contchar	= '&';
179727Sclemc 
189727Sclemc char	comment[320];
199727Sclemc int	comptr	= 0;
209727Sclemc int	indent	= 0;
219727Sclemc 
outdon()229727Sclemc outdon() {
239727Sclemc 	outbuf[outp] = '\0';
249727Sclemc 	if (outp > 0)
259727Sclemc 		fprintf(outfil, "%s\n", outbuf);
269727Sclemc 	outp = cont = 0;
279727Sclemc }
289727Sclemc 
putcom(s)299727Sclemc putcom(s) char *s; {
309727Sclemc 	if (printcom) {
319727Sclemc 		ptc('c');
329727Sclemc 		outtab();
339727Sclemc 		pts(s);
349727Sclemc 		outdon();
359727Sclemc 	}
369727Sclemc }
379727Sclemc 
outcode(xp)389727Sclemc outcode(xp) char *xp; {
399727Sclemc 	register c, c1, j;
409727Sclemc 	char *q, *p;
419727Sclemc 
429727Sclemc 	p = (char *) xp;	/* shut lint up */
439727Sclemc 	if (cont == 0 && comptr > 0)	/* flush comment if not on continuation */
449727Sclemc 		flushcom();
459727Sclemc 	while( (c = *p++) ){
469727Sclemc 		c1 = *p;
479727Sclemc 		if (type[c] == LET || type[c] == DIG) {
489727Sclemc 			pts(p-1);
499727Sclemc 			break;
509727Sclemc 		}
519727Sclemc 		switch(c){
529727Sclemc 
539727Sclemc 		case '"': case '\'':
549727Sclemc 			j = 0;
559727Sclemc 			for (q=p; *q; q++) {
569727Sclemc 				if (*q == '\\')
579727Sclemc 					q++;
589727Sclemc 				j++;
599727Sclemc 			}
609727Sclemc 			if (outp+j+2 > 71)
619727Sclemc 				contcard();
629727Sclemc 			if (hollerith) {
639727Sclemc 				outnum(--j);
649727Sclemc 				ptc('h');
659727Sclemc 			} else
669727Sclemc 				ptc(c);
679727Sclemc 			while (*p != c) {
689727Sclemc 				if (*p == '\\')
699727Sclemc 					p++;
709727Sclemc 				ptc(*p++);
719727Sclemc 			}
729727Sclemc 			if (!hollerith)
739727Sclemc 				ptc(c);
749727Sclemc 			p++;
759727Sclemc 			break;
769727Sclemc 		case '$': case '\\':
779727Sclemc 			if (strlen(p-1)+outp > 71)
789727Sclemc 				contcard();
799727Sclemc 			if (c1 == '"' || c1 == '\'') {
809727Sclemc 				ptc(c1);
819727Sclemc 				p++;
829727Sclemc 			} else
839727Sclemc 				for (p--; *p; p++)
849727Sclemc 					ptc(*p);
859727Sclemc 			break;
869727Sclemc 		case '%':
879727Sclemc 			outp = 0;
889727Sclemc 			while (*p)
899727Sclemc 				ptc(*p++);
909727Sclemc 			break;
919727Sclemc 		case '>':
929727Sclemc 			if( c1=='=' ){
939727Sclemc 				pts(".ge."); p++;
949727Sclemc 			} else
959727Sclemc 				pts(".gt.");
969727Sclemc 			break;
979727Sclemc 		case '<':
989727Sclemc 			if( c1=='=' ){
999727Sclemc 				pts(".le."); p++;
1009727Sclemc 			} else if( c1=='>' ){
1019727Sclemc 				pts(".ne."); p++;
1029727Sclemc 			} else
1039727Sclemc 				pts(".lt.");
1049727Sclemc 			break;
1059727Sclemc 		case '=':
1069727Sclemc 			if( c1=='=' ){
1079727Sclemc 				pts(".eq."); p++;
1089727Sclemc 			} else
1099727Sclemc 				ptc('=');
1109727Sclemc 			break;
1119727Sclemc 		case '!': case '^':
1129727Sclemc 			if( c1=='=' ){
1139727Sclemc 				pts(".ne."); p++;
1149727Sclemc 			} else
1159727Sclemc 				pts(".not.");
1169727Sclemc 			break;
1179727Sclemc 		case '&':
1189727Sclemc 			if( c1=='&' )
1199727Sclemc 				p++;
1209727Sclemc 			pts(".and.");
1219727Sclemc 			break;
1229727Sclemc 		case '|':
1239727Sclemc 			if( c1=='|' )
1249727Sclemc 				p++;
1259727Sclemc 			pts(".or.");
1269727Sclemc 			break;
1279727Sclemc 		case '\t':
1289727Sclemc 			outtab();
1299727Sclemc 			break;
1309727Sclemc 		case '\n':
1319727Sclemc 			ptc(' ');
1329727Sclemc 			break;
1339727Sclemc 		default:
1349727Sclemc 			ptc(c);
1359727Sclemc 			break;
1369727Sclemc 		}
1379727Sclemc 	}
1389727Sclemc }
1399727Sclemc 
ptc(c)1409727Sclemc ptc(c) char c; {
1419727Sclemc 	if( outp > 71 )
1429727Sclemc 		contcard();
1439727Sclemc 	outbuf[outp++] = c;
1449727Sclemc }
1459727Sclemc 
pts(s)1469727Sclemc pts(s) char *s; {
1479727Sclemc 	if (strlen(s)+outp > 71)
1489727Sclemc 		contcard();
1499727Sclemc 	while(*s)
1509727Sclemc 		ptc(*s++);
1519727Sclemc }
1529727Sclemc 
contcard()1539727Sclemc contcard(){
1549727Sclemc 	int n;
1559727Sclemc 	outbuf[outp] = '\0';
1569727Sclemc 	fprintf(outfil, "%s\n", outbuf);
1579727Sclemc 	n = 6;
1589727Sclemc 	if (printcom) {
1599727Sclemc 		n += INDENT * indent + 1;
1609727Sclemc 		if (n > 35) n = 35;
1619727Sclemc 	}
1629727Sclemc 	for( outp=0; outp<n; outbuf[outp++] = ' ' );
1639727Sclemc 	outbuf[contfld-1] = contchar;
1649727Sclemc 	cont++;
1659727Sclemc 	if (cont > 19)
1669727Sclemc 		error("more than 19 continuation cards");
1679727Sclemc }
1689727Sclemc 
outtab()1699727Sclemc outtab(){
1709727Sclemc 	int n;
1719727Sclemc 	n = 6;
1729727Sclemc 	if (printcom) {
1739727Sclemc 		n += INDENT * indent;
1749727Sclemc 		if (n > 35) n = 35;
1759727Sclemc 	}
1769727Sclemc 	while (outp < n)
1779727Sclemc 		ptc(' ');
1789727Sclemc }
1799727Sclemc 
outnum(n)1809727Sclemc outnum(n) int n; {
1819727Sclemc 	int a;
1829727Sclemc 	if( a = n/10 )
1839727Sclemc 		outnum(a);
1849727Sclemc 	ptc(n%10 + '0');
1859727Sclemc }
1869727Sclemc 
outcont(n)1879727Sclemc outcont(n) int n; {
1889727Sclemc 	transfer = 0;
1899727Sclemc 	if (n == 0 && outp == 0)
1909727Sclemc 		return;
1919727Sclemc 	if( n > 0 )
1929727Sclemc 		outnum(n);
1939727Sclemc 	outcode("\tcontinue");
1949727Sclemc 	outdon();
1959727Sclemc }
1969727Sclemc 
outgoto(n)1979727Sclemc outgoto(n) int n; {
1989727Sclemc 	if (transfer != 0)
1999727Sclemc 		return;
2009727Sclemc 	outcode("\tgoto ");
2019727Sclemc 	outnum(n);
2029727Sclemc 	outdon();
2039727Sclemc }
2049727Sclemc 
flushcom()2059727Sclemc flushcom() {
2069727Sclemc 	int i, j;
2079727Sclemc 	if (printcom == 0)
2089727Sclemc 		comptr = 0;
2099727Sclemc 	else if (cont == 0 && comptr > 0) {
2109727Sclemc 		for (i=j=0; i < comptr; i++)
2119727Sclemc 			if (comment[i] == '\n') {
2129727Sclemc 				comment[i] = '\0';
2139727Sclemc 				fprintf(outfil, "%s\n", &comment[j]);
2149727Sclemc 				j = i + 1;
2159727Sclemc 			}
2169727Sclemc 		comptr = 0;
2179727Sclemc 	}
2189727Sclemc }
219