Annotation of 43BSD/contrib/apl/src/aplcvt.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.