|
|
1.1 ! root 1: static char Sccsid[] = "aplcvt.c @(#)aplcvt.c 1.2 10/1/82 Berkeley "; ! 2: # ! 3: ! 4: /* ! 5: * aplcvt - convert APL workspace to/from VAX format ! 6: */ ! 7: ! 8: #include <stdio.h> ! 9: ! 10: #define PDPMAGIC 0100554 /* PDP-11 magic number */ ! 11: #define VAXMAGIC 0100556 /* VAX magic number */ ! 12: ! 13: #define DA 1 /* data type */ ! 14: #define NF 8 /* niladic function type */ ! 15: #define MF 9 /* monadic function type */ ! 16: #define DF 10 /* dyadic function type */ ! 17: #define MRANK 8 /* maximum rank */ ! 18: ! 19: /* ! 20: * The following define the internal data structures for APL ! 21: * on both the PDP-11 and the VAX. Two short integers are ! 22: * used instead of a long integer for the VAX definitions so ! 23: * that the program can be compiled and run on either machine ! 24: * without changes. (Otherwise, the reversal of long integers ! 25: * between the two machines would cause problems.) ! 26: */ ! 27: ! 28: struct pdp_thread { ! 29: double pt_fuzz; ! 30: short pt_iorg; ! 31: short pt_rl; ! 32: short pt_digits; ! 33: short pt_width; ! 34: } pthread; ! 35: #define PTSIZE 14 /* its real size, not the sizeof */ ! 36: ! 37: struct vax_thread { ! 38: double vt_fuzz; ! 39: short vt_iorg[2]; ! 40: short vt_rl[2]; ! 41: short vt_digits[2]; ! 42: short vt_width[2]; ! 43: } vthread; ! 44: ! 45: ! 46: struct pdp_item { ! 47: char pi_rank; ! 48: char pi_type; ! 49: short pi_size; ! 50: short pi_index; ! 51: short pi_datap; /* really a 16-bit pointer */ ! 52: short pi_dim[MRANK]; ! 53: } pitem; ! 54: ! 55: struct vax_item { ! 56: char vi_rank; ! 57: char vi_type; ! 58: char vi_pad[2]; ! 59: short vi_size[2]; ! 60: short vi_index[2]; ! 61: short vi_datap[2]; /* really a 32-bit pointer */ ! 62: short vi_dim[MRANK][2]; /* array of 32-bit integers */ ! 63: } vitem; ! 64: ! 65: union uci { ! 66: char cv[4]; ! 67: unsigned short s; ! 68: }; ! 69: ! 70: #define eperror(x,y) {eprintf(x); perror(y);} ! 71: char *base(), *strcpy(), *strcmp(); ! 72: ! 73: #ifdef vax ! 74: int makevax = 1; /* by default, convert to VAX format */ ! 75: #else ! 76: int makevax = 0; /* by default, convert to PDP format */ ! 77: #endif ! 78: ! 79: char *pname; /* holds argv[0] */ ! 80: char *ifname; /* points to input file name */ ! 81: char ofname[128]; /* contains output file name */ ! 82: ! 83: main(argc, argv) ! 84: char **argv; ! 85: { ! 86: register FILE *ifp, *ofp; ! 87: register char **ap; ! 88: ! 89: /* Parse the arguments */ ! 90: ! 91: pname = *argv; ! 92: ap = argv+1; ! 93: if (argc > 1 && *argv[1] == '-'){ ! 94: switch(argv[1][1]){ ! 95: case 'v': ! 96: case 'p': ! 97: makevax = (argv[1][1] == 'v'); ! 98: break; ! 99: default: ! 100: eprintf("unknown flag \"%s\"\n", argv[1]); ! 101: exit(1); ! 102: } ! 103: ap++; ! 104: } ! 105: ! 106: ! 107: /* If there are no filename arguments, convert standard ! 108: * input to standard output. However, if one of these is ! 109: * a tty, just exit with a syntax error message (it is highly ! 110: * unlikely that the user wanted input or output from/to his ! 111: * tty. ! 112: * ! 113: * If there are filenames, convert each one. ! 114: */ ! 115: ! 116: if (!*ap){ ! 117: if(isatty(0) || isatty(1)){ ! 118: fprintf(stderr, "Syntax: \"%s [-v|-p] filename ...\"\n", ! 119: pname); ! 120: exit(1); ! 121: } ! 122: ifname = "<stdin>"; ! 123: strcpy(ofname, "<stdout>"); ! 124: if (makevax ? tovax(stdin,stdout) : topdp(stdin,stdout)){ ! 125: eprintf("don't trust the output file!\n"); ! 126: exit(1); ! 127: } ! 128: } else ! 129: for(; *ap; ap++){ ! 130: ifname = *ap; ! 131: if ((ifp=fopen(ifname, "r")) == NULL){ ! 132: eperror("can't open ", ifname); ! 133: continue; ! 134: } ! 135: strcat(strcpy(ofname,base(ifname)), ! 136: makevax ? ".vax" : ".pdp"); ! 137: if ((ofp=fopen(ofname, "w")) == NULL){ ! 138: eperror("can't create ", ofname); ! 139: fclose(ifp); ! 140: continue; ! 141: } ! 142: if (makevax ? tovax(ifp,ofp) : topdp(ifp,ofp)) ! 143: if (unlink(ofname) < 0) ! 144: eperror("unlink ", ofname); ! 145: fclose(ifp); ! 146: fclose(ofp); ! 147: } ! 148: ! 149: exit(0); ! 150: } ! 151: ! 152: char * ! 153: base(s) ! 154: register char *s; ! 155: { ! 156: static char basename[128]; ! 157: register char *p; ! 158: ! 159: /* Strip off a trailing ".pdp" or ".vax" (depending upon the ! 160: * direction of conversion. ! 161: */ ! 162: ! 163: for(p=basename; *p = *s; p++,s++) ! 164: if (*s == '.' && !strcmp(s+1, makevax ? "pdp" : "vax")){ ! 165: *p = '\0'; ! 166: break; ! 167: } ! 168: ! 169: return(basename); ! 170: } ! 171: ! 172: topdp(ifp, ofp) ! 173: FILE *ifp, *ofp; ! 174: { ! 175: unsigned short magic; ! 176: short nsz; ! 177: union uci iz; ! 178: char name[128]; ! 179: register c; ! 180: register j; ! 181: ! 182: /* Look for proper magic number */ ! 183: ! 184: if (fread(&magic, sizeof magic, 1, ifp) != 1){ ! 185: eperror("read error on ", ifname); ! 186: return(-1); ! 187: } ! 188: ! 189: if ((magic|1) != (VAXMAGIC|1)){ ! 190: eprintf("%s is not a VAX APL workspace\n", ifname); ! 191: return(-1); ! 192: } ! 193: ! 194: if (fread(&magic, sizeof magic, 1, ifp) != 1){ ! 195: eperror("read error on ", ifname); ! 196: return(-1); ! 197: } ! 198: ! 199: if (magic){ ! 200: eprintf("warning: %s may be corrupted\n", ifname); ! 201: eprintf("attempting to continue\n"); ! 202: } ! 203: ! 204: magic = (magic&1) | PDPMAGIC; ! 205: if (fwrite(&magic, sizeof magic, 1, ofp) != 1){ ! 206: eperror("write error on ", ofname); ! 207: return(-1); ! 208: } ! 209: ! 210: ! 211: /* Convert the "thread" structure */ ! 212: ! 213: if (fread(&vthread, sizeof vthread, 1, ifp) != 1){ ! 214: eperror("read error on ", ifname); ! 215: return(-1); ! 216: } ! 217: ! 218: pthread.pt_fuzz = vthread.vt_fuzz; ! 219: pthread.pt_iorg = vthread.vt_iorg[0]; ! 220: pthread.pt_rl = vthread.vt_rl[0]; ! 221: pthread.pt_digits = vthread.vt_digits[0]; ! 222: pthread.pt_width = vthread.vt_width[0]; ! 223: ! 224: if (fwrite(&pthread, PTSIZE, 1, ofp) != 1){ ! 225: eperror("write error on ", ofname); ! 226: return(-1); ! 227: } ! 228: ! 229: ! 230: /* Convert each data item or function */ ! 231: ! 232: loop: ! 233: if ((j=fread(&iz, sizeof(long), 1, ifp)) != 1) ! 234: if (j <= 0) ! 235: return(0); ! 236: else { ! 237: eperror("read error on ", ifname); ! 238: return(-1); ! 239: } ! 240: if (fwrite(&iz, sizeof(short), 1, ofp) != 1){ ! 241: eperror("write error on ", ofname); ! 242: return(-1); ! 243: } ! 244: ! 245: if (fread(name, sizeof(char), (unsigned)iz.cv[1], ifp) != iz.cv[1]){ ! 246: eperror("read error on ", ifname); ! 247: return(-1); ! 248: } ! 249: if (fwrite(name, sizeof(char), (unsigned)iz.cv[1], ofp) != iz.cv[1]){ ! 250: eperror("write error on ", ofname); ! 251: return(-1); ! 252: } ! 253: ! 254: switch(iz.cv[0]){ ! 255: default: ! 256: eprintf("unknown item, type = %d\n", iz.cv[0]); ! 257: eprintf("conversion aborted\n"); ! 258: return(-1); ! 259: ! 260: case NF: ! 261: case MF: ! 262: case DF: ! 263: do { ! 264: if ((c=getc(ifp)) == EOF){ ! 265: eperror("getc error on ", ifname); ! 266: return(-1); ! 267: } ! 268: putc(c, ofp); ! 269: } while (c); ! 270: break; ! 271: ! 272: case DA: ! 273: if (fread(&iz, sizeof(long), 1, ifp) != 1){ ! 274: eperror("read error on ", ifname); ! 275: return(-1); ! 276: } ! 277: if (iz.cv[2] | iz.cv[3]){ ! 278: eprintf("item %s too large -- aborting\n", name); ! 279: return(-1); ! 280: } ! 281: if (fread(&vitem, sizeof vitem - MRANK*sizeof(long), ! 282: 1, ifp) != 1){ ! 283: eperror("read error on ", ifname); ! 284: return(-1); ! 285: } ! 286: if (fread(vitem.vi_dim, sizeof(long), vitem.vi_rank, ifp) ! 287: != vitem.vi_rank){ ! 288: eperror("read error on ", ifname); ! 289: return(-1); ! 290: } ! 291: pitem.pi_rank = vitem.vi_rank; ! 292: pitem.pi_type = vitem.vi_type; ! 293: pitem.pi_size = vitem.vi_size[0]; ! 294: for(j=0; j<vitem.vi_rank; j++) ! 295: pitem.pi_dim[j] = vitem.vi_dim[j][0]; ! 296: nsz = sizeof pitem - (MRANK-pitem.pi_rank)*sizeof(short) ! 297: - sizeof vitem + (MRANK-vitem.vi_rank)*sizeof(long) ! 298: + iz.s; ! 299: if (fwrite(&nsz, sizeof nsz, 1, ofp) != 1){ ! 300: eperror("write error on ", ofname); ! 301: return(-1); ! 302: } ! 303: j = sizeof pitem - (MRANK-pitem.pi_rank)*sizeof(short); ! 304: if (fwrite(&pitem, j, 1, ofp) != 1){ ! 305: eperror("write error on ", ofname); ! 306: return(-1); ! 307: } ! 308: j = sizeof vitem - (MRANK-vitem.vi_rank)*sizeof(long); ! 309: if (copy(ifp, ofp, iz.s-j)) ! 310: return(-1); ! 311: } ! 312: ! 313: goto loop; /* should be while(1) */ ! 314: } ! 315: ! 316: tovax(ifp, ofp) ! 317: FILE *ifp, *ofp; ! 318: { ! 319: unsigned short magic; ! 320: static short zero = 0; ! 321: short nsz; ! 322: union uci iz; ! 323: char name[128]; ! 324: register c; ! 325: register j; ! 326: ! 327: /* Look for proper magic number. */ ! 328: ! 329: if (fread(&magic, sizeof magic, 1, ifp) != 1){ ! 330: eperror("read error on ", ifname); ! 331: return(-1); ! 332: } ! 333: ! 334: if ((magic|1) != (PDPMAGIC|1)){ ! 335: eprintf("%s is not a PDP-11 APL workspace\n", ifname); ! 336: return(-1); ! 337: } ! 338: ! 339: magic = (magic&1) | VAXMAGIC; ! 340: if (fwrite(&magic, sizeof magic, 1, ofp) != 1 ! 341: || fwrite(&zero, sizeof zero, 1, ofp) != 1){ ! 342: eperror("write error on ", ofname); ! 343: return(-1); ! 344: } ! 345: ! 346: ! 347: /* Convert the "thread" structure. */ ! 348: ! 349: if (fread(&pthread, PTSIZE, 1, ifp) != 1){ ! 350: eperror("read error on ", ifname); ! 351: return(-1); ! 352: } ! 353: ! 354: vthread.vt_fuzz = pthread.pt_fuzz; ! 355: vthread.vt_iorg[0] = pthread.pt_iorg; ! 356: vthread.vt_iorg[1] = 0; ! 357: vthread.vt_rl[0] = pthread.pt_rl; ! 358: vthread.vt_rl[1] = 0; ! 359: vthread.vt_digits[0] = pthread.pt_digits; ! 360: vthread.vt_digits[1] = 0; ! 361: vthread.vt_width[0] = pthread.pt_width; ! 362: vthread.vt_width[1] = 0; ! 363: ! 364: if (fwrite(&vthread, sizeof vthread, 1, ofp) != 1){ ! 365: eperror("write error on ", ofname); ! 366: return(-1); ! 367: } ! 368: ! 369: ! 370: /* Convert each data item or function. */ ! 371: ! 372: loop: ! 373: if ((j=fread(&iz, sizeof(short), 1, ifp)) != 1) ! 374: if (j <= 0) ! 375: return(0); ! 376: else { ! 377: eperror("read error on ", ifname); ! 378: return(-1); ! 379: } ! 380: iz.cv[2] = iz.cv[3] = 0; ! 381: if (fwrite(&iz, sizeof(long), 1, ofp) != 1){ ! 382: eperror("write error on ", ofname); ! 383: return(-1); ! 384: } ! 385: ! 386: if (fread(name, sizeof(char), (unsigned)iz.cv[1], ifp) != iz.cv[1]){ ! 387: eperror("read error on ", ifname); ! 388: return(-1); ! 389: } ! 390: if (fwrite(name, sizeof(char), (unsigned)iz.cv[1], ofp) != iz.cv[1]){ ! 391: eperror("write error on ", ofname); ! 392: return(-1); ! 393: } ! 394: ! 395: switch(iz.cv[0]){ ! 396: default: ! 397: eprintf("unknown item, type = %d\n", iz.cv[0]); ! 398: eprintf("conversion aborted\n"); ! 399: return(-1); ! 400: ! 401: case NF: ! 402: case MF: ! 403: case DF: ! 404: do { ! 405: if ((c=getc(ifp)) == EOF){ ! 406: eperror("getc error on ", ifname); ! 407: return(-1); ! 408: } ! 409: putc(c, ofp); ! 410: } while (c); ! 411: break; ! 412: ! 413: case DA: ! 414: if (fread(&iz, sizeof(short), 1, ifp) != 1){ ! 415: eperror("read error on ", ifname); ! 416: return(-1); ! 417: } ! 418: if (fread(&pitem, sizeof pitem - MRANK*sizeof(short), ! 419: 1, ifp) != 1){ ! 420: eperror("read error on ", ifname); ! 421: return(-1); ! 422: } ! 423: if (fread(pitem.pi_dim, sizeof(short), pitem.pi_rank, ifp) ! 424: != pitem.pi_rank){ ! 425: eperror("read error on ", ifname); ! 426: return(-1); ! 427: } ! 428: vitem.vi_rank = pitem.pi_rank; ! 429: vitem.vi_type = pitem.pi_type; ! 430: vitem.vi_size[0] = pitem.pi_size; ! 431: vitem.vi_size[1] = 0; ! 432: for(j=0; j<pitem.pi_rank; j++){ ! 433: vitem.vi_dim[j][0] = pitem.pi_dim[j]; ! 434: vitem.vi_dim[j][1] = 0; ! 435: } ! 436: nsz = sizeof vitem - (MRANK-vitem.vi_rank)*sizeof(long) ! 437: - sizeof pitem + (MRANK-pitem.pi_rank)*sizeof(short) ! 438: + iz.s; ! 439: if (fwrite(&nsz, sizeof nsz, 1, ofp) != 1 ! 440: || fwrite(&zero, sizeof zero, 1, ofp) != 1){ ! 441: perror("write error on ", ofname); ! 442: return(-1); ! 443: } ! 444: j = sizeof vitem - (MRANK-vitem.vi_rank)*sizeof(long); ! 445: if (fwrite(&vitem, j, 1, ofp) != 1){ ! 446: eperror("write error on ", ofname); ! 447: return(-1); ! 448: } ! 449: j = sizeof pitem - (MRANK-pitem.pi_rank)*sizeof(short); ! 450: if (copy(ifp, ofp, iz.s-j)) ! 451: return(-1); ! 452: } ! 453: ! 454: goto loop; /* should be while(1) */ ! 455: } ! 456: ! 457: copy(ifp, ofp, len) ! 458: FILE *ifp, *ofp; ! 459: register len; ! 460: { ! 461: register c; ! 462: ! 463: while(len--){ ! 464: if ((c=getc(ifp)) == EOF){ ! 465: eperror("getc error on ", ifname); ! 466: return(-1); ! 467: } ! 468: putc(c, ofp); ! 469: } ! 470: return(0); ! 471: } ! 472: ! 473: /*VARARGS 1*/ ! 474: eprintf(a, b, c, d, e, f, g, h, i, j){ ! 475: ! 476: fprintf(stderr, "%s: ", pname); ! 477: fprintf(stderr, a, b, c, d, e, f, g, h, i, j); ! 478: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.