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

1.1     ! root        1: static char Sccsid[] = "al.c @(#)al.c  1.1     10/1/82 Berkeley ";
        !             2: #
        !             3: /*
        !             4:  *     monadic epsilon and encode /rww
        !             5:  */
        !             6: #include "apl.h"
        !             7: #include <signal.h>
        !             8: 
        !             9: ex_meps()
        !            10: {
        !            11:         struct item *p;
        !            12:         register i,j;
        !            13:         char *a,*b,*c;
        !            14:         int dim0,dim1;
        !            15:        char *xpcp;
        !            16: 
        !            17:        p = fetch1();
        !            18:        if ( p->rank > 2 || p->type != CH )
        !            19:                error("execute C");
        !            20:        /*get out if nothing to do, apr 2-23-77 */
        !            21:        if (p->size == 0){
        !            22:                return;
        !            23:        }
        !            24:        b = (char *)p->datap;
        !            25:        dim0 = p->rank < 2 ? 1       : p->dim[0];
        !            26:        dim1 = p->rank < 2 ? p->size : p->dim[1];
        !            27:        a = alloc ( dim1+1 );
        !            28:        xpcp = pcp;
        !            29:        for ( i=0; i<dim0 ; i++) {
        !            30:                copy(CH, b, a, dim1);
        !            31:                a[dim1] = '\n';
        !            32:                c = compile(a,1);
        !            33:                if(c != 0){
        !            34:                        execute(c);
        !            35:                        free(c);
        !            36:                } else {
        !            37:                        free(a);
        !            38:                        error("");
        !            39:                }
        !            40:                b += dim1;
        !            41:                if(i < dim0-1)
        !            42:                        pop();
        !            43:        }
        !            44:        free(a);
        !            45:        pcp = xpcp;
        !            46:        p = *--sp;
        !            47:        pop();
        !            48:        *sp++ = p;
        !            49: }
        !            50: 
        !            51: ex_menc()
        !            52: {
        !            53:        struct item *p;
        !            54: 
        !            55:        p = fetch1();
        !            56:        if ( p->type == DA )
        !            57:                menc1();        /*
        !            58:        else
        !            59:                return (char argument unchanged);       */
        !            60: }
        !            61: 
        !            62: 
        !            63: ex_list()      /* List a function on the terminal */
        !            64: {
        !            65:        register char lastc;
        !            66:        register struct nlist *n;
        !            67:        register line;
        !            68:        char c;
        !            69: 
        !            70: 
        !            71:        /* Check for valid function */
        !            72: 
        !            73:        n = (struct nlist *)*--sp;
        !            74:        if (n->type != LV)
        !            75:                error("fnlist B");
        !            76: 
        !            77: 
        !            78:        /* If a function, locate it in workspace file and
        !            79:         * print on the terminal in formatted form.
        !            80:         */
        !            81: 
        !            82:        switch(((struct nlist *)n)->use){
        !            83:        default:
        !            84:                error("fnlist T");
        !            85: 
        !            86:        case NF:
        !            87:        case MF:
        !            88:        case DF:
        !            89:                SEEKF(wfile, (long)n->label, 0);
        !            90:                line = 0;
        !            91:                lastc = 0;
        !            92:                putchar('\n');
        !            93: 
        !            94:                while(READF(wfile, &c, 1) > 0){
        !            95: 
        !            96:                        if (!c){
        !            97:                                putchar('\n');
        !            98:                                return;
        !            99:                        }
        !           100: 
        !           101:                        switch(lastc){
        !           102:                        case '\n':
        !           103:                                printf("[%d]", ++line);
        !           104:                        case 0:
        !           105:                                putchar('\t');
        !           106:                        }
        !           107:                        putchar(lastc=c);
        !           108:                }
        !           109:                error("workspace eof");
        !           110:        }
        !           111: }
        !           112: 
        !           113: 
        !           114: ex_crp()         /* dredge up a function and put it into an array*/
        !           115: {
        !           116:        char name[NAMS];
        !           117:        char *c, *c2;
        !           118:        struct nlist *np;
        !           119:        struct item *p;
        !           120:        int len, dim0, dim1;
        !           121:        register i;
        !           122:        register char *dp;
        !           123: 
        !           124:        p = fetch1();
        !           125:        if ( p->size == 0 || p->rank >1 || p->size >= NAMS )
        !           126:                error("Lcr C");
        !           127:                        /* set up the name in search format     */
        !           128:        copy(CH, p->datap, name, p->size);
        !           129:        name[p->size] = '\0';
        !           130:        np = nlook(name);
        !           131:                        /* if not found then domain error       */
        !           132:        if ( !np->namep )
        !           133:                error("Lcr D");
        !           134:        switch(np->use){
        !           135:        default:
        !           136:                error("Lcr D");
        !           137:        case MF:
        !           138:        case DF:
        !           139:        case NF:        /* only allow functions */
        !           140:                ;
        !           141:        }
        !           142:                        /* set up new array                     */
        !           143:        dim0 = 0;
        !           144:        dim1 = 0;
        !           145:        ifile = DUPF(wfile);
        !           146:        SEEKF( ifile, (long)np->label, 0);    /* look up function     */
        !           147:                        /* compute max width and height         */
        !           148:        while ( c2 = c = rline(0) ){
        !           149:               while ( *c2++ != '\n' ){}
        !           150:                dim0++;
        !           151:                len = c2 - c - 1;
        !           152:                dim1 = dim1 < len ? len : dim1;
        !           153:                free(c);
        !           154:        }
        !           155:        pop();                /* release old variable         */
        !           156:                        /* create new array and put function in */
        !           157:        p = newdat ( CH, 2, dim0*dim1 );
        !           158:        p->rank = 2;
        !           159:        p->dim[0] = dim0;
        !           160:        p->dim[1] = dim1;
        !           161:        dp = (char *)(p->datap);
        !           162:        SEEKF( ifile, (long)np->label, 0);
        !           163:        while ( c2 = c = rline(0) ){
        !           164:               for ( i=0; i<dim1; i++)
        !           165:                        if ( *c != '\n' )
        !           166:                                *dp++ = *c++;
        !           167:                        else
        !           168:                                *dp++ = ' ';    /* fill w/blanks*/
        !           169:                free(c2);
        !           170:        }
        !           171:                        /* put the new array on the stack       */
        !           172:        *sp++ = p;
        !           173:                                /* reset the current file               */
        !           174:        CLOSEF(ifile);
        !           175:        ifile = 0;
        !           176: }
        !           177: 
        !           178: menc1()                 /* change numbers into characters       */
        !           179: {
        !           180:        struct item *p, *q;
        !           181:        register i,j,numsz;
        !           182:        data *dp;
        !           183:        int total,param[4];
        !           184: 
        !           185:                        /* zeroize size information vector      */
        !           186:        for ( i=0; i<4; i++ )
        !           187:                param[i] = 0;
        !           188:                        /* pick up the argument                 */
        !           189:        p = fetch1();
        !           190:        if(p->rank > 2)
        !           191:                error("format R");
        !           192:        dp = p->datap;
        !           193:                        /* find the maximum # of chars in any # */
        !           194:        for(i=0; i<p->size; i++)
        !           195:                epr1(*dp++, param);
        !           196:        numsz = param[1] + param[2] + !!param[2] + param[3] + 1;
        !           197:                        /* rowsize is max # size x last dim     */
        !           198:        rowsz = p->rank ? p->dim[p->rank-1] : 1;
        !           199:        rowsz *= numsz;
        !           200:                        /* row size x # of rows (incl blank)    */
        !           201:        total = p->size * numsz;
        !           202:        for( j=i=0; i<p->rank; i++ )
        !           203:                if ( p->dim[i] != 1)
        !           204:                        if ( j++ > 1 )
        !           205:                                total += rowsz;
        !           206:                        /* make new data and fill with blanks   */
        !           207:        if(p->rank == 2){
        !           208:                q = newdat(CH, 2, total);
        !           209:                q->dim[0] = total/rowsz;
        !           210:                q->dim[1] = rowsz;
        !           211:        } else {
        !           212:                /* rank = 0 or 1 */
        !           213:                q = newdat( CH, 1, total);
        !           214:                q->dim[0] = rowsz;
        !           215:        }
        !           216:        mencptr = (char *)(q->datap);
        !           217:        for ( i=0; i<total; i++)
        !           218:                *mencptr++ = ' ';
        !           219:        mencptr = (char *)(q->datap);
        !           220:                        /* use putchar() to fill up the array   */
        !           221:        mencflg = 2;
        !           222:        ex_hprint();
        !           223:        mencflg = 0;
        !           224:                        /* put it on the stack                  */
        !           225: /*     pop();          /* done by ex_hprint() */
        !           226:        *sp++ = q;
        !           227: }
        !           228: 
        !           229: 
        !           230: ex_run()
        !           231: {
        !           232:        register struct item *p;
        !           233:        register data *dp;
        !           234:        register int *p2;
        !           235:        char ebuf[100];
        !           236:        int i;
        !           237:        int *run();
        !           238: 
        !           239:        p = fetch1();
        !           240:        if(p->type != CH || p->rank != 1)
        !           241:                error("Lrun D");
        !           242:        copy(CH, p->datap, ebuf, p->size);
        !           243:        ebuf[p->size] = 0;
        !           244:        p2 = run(ebuf);
        !           245:        p = newdat(DA, 1, 0);
        !           246:        pop();
        !           247:        *sp++ = p;
        !           248: }
        !           249: 
        !           250: int *run(s)
        !           251: char *s;
        !           252: {
        !           253:        register p;
        !           254:        static int a[3];
        !           255:        int (*oldint)(), (*oldquit)();
        !           256: 
        !           257:        oldint = signal(SIGINT, SIG_IGN);
        !           258:        oldquit = signal(SIGQUIT, 1);
        !           259:        if(a[0]=FORKF(1)){
        !           260:                while((p = wait(a+1)) != -1)
        !           261:                        if(p == a[0])
        !           262:                                break;
        !           263:        } else {
        !           264:                execl("/bin/sh", "-", "-c", s, 0);
        !           265:                WRITEF(1, "can't find shell\n", 17);
        !           266:                exit(1);
        !           267:        }
        !           268:        a[2] = (a[1]>>8)&0377;
        !           269:        a[1] &= 0377;
        !           270:        signal(SIGINT, oldint);
        !           271:        signal(SIGQUIT, oldquit);
        !           272:        return(a);
        !           273: }
        !           274: 
        !           275: ex_dfmt()
        !           276: {
        !           277:        register char *cp, *ecp;
        !           278:        register data *fp;
        !           279:        register j;
        !           280:        struct item *lp, *rp, *ip;
        !           281:        data *dp;
        !           282:        unsigned nrow, ncol, rowlen, inc, wid;
        !           283:        int i, sign, decpt;
        !           284: 
        !           285:        /* Dyadic format.  This routine is a little crude and should
        !           286:         * probably be rewritten to take advantage of other conversion
        !           287:         * routines.  Nonetheless, it does do dyadic formatting for
        !           288:         * scalars, vectors, and 2-dimensional arrays when the left
        !           289:         * argument is a 2-element or appropriate-length vector
        !           290:         * specifying non-exponential ("F format") conversion.
        !           291:         */
        !           292: 
        !           293:        lp = fetch2();
        !           294:        rp = sp[-2];
        !           295:        nrow = (rp->rank < 2) ? 1 : rp->dim[0];
        !           296:        ncol = rp->rank ? rp->dim[rp->rank-1] : 1;
        !           297:        inc = (lp->size != 2) * 2;
        !           298: 
        !           299: 
        !           300:        /* Check validity of arguments. */
        !           301: 
        !           302:        if (lp->rank > 1 || lp->size <= 1 || rp->rank > 2
        !           303:            || lp->type != DA || rp->type != DA
        !           304:            || (lp->size != 2 && lp->size != 2*ncol))
        !           305:                error("dfmt D");
        !           306: 
        !           307:        for(fp=lp->datap,i=0; i < lp->size; i += 2,fp += 2){
        !           308:                if (fp[0] <= 0.0 || fp[1] < 0.0)
        !           309:                        error("dfmt D");
        !           310:                fp[0] = (data)((int)(0.5+fp[0]));
        !           311:                fp[1] = (data)((int)(0.5+fp[1]));
        !           312:        }
        !           313: 
        !           314: 
        !           315:        /* Allocate result array */
        !           316: 
        !           317:        for(i=rowlen=0,fp=lp->datap; i < ncol; i++, fp += inc)
        !           318:                rowlen += (int)*fp;
        !           319: 
        !           320:        ip = newdat(CH, rp->rank ? rp->rank : 1, rowlen*nrow);
        !           321: 
        !           322:        if (rp->rank < 2)
        !           323:                ip->dim[0] = rowlen;
        !           324:        else {
        !           325:                ip->dim[0] = nrow;
        !           326:                ip->dim[1] = rowlen;
        !           327:        }
        !           328: 
        !           329: 
        !           330:        /* Fill it up. The special case "fabs(*dp) < 1.0 && !fp[1]" 
        !           331:         * insures that a zero is printed when 0 fractional digits are
        !           332:         * specified and the number being converted is less than one.
        !           333:         */
        !           334: 
        !           335:        cp = (char *)ip->datap;
        !           336:        dp = rp->datap;
        !           337:        while(nrow--)
        !           338:                for(i=0,fp=lp->datap; i < ncol; i++, dp++, fp += inc){
        !           339:                        if (fp[1] == 0.0 && fabs(*dp) < 1.0)
        !           340:                                *dp = 0.0;
        !           341:                        ecp = ecvt(*dp, (int)(0.5+fp[0]), &decpt, &sign);
        !           342:                        decpt += (*dp == 0.0 && fp[1] == 0.0);
        !           343:                        j = fp[0];
        !           344:                        wid = !!sign + fp[1] + !!fp[1] + ((decpt>0)?decpt:0);
        !           345:                        if (j < wid)
        !           346:                                while(j--)
        !           347:                                        *cp++ = '*';    /* not wide enough */
        !           348:                        else {
        !           349:                                while(j > wid){         /* leading spaces */
        !           350:                                        *cp++ = ' ';
        !           351:                                        j--;
        !           352:                                }
        !           353:                                if (sign){              /* possible - sign */
        !           354:                                        *cp++ = '-';
        !           355:                                        j--;
        !           356:                                }
        !           357:                                while(decpt > 0){       /* whole number part */
        !           358:                                        *cp++ = *ecp++;
        !           359:                                        j--;
        !           360:                                        decpt--;
        !           361:                                }
        !           362:                                if (j--){               /* fraction, if any */
        !           363:                                        *cp++ = '.';
        !           364:                                        while(decpt++ < 0 && j){
        !           365:                                                j--;
        !           366:                                                *cp++ = '0';
        !           367:                                        }
        !           368:                                        while(j--)
        !           369:                                                *cp++ = *ecp++;
        !           370:                                }
        !           371:                        }
        !           372:                }
        !           373: 
        !           374:        pop();
        !           375:        pop();
        !           376:        *sp++ = ip;
        !           377: 
        !           378: }
        !           379: 
        !           380: ex_mfmt()
        !           381: {
        !           382:        ex_menc();
        !           383: }
        !           384: 
        !           385: ex_nc()
        !           386: {
        !           387:        register struct nlist *np;
        !           388:        register struct item *p;
        !           389:        register char *q;
        !           390:        int i;
        !           391:        char buf[40];
        !           392: 
        !           393:        p = fetch1();
        !           394:        if(p->type != CH)
        !           395:                error("Lnc T");
        !           396:        if(p->size >= 40 || p->rank > 1)
        !           397:                error("Lnc D");
        !           398:        copy(CH, p->datap, buf, p->size);
        !           399:        buf[p->size] = 0;
        !           400:        np = nlook(buf);
        !           401:        i = 0;
        !           402:        if(np != 0)
        !           403:        switch(np->use){
        !           404:        case 0:
        !           405:                i = 0; break;
        !           406:        case MF:
        !           407:        case NF:
        !           408:        case DF:
        !           409:                i = 3; break;
        !           410:        case DA:
        !           411:        case CH:
        !           412:        case LV:
        !           413:                i = 2; break;
        !           414:        default:
        !           415:                printf("unknown Lnc type = %d\n", np->use);
        !           416:                i = 4;
        !           417:        }
        !           418:        p = newdat(DA, 0, 1);
        !           419:        p->datap[0] = i;
        !           420:        pop();
        !           421:        *sp++ = p;
        !           422: }
        !           423: 
        !           424: ex_nl()
        !           425: {
        !           426: 
        !           427:        struct item *ip;
        !           428:        struct nlist *np;
        !           429:        data *dp;
        !           430:        register char *cp, *cp2;
        !           431:        register i;
        !           432:        int count, maxlen;
        !           433:        char tlist[NTYPES];
        !           434: 
        !           435: 
        !           436:        /* Namelist quad function.  This is monadic (dyadic not
        !           437:         * implemented).  The argument is a list of types:
        !           438:         *  1:  labels
        !           439:         *  2:  variables
        !           440:         *  3:  functions
        !           441:         * whose names are desired.  The result is a character array
        !           442:         * containing all defined names (in no particular order) of
        !           443:         * the specified type(s).  The number of rows in the matrix
        !           444:         * is the number of names; the number of columns is the
        !           445:         * same as the longest name (other names are space-filled).
        !           446:         */
        !           447: 
        !           448:        ip = fetch1();
        !           449:        if (ip->rank > 1 || ip->type != DA)
        !           450:                error("Lnl D");
        !           451: 
        !           452:        for(i=0; i < NTYPES; i++) tlist[i] = 0;
        !           453:        for(dp=ip->datap; dp < ip->datap+ip->size; dp++)
        !           454:                switch((int)*dp){
        !           455:                case 1: tlist[LBL] = 1; break;
        !           456:                case 2: tlist[CH] = tlist[DA] = 1; break;
        !           457:                case 3: tlist[NF] = tlist[MF] = tlist[DF] = 1; break;
        !           458:                default:error("Lnl D"); break;
        !           459:                }
        !           460: 
        !           461:        count = maxlen = 0;
        !           462:        for(np=nlist; np < &nlist[NLS]; np++){
        !           463:                if (np->use < NTYPES && tlist[np->use]){
        !           464:                        count++;
        !           465:                        if ((i=strlen(np->namep)) > maxlen)
        !           466:                                maxlen = i;
        !           467:                }
        !           468:        }
        !           469: 
        !           470: 
        !           471:        ip = newdat(CH, 2, count*maxlen);
        !           472:        ip->dim[0] = count;
        !           473:        ip->dim[1] = maxlen;
        !           474:        cp = ip->datap;
        !           475: 
        !           476:        for(np=nlist; np < &nlist[NLS]; np++)
        !           477:                if (np->use < NTYPES && tlist[np->use])
        !           478:                        for(cp2 = &np->namep[i=0]; i < maxlen; i++)
        !           479:                                if (*cp2)
        !           480:                                        *cp++ = *cp2++;
        !           481:                                else
        !           482:                                        *cp++ = ' ';
        !           483: 
        !           484:        pop();
        !           485:        *sp++ = ip;
        !           486: }
        !           487: 
        !           488: strlen(p)
        !           489: register char *p;
        !           490: {
        !           491:        register i;
        !           492: 
        !           493:        for(i=0; *p; i++,p++);
        !           494:        return(i);
        !           495: }
        !           496: 
        !           497: ex_prws(){
        !           498: 
        !           499:        register struct nlist *np;
        !           500:        register struct item *ip;
        !           501:        register i;
        !           502: 
        !           503:        /* Print workspace in ASCII format */
        !           504: 
        !           505:        printf("origin = %d\nwidth = %d\ndigits = %d\n\n\n",
        !           506:                thread.iorg, thread.width, thread.digits);
        !           507:        for(np=nlist; np < &nlist[NLS]; np++)
        !           508:                switch(np->use){
        !           509:                case CH:
        !           510:                case DA:
        !           511:                        printf("%s { ", np->namep);
        !           512:                        ip = np->itemp;
        !           513:                        if (ip->rank){
        !           514:                                for(i=0; i < ip->rank; i++)
        !           515:                                        printf("%d ", ip->dim[i]);
        !           516:                                printf("R\n");
        !           517:                        }
        !           518:                        *sp++ = np;
        !           519:                        ex_print();
        !           520:                        pop();
        !           521:                        putchar('\n');
        !           522:                        break;
        !           523: 
        !           524:                case NF:
        !           525:                case MF:
        !           526:                case DF:
        !           527:                        *sp++ = np;
        !           528:                        ex_list();
        !           529:                        /* pop(); in ex_list() */
        !           530:                        putchar('\n');
        !           531:                        break;
        !           532:                }
        !           533: }

unix.superglobalmegacorp.com

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