1*48064Sbostic /*- 2*48064Sbostic * %sccs.include.proprietary.c% 3*48064Sbostic */ 4*48064Sbostic 514503Ssam #ifndef lint 6*48064Sbostic static char sccsid[] = "@(#)r2.c 1.3 (Berkeley) 04/16/91"; 7*48064Sbostic #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 229727Sclemc outdon() { 239727Sclemc outbuf[outp] = '\0'; 249727Sclemc if (outp > 0) 259727Sclemc fprintf(outfil, "%s\n", outbuf); 269727Sclemc outp = cont = 0; 279727Sclemc } 289727Sclemc 299727Sclemc putcom(s) char *s; { 309727Sclemc if (printcom) { 319727Sclemc ptc('c'); 329727Sclemc outtab(); 339727Sclemc pts(s); 349727Sclemc outdon(); 359727Sclemc } 369727Sclemc } 379727Sclemc 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 1409727Sclemc ptc(c) char c; { 1419727Sclemc if( outp > 71 ) 1429727Sclemc contcard(); 1439727Sclemc outbuf[outp++] = c; 1449727Sclemc } 1459727Sclemc 1469727Sclemc pts(s) char *s; { 1479727Sclemc if (strlen(s)+outp > 71) 1489727Sclemc contcard(); 1499727Sclemc while(*s) 1509727Sclemc ptc(*s++); 1519727Sclemc } 1529727Sclemc 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 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 1809727Sclemc outnum(n) int n; { 1819727Sclemc int a; 1829727Sclemc if( a = n/10 ) 1839727Sclemc outnum(a); 1849727Sclemc ptc(n%10 + '0'); 1859727Sclemc } 1869727Sclemc 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 1979727Sclemc outgoto(n) int n; { 1989727Sclemc if (transfer != 0) 1999727Sclemc return; 2009727Sclemc outcode("\tgoto "); 2019727Sclemc outnum(n); 2029727Sclemc outdon(); 2039727Sclemc } 2049727Sclemc 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