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