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