Annotation of 40BSD/cmd/lisp/io.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)io.c        34.5 10/24/80";
                      2: 
                      3: #include "global.h"
                      4: #include <ctype.h>
                      5: #include "chars.h"
                      6: 
                      7: struct readtable {
                      8: char   ctable[132];
                      9: } initread = {
                     10: /*     ^@ nul  ^A soh  ^B stx  ^C etx  ^D eot  ^E eng  ^F ack  ^G bel  */
                     11:        VERR,   VERR,   VERR,   VERR,   VERR,   VERR,   VERR,   VERR,
                     12: /*     ^H bs   ^I ht   ^J nl   ^K vt   ^L np   ^M cr   ^N so   ^O si   */
                     13:        VCHAR,  VSEP,   VSEP,   VSEP,   VSEP,   VSEP,   VERR,   VERR,
                     14: /*     ^P dle  ^Q dc1  ^R dc2  ^S dc3  ^T dc4  ^U nak  ^V syn  ^W etb  */
                     15:        VERR,   VERR,   VERR,   VERR,   VERR,   VERR,   VERR,   VERR,
                     16: /*     ^X can  ^Y em   ^Z sub  ^[ esc  ^\ fs   ^] gs   ^^ rs   ^_ us   */
                     17:        VERR,   VERR,   VERR,   VSEP,   VERR,   VERR,   VERR,   VERR,
                     18: /*     sp      !       "       #       $       %       &       '       */
                     19:        VSEP,   VCHAR,  VSD,    VCHAR,  VCHAR,  VCHAR,  VCHAR,  VSQ,
                     20: /*     (       )       *       +       ,       -       .       /       */
                     21:        VLPARA, VRPARA, VCHAR,  VSIGN,  VCHAR,  VSIGN,  VPERD,  VCHAR,
                     22: /*     0       1       2       3       4       5       6       7       */
                     23:        VNUM,   VNUM,   VNUM,   VNUM,   VNUM,   VNUM,   VNUM,   VNUM,
                     24: /*     8       9       :       ;       <       =       >       ?       */
                     25:        VNUM,   VNUM,   VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,
                     26: /*     @       A       B       C       D       E       F       G       */
                     27:        VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,
                     28: /*     H       I       J       K       L       M       N       O       */
                     29:        VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,
                     30: /*     P       Q       R       S       T       U       V       W       */
                     31:        VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,
                     32: /*     X       Y       Z       [       \       ]       ^       _       */
                     33:        VCHAR,  VCHAR,  VCHAR,  VLBRCK, VESC,   VRBRCK, VCHAR,  VCHAR,
                     34: /*     `       a       b       c       d       e       f       g       */
                     35:        VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,
                     36: /*     h       i       j       k       l       m       n       o       */
                     37:        VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,
                     38: /*     p       q       r       s       t       u       v       w       */
                     39:        VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,  VCHAR,
                     40: /*     x       y       z       {       |       }       ~       del     */
                     41:        VCHAR,  VCHAR,  VCHAR,  VCHAR,  VDQ,    VCHAR,  VCHAR,  VEOF,
                     42: /*     unused  Xsdc    Xesc    Xdqc                                    */
                     43:        0,      '"',    '\\',   '|'
                     44: };
                     45: 
                     46: char *ctable = initread.ctable;
                     47: lispval atomval;       /* external varaible containing atom returned
                     48:                           from internal atom reading routine */
                     49: lispval readrx(); lispval readr(); lispval readry();
                     50: int keywait;
                     51: int prinlevel = -1;    /* contains maximum list recursion count        */
                     52: int prinlength = -1;   /* maximum number of list elements printed      */
                     53: static int dbqflag;
                     54: static int macflag;
                     55: static int splflag;
                     56: static int mantisfl = 0;
                     57: extern lispval lastrtab;       /* external variable designating current reader
                     58:                           table */
                     59: static char baddot1[]=
                     60: "Bad reader construction: (. <something>)\nShould be (nil . <something>)\n";
                     61: static char baddot2[]=
                     62: "Bad reader construction: (<something> .)\n\
                     63: Should be (<something> . <something>), assumed to be (<something>)";
                     64: static char baddot3[]=
                     65: "Bad reader construction: (<something> . <something> not followed by )";
                     66: 
                     67: #include "chkrtab.h"
                     68: /* readr ****************************************************************/
                     69: /* returns a s-expression read in from the port specified as the first */
                     70: /* argument.  Handles superbrackets, reader macros.                    */
                     71: lispval
                     72: readr(useport)
                     73: FILE *useport;
                     74: {
                     75:        register lispval handy = Vreadtable->a.clb;
                     76: 
                     77:        chkrtab(handy);
                     78:        rbktf = FALSE;
                     79:        rdrport = (FILE *) useport;
                     80:        if(useport==stdin)
                     81:                keywait = TRUE; 
                     82:        handy = readrx(Iratom());
                     83:        if(useport==stdin)
                     84:                keywait = FALSE;
                     85:        return(handy);
                     86: 
                     87: }
                     88: 
                     89: 
                     90: /* readrx **************************************************************/
                     91: /* returns a s-expression beginning with the syntax code of an atom    */
                     92: /* passed in the first */
                     93: /* argument.  Does the actual work for readr, including list, dotted   */
                     94: /* pair, and quoted atom detection                                     */
                     95: lispval
                     96: readrx(code)
                     97: register int code;
                     98: {
                     99:        register lispval work;
                    100:        register lispval *current;
                    101:        register struct argent *result;
                    102:        register struct argent *lbot, *np;
                    103:        int inlbkt = FALSE;
                    104:        lispval errorh();
                    105: 
                    106: top:
                    107:        switch(code)
                    108:        {
                    109:        case TLBKT:
                    110:                inlbkt = TRUE;
                    111:        case TLPARA:
                    112:                result = np;
                    113:                current = (lispval *)np;
                    114:                np++->val = nil; /*protect(nil);*/
                    115:                for(EVER) {
                    116:                        switch(code = Iratom())
                    117:                        {
                    118:                        case TRPARA:
                    119:                                if(rbktf && inlbkt)
                    120:                                        rbktf = FALSE;
                    121:                                return(result->val);
                    122:                        default:
                    123:                                atomval = readrx(code);
                    124:                        case TSCA:
                    125:                                np++->val=atomval;
                    126:                                *current = work = newdot();
                    127:                                work->d.car = atomval;
                    128:                                np--;
                    129:                                current = (lispval *) &(work->d.cdr);
                    130:                                break;
                    131:                        case TSPL:
                    132:                                macrox(); /* input and output in atomval */
                    133:                                *current = atomval;
                    134:                                while(*current!=nil) {
                    135:                                        if(TYPE(*current)!=DTPR)
                    136:                                                errorh(Vermisc,"Non-list returned from splicing macro",nil,FALSE,7,*current);
                    137:                                        current=(lispval *)&((*current)->d.cdr);
                    138:                                }
                    139:                                break;
                    140:                        case TPERD:
                    141:                                if(result->val==nil) {
                    142:                                        work = result->val=newdot();
                    143:                                        current = (lispval *) &(work->d.cdr);
                    144:                                        fprintf(stderr,baddot1);
                    145:                                }
                    146:                                code = Iratom();
                    147:                                if(code==TRPARA) {
                    148:                                        return(errorh(Vermisc,baddot2,nil,TRUE,58,result->val));
                    149:                                }
                    150:                                *current = readrx(code);
                    151:                                /* there is the possibility that the expression
                    152:                                   following the dot is terminated with a "]"
                    153:                                   and thus needs no closing lparens to follow
                    154:                                */
                    155:                                if(!rbktf && ((code = Iratom()))!=TRPARA) {
                    156:                                        errorh(Vermisc,baddot3,nil,TRUE,59,result->val,atomval);
                    157:                                }
                    158:                                if(rbktf && inlbkt)
                    159:                                        rbktf = FALSE;
                    160:                                return(result->val);
                    161:                        case TEOF:
                    162:                                errorh(Vermisc,"Premature end of file after ", 
                    163:                                                          nil,FALSE,0,result->val);
                    164:                        }
                    165:                        if(rbktf) {
                    166:                                if(inlbkt)
                    167:                                        rbktf = FALSE;
                    168:                                return(result->val);
                    169:                        }
                    170:                }
                    171:        case TSCA:
                    172:                return(atomval);
                    173:        case TEOF:
                    174:                return(eofa);
                    175:        case TMAC:
                    176:                macrox();
                    177:                return(atomval);
                    178:        case TSPL:
                    179:                macrox();
                    180:                if((work = atomval)!=nil) {
                    181:                        if(TYPE(work)==DTPR && work->d.cdr==nil)
                    182:                                return(work->d.car);
                    183:                        else
                    184:                                errorh(Vermisc,
                    185: "Improper value returned from splicing macro at top-level",nil,FALSE,9,work);
                    186:                }
                    187:                code = Iratom();
                    188:                goto top;
                    189:                /* return(readrx(Iratom())); */
                    190:        case TSQ:
                    191:                result = np;
                    192:                protect(newdot());
                    193:                (work = result->val)->d.car = quota;
                    194:                work = work->d.cdr = newdot();
                    195:                work->d.car = readrx(Iratom());
                    196:                return(result->val);
                    197:        default:
                    198:                return(errorh(Vermisc,"Readlist error,  code ",nil,FALSE,0,inewint(code)));
                    199:        }
                    200: }
                    201: macrox()
                    202: {
                    203:        lispval Lapply();
                    204: 
                    205:        snpand(0);
                    206:        lbot = np;
                    207:        protect(Iget(atomval,macro));
                    208:        protect(nil);
                    209:        atomval = Lapply();
                    210:        chkrtab(Vreadtable->a.clb);     /* the macro could have changed
                    211:                                           the readtable
                    212:                                         */
                    213:        return;
                    214: }
                    215: 
                    216: 
                    217: 
                    218: /* ratomr ***************************************************************/
                    219: /* this routine returns a pointer to an atom read in from the port given*/
                    220: /* by the first argument                                               */
                    221: lispval
                    222: ratomr(useport)
                    223: register FILE  *useport;
                    224: {
                    225:        rdrport = useport;
                    226:        switch(Iratom())
                    227:        {
                    228:        case TEOF:
                    229:                return(eofa);
                    230:        case TSQ:
                    231:        case TRPARA:
                    232:        case TLPARA:
                    233:        case TLBKT:
                    234:        case TPERD:
                    235:                strbuf[1]=0;
                    236:                return(getatom());
                    237:        default:
                    238:                return(atomval);
                    239:        }
                    240: }
                    241: Iratom()
                    242: {
                    243:        register FILE   *useport = rdrport;
                    244:        register char   c, marker, *name;
                    245:        extern lispval finatom(), calcnum(), getnum();
                    246:        char    positv = TRUE;
                    247:        int code;
                    248:        int strflag = FALSE;
                    249: 
                    250:        name = strbuf;
                    251: 
                    252: again: c = getc(useport) & 0177;
                    253:        *name = c;
                    254: 
                    255:        switch(ctable[c] & 0377) {
                    256: 
                    257:        default:        goto again;
                    258: 
                    259:        case VNUM:
                    260: 
                    261:        case VSIGN:     *name++ = c;
                    262:                        atomval = (getnum(name));
                    263:                        return(TSCA);
                    264: 
                    265:        case VESC:
                    266:                        dbqflag = TRUE;
                    267:                        *name++ = getc(useport) & 0177;
                    268:                        atomval = (finatom(name));
                    269:                        return(TSCA);
                    270:                        
                    271:        case VCHAR:
                    272:                        *name++ = c;
                    273:                        atomval = (finatom(name));
                    274:                        return(TSCA);
                    275: 
                    276:        case VLPARA:    return(TLPARA);
                    277: 
                    278:        case VRPARA:    return(TRPARA);
                    279: 
                    280:        case VPERD:     c = peekc(useport) & 0177;
                    281:                        if(VNUM!=ctable[c])
                    282:                        {  if(SEPMASK & ctable[c])
                    283:                                return(TPERD);
                    284:                           else { *name++ = '.';        /* this period begins an atm */
                    285:                                  atomval = finatom(name);
                    286:                                  return(TSCA);
                    287:                           }
                    288:                        }
                    289:                        *name++ = '.';
                    290:                        mantisfl = 1;
                    291:                        atomval = (getnum(name));
                    292:                        return(TSCA);
                    293: 
                    294:        case VLBRCK:    return(TLBKT);
                    295: 
                    296:        case VRBRCK:    rbktf = TRUE;
                    297:                        return(TRPARA);
                    298: 
                    299:        case VEOF:      /*printf("returning eof atom\n");*/
                    300:                        clearerr(useport);
                    301:                        return(TEOF);
                    302: 
                    303:        case VSQ:       return(TSQ);
                    304: 
                    305:        case VSD:       strflag = TRUE;
                    306:        case VDQ:       name = strbuf;
                    307:                        marker = c;
                    308:                        while ((c = getc(useport)) != marker) {
                    309: 
                    310:                                if(VESC==ctable[c]) c = getc(useport) & 0177;
                    311:                                *name++ = c;
                    312:                                if (name >= endstrb)
                    313:                                        error("ATOM TOO LONG",FALSE);
                    314:                                if (feof(useport)) {
                    315:                                        clearerr(useport);
                    316:                                        error("EOF encountered while reading atom", FALSE);
                    317:                                }
                    318:                        }
                    319:                        *name = NULL_CHAR;
                    320:                        if(strflag)
                    321:                                atomval = (lispval) inewstr(strbuf);
                    322:                        else
                    323:                                atomval = (getatom(name));
                    324:                        return(TSCA);
                    325: 
                    326:        case VERR:      if (c == '\0') 
                    327:                        {
                    328:                          fprintf(stderr,"[read: null read and ignored]\n");
                    329:                          goto again;   /* null pname */
                    330:                        }
                    331:                        fprintf(stderr,"%c (%o): ",c,(int) c);
                    332:                        error("ILLEGAL CHARACTER IN ATOM",TRUE);
                    333: 
                    334:        case VSPL:
                    335:                code = TSPL;
                    336:                goto same;
                    337:        case VMAC:
                    338:                code = TMAC;
                    339:                goto same;
                    340:        case VSCA:
                    341:                code = TSCA;
                    342:        same:
                    343:                strbuf[0] = c;
                    344:                strbuf[1] = 0;
                    345:                atomval = (getatom());
                    346:                return(code);
                    347:        }
                    348: }
                    349: 
                    350: #define push();        if(name==endstrb) error("Int too long",FALSE); else *name++=c;
                    351: #define next() (stats = ctable[c=getc(useport) & 0177])
                    352: 
                    353: lispval
                    354: getnum(name)
                    355: register char *name;
                    356: {
                    357:        register char c;
                    358:        register lispval result;
                    359:        register FILE *useport=rdrport;
                    360:        char  stats;
                    361:        double realno;
                    362:        extern lispval finatom(), calcnum(), newdoub(), dopow();
                    363: 
                    364:        if(mantisfl) {
                    365:                mantisfl = 0;
                    366:                next();
                    367:                goto mantissa;
                    368:        }
                    369:        while(VNUM==next()) {
                    370:                push();         /* recognize [0-9]*, in "ex" parlance */
                    371:        }
                    372:        if(stats==VPERD) {
                    373:                push();         /* continue */ 
                    374:        } else if(stats & SEPMASK) {
                    375:                ungetc(c,useport);
                    376:                return(calcnum(strbuf,name,ibase->a.clb->i));
                    377:        } else if(c=='^') {
                    378:                push();
                    379:                return(dopow(name,ibase->a.clb->i));
                    380:        } else if(c=='_') {
                    381:                push();
                    382:                return(dopow(name,2));
                    383:        } else if(c=='e' || c=='E' || c=='d' ||c=='D') {
                    384:                goto expt;
                    385:        } else {
                    386:                ungetc(c,useport);
                    387:                return(finatom(name));
                    388:        }
                    389:                                /* at this point we have [0-9]*\. , which might
                    390:                                   be a decimal int or the leading part of a
                    391:                                   float                                */
                    392:        if(next()!=VNUM) {
                    393:                if(c=='e' || c=='E' || c=='d' ||c=='D')
                    394:                        goto expt;
                    395:                else if(c=='^') {
                    396:                        push();
                    397:                        return(dopow(name,ibase->a.clb->i));
                    398:                } else if(c=='_') {
                    399:                        push();
                    400:                        return(dopow(name,2));
                    401:                } else {
                    402:                                /* Here we have 1.x where x not num, not sep */
                    403:                                /* Here we have decimal int. NOT FORTRAN! */
                    404:                        ungetc(c,useport);
                    405:                        return(calcnum(strbuf,name-1,10));
                    406:                }
                    407:        }
                    408: mantissa:
                    409:        do {
                    410:                push();
                    411:        } while (VNUM==next());
                    412:                                /* Here we have [0-9]*\.[0-9]* */
                    413:        if(stats & SEPMASK)
                    414:                goto last;
                    415:        else if(c!='e' && c!='E' && c!='d' && c!='D') {
                    416:                ungetc(c,useport);
                    417:                goto verylast;
                    418:        }
                    419: expt:  push();
                    420:        next();
                    421:        if(c=='+' || c =='-') {
                    422:                push();
                    423:                next();
                    424:        }
                    425:        while (VNUM==stats) {
                    426:                push();
                    427:                next();
                    428:        }
                    429: last:  ungetc(c,useport);
                    430:        if(! (stats & SEPMASK) )
                    431:                return(finatom(name));
                    432: 
                    433: verylast:
                    434:        *name=0;
                    435:        sscanf(strbuf,"%F",&realno);
                    436:        (result = newdoub())->r = realno;
                    437:        return(result);
                    438: }
                    439: 
                    440: lispval
                    441: dopow(part2,base)
                    442: lispval base;
                    443: register char *part2;
                    444: {
                    445:        register char *name = part2;
                    446:        register FILE *useport = rdrport;
                    447:        register int power;
                    448:        register struct argent *lbot, *np;
                    449:        char stats,c;
                    450:        char *end1 = part2 - 1; lispval Ltimes();
                    451: 
                    452:        while(VNUM==next()) {
                    453:                push();
                    454:        }
                    455:        if(c!='.') {
                    456:                ungetc(c,useport);
                    457:        }
                    458:        if(c!='.' && !(stats & SEPMASK)) {
                    459:                return(finatom(name));
                    460:        }
                    461:        lbot = np;
                    462:        np++->val = inewint(base);
                    463:        /* calculate "mantissa"*/
                    464:        if(*end1=='.')
                    465:                np++->val = calcnum(strbuf,end1-1,10);
                    466:        else
                    467:                np++->val = calcnum(strbuf,end1,ibase->a.clb->i);
                    468: 
                    469:        /* calculate exponent */
                    470:        if(c=='.')
                    471:                power = calcnum(part2,name,10)->i;
                    472:        else
                    473:                power = calcnum(part2,name,ibase->a.clb->i)->i;
                    474:        while(power-- > 0)
                    475:                lbot[1].val = Ltimes();
                    476:        return(lbot[1].val);
                    477: }
                    478:        
                    479: 
                    480: lispval
                    481: calcnum(strbuf,name,base)
                    482: char *name;
                    483: char *strbuf;
                    484: {
                    485:        register char *p;
                    486:        register lispval result, temp;
                    487:        int negflag = 0;
                    488: 
                    489:        temp = rdrsdot;                 /* initialize sdot cell */
                    490:        temp->s.CDR = nil;
                    491:        temp->i   = 0;
                    492:        p = strbuf;
                    493:        if(*p=='+') p++;
                    494:        else if(*p=='-') {negflag = 1; p++;}
                    495:        *name = 0;
                    496:        if(p>=name) return(getatom());
                    497: 
                    498:        for(;p < name; p++)
                    499:                dmlad(temp,base,*p-'0');
                    500:        if(negflag)
                    501:                dmlad(temp,-1,0);
                    502: 
                    503:        if(temp->s.CDR==0) {
                    504:                result = inewint(temp->i);
                    505:                return(result);
                    506:        } else {
                    507:                (result = newsdot())->i = temp->i;
                    508:                result->s.CDR = temp->s.CDR;
                    509:                temp->s.CDR = 0;
                    510:        }
                    511:        return(result);
                    512: }
                    513: lispval
                    514: finatom(name)
                    515: register char *name;
                    516: {
                    517:        extern int uctolc;
                    518:        register FILE *useport = rdrport;
                    519:        register char c, stats;
                    520:        register char *savenm;
                    521:        savenm = name - 1;      /* remember start of name */
                    522:        while(!(next()&SEPMASK)) {
                    523: 
                    524:                if(stats == VESC) c = getc(useport) & 0177;
                    525:                *name++=c;
                    526:                if (name >= endstrb)
                    527:                        error("ATOM TOO LONG",FALSE);
                    528:        }
                    529:        *name = NULL_CHAR;
                    530:        ungetc(c,useport);
                    531:        if (uctolc) for(; *savenm ; savenm++) 
                    532:                        if( isupper(*savenm) ) *savenm = tolower(*savenm);
                    533:        return(getatom());
                    534: }
                    535: 
                    536: /* printr ***************************************************************/
                    537: /* prints the first argument onto the port specified by the second     */
                    538: 
                    539: /*
                    540:  * Last modified Mar 21, 1980 for hunks
                    541:  */
                    542: 
                    543: printr(a,useport)
                    544: register lispval a;
                    545: register FILE *useport;
                    546: {
                    547:        register lispval temp;
                    548:        register hsize, i;
                    549:        char strflag = 0;
                    550:        char Idqc = 0;
                    551:        int curprinlength = prinlength;
                    552: 
                    553: val_loop:
                    554:        if( ! VALID(a) )
                    555:        {
                    556:        /*      error("Bad lisp data encountered by printr", TRUE); 
                    557:                a = badst;      */
                    558:                printf("<printr:bad lisp data: 0x%x>",a);
                    559:                return;
                    560:        }
                    561: 
                    562:        switch (TYPE(a))
                    563:        {
                    564: 
                    565: 
                    566:        case UNBO:      fputs("<UNBOUND>",useport);
                    567:                        break;
                    568: 
                    569:        case VALUE:     fputs("(ptr to)",useport);
                    570:                        a = a->l;
                    571:                        goto val_loop;
                    572: 
                    573:        case INT:       fprintf(useport,"%d",a->i);
                    574:                        break;
                    575: 
                    576:        case DOUB:      {  char buf[64];
                    577:                           lfltpr(buf,a->r);
                    578:                           fputs(buf,useport);
                    579:                        }
                    580:                        break;
                    581: 
                    582:        case PORT:      { lispval  cp;
                    583:                          if((cp = ioname[PN(a->p)]) == nil)
                    584:                             fputs("%$unopenedport",useport);
                    585:                          else fprintf(useport,"%%%s",cp);
                    586:                        }
                    587:                        break;
                    588: 
                    589:        case HUNK2:
                    590:        case HUNK4:
                    591:        case HUNK8:
                    592:        case HUNK16:
                    593:        case HUNK32:
                    594:        case HUNK64:
                    595:        case HUNK128:
                    596:                        if(prinlevel == 0) 
                    597:                        {   
                    598:                             fputs("%",useport);
                    599:                             break;
                    600:                        }
                    601:                        hsize = 2 << HUNKSIZE(a);
                    602:                        fputs("{", useport);
                    603:                        prinlevel--;
                    604:                        printr(a->h.hunk[0], useport);
                    605:                        curprinlength--;
                    606:                        for (i=1; i < hsize; i++)
                    607:                        {
                    608:                            if (a->h.hunk[i] == hunkfree)
                    609:                                break;
                    610:                            if (curprinlength-- == 0)
                    611:                            {
                    612:                                fputs(" ...",useport); 
                    613:                                break;
                    614:                            }
                    615:                            else
                    616:                            {
                    617:                                fputs(" ", useport);
                    618:                                printr(a->h.hunk[i], useport);
                    619:                            }
                    620:                        }
                    621:                        fputs("}", useport);
                    622:                        prinlevel++;
                    623:                        break;
                    624: 
                    625:        case ARRAY:     fputs("array[",useport);
                    626:                        printr(a->ar.length,useport);
                    627:                        fputs("]",useport);
                    628:                        break;
                    629: 
                    630:        case BCD:       fprintf(useport,"#%X-",a->bcd.entry);
                    631:                        printr(a->bcd.discipline,useport);
                    632:                        break;
                    633: 
                    634:        case SDOT:      pbignum(a,useport);
                    635:                        break;
                    636: 
                    637:        case DTPR:      if(prinlevel==0)
                    638:                        {
                    639:                             fputs("&",useport);
                    640:                             break;
                    641:                        }
                    642:                        prinlevel--;
                    643:                        if(a->d.car==quota && a->d.cdr!=nil 
                    644:                            && a->d.cdr->d.cdr==nil) {
                    645:                                putc('\'',useport);
                    646:                                printr(a->d.cdr->d.car,useport);
                    647:                                prinlevel++;
                    648:                                break;
                    649:                        }
                    650:                        putc('(',useport);
                    651:                        curprinlength--;
                    652:        morelist:       printr(a->d.car,useport);
                    653:                        if ((a = a->d.cdr) != nil)
                    654:                                {
                    655:                                if(curprinlength-- == 0)
                    656:                                {
                    657:                                    fputs(" ...",useport);
                    658:                                    goto out;
                    659:                                }
                    660:                                putc(' ',useport);
                    661:                                if (TYPE(a) == DTPR) goto morelist;
                    662:                                fputs(". ",useport);
                    663:                                printr(a,useport);
                    664:                                }
                    665:                out:
                    666:                        fputc(')',useport);
                    667:                        prinlevel++;
                    668:                        break;
                    669: 
                    670:        case STRNG:     strflag = TRUE;
                    671:                        Idqc = Xsdc;
                    672: 
                    673:        case ATOM:      {
                    674:                        char    *front, *temp; int clean;
                    675:                        temp = front = (strflag ? ((char *) a) : a->a.pname);
                    676:                        if(Idqc==0) Idqc = Xdqc;
                    677: 
                    678:                        if(Idqc) {
                    679:                                clean = *temp;
                    680:                                if (*temp == '-') temp++;
                    681:                                clean = clean && (ctable[*temp] != VNUM);
                    682:                                while (clean && *temp)
                    683:                                        clean = (!(ctable[*temp++] & QUTMASK));
                    684:                                if (clean & !strflag)
                    685:                                        fputs(front,useport);
                    686:                                else     {
                    687:                                        putc(Idqc,useport);
                    688:                                        for(temp=front;*temp;temp++) {
                    689:                                                if(  *temp==Idqc
                    690:                                                  || ctable[*temp] == VESC)
                    691:                                                        putc(Xesc,useport);
                    692:                                                putc(*temp,useport);
                    693:                                        }
                    694:                                        putc(Idqc,useport);
                    695:                                }
                    696: 
                    697:                        }  else {
                    698:                                register char *cp = front;
                    699: 
                    700:                                if(ctable[*cp]==VNUM)
                    701:                                        putc(Xesc,useport);
                    702:                                for(; *cp; cp++) {
                    703:                                        if(ctable[*cp]& QUTMASK)
                    704:                                                putc(Xesc,useport);
                    705:                                        putc(*cp,useport);
                    706:                                }
                    707:                        
                    708:                        }
                    709:                                        
                    710:                }
                    711:        }
                    712: }
                    713: 
                    714: lfltpr(buf,val)                /* lisp floating point printer */
                    715: char *buf;
                    716: double val;
                    717: {
                    718:        register char *cp1;
                    719: 
                    720:        sprintf(buf,"%.16G",val);
                    721:        for(cp1 = buf; *cp1; cp1++)
                    722:                if(*cp1=='.'|| *cp1=='E') return;
                    723: 
                    724:        /* if we are here, there was no dot, so the number was
                    725:           an integer.  Furthermore, cp1 already points to the 
                    726:           end of the string. */
                    727: 
                    728:        *cp1++ = '.';
                    729:        *cp1++ = '0';
                    730:        *cp1++ = 0;
                    731: }
                    732:        
                    733: 
                    734: /* dmpport ****************************************************************/
                    735: /* outputs buffer indicated by first argument whether full or not      */
                    736: 
                    737: dmpport(useport)
                    738: register lispval useport;
                    739:        {
                    740:        fflush(useport);
                    741: }
                    742: 
                    743: /*  protect and unprot moved to eval.c  (whr)  */

unix.superglobalmegacorp.com

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