Annotation of 41BSD/cmd/lisp/eval.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)eval.c      34.2 10/21/80";
                      2: 
                      3: #include "global.h"
                      4: #include <signal.h>
                      5: /************************************************************************/
                      6: /*                                                                     */
                      7: /*   file: eval.i                                                      */
                      8: /*   contents: evaluator and namestack maintenance routines            */
                      9: /*                                                                     */
                     10: /************************************************************************/
                     11: 
                     12: 
                     13: /* eval *****************************************************************/
                     14: /* returns the value of the pointer passed as the argument.            */
                     15: 
                     16: 
                     17: lispval
                     18: eval(actarg)
                     19: lispval actarg;
                     20: {
                     21: #define argptr handy
                     22:     register lispval a = actarg;
                     23:     register lispval handy;
                     24:     register struct nament *namptr;
                     25:     register struct argent *workp;
                     26:     register struct argent *lbot;
                     27:     register struct argent *np;
                     28:     /*  struct argent *poplbot;  Why this here? - M. Marcus */
                     29:     struct nament *oldbnp = bnp;
                     30:     lispval Ifcall(), Iarray();
                     31: 
                     32:     /*debugging 
                     33:     if (rsetsw && rsetatom->a.clb != nil) {
                     34:        printf("Eval:");
                     35:        printr(a,stdout);
                     36:        printf("\nrsetsw: %d evalhsw: %d\n", rsetsw, evalhsw);
                     37:        printf("*rset: ");
                     38:        printr(rsetatom->a.clb,stdout);
                     39:        printf(" evalhook: ");
                     40:        printr(evalhatom->a.clb,stdout);
                     41:        printf(" evalhook call flag^G: ");
                     42:        printr(evalhcall->a.clb, stdout);
                     43:        fflush(stdout); 
                     44:     };  */
                     45: 
                     46:     /* check if an interrupt is pending         and handle if so */
                     47:     if(sigintcnt > 0) sigcall(SIGINT);
                     48: 
                     49:     if (rsetsw && rsetatom->a.clb != nil){     /* if (*rset t) has been done */
                     50:        if (evalhsw != nil && evalhatom->a.clb != nil)
                     51:                                                /*if (sstatus evalhook t)
                     52:                                                    and evalhook non-nil */
                     53:            if (evalhcall->a.clb == tatom)
                     54:                        /*if this is a call to evalhook, don't call evalhook
                     55:                          function, but clobber evalhcall atom, so recursive 
                     56:                          calls to eval cause evalhook function to fire. */
                     57:                evalhcall->a.clb = nil;
                     58:            else {
                     59:                /* setup equivalent of (funcall evalhook <arg to eval>) */
                     60:                (np++)->val = a;                /* push form on namestack */
                     61:                lbot=np;                        /* set up args to funcall */
                     62:                (np++)->val = evalhatom->a.clb; /* push evalhook's clb */
                     63:                (np++)->val = a;                /* eval's arg becomes
                     64:                                                           2nd arg to funcall */
                     65:                PUSHDOWN(evalhatom, nil);       /* lambda-bind evalhook to nil*/
                     66:                handy = Lfuncal();              /* now call funcall */
                     67:                POP;
                     68:                return(handy);
                     69:        };
                     70:     };
                     71:         
                     72:     switch (TYPE(a))
                     73:     {
                     74:     case ATOM:
                     75:        if (rsetsw && rsetatom->a.clb != nil && bptr_atom->a.clb != nil) {
                     76: 
                     77:            struct nament *bpntr, *eval1bptr;
                     78:                                    /* Both rsetsw and rsetatom for efficiency*/
                     79:                                    /* bptr_atom set by second arg to eval1 */
                     80:            eval1bptr = (struct nament *) bptr_atom->a.clb->d.cdr;
                     81:                                    /* eval1bptr is bnp when eval1 was called;
                     82:                                       if an atom was bound after this,
                     83:                                       then its clb is valid */
                     84:            for (bpntr = eval1bptr; bpntr < bnp; bpntr++)
                     85:                if (bpntr->atm==a) {
                     86:                    handy = a->a.clb;
                     87:                    goto gotatom;
                     88:                };                  /* Value saved in first binding of a,
                     89:                                       if any, after pointer to eval1,
                     90:                                       is the valid value, else use its clb */
                     91:            for (bpntr = (struct nament *)bptr_atom->a.clb->d.car;
                     92:              bpntr < eval1bptr; bpntr++)
                     93:                if (bpntr->atm==a) {
                     94:                    handy=bpntr->val;
                     95:                    goto gotatom;   /* Simply no way around goto here */
                     96:                };
                     97:        };
                     98:         handy = a->a.clb;
                     99:     gotatom:
                    100:         if(handy==CNIL) {
                    101:             handy = errorh(Vermisc,"Unbound Variable:",nil,TRUE,0,a);
                    102:         }
                    103:         return(handy);
                    104: 
                    105:     case VALUE:
                    106:         return(a->l);
                    107: 
                    108:     case DTPR:
                    109:         (np++)->val = a;               /* push form on namestack */
                    110:         lbot = np;                     /* define beginning of argstack */
                    111:         /* oldbnp = bnp;                  redundant - Mitch Marcus */
                    112:         a = a->d.car;                  /* function name or lambda-expr */
                    113:         for(EVER)
                    114:             {
                    115:             switch(TYPE(a))
                    116:                 {
                    117:             case ATOM:
                    118:                                        /*  get function binding  */
                    119:                 if(a->a.fnbnd==nil && a->a.clb!=nil) {
                    120:                     a=a->a.clb;
                    121:                     if(TYPE(a)==ATOM)
                    122:                         a=a->a.fnbnd;
                    123:                 } else
                    124:                     a = a->a.fnbnd;
                    125:                 break;
                    126:             case VALUE:
                    127:                 a = a->l;              /*  get value  */
                    128:                 break;
                    129:                 }
                    130: 
                    131:             vtemp = (CNIL-1);       /* sentinel value for error test */
                    132: 
                    133:         funcal:    switch (TYPE(a))
                    134:                 {
                    135:             case BCD:    /* function */
                    136:                 argptr = actarg->d.cdr;
                    137: 
                    138:                                    /* decide whether lambda, nlambda or
                    139:                                       macro and push args onto argstack
                    140:                                       accordingly.                */
                    141: 
                    142:                 if(a->bcd.discipline==nlambda) {
                    143:                     (np++)->val = argptr;
                    144:                     TNP;
                    145:                 } else if(a->bcd.discipline==macro) {
                    146:                     (np++)->val = actarg;
                    147:                     TNP;
                    148:                 } else for(;argptr!=nil; argptr = argptr->d.cdr) {
                    149:                     (np++)->val = eval(argptr->d.car);
                    150:                     TNP;
                    151:                 }
                    152:                 /* go for it */
                    153: 
                    154:                 if(TYPE(a->bcd.discipline)==STRNG)
                    155:                     vtemp = Ifcall(a);
                    156:                 else
                    157:                     vtemp = (*(lispval (*)())(a->bcd.entry))();
                    158:                 break;
                    159: 
                    160:             case ARRAY:
                    161:                 vtemp = Iarray(a,actarg->d.cdr,TRUE);
                    162:                 break;
                    163: 
                    164:             case DTPR:             /* push args on argstack according to
                    165:                                       type                */
                    166:                 argptr = a->d.car;
                    167:                 if (argptr==lambda) {
                    168:                     for(argptr = actarg->d.cdr;
                    169:                         argptr!=nil; argptr=argptr->d.cdr) {
                    170:                         
                    171:                         (np++)->val = eval(argptr->d.car);
                    172:                         TNP;
                    173:                     }
                    174:                 } else if (argptr==nlambda) {
                    175:                     (np++)->val = actarg->d.cdr;
                    176:                     TNP;
                    177:                 } else if (argptr==macro) {
                    178:                     (np++)->val = actarg;
                    179:                     TNP;
                    180:                 } else if (argptr==lexpr) {
                    181:                     for(argptr = actarg->d.cdr;
                    182:                       argptr!=nil; argptr=argptr->d.cdr) {
                    183:                         
                    184:                         (np++)->val = eval(argptr->d.car);
                    185:                         TNP;
                    186:                     }
                    187:                     handy = newdot();
                    188:                     handy->d.car = (lispval)lbot;
                    189:                     handy->d.cdr = (lispval)np;
                    190:                     PUSHDOWN(lexpr_atom,handy);
                    191:                     lbot = np;
                    192:                     (np++)->val = inewint(((lispval *)handy->d.cdr) - (lispval *)handy->d.car);
                    193: 
                    194:                 } else break;    /* something is wrong - this isn't a proper function */
                    195: 
                    196:                 argptr = (a->d.cdr)->d.car;
                    197:                 namptr =  bnp;
                    198:                 workp = lbot;
                    199:                 if(bnp + (np - lbot)> bnplim)
                    200:                     binderr();
                    201:                 for(;argptr != (lispval)nil;
                    202:                      workp++,argptr = argptr->d.cdr)    /* rebind formal names (shallow) */
                    203:                 {
                    204:                     if(argptr->d.car==nil)
                    205:                         continue;
                    206:                     /*if(((namptr)->atm = argptr->d.car)==nil)
                    207:                         error("Attempt to lambda bind nil",FALSE);*/
                    208:                     namptr->atm = argptr->d.car;
                    209:                     if (workp < np) {
                    210:                         namptr->val = namptr->atm->a.clb;
                    211:                         namptr->atm->a.clb = workp->val;
                    212:                     } else
                    213:                         bnp = namptr,
                    214:                         error("Too few actual parameters",FALSE);
                    215:                     namptr++;
                    216:                 }
                    217:                 bnp = namptr;
                    218:                 if (workp < np)
                    219:                     error("Too many actual parameters",FALSE);
                    220: 
                    221:                                    /* execute body, implied prog allowed */
                    222: 
                    223:                 for (handy = a->d.cdr->d.cdr;
                    224:                     handy != nil;
                    225:                     handy = handy->d.cdr) {
                    226:                         vtemp = eval(handy->d.car);
                    227:                     }
                    228:                 }
                    229:             if (vtemp != (CNIL-1)) {
                    230:                                /* if we get here with a believable value, */
                    231:                                /* we must have executed a function. */
                    232:                 popnames(oldbnp);
                    233: 
                    234:                 /* in case some clown trashed t */
                    235: 
                    236:                 tatom->a.clb = (lispval) tatom;
                    237:                 if(a->d.car==macro) 
                    238:                    return(eval(vtemp));
                    239:                     /* It is of the most wonderful 
                    240:                        coincidence that the offset
                    241:                        for car is the same as for
                    242:                        discipline so we get bcd macros
                    243:                        for free here ! */
                    244:                 else return(vtemp);
                    245:            }
                    246:             popnames(oldbnp);
                    247:             a = (lispval) errorh(Verundef,"eval: Undefined function ",nil,TRUE,0,actarg->d.car);
                    248:             }
                    249: 
                    250:         }
                    251:     return(a);    /* other data types are considered constants */
                    252:     }
                    253: 
                    254: 
                    255: 
                    256: 
                    257: /* popnames *************************************************************/
                    258: /* removes from the name stack all entries above the first argument.    */
                    259: /* routine should usually be used to clean up the name stack as it    */
                    260: /* knows about the special cases.  np is returned pointing to the    */
                    261: /* same place as the argument passed.                    */
                    262: lispval
                    263: popnames(llimit)
                    264: register struct nament *llimit;
                    265: {
                    266:     register struct nament *rnp;
                    267: 
                    268:     for(rnp = bnp; --rnp >= llimit;)
                    269:         rnp->atm->a.clb = rnp->val;
                    270:     bnp = llimit;
                    271: }
                    272: 
                    273: 
                    274: /************************************************************************/
                    275: /*                                                                     */
                    276: /*   file: apply.c                                                     */
                    277: /*    Caveat -- Work in Progress -- not guaranteed! not tested!                */
                    278: /*                                                                     */
                    279: /* apply  ***************************************************************/
                    280: lispval
                    281: Lapply()
                    282: {
                    283:     register lispval a;
                    284:     register lispval handy;
                    285:     register struct argent *workp;
                    286:     register struct nament *namptr;
                    287:     register struct argent *lbot;
                    288:     register struct argent *np;
                    289:     lispval vtemp;
                    290:     struct nament *oldbnp = bnp;
                    291:     struct argent *oldlbot = lbot; /* Bottom of my frame! */
                    292: 
                    293:     a = lbot->val;
                    294:     argptr = lbot[1].val;
                    295:     if(np-lbot!=2)
                    296:         errorh(Vermisc,"Apply: Wrong number of args.",nil,FALSE,
                    297:                999,a,argptr);
                    298:     if(TYPE(argptr)!=DTPR && argptr!=nil)
                    299:         argptr = errorh(Vermisc,"Apply: non-list of args",nil,TRUE,
                    300:                 998,argptr);
                    301:     (np++)->val = a;    /* push form on namestack */
                    302:     TNP;
                    303:     lbot = np;        /* bottom of current frame */
                    304:     for(EVER)
                    305:         {
                    306:         if (TYPE(a) == ATOM) a = a->a.fnbnd;
                    307:                                        /* get function definition (unless
                    308:                                           calling form is itself a lambda-
                    309:                                           expression) */
                    310:         vtemp = CNIL;                  /* sentinel value for error test */
                    311:         switch (TYPE(a)) {
                    312: 
                    313:         case BCD: 
                    314:                                        /* push arguments - value of a */
                    315:             if(a->bcd.discipline==nlambda || a->bcd.discipline==macro) {
                    316:                 (np++)->val=argptr;
                    317:                 TNP;
                    318:             } else for (; argptr!=nil; argptr = argptr->d.cdr) {
                    319:                 (np++)->val=argptr->d.car;
                    320:                 TNP;
                    321:             }
                    322: 
                    323:            if(TYPE(a->bcd.discipline) == STRNG)
                    324:              vtemp = Ifcall(a);        /* foreign function */
                    325:            else
                    326:               vtemp = (*(lispval (*)())(a->bcd.entry))(); /* go for it */
                    327:             break;
                    328: 
                    329:         case ARRAY:
                    330:             vtemp = Iarray(a,argptr,FALSE);
                    331:             break;
                    332: 
                    333: 
                    334:         case DTPR:
                    335:             if (a->d.car==nlambda || a->d.car==macro) {
                    336:                 (np++)->val = argptr;
                    337:                 TNP;
                    338:             } else if (a->d.car==lambda)
                    339:                 for (; argptr!=nil; argptr = argptr->d.cdr) {
                    340:                     (np++)->val = argptr->d.car;
                    341:                     TNP;
                    342:                 }
                    343:             else if(a->d.car==lexpr) {
                    344:                 for (; argptr!=nil; argptr = argptr->d.cdr) {
                    345:                     
                    346:                     (np++)->val = argptr->d.car;
                    347:                     TNP;
                    348:                 }
                    349:                 handy = newdot();
                    350:                 handy->d.car = (lispval)lbot;
                    351:                 handy->d.cdr = (lispval)np;
                    352:                 PUSHDOWN(lexpr_atom,handy);
                    353:                 lbot = np;
                    354:                 (np++)->val = inewint(((lispval *)handy->d.cdr) - (lispval *)handy->d.car);
                    355: 
                    356:             } else break;    /* something is wrong - this isn't a proper function */
                    357:             rebind(a->d.cdr->d.car,lbot);
                    358:             np = lbot;
                    359:             for (handy = a->d.cdr->d.cdr;
                    360:                 handy != nil;
                    361:                 handy = handy->d.cdr) {
                    362:                     vtemp = eval(handy->d.car);    /* go for it */
                    363:                 }
                    364:             }
                    365:         if (vtemp != CNIL)
                    366:                                /* if we get here with a believable value, */
                    367:                                /* we must have executed a function. */
                    368:             {
                    369:             popnames(oldbnp);
                    370: 
                    371:             /* in case some clown trashed t */
                    372: 
                    373:             tatom->a.clb = (lispval) tatom;
                    374:             return(vtemp);
                    375:             }
                    376:         popnames(oldbnp);
                    377:         a = (lispval) errorh(Verundef,"apply: Undefined Function ",
                    378:                                              nil,TRUE,0,oldlbot->val);
                    379:     }
                    380:     /*NOT REACHED*/
                    381: }
                    382: 
                    383: 
                    384: /*
                    385:  * Rebind -- rebind formal names
                    386:  */
                    387: rebind(argptr,workp)
                    388: register lispval argptr;        /* argptr points to list of atoms */
                    389: register struct argent * workp;        /* workp points to position on stack
                    390:                        where evaluated args begin */
                    391: {
                    392:     register lispval vtemp;
                    393:     register struct nament *namptr = bnp;
                    394:     register struct argent *lbot;
                    395:     register struct argent *np;
                    396: 
                    397:     for(;argptr != (lispval)nil;
                    398:          workp++,argptr = argptr->d.cdr)  /* rebind formal names (shallow) */
                    399:     {
                    400:         if(argptr->d.car==nil)
                    401:             continue;
                    402:         namptr->atm = argptr->d.car;
                    403:         if (workp < np) {
                    404:             namptr->val = namptr->atm->a.clb;
                    405:             namptr->atm->a.clb = workp->val;
                    406:         } else
                    407:             bnp = namptr,
                    408:             error("Too few actual parameters",FALSE);
                    409:         namptr++;
                    410:         if(namptr > bnplim)
                    411:             binderr();
                    412:     }
                    413:     bnp = namptr;
                    414:     if (workp < np)
                    415:         error("Too many actual parameters",FALSE);
                    416: }
                    417: 
                    418: /* the argument to Lfuncal is optional, if it is given  then it is 
                    419:  * the name of the function to call and lbot points to the first arg.
                    420:  * if it is not given, then lbot points to the function to call
                    421:  */
                    422: lispval
                    423: Lfuncal(fcn)
                    424: lispval fcn;
                    425: {
                    426:     register lispval a;
                    427:     register lispval handy; 
                    428:     register struct argent *oldlbot;
                    429:     register struct nament **namptr;
                    430:     register struct argent *lbot;
                    431:     register struct argent *np;
                    432:     struct nament *oldbnp = bnp;       /* MUST be first local for evalframe */
                    433:     lispval fcncalled;
                    434:     lispval Ifcall(),Llist(),Iarray();
                    435:     lispval vtemp;
                    436:     int typ;
                    437:     extern lispval end[];
                    438: 
                    439:     /*debugging stufff 
                    440:     printf("In funcal: ");
                    441:     printr(lbot->val,stdout);
                    442:     fflush(stdout); 
                    443:     printf("\n"); */
                    444: 
                    445:     /* atrocity to avoid call to nargs() */
                    446:     /*define nargs() (* (char *) (&fcn -1))*/
                    447: 
                    448:     oldlbot = lbot;                    /* bottom of my namestack frame */
                    449:     if((&fcn)[-1]==(lispval)1)                 /* function I am evaling.    */
                    450:        a = fcncalled = fcn;
                    451:     else {
                    452:        a = fcncalled = lbot->val;
                    453:        lbot++;
                    454:     }
                    455: 
                    456:     /* check if exception pending */
                    457:     if(sigintcnt > 0 ) sigcall(SIGINT);
                    458: 
                    459:     for(EVER)
                    460:     {
                    461:      top:
                    462:         typ = TYPE(a);
                    463:         if (typ == ATOM) a = a->a.fnbnd, typ = TYPE(a);
                    464: 
                    465:             /* get function defn (unless calling form */
                    466:             /* is itself a lambda-expr) */
                    467:         vtemp = CNIL-1;            /* sentinel value for error test */
                    468:         switch (typ) {
                    469:         case ARRAY:
                    470:            protect(a);                 /* stack array descriptor on top */
                    471:            a = a->ar.accfun;           /* now funcall access function */
                    472:            goto top;
                    473:         case BCD:
                    474:             if(a->bcd.discipline==nlambda)
                    475:                 {   if(np==lbot) protect(nil);  /* default is nil */
                    476:                 while(np-lbot!=1 || (lbot->val != nil &&
                    477:                       TYPE(lbot->val)!=DTPR)) {
                    478: 
                    479:                            lbot->val = errorh(Vermisc,"Bad funcall arg(s) to fexpr.",
                    480:                                                 nil,TRUE,0,lbot->val);
                    481:                            
                    482:                     np = lbot+1;
                    483:                     }
                    484:                 }
                    485:             /* go for it */
                    486: 
                    487:             if(TYPE(a->bcd.discipline)==STRNG)
                    488:                 vtemp = Ifcall(a);
                    489:             else
                    490:                 vtemp = (*(lispval (*)())(a->bcd.entry))();
                    491:             if(a->bcd.discipline==macro)
                    492:                 vtemp = eval(vtemp);
                    493:             break;
                    494: 
                    495: 
                    496:         case DTPR:
                    497:             if (a->d.car == lambda) {
                    498:                 ;/* VOID */
                    499:             } else if (a->d.car == nlambda || a->d.car==macro) {
                    500:                 if( np==lbot ) protect(nil);    /* default */
                    501:                 while(np-lbot!=1 || (lbot->val != nil &&
                    502:                           TYPE(lbot->val)!=DTPR)) {
                    503:                     lbot->val = error("Bad funcall arg(s) to fexpr.",TRUE);
                    504:                     np = lbot+1;
                    505:                     }
                    506:             } else if (a->d.car == lexpr) {
                    507:                 handy = newdot();
                    508:                 handy->d.car = (lispval) lbot;
                    509:                 handy->d.cdr = (lispval) np;
                    510:                 PUSHDOWN(lexpr_atom,handy);
                    511:                 lbot = np;
                    512:                 (np++)->val = inewint(((lispval *)handy->d.cdr) - (lispval *)handy->d.car);
                    513:             } else break;        /* something is wrong - this isn't a proper function */
                    514:             rebind(a->d.cdr->d.car,lbot);
                    515:             np = lbot;
                    516:             for (handy = a->d.cdr->d.cdr;
                    517:                 handy != nil;
                    518:                 handy = handy->d.cdr) {
                    519:                     vtemp = eval(handy->d.car);    /* go for it */
                    520:                 }
                    521:             if(a->d.car==macro)
                    522:                 vtemp = eval(vtemp);
                    523:         }
                    524:         if (vtemp != CNIL-1)
                    525:             /* if we get here with a believable value, */
                    526:             /* we must have executed a function. */
                    527:             {
                    528:             popnames(oldbnp);
                    529: 
                    530:             /* in case some clown trashed t */
                    531: 
                    532:             tatom->a.clb = (lispval) tatom;
                    533:             /*debugging
                    534:             if(a>(lispval) end){printf(" leaving:");
                    535:             printr(a,stdout);
                    536:             fflush(stdout);} */
                    537:             return(vtemp);
                    538:             }
                    539:         popnames(oldbnp);
                    540:            a = fcncalled = (lispval) errorh(Verundef,"funcall: Bad function",
                    541:                                               nil,TRUE,0,fcncalled);
                    542:     }
                    543:     /*NOT REACHED*/
                    544: }
                    545: 
                    546: /* The following must be the next "function" after Lfuncal, for the
                    547: sake of Levalf.  */
                    548: fchack () {}
                    549: 
                    550: #undef protect
                    551: 
                    552: /* protect **************************************************************/
                    553: /* pushes the first argument onto namestack, thereby protecting from gc */
                    554: lispval
                    555: protect(a)
                    556: lispval a;
                    557: {
                    558:     /* (np++)->val = a;
                    559:        if (np >=  nplim)
                    560:         namerr();
                    561:      */
                    562:     asm("    movl    4(ap),(r6)+");
                    563:     asm("    cmpl    r6,_nplim");
                    564:     asm("    jlss    out1");
                    565:     asm("    calls    $0,_namerr");
                    566:     asm("out1:    ret");
                    567:     }
                    568: 
                    569: 
                    570: /* unprot ****************************************************************/
                    571: /* returns the top thing on the name stack.  Underflow had better not    */
                    572: /* occur.                                */
                    573: lispval
                    574: unprot()
                    575:     {
                    576:     asm("    movl    -(r6),r0");
                    577:     }
                    578: 
                    579: lispval
                    580: linterp()
                    581:     {
                    582:     error("BYTE INTERPRETER CALLED ERRONEOUSLY",FALSE);
                    583:     }
                    584: 
                    585: /* Undeff - called from qfuncl when it detects a call to a undefined
                    586:     function from compiled code, we print out a message and
                    587:     dont allow continuation
                    588: */
                    589: lispval
                    590: Undeff(atmn)
                    591: lispval atmn;
                    592: {
                    593:     return(errorh(Verundef,"Undefined function called from compiled code ",
                    594:                                      nil,TRUE,0,atmn));
                    595: }
                    596: bindfix(firstarg)
                    597: lispval firstarg;
                    598: {
                    599:     register lispval *argp = &firstarg;
                    600:     register struct nament *mybnp = bnp;
                    601:     while(*argp != nil) {
                    602:         mybnp->atm = *argp++;
                    603:         mybnp->val = mybnp->atm->a.clb;
                    604:         mybnp->atm->a.clb = *argp++;
                    605:         bnp = mybnp++;
                    606:     }
                    607: }

unix.superglobalmegacorp.com

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