Annotation of researchv10dc/cmd/usgmake/misc.c, revision 1.1.1.1

1.1       root        1: /*      @(#)/usr/src/cmd/make/misc.c    3.4     */
                      2: 
                      3: /*      @(#)misc.c      3.2     */
                      4: 
                      5: #include "defs"
                      6: #include "ctype.h"
                      7: 
                      8: 
                      9: 
                     10: FSTATIC CHARSTAR nextchar=0;
                     11: FSTATIC CHARSTAR lastchar=0;
                     12: 
                     13: FSTATIC int *nextint=0;
                     14: FSTATIC int *lastint=0;
                     15: 
                     16: FSTATIC NAMEBLOCK hashtab[HASHSIZE];
                     17: int nhashed=0;
                     18: 
                     19: 
                     20: /* simple linear hash.  hash function is sum of
                     21:    characters mod hash table size.
                     22: */
                     23: hashloc(s)
                     24: CHARSTAR s;
                     25: {
                     26:         register int i;
                     27:         register int hashval;
                     28:         register CHARSTAR t;
                     29: 
                     30:         hashval = 0;
                     31: 
                     32:         for(t=s; *t!=CNULL ; ++t)
                     33:                 hashval += *t;
                     34: 
                     35:         hashval %= HASHSIZE;
                     36: 
                     37:         for(i=hashval;
                     38:                 hashtab[i]!=0 && !equal(s,hashtab[i]->namep);
                     39:                 i = (i+1)%HASHSIZE ) ;
                     40: 
                     41:         return(i);
                     42: }
                     43: 
                     44: 
                     45: NAMEBLOCK srchname(s)
                     46: register CHARSTAR s;
                     47: {
                     48:         return( hashtab[hashloc(s)] );
                     49: }
                     50: 
                     51: 
                     52: 
                     53: 
                     54: NAMEBLOCK makename(s)
                     55: register CHARSTAR s;
                     56: {
                     57: /* make a name entry; `s' is presumed to already to have been saved */
                     58: 
                     59:         register NAMEBLOCK p;
                     60:         register CHARSTAR t;
                     61: 
                     62:         if(nhashed++ > HASHSIZE-3)
                     63:                 fatal("Hash table overflow");
                     64: 
                     65:         p = ALLOC(nameblock);
                     66:         p->nextname = firstname;
                     67:         p->backname = NULL;
                     68: 
                     69:         p->namep = s;
                     70:         p->linep = 0;
                     71:         p->done = 0;
                     72:         p->septype = 0;
                     73:         p->rundep  = 0;
                     74:         p->modtime = 0;
                     75: 
                     76:         firstname = p;
                     77: 
                     78:         hashtab[hashloc(s)] = p;
                     79: 
                     80:         return(p);
                     81: }
                     82: 
                     83: 
                     84: 
                     85: 
                     86: 
                     87: 
                     88: 
                     89: #define NOTSHORT sizeof (struct nameblock)
                     90: 
                     91: extern CHARSTAR end;            /* loader value of end of core */
                     92: 
                     93: CHARSTAR copys(s)
                     94: register CHARSTAR s;
                     95: {
                     96:         register CHARSTAR t;
                     97:         register struct
                     98:         {
                     99:                 int i_i;
                    100:                 CHARSTAR i_s;
                    101:         } i;
                    102: 
                    103:         i.i_i = strlen(s) + 1;
                    104:         if(i.i_i > NOTSHORT)
                    105:         {
                    106:                 i.i_i = (i.i_i + 1)&~1;
                    107:                 t = (CHARSTAR )calloc(i.i_i, sizeof (*s));
                    108:                 if(t == NULL)
                    109:                         goto fat;
                    110:                 i.i_s = t;
                    111:                 while(*t++ = *s++);
                    112:                 return(i.i_s);
                    113:         }
                    114: 
                    115:         if( i.i_i >= (lastchar-nextchar) )
                    116:         {
                    117:                 i.i_i = (i.i_i + 1)&~1;
                    118:                 if( (nextchar=(CHARSTAR )calloc(i.i_i, sizeof (*s) )) == NULL)
                    119: fat:
                    120:                         fatal("Cannot allocate memory");
                    121:                 lastchar = nextchar + i.i_i;
                    122:         }
                    123: 
                    124:         t = nextchar;
                    125:         while(*nextchar++ = *s++);
                    126:         return(t);
                    127: }
                    128: 
                    129: 
                    130: CHARSTAR concat(a,b,c)   /* c = concatenation of a and b */
                    131: register CHARSTAR a, b;
                    132: register CHARSTAR c;
                    133: {
                    134:         register CHARSTAR t;
                    135:         t = c;
                    136: 
                    137:         while(*t = *a++) t++;
                    138:         while(*t++ = *b++);
                    139:         return(c);
                    140: }
                    141: 
                    142: suffix(a,b,p)  /* is b the suffix of a?  if so, set p = prefix */
                    143: register CHARSTAR a, b, p;
                    144: {
                    145:         CHARSTAR a0, b0;
                    146:         a0 = a;
                    147:         b0 = b;
                    148: 
                    149:         if(!a || !b)
                    150:                 return(0);
                    151: 
                    152:         while(*a++);
                    153:         while(*b++);
                    154: 
                    155:         if( (a-a0) < (b-b0) )
                    156:                 return(0);
                    157: 
                    158:         while(b>b0)
                    159:                 if(*--a != *--b)
                    160:                         return(0);
                    161: 
                    162:         while(a0<a)
                    163:                 *p++ = *a0++;
                    164:         *p = CNULL;
                    165: 
                    166:         return(1);
                    167: }
                    168: 
                    169: 
                    170: 
                    171: int *intalloc(n)
                    172: register int n;
                    173: {
                    174:         register INTSTAR p;
                    175: 
                    176:         if( p = (int *) calloc(1,n) )
                    177:                 return(p);
                    178: 
                    179:         fatal("out of memory");
                    180: }
                    181: 
                    182: /* copy string a into b, substituting for arguments */
                    183: extern NAMEBLOCK cur_name;
                    184: 
                    185: CHARSTAR subst(a,b)
                    186: register CHARSTAR a, b;
                    187: {
                    188:         register CHARSTAR s;
                    189:         register VARBLOCK vbp;
                    190:         static depth=0;
                    191:         char vname[100];
                    192:         char closer;
                    193: 
                    194:         if(++depth > 100)
                    195:                 fatal("infinitely recursive macro?");
                    196:         if(a!=0)
                    197:         {
                    198:                 while(*a)
                    199:                 {
                    200:                         if(*a != DOLLAR)
                    201:                                 *b++ = *a++;
                    202:                         else if(*++a==CNULL || *a==DOLLAR)
                    203:                                 *b++ = *a++;
                    204:                         else
                    205:                         {
                    206:                                 s = vname;
                    207:                                 if( *a==LPAREN || *a==LCURLY )
                    208:                                 {
                    209:                                         closer=(*a==LPAREN ? RPAREN : RCURLY);
                    210:                                         ++a;
                    211:                                         while(*a == BLANK)
                    212:                                                 ++a;
                    213:                                         while(  *a!=BLANK  &&
                    214:                                                 *a!=closer &&
                    215:                                                 *a!=CNULL)
                    216:                                                 *s++ = *a++;
                    217:                                         while(*a!=closer && *a!=CNULL)
                    218:                                                 ++a;
                    219:                                         if(*a == closer)
                    220:                                                 ++a;
                    221:                                 }
                    222:                                 else
                    223:                                         *s++ = *a++;
                    224: 
                    225:                                 *s = CNULL;
                    226:                                 if(amatch(&vname[0], "*:*=*"))
                    227:                                 {
                    228:                                         b = colontrans(b, vname);
                    229:                                 }
                    230:                                 else if(amatch(vname, "[@*<%][DF]"))
                    231:                                 {
                    232:                                         b = dftrans(b, vname);
                    233:                                 }
                    234:                                 else
                    235:                                 {
                    236:                                         b = straightrans(b, vname);
                    237:                                 }
                    238:                         }
                    239:                 }
                    240:         }
                    241: 
                    242:         *b = CNULL;
                    243:         --depth;
                    244:         return(b);
                    245: }
                    246: 
                    247: 
                    248: /*
                    249:  *      Translate the $(name:*=*) type things.
                    250:  */
                    251: 
                    252: CHARSTAR colontrans(b, vname)
                    253: register CHARSTAR b;
                    254: char vname[];
                    255: {
                    256:         register int i;
                    257:         register CHARSTAR ps1;
                    258:         int fromlen;
                    259:         char from[30], to[70];
                    260:         char dftemp[128];
                    261:         char tmp, nextchr;
                    262:         CHARSTAR psave, pcolon;
                    263:         VARBLOCK vbp;
                    264: 
                    265: /*
                    266:  *      Mark off the name (up to colon), the from expression (up to '='),
                    267:  *      and the to expresion (up to CNULL).
                    268:  */
                    269:         i = 0;
                    270:         for(ps1 = &vname[0]; *ps1 != KOLON; ps1++);
                    271:         pcolon = ps1;
                    272:         *pcolon = CNULL;
                    273:         while(*++ps1 != EQUALS)
                    274:                 from[i++] = *ps1;
                    275:         from[i] = CNULL;
                    276:         fromlen = i;
                    277:         i = 0;
                    278:         while(*++ps1)
                    279:                 to[i++] = *ps1;
                    280:         to[i] = CNULL;
                    281: 
                    282: /*
                    283:  *      Now, tanslate.
                    284:  */
                    285: 
                    286:         if(amatch(vname, "[@*<%][DF]"))
                    287:         {
                    288:                 dftrans(dftemp, vname);
                    289:                 ps1 = dftemp;
                    290:         }
                    291:         else
                    292:         {
                    293:                 if((vbp = srchvar(vname)) == NULL)
                    294:                 {
                    295:                         return(b);
                    296:                 }
                    297:                 ps1 = vbp->varval;
                    298:         }
                    299:         if(ps1 != NULL && *ps1 != NULL)
                    300:         {
                    301:                 psave = ps1;
                    302:                 while((i = sindex(ps1, from)) >= 0)
                    303:                 {
                    304:                         ps1 = &ps1[i];
                    305:                         tmp = *ps1;
                    306:                         *ps1 = CNULL;
                    307:                         nextchr = *(ps1+fromlen);
                    308:                         if(     nextchr == TAB ||
                    309:                                 nextchr == BLANK ||
                    310:                                 nextchr == CNULL)
                    311:                         {
                    312:                                 b = copstr(b, psave);
                    313:                                 b = copstr(b, to);
                    314:                                 *ps1 = tmp;
                    315:                                 ps1 += fromlen;
                    316:                         }
                    317:                         else
                    318:                         {
                    319:                                 b = copstr(b, psave);
                    320:                                 *b++ = tmp;
                    321:                                 *ps1 = tmp;
                    322:                                 ps1++;
                    323:                         }
                    324:                         psave = ps1;
                    325:                 }
                    326:                 b = copstr(b, ps1);
                    327:         }
                    328:         *pcolon = KOLON;
                    329:         return(b);
                    330: }
                    331: 
                    332: /*
                    333:  *      Do the $(@D) type translations.
                    334:  */
                    335: 
                    336: CHARSTAR dftrans(b, vname)
                    337: register CHARSTAR b;
                    338: char vname[];
                    339: {
                    340:         char c, c1;
                    341:         CHARSTAR p1, p2;
                    342:         VARBLOCK vbp;
                    343: 
                    344:         c1 = vname[1];
                    345:         vname[1] = CNULL;
                    346:         vbp = srchvar(vname);
                    347:         if(vbp != 0 && vbp->varval != 0)
                    348:         {
                    349:                 for(p1=p2=vbp->varval;*p1;p1++)
                    350:                         if(*p1 == SLASH)
                    351:                                 p2 = p1;
                    352:                 if(*p2 == SLASH)
                    353:                 {
                    354:                         if(c1 == 'D')
                    355:                         {
                    356:                                 if(p2 == vbp->varval)
                    357:                                         p2++;
                    358:                                 c = *p2;
                    359:                                 *p2 = CNULL;
                    360:                                 b = copstr(b,vbp->varval);
                    361:                                 *p2 = c;
                    362:                         }
                    363:                         else
                    364:                         {
                    365:                                 b = copstr(b, p2+1);
                    366:                         }
                    367:                 }
                    368:                 else
                    369:                 {
                    370:                         if(c1 == 'D')
                    371:                                 b = copstr(b, ".");
                    372:                         else
                    373:                                 b = copstr(b, p2);
                    374:                 }
                    375:         }
                    376:         vname[1] = c1;
                    377:         return(b);
                    378: }
                    379: 
                    380: 
                    381: /*
                    382:  *      Standard trnaslation, nothing fancy.
                    383:  */
                    384: 
                    385: CHARSTAR straightrans(b, vname)
                    386: register CHARSTAR b;
                    387: char vname[];
                    388: {
                    389:         register VARBLOCK vbp;
                    390:         register CHAIN pchain;
                    391:         register NAMEBLOCK pn;
                    392: 
                    393:         vbp = srchvar(vname);
                    394:         if( vbp != 0 && vbp->varval != 0)
                    395:         {
                    396:                 if(vbp->v_aflg == YES)
                    397:                 {
                    398:                         pchain = (CHAIN)vbp->varval;
                    399:                         for(; pchain; pchain = pchain->nextchain)
                    400:                         {
                    401:                                 pn = (NAMEBLOCK)pchain->datap;
                    402:                                 if(pn->alias)
                    403:                                         b=copstr(b, pn->alias);
                    404:                                 else
                    405:                                         b=copstr(b,pn->namep);
                    406:                                 *b++ = BLANK;
                    407:                         }
                    408:                 }
                    409:                 else
                    410:                 {
                    411:                         b = subst(vbp->varval, b);
                    412:                 }
                    413:                 vbp->used = YES;
                    414:         }
                    415:         return(b);
                    416: }
                    417: 
                    418: 
                    419: 
                    420: /* copy s into t, return the location of the next free character in s */
                    421: CHARSTAR copstr(s, t)
                    422: register CHARSTAR s, t;
                    423: {
                    424:         if(t == 0)
                    425:                 return(s);
                    426:         while (*t)
                    427:                 *s++ = *t++;
                    428:         *s = CNULL;
                    429:         return(s);
                    430: }
                    431: 
                    432: setvar(v,s)
                    433: register CHARSTAR v, s;
                    434: {
                    435:         register VARBLOCK p;
                    436: 
                    437:         p = srchvar(v);
                    438:         if(p == 0)
                    439:         {
                    440:                 p = varptr(v);
                    441:         }
                    442:         if (p->noreset == NO)
                    443:         {
                    444:                 if(IS_ON(EXPORT))
                    445:                         p->envflg = YES;
                    446:                 p->varval = s;
                    447:                 if(IS_ON(INARGS) || IS_ON(ENVOVER))
                    448:                         p->noreset = YES;
                    449:                 else
                    450:                         p->noreset = NO;
                    451: if(IS_ON(DBUG))printf("setvar: %s = %s noreset = %d envflg = %d Mflags = 0%o\n",
                    452:         v, p->varval, p->noreset, p->envflg, Mflags);
                    453: 
                    454:                 if(p->used && !amatch(v, "[@*<?!%]") )
                    455:                         if(IS_ON(DBUG))
                    456:                                 fprintf(stderr, "Warning: %s changed after being used\n",v);
                    457:         }
                    458: }
                    459: 
                    460: 
                    461: eqsign(a)
                    462: register CHARSTAR a;
                    463: {
                    464:         register CHARSTAR p;
                    465: 
                    466:         for(p = ":;=$\n\t"; *p; p++)
                    467:                 if(any(a, *p))
                    468:                 {
                    469:                         callyacc(a);
                    470:                         return(YES);
                    471:                 }
                    472:         return(NO);
                    473: }
                    474: 
                    475: 
                    476: VARBLOCK varptr(v)
                    477: register CHARSTAR v;
                    478: {
                    479:         register VARBLOCK vp;
                    480: 
                    481:         if((vp = srchvar(v)) != 0)
                    482:                 return(vp);
                    483: 
                    484:         vp = ALLOC(varblock);
                    485:         vp->nextvar = firstvar;
                    486:         firstvar = vp;
                    487:         vp->varname = copys(v);
                    488:         vp->varval = 0;
                    489:         return(vp);
                    490: }
                    491: 
                    492: VARBLOCK srchvar(vname)
                    493: register CHARSTAR vname;
                    494: {
                    495:         register VARBLOCK vp;
                    496: 
                    497:         for(vp=firstvar; vp != 0 ; vp = vp->nextvar)
                    498:                 if(equal(vname, vp->varname))
                    499:                         return(vp);
                    500:         return(NO);
                    501: }
                    502: 
                    503: 
                    504: fatal1(s,t)
                    505: CHARSTAR s, t;
                    506: {
                    507:         char buf[100];
                    508:         sprintf(buf, s, t);
                    509:         fatal(buf);
                    510: }
                    511: 
                    512: 
                    513: 
                    514: fatal(s)
                    515: CHARSTAR s;
                    516: {
                    517:         if(s)
                    518:                 fprintf(stderr, "Make: %s.  Stop.\n", s);
                    519:         else
                    520:                 fprintf(stderr, "\nStop.\n");
                    521: #ifdef unix
                    522:         exit(1);
                    523: #endif
                    524: #ifdef gcos
                    525:         exit(0);
                    526: #endif
                    527: }
                    528: 
                    529: 
                    530: 
                    531: yyerror(s)
                    532: CHARSTAR s;
                    533: {
                    534:         char buf[50];
                    535:         extern int yylineno;
                    536: 
                    537:         sprintf(buf, "line %d: %s", yylineno, s);
                    538:         fatal(buf);
                    539: }
                    540: 
                    541: 
                    542: 
                    543: CHAIN appendq(head,tail)
                    544: register CHAIN head;
                    545: register CHARSTAR tail;
                    546: {
                    547:         register CHAIN p;
                    548: 
                    549:         p = ALLOC(chain);
                    550:         p->datap = tail;
                    551:         while(head->nextchain)
                    552:                 head = head->nextchain;
                    553:         head->nextchain = p;
                    554: }
                    555: 
                    556: 
                    557: 
                    558: 
                    559: 
                    560: CHARSTAR mkqlist(p)
                    561: register CHAIN p;
                    562: {
                    563:         register CHARSTAR qbufp, s;
                    564:         static char qbuf[OUTMAX];
                    565: 
                    566:         qbufp = qbuf;
                    567: 
                    568:         for( ; p ; p = p->nextchain)
                    569:         {
                    570:                 s = p->datap;
                    571:                 if(qbufp != qbuf)
                    572:                         *qbufp++ = BLANK;
                    573:                 if(qbufp+strlen(s) > &qbuf[OUTMAX-3])
                    574:                 {
                    575:                         fprintf(stderr, "$? list too long\n");
                    576:                         break;
                    577:                 }
                    578:                 while (*s)
                    579:                         *qbufp++ = *s++;
                    580:         }
                    581:         *qbufp = CNULL;
                    582:         return(qbuf);
                    583: }
                    584: 
                    585: any(s,c)
                    586: register CHARSTAR s;
                    587: register char c;
                    588: {
                    589:         register char d;
                    590: 
                    591:         while(d = *s++)
                    592:         {
                    593:                 if(d==c)
                    594:                         return(1);
                    595:         }
                    596:         return(0);
                    597: }
                    598: 
                    599: 
                    600: sindex(s1,s2)
                    601: CHARSTAR s1;
                    602: CHARSTAR s2;
                    603: {
                    604:         register CHARSTAR p1;
                    605:         register CHARSTAR p2;
                    606:         register int flag;
                    607:         int ii;
                    608: 
                    609:         p1 = &s1[0];
                    610:         p2 = &s2[0];
                    611:         flag = -1;
                    612:         for(ii = 0; ; ii++)
                    613:         {
                    614:                 while(*p1 == *p2)
                    615:                 {
                    616:                         if(flag < 0)
                    617:                                 flag = ii;
                    618:                         if(*p1++ == CNULL)
                    619:                                 return(flag);
                    620:                         p2++;
                    621:                 }
                    622:                 if(*p2 == CNULL)
                    623:                         return(flag);
                    624:                 if(flag >= 0)
                    625:                 {
                    626:                         flag = -1;
                    627:                         p2 = &s2[0];
                    628:                 }
                    629:                 if(*s1++ == CNULL)
                    630:                         return(flag);
                    631:                 p1 = s1;
                    632:         }
                    633: }
                    634: 
                    635: 
                    636: #include "sys/types.h"
                    637: #include "sys/stat.h"
                    638: 
                    639: /*
                    640:  *      findfl(name)    (like execvp, but does path search and finds files)
                    641:  */
                    642: static char fname[128];
                    643: 
                    644: char    *execat();
                    645: 
                    646: CHARSTAR findfl(name)
                    647: register CHARSTAR name;
                    648: {
                    649:         register CHARSTAR p;
                    650:         register VARBLOCK cp;
                    651: 
                    652:         if(name[0] == SLASH)
                    653:                 return(name);
                    654:         cp = varptr("VPATH");
                    655:         if(cp->varval == 0)
                    656:                 p = ":";
                    657:         else
                    658:                 p = cp->varval;
                    659: 
                    660:         do
                    661:         {
                    662:                 p = execat(p, name, fname);
                    663:                 if(access(fname, 4) == 0)
                    664:                         return(fname);
                    665:         } while (p);
                    666:         return((CHARSTAR )-1);
                    667: }
                    668: 
                    669: CHARSTAR execat(s1, s2, si)
                    670: register CHARSTAR s1, s2;
                    671: CHARSTAR si;
                    672: {
                    673:         register CHARSTAR s;
                    674: 
                    675:         s = si;
                    676:         while (*s1 && *s1 != KOLON && *s1 != MINUS)
                    677:                 *s++ = *s1++;
                    678:         if (si != s)
                    679:                 *s++ = SLASH;
                    680:         while (*s2)
                    681:                 *s++ = *s2++;
                    682:         *s = CNULL;
                    683:         return(*s1? ++s1: 0);
                    684: }
                    685: 
                    686: 
                    687: /*
                    688:  *      change xx to s.xx or /x/y/z to /x/y/s.z
                    689:  */
                    690: CHARSTAR trysccs(str)
                    691: register CHARSTAR str;
                    692: {
                    693:         register CHARSTAR sstr;
                    694:         register int i = 2;
                    695: 
                    696:         sstr = str;
                    697:         for(; *str; str++);
                    698:         str[2] = CNULL;
                    699:         str--;
                    700:         for(;str >= sstr; str--)
                    701:         {
                    702:                 if(*str == SLASH)
                    703:                         if(i == 2)
                    704:                         {
                    705:                                 i = 0;
                    706:                                 *(str+2) = DOT;
                    707:                                 *(str+1) = 's';
                    708:                         }
                    709:                 *(str+i) = *str;
                    710:         }
                    711:         if(i == 2)
                    712:         {
                    713:                 *(str+2) = DOT;
                    714:                 *(str+1) = 's';
                    715:         }
                    716:         return(sstr);
                    717: }
                    718: 
                    719: 
                    720: is_sccs(filename)
                    721: register CHARSTAR filename;
                    722: {
                    723:         register CHARSTAR p;
                    724: 
                    725:         for(p = filename; *p; p++)
                    726:                 if(*p == 's')
                    727:                         if(p == filename && p[1] == DOT)
                    728:                                 return(YES);
                    729:                         else if(p[-1] == SLASH && p[1] == DOT)
                    730:                                 return(YES);
                    731:         return(NO);
                    732: }
                    733: 
                    734: /*
                    735:  *      change pfx to /xxx/yy/*zz.* or *zz.*
                    736:  */
                    737: CHARSTAR addstars(pfx)
                    738: register CHARSTAR pfx;
                    739: {
                    740:         register CHARSTAR p1, p2;
                    741: 
                    742:         for(p1 = pfx; *p1; p1++);
                    743:         p2 = p1 + 3;                    /* 3 characters, '*', '.', and '*'. */
                    744:         p1--;
                    745: 
                    746:         *p2-- = CNULL;
                    747:         *p2-- = STAR;
                    748:         *p2-- = DOT;
                    749:         while(p1 >= pfx)
                    750:         {
                    751:                 if(*p1 == SLASH)
                    752:                 {
                    753:                         *p2 = STAR;
                    754:                         return(pfx);
                    755:                 }
                    756:                 *p2-- = *p1--;
                    757:         }
                    758:         *p2 = STAR;
                    759:         return(p2);
                    760: }
                    761: 
                    762: 
                    763: #define NENV    300
                    764: extern CHARSTAR *environ;
                    765: 
                    766: /*
                    767:  *      This routine is called just before and exec.
                    768:  */
                    769: 
                    770: setenv()
                    771: {
                    772:         register CHARSTAR *ea;
                    773:         register int nenv = 0;
                    774:         register CHARSTAR p;
                    775:         CHARSTAR *es;
                    776:         VARBLOCK vp;
                    777:         int length;
                    778: 
                    779:         if(firstvar == 0)
                    780:                 return;
                    781: 
                    782:         es=ea=(CHARSTAR *)calloc(NENV, sizeof *ea);
                    783:         if(es == (CHARSTAR *)-1)
                    784:                 fatal("Cannot alloc mem for envp.");
                    785: 
                    786:         for(vp=firstvar; vp != 0; vp=vp->nextvar)
                    787:                 if(vp->envflg)
                    788:                 {
                    789:                         if(++nenv >= NENV)
                    790:                                 fatal("Too many env parameters.");
                    791:                         length = strlen(vp->varname) + strlen(vp->varval) + 2;
                    792:                         if((*ea = (CHARSTAR )calloc(length, sizeof **ea)) == (CHARSTAR )-1)
                    793:                                 fatal("Cannot alloc mem for env.");
                    794:                         p = copstr(*ea++, vp->varname);
                    795:                         p = copstr(p, "=");
                    796:                         p = copstr(p, vp->varval);
                    797:                 }
                    798:         *ea = 0;
                    799:         if(nenv > 0)
                    800:                 environ=es;
                    801:         if(IS_ON(DBUG))
                    802:                 printf("nenv = %d\n", nenv);
                    803: }
                    804: 
                    805: 
                    806: /*
                    807:  *      Called in main
                    808:  *      If a string like "CC=" occurs then CC is not put in environment.
                    809:  *      This is because there is no good way to remove a variable
                    810:  *      from the environment within the shell.
                    811:  */
                    812: 
                    813: readenv()
                    814: {
                    815:         register CHARSTAR *ea;
                    816:         register CHARSTAR p;
                    817: 
                    818:         ea=environ;
                    819:         for(;*ea; ea++)
                    820:         {
                    821:                 for(p = *ea; *p && *p != EQUALS; p++);
                    822:                 if(*p == EQUALS)
                    823:                         if(*(p+1))
                    824:                                 eqsign(*ea);
                    825:         }
                    826: }
                    827: 
                    828: 
                    829: sccstrip(pstr)
                    830: register CHARSTAR pstr;
                    831: {
                    832:         register CHARSTAR p2;
                    833:         register CHARSTAR sstr;
                    834: 
                    835:         sstr = pstr;
                    836:         for(; *pstr ; pstr++)
                    837:                 if(*pstr == RCURLY)
                    838:                 {
                    839:                         if(isdigit(pstr[1]))
                    840:                         if(pstr != sstr)
                    841:                         if(pstr[-1] != DOLLAR)
                    842:                         {
                    843:                                 for(p2 = pstr; *p2 && (*p2 != LCURLY); p2++);
                    844:                                 if(*p2 == CNULL)
                    845:                                         break;
                    846:                                 strshift(pstr, -(int)(p2-pstr+1) );
                    847:                         }
                    848:                 }
                    849: }
                    850: 
                    851: /*
                    852:  *      Shift a string `pstr' count places. negative is left, pos is right
                    853:  *      Negative shifts cause char's at front to be lost.
                    854:  *      Positive shifts assume enough space!
                    855:  */
                    856: CHARSTAR strshift(pstr, count)
                    857: register CHARSTAR pstr;
                    858: register int count;
                    859: {
                    860:         register CHARSTAR sstr;
                    861: 
                    862:         sstr = pstr;
                    863:         if(count < 0)
                    864:         {
                    865:                 count = -count;
                    866:                 while(pstr[count])
                    867:                         *pstr = pstr++[count];
                    868:                 *pstr = 0;
                    869:                 return(sstr);
                    870:         }
                    871:         for(; *pstr; pstr++);
                    872:         pstr--[count] = 0;
                    873:         while(pstr != sstr)
                    874:                 pstr[count] = *pstr--;
                    875:         pstr[count] = *pstr;
                    876: 
                    877:         return(sstr);
                    878: 
                    879: }
                    880: 
                    881: 
                    882: /*
                    883:  *      execlp(name, arg,...,0) (like execl, but does path search)
                    884:  *      execvp(name, argv)      (like execv, but does path search)
                    885:  */
                    886: #include <errno.h>
                    887: 
                    888: CHARSTAR execat();
                    889: extern  errno;
                    890: 
                    891: execlp(name, argv)
                    892: CHARSTAR name, argv;
                    893: {
                    894:         return(execvp(name, &argv));
                    895: }
                    896: 
                    897: execvp(name, argv)
                    898: CHARSTAR name, *argv;
                    899: {
                    900:         register etxtbsy = 1;
                    901:         register eacces = 0;
                    902:         register CHARSTAR cp;
                    903:         CHARSTAR pathstr;
                    904:         CHARSTAR shell;
                    905:         char fname[128];
                    906: 
                    907:         pathstr = varptr("PATH")->varval;
                    908:         if(pathstr == 0 || *pathstr == CNULL)
                    909:                 pathstr = ":/bin:/usr/bin";
                    910:         shell = varptr("SHELL")->varval;
                    911:         if(shell == 0 || *shell == CNULL)
                    912:                 shell = "/bin/sh";
                    913:         cp = strchr(name, SLASH)? "": pathstr;
                    914: 
                    915:         do
                    916:         {
                    917:                 cp = execat(cp, name, fname);
                    918:         retry:
                    919:                 execv(fname, argv);
                    920:                 switch(errno)
                    921:                 {
                    922:                 case ENOEXEC:
                    923:                         *argv = fname;
                    924:                         *--argv = "sh";
                    925:                         execv(shell, argv);
                    926:                         return(-1);
                    927:                 case ETXTBSY:
                    928:                         if (++etxtbsy > 5)
                    929:                                 return(-1);
                    930:                         sleep(etxtbsy);
                    931:                         goto retry;
                    932:                 case EACCES:
                    933:                         eacces++;
                    934:                         break;
                    935:                 case ENOMEM:
                    936:                 case E2BIG:
                    937:                         return(-1);
                    938:                 }
                    939:         } while (cp);
                    940:         if (eacces)
                    941:                 errno = EACCES;
                    942:         return(-1);
                    943: }
                    944: 
                    945: /*
                    946:  *      get() does an SCCS get on the file ssfile.
                    947:  *      For the get command, get() uses the value of the variable "GET".
                    948:  *      If ssfile has a slash in it, get() does a "chdir" to the appropriate
                    949:  *      directory if the cdflag is set to CD. This assures
                    950:  *      the program finds the ssfile where it belongs when necessary.
                    951:  *      If the rlse string variable is set, get() uses it in the
                    952:  *      get command sequence.
                    953:  *      Thus a possible sequence is:
                    954:  *              set -x;
                    955:  *              cd ../sys/head;
                    956:  *              get -r2.3.4.5 s.stdio.h
                    957:  *
                    958:  */
                    959: 
                    960: /*
                    961:  *      The gothead and gotf structures are used to remember
                    962:  *      the names of the files `make' automatically gets so
                    963:  *      `make' can remove them upon exit.
                    964:  */
                    965: GOTHEAD gotfiles;
                    966: 
                    967: get(ssfile, cdflag, rlse)
                    968: register CHARSTAR ssfile;
                    969: int cdflag;
                    970: CHARSTAR rlse;
                    971: {
                    972:         register CHARSTAR pr;
                    973:         register CHARSTAR pr1;
                    974:         char gbuf[128];
                    975:         char sfile[128];
                    976:         int retval;
                    977:         GOTF gf;
                    978: 
                    979:         copstr(sfile, ssfile);
                    980:         if(!is_sccs(sfile))
                    981:                 trysccs(sfile);
                    982:         if(access(sfile, 4) != 0 && IS_OFF(GET))
                    983:                 return(NO);
                    984: 
                    985:         pr = gbuf;
                    986:         if(IS_OFF(SIL))
                    987:                 pr = copstr(pr, "set -x;\n");
                    988: 
                    989:         if(cdflag == CD)
                    990:         if(any(sfile, SLASH))
                    991:         {
                    992:                 pr = copstr(pr, "cd ");
                    993:                 for(pr1 = sfile; *pr1; pr1++);
                    994:                 while(*pr1 != SLASH)
                    995:                         pr1--;
                    996:                 *pr1 = CNULL;
                    997:                 pr = copstr(pr, sfile);
                    998:                 pr = copstr(pr, ";\n");
                    999:                 *pr1 = SLASH;
                   1000:         }
                   1001: 
                   1002:         pr = copstr(pr, varptr("GET")->varval);
                   1003:         pr = copstr(pr, " ");
                   1004:         pr = copstr(pr, varptr("GFLAGS")->varval);
                   1005:         pr = copstr(pr, " ");
                   1006: 
                   1007:         pr1 = rlse;
                   1008:         if(pr1 != NULL && pr1[0] != CNULL)
                   1009:         {
                   1010:                 if(pr1[0] != MINUS)     /* RELEASE doesn't have '-r' */
                   1011:                         pr = copstr(pr, "-r");
                   1012:                 pr = copstr(pr, pr1);
                   1013:                 pr = copstr(pr, " ");
                   1014:         }
                   1015: 
                   1016:         pr = copstr(pr, sfile);
                   1017: /*
                   1018:  *      exit codes are opposite of error codes so do the following:
                   1019:  */
                   1020:         retval = (system(gbuf) == 0) ? YES : NO ;
                   1021:         if(retval == YES)
                   1022:         {
                   1023:                 if(gotfiles == 0)
                   1024:                 {
                   1025:                         gotfiles = ALLOC(gothead);
                   1026:                         gf = (GOTF)gotfiles;
                   1027:                         gotfiles->gnextp = 0;
                   1028:                         gotfiles->endp = (GOTF)gotfiles;
                   1029:                 }
                   1030:                 else
                   1031:                 {
                   1032:                         gf = gotfiles->endp;
                   1033:                         gf->gnextp = ALLOC(gotf);
                   1034:                         gf = gf->gnextp;
                   1035:                         gf->gnextp = 0;
                   1036:                 }
                   1037:                 gf->gnamep = copys(sfile+2);    /* `+2' skips `s.' */
                   1038:                 gotfiles->endp = gf;
                   1039:         }
                   1040:         return(retval);
                   1041: }
                   1042: 
                   1043: /*
                   1044:  *      subroutine to actually remove to gotten files.
                   1045:  */
                   1046: rm_gots()
                   1047: {
                   1048:         register GOTF gf;
                   1049: 
                   1050:         if(IS_ON(GF_KEEP))
                   1051:                 return;
                   1052:         for(gf = (GOTF)gotfiles; gf ; gf=gf->gnextp)
                   1053:                 if(gf->gnamep)
                   1054:                 {
                   1055:                         if(IS_ON(DBUG))printf("rm_got: %s\n", gf->gnamep);
                   1056:                         unlink(gf->gnamep);
                   1057:                 }
                   1058: }
                   1059: callyacc(str)
                   1060: register CHARSTAR str;
                   1061: {
                   1062:         CHARSTAR lines[2];
                   1063:         FILE *finsave;
                   1064:         CHARSTAR *lpsave;
                   1065: 
                   1066:         finsave = fin;
                   1067:         lpsave = linesptr;
                   1068:         fin = 0;
                   1069:         lines[0] = str;
                   1070:         lines[1] = 0;
                   1071:         linesptr = lines;
                   1072:         yyparse();
                   1073:         fin = finsave;
                   1074:         linesptr = lpsave;
                   1075: }
                   1076: 
                   1077: /*
                   1078:  *      exit routine for removing the files `make' automatically
                   1079:  *      got.
                   1080:  */
                   1081: exit(arg)
                   1082: {
                   1083:         rm_gots();
                   1084:         if(IS_ON(MEMMAP))
                   1085:         {
                   1086:                 prtmem();
                   1087:         }
                   1088:         _cleanup();
                   1089:         _exit(arg);
                   1090: }

unix.superglobalmegacorp.com

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