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