Annotation of 43BSD/contrib/apl/src/aj.c, revision 1.1.1.1

1.1       root        1: static char Sccsid[] = "aj.c @(#)aj.c  1.2     10/1/82 Berkeley ";
                      2: #include "apl.h"
                      3: #include <signal.h>
                      4: 
                      5: #ifdef vax
                      6: #define        WSMESG "can't load pdp-11 workspace"
                      7: #else
                      8: #define        WSMESG "can't load vax workspace"
                      9: #endif
                     10: 
                     11: 
                     12: clear()
                     13: {
                     14:        register struct nlist *n;
                     15: 
                     16:        for(n=nlist; n->namep; n++) {
                     17:                n->use = 0;
                     18:                n->itemp = 0;
                     19:                n->namep = 0;
                     20:                }
                     21:                thread.iorg = 1;
                     22:                srand(thread.rl = 1);
                     23:                thread.width = 72;
                     24:                thread.fuzz = 1.0e-13;
                     25:                afreset();      /* release all dynamic memory */
                     26:                gsip = 0;       /* reset state indicator */
                     27: }
                     28: 
                     29: lsize(s)
                     30: char *s;
                     31: {
                     32:        register i;
                     33:        register char *p;
                     34: 
                     35:        i=1;
                     36:        p=s;
                     37:        while (*p++) i++;
                     38:        return(i);
                     39: }
                     40: 
                     41: isize(ip)
                     42: struct item *ip;
                     43: {
                     44:        register struct item *p;
                     45:        register i;
                     46: 
                     47:        p=ip;
                     48:        i = sizeof *p - (MRANK-p->rank)*SINT;
                     49:        if(p->type == DA)
                     50:                i += p->size*SDAT; else
                     51:        if(p->type == CH)
                     52:                i += p->size;
                     53:        return(i);
                     54: }
                     55: 
                     56: wsload(ffile)
                     57: {
                     58:        struct item *convrt();
                     59:        char name[NAMS];
                     60:        union uci iz;
                     61:        register i;
                     62:        register struct nlist *n;
                     63:        register struct item *p;
                     64:        char c;
                     65:        int dconv;
                     66:        struct {
                     67:                int word;
                     68:        };
                     69: 
                     70:        iz.i = 0;
                     71: /* Check for correct magic number */
                     72:        READF(ffile,&iz,sizeof iz);
                     73:        iz.i &= 0177777;                        /* Zap high bits */
                     74:        if((iz.i|1) != (MAGIC|1)){
                     75: barf:
                     76:                CLOSEF(ffile);
                     77:                if (((iz.i|1)^2) == (MAGIC|1))
                     78:                        error(WSMESG);
                     79:                else
                     80:                        error("bad ws file format");
                     81:        }
                     82:        if(iz.i > MAGIC){
                     83:                printf("single data converted to double\n");
                     84:                dconv = 2;
                     85:        } else if(iz.i < MAGIC){
                     86:                printf("double data converted to single\n");
                     87:                dconv = 1;
                     88:        } else
                     89:                dconv = 0;
                     90:        READF(ffile,&thread,sizeof thread);
                     91:        while(READF(ffile,&iz,sizeof iz) == sizeof iz){
                     92:                i = iz.cv[1];
                     93: /* read name of vbl or fn */
                     94:                READF(ffile,name,i);
                     95:                for(n=nlist; n->namep; n++)
                     96:                        if(equal(name, n->namep)){
                     97:                                erase(n);
                     98:                                goto hokay;
                     99:                        }
                    100:                n->namep = alloc(i);
                    101:                copy(CH,name,n->namep,i);
                    102: hokay:
                    103:                n->use = iz.cv[0];
                    104:                n->type = LV;
                    105:                switch(n->use) {
                    106: default:
                    107:                        goto barf;
                    108: 
                    109: case DA:
                    110:                        READF(ffile,&iz,sizeof iz);
                    111:                        p=(struct item *)alloc(iz.i);
                    112:                        READF(ffile,p,iz.i);
                    113:                        p->datap = (data *)&p->dim[p->rank]; /*make absolute*/
                    114:                                /*
                    115:                                 * convert data type if neccessary
                    116:                                 */
                    117:                        n->itemp = convrt(dconv,p);
                    118:                        continue;
                    119: case NF:
                    120: case MF:
                    121: case DF:
                    122:                        n->itemp = 0;
                    123:                        n->label = SEEKF(wfile, 0L, 2);
                    124:                        do {
                    125:                                if(READF(ffile,&c,1) != 1)
                    126:                                        error("wsload eof");
                    127:                                WRITEF(wfile,&c,1);
                    128:                        } while(c != 0);
                    129:                }
                    130:        }
                    131:        fdat(ffile);
                    132:        CLOSEF(ffile);
                    133: }
                    134: 
                    135: wssave(ffile)
                    136: {
                    137:        register struct nlist *n;
                    138: 
                    139:        nsave(ffile, 0);
                    140:        for(n=nlist; n->namep; n++)
                    141:                nsave(ffile, n);
                    142:        fdat(ffile);
                    143:        CLOSEF(ffile);
                    144: }
                    145: 
                    146: vsave(fd)
                    147: {
                    148:        register struct nlist *n;
                    149:        struct nlist *getnm();
                    150: 
                    151:        nsave(fd, 0);
                    152:        while(n = getnm())
                    153:                nsave(fd, n);
                    154:        fdat(fd);
                    155:        CLOSEF(fd);
                    156: }
                    157: 
                    158: nsave(ffile, an)
                    159: struct nlist *an;
                    160: {
                    161:        union uci iz;
                    162:        register struct nlist *n;
                    163:        register i;
                    164:        register struct item *p;
                    165:        char c;
                    166: 
                    167:        n = an;
                    168:        if(n == 0){
                    169:                iz.i = MAGIC;
                    170:                WRITEF(ffile,&iz,sizeof iz);
                    171:                WRITEF(ffile,&thread,sizeof thread);
                    172:                return(0);
                    173:        }
                    174: 
                    175:        if(n->use == 0 || (n->use == DA && n->itemp == 0))
                    176:                return(0);
                    177:        iz.cv[0] = n->use;
                    178:        iz.cv[1] = i = lsize(n->namep);
                    179: #ifdef vax
                    180:        iz.cv[2] = iz.cv[3] = 0;
                    181: #endif
                    182:        WRITEF(ffile,&iz,sizeof iz);
                    183:        WRITEF(ffile,n->namep,i);
                    184: 
                    185:        switch(n->use) {
                    186: default:
                    187:                CLOSEF(ffile);
                    188:                error("save B");
                    189: case DA:
                    190:                p = n->itemp;
                    191:                iz.i = i = isize(p);
                    192:                ((struct nlist *)p)->label -= (int)p;
                    193:                WRITEF(ffile,&iz,sizeof iz);
                    194:                WRITEF(ffile,p,i);
                    195:                ((struct nlist *)p)->label += (int)p;
                    196:                break;
                    197: case NF:
                    198: case MF:
                    199: case DF:
                    200:                SEEKF(wfile,(long)n->label,0);
                    201:                do {
                    202:                        READF(wfile,&c,1);
                    203:                        WRITEF(ffile,&c,1);
                    204:                } while(c != 0);
                    205:        }
                    206:        return(0);
                    207: }
                    208: 
                    209: struct nlist *
                    210: getnm()
                    211: {
                    212:        char name[100];
                    213:        register char *p;
                    214:        register struct nlist *n;
                    215:        register c;
                    216: 
                    217:        while(1){
                    218:                printf("variable name? ");
                    219:                c = READF(1, name, 100);
                    220:                if(c <= 1)
                    221:                        return(0);
                    222:                name[c-1] = 0;
                    223:                for(n=nlist; n->namep; n++)
                    224:                        if(equal(name, n->namep))
                    225:                                return(n);
                    226:                printf("%s does not exist\n", name);
                    227:        }
                    228: }
                    229: 
                    230: #ifdef NDIR
                    231: listdir()
                    232: {
                    233:        register pid, i;
                    234:        register int (*oldint)();
                    235: 
                    236:        /* I am not AT ALL happy with the change in the directory
                    237:         * format.  Until it settles down in an official 4.2BSD
                    238:         * distribution, just bail out and call "ls".  This solution
                    239:         * doesn't work properly with ")script" files, but eventually
                    240:         * I hope to make it internal again.
                    241:         *                      --John Bruner (06-May-82)
                    242:         */
                    243: 
                    244:        oldint = signal(SIGINT, SIG_IGN);
                    245:        while ((pid=FORKF(1)) < 0)
                    246:                sleep(5);
                    247:        if (!pid) {
                    248:                signal(SIGINT, SIG_DFL);
                    249:                execl("/usr/ucb/ls", "ls", 0);  /* for column output */
                    250:                execl("/bin/ls", "ls", 0);      /* last resort */
                    251:                write(2, "Can't find \"ls\"!\n", 17);
                    252:                exit(1);
                    253:        }
                    254:        while ((i=wait(0)) > 0 && i != pid);
                    255:        signal(SIGINT, oldint);
                    256: }
                    257: #else
                    258: listdir()
                    259: {
                    260:        register f;
                    261:        register char *p;
                    262:        struct direct dir;
                    263: 
                    264:        /* List the directory in columnar format. */
                    265: 
                    266:        if((f = OPENF(".",0)) < 0)
                    267:                error("directory B");
                    268:        while(READF(f,&dir,sizeof dir) == sizeof dir)
                    269:                if(dir.d_ino != 0 && dir.d_name[0] != '.') {
                    270:                        if(column+10 >= thread.width)
                    271:                                printf("\n\t");
                    272:                        for(p=dir.d_name; p<dir.d_name+14 && *p; p++)
                    273:                                putchar(*p);
                    274:                        putchar('\t');
                    275:                }
                    276:        putchar('\n');
                    277:        CLOSEF(f);
                    278: }
                    279: #endif
                    280: 
                    281: fdat(f)
                    282: {
                    283:        struct stat b;
                    284:        register struct tm *p;
                    285:        struct tm *localtime();
                    286: 
                    287:        FSTATF(f,&b);
                    288:        p = localtime(&b.st_mtime);
                    289: 
                    290:        printf("  ");
                    291:        pr2d(p->tm_hour);
                    292:        putchar('.');
                    293:        pr2d(p->tm_min);
                    294:        putchar('.');
                    295:        pr2d(p->tm_sec);
                    296:        putchar(' ');
                    297:        pr2d(p->tm_mon+1);
                    298:        putchar('/');
                    299:        pr2d(p->tm_mday);
                    300:        putchar('/');
                    301:        pr2d(p->tm_year);
                    302: }
                    303: 
                    304: pr2d(i)
                    305: {
                    306:        putchar(i/10+'0');
                    307:        putchar(i % 10 + '0');
                    308: }
                    309: 
                    310: struct item *
                    311: convrt(m, p)
                    312: struct item *p;
                    313: {
                    314:        register i;
                    315:        register float *f;
                    316:        register double *d;
                    317:        struct item *q;
                    318: 
                    319:        if (p->type == CH) return(p);
                    320:        switch(m){
                    321:        case 0:
                    322:                return(p);
                    323: 
                    324:        case 1:         /* apl to apl2 */
                    325:                q = newdat(DA, p->rank, p->size);
                    326:                f = (float *)q->datap;
                    327:                d = (double *)p->datap;
                    328:                for(i=0; i<p->size; i++)
                    329:                        *f++ = *d++;
                    330:                break;
                    331: 
                    332:        case 2:         /* apl2 to apl */
                    333:                q = newdat(DA, p->rank, p->size);
                    334:                f = (float *)p->datap;
                    335:                d = (double *)q->datap;
                    336:                for(i=0; i<p->size; i++)
                    337:                        *d++ = *f++;
                    338:                break;
                    339:        }
                    340:        for(i=0; i<p->rank; i++)
                    341:                q->dim[i] = p->dim[i];
                    342:        free(p);
                    343:        return(q);
                    344: }

unix.superglobalmegacorp.com

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