1: #include <stdio.h> 2: 3: int tabflg; 4: int labno = 1; 5: FILE *curbuf; 6: FILE *obuf; 7: 8: main(argc, argv) 9: char **argv; 10: { 11: /* 12: A1 -> A 13: A2 B 14: A O 15: B1 C 16: B2 D 17: BE L 18: BF P 19: C1 E 20: C2 F 21: F G 22: H H 23: R I 24: R1 J 25: S K 26: I M 27: M N 28: 29: * +1 30: S +2 31: C +4 32: 1 +8 33: 34: z -> 4 35: c 10 36: a 14 37: e 20 38: n 63 39: * +0100 40: */ 41: 42: int c, snlflg, nlflg, t, smode, m, ssmode, peekc; 43: 44: smode = nlflg = snlflg = ssmode = 0; 45: if (argc>1) 46: if (freopen(argv[1], "r", stdin) == NULL) { 47: fprintf(stderr, "%s?\n", argv[1]); 48: return(1); 49: } 50: if (argc>2) 51: if (freopen(argv[2], "w", stdout) == NULL) { 52: fprintf(stderr, "%s?\n", argv[2]); 53: return(1); 54: } 55: if ((obuf = fopen("cvopt.tmp", "w")) == NULL) { 56: fprintf(stderr, "cvopt.tmp?\n"); 57: exit(1); 58: } 59: curbuf = obuf; 60: loop: 61: c = getchar(); 62: if (c!='\n' && c!='\t') 63: nlflg = 0; 64: if (ssmode!=0 && c!='%') { 65: ssmode = 0; 66: curbuf = stdout; 67: fprintf(curbuf, "L%d:<", labno++); 68: } 69: switch(c) { 70: 71: case EOF: 72: fprintf(obuf, "0\n"); 73: fclose(obuf); 74: fprintf(stdout, ".even\n"); 75: if (freopen("cvopt.tmp", "r", stdin) == NULL) { 76: fprintf(stderr, "tmp?\n"); 77: exit(1); 78: } 79: while ((c = getchar()) != EOF) 80: putchar(c); 81: unlink("cvopt.tmp"); 82: return(0); 83: 84: case ':': 85: if (!smode) 86: fprintf(curbuf, "=.+2; 0"); else 87: put(':'); 88: goto loop; 89: 90: case 'A': 91: if ((c=getchar())=='1' || c=='2') { 92: put(c+'A'-'1'); 93: goto loop; 94: } 95: put('O'); 96: ungetc(c, stdin); 97: goto loop; 98: 99: case 'B': 100: switch (getchar()) { 101: 102: case '1': 103: put('C'); 104: goto loop; 105: 106: case '2': 107: put('D'); 108: goto loop; 109: 110: case 'E': 111: put('L'); 112: goto loop; 113: 114: case 'F': 115: put('P'); 116: goto loop; 117: } 118: put('?'); 119: goto loop; 120: 121: case 'C': 122: put(getchar()+'E'-'1'); 123: goto loop; 124: 125: case 'F': 126: put('G'); 127: goto subtre; 128: 129: case 'R': 130: if ((c=getchar()) == '1') 131: put('J'); else { 132: put('I'); 133: ungetc(c, stdin); 134: } 135: goto loop; 136: 137: case 'H': 138: put('H'); 139: goto subtre; 140: 141: case 'I': 142: put('M'); 143: goto loop; 144: 145: case 'S': 146: put('K'); 147: subtre: 148: snlflg = 1; 149: t = 'A'; 150: l1: 151: switch (c=getchar()) { 152: 153: case '*': 154: t++; 155: goto l1; 156: 157: case 'S': 158: t =+ 2; 159: goto l1; 160: 161: case 'C': 162: t =+ 4; 163: goto l1; 164: 165: case '1': 166: t =+ 8; 167: goto l1; 168: 169: case '2': 170: t =+ 16; 171: goto l1; 172: } 173: ungetc(c, stdin); 174: put(t); 175: goto loop; 176: 177: case '#': 178: if(getchar()=='1') 179: put('#'); else 180: put('"'); 181: goto loop; 182: 183: case '%': 184: if (smode) 185: curbuf = obuf; 186: if (ssmode==0) { 187: if ((peekc=getchar())=='[') { 188: curbuf = stdout; 189: while((c=getchar())!=']') 190: put(c); 191: getchar(); 192: fprintf(curbuf, ";"); 193: curbuf = obuf; 194: goto loop; 195: } 196: ungetc(peekc, stdin); 197: } 198: loop1: 199: switch (c=getchar()) { 200: 201: case ' ': 202: case '\t': 203: goto loop1; 204: case 'a': 205: m = 16; 206: t = flag(); 207: goto pf; 208: 209: case ',': 210: put(';'); 211: goto loop1; 212: 213: case 'i': 214: m = 12; 215: t = flag(); 216: goto pf; 217: case 'z': 218: m = 4; 219: t = flag(); 220: goto pf; 221: 222: case 'r': 223: m = 9; 224: t = flag(); 225: goto pf; 226: 227: case '1': 228: m = 5; 229: t = flag(); 230: goto pf; 231: 232: case 'c': 233: t = 0; 234: m = 8; 235: goto pf; 236: 237: case 'e': 238: t = flag(); 239: m = 20; 240: goto pf; 241: 242: case 'n': 243: t = flag(); 244: m = 63; 245: pf: 246: if ((c=getchar())=='*') 247: m =+ 0100; else 248: ungetc(c, stdin); 249: fprintf(curbuf, ".byte %o,%o", m, t); 250: goto loop1; 251: case '[': 252: fprintf(curbuf, "L%d=", labno++); 253: while ((c=getchar())!=']') 254: put(c); 255: ssmode = 0; 256: smode = 0; 257: goto loop; 258: 259: case '\n': 260: fprintf(curbuf, "\nL%d\n", labno); 261: ssmode = 1; 262: nlflg = 1; 263: smode = 1; 264: goto loop; 265: } 266: put(c); 267: goto loop1; 268: 269: case '\t': 270: if (nlflg) { 271: nlflg = 0; 272: goto loop; 273: } 274: if (smode) { 275: tabflg++; 276: goto loop; 277: } 278: put('\t'); 279: goto loop; 280: 281: case '\n': 282: if (!smode) { 283: put('\n'); 284: goto loop; 285: } 286: if (nlflg) { 287: nlflg = 0; 288: fprintf(curbuf, "\\0>\n"); 289: curbuf = obuf; 290: smode = 0; 291: goto loop; 292: } 293: if (!snlflg) 294: fprintf(curbuf, "\\n"); 295: snlflg = 0; 296: fprintf(curbuf, ">\n<"); 297: nlflg = 1; 298: goto loop; 299: 300: case 'X': 301: case 'Y': 302: case 'T': 303: snlflg++; 304: } 305: put(c); 306: goto loop; 307: } 308: 309: flag() { 310: register c, f; 311: 312: f = 0; 313: l1: 314: switch(c=getchar()) { 315: 316: case 'w': 317: f = 1; 318: goto l1; 319: 320: case 'i': 321: f = 2; 322: goto l1; 323: 324: case 'b': 325: f = 3; 326: goto l1; 327: 328: case 'f': 329: f = 4; 330: goto l1; 331: 332: case 'd': 333: f = 5; 334: goto l1; 335: 336: case 'u': 337: f = 9; 338: goto l1; 339: 340: case 's': 341: f = 6; 342: goto l1; 343: 344: case 'l': 345: f = 8; 346: goto l1; 347: 348: case 'p': 349: f =+ 16; 350: goto l1; 351: } 352: ungetc(c, stdin); 353: return(f); 354: } 355: 356: put(c) 357: { 358: if (tabflg) { 359: tabflg = 0; 360: fprintf(curbuf, ">;.byte %o;<", c+0200); 361: } else 362: putc(c, curbuf); 363: }