Annotation of 42BSD/bin/make/misc.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)misc.c      4.2 (Berkeley) 82/10/19";
                      2: #include "defs"
                      3: 
                      4: FSTATIC struct nameblock *hashtab[HASHSIZE];
                      5: FSTATIC int nhashed    = 0;
                      6: 
                      7: 
                      8: /* simple linear hash.  hash function is sum of
                      9:    characters mod hash table size.
                     10: */
                     11: hashloc(s)
                     12: char *s;
                     13: {
                     14: register int i;
                     15: register int hashval;
                     16: register char *t;
                     17: 
                     18: hashval = 0;
                     19: 
                     20: for(t=s; *t!='\0' ; ++t)
                     21:        hashval += *t;
                     22: 
                     23: hashval %= HASHSIZE;
                     24: 
                     25: for(i=hashval;
                     26:        hashtab[i]!=0 && unequal(s,hashtab[i]->namep);
                     27:        i = (i+1)%HASHSIZE ) ;
                     28: 
                     29: return(i);
                     30: }
                     31: 
                     32: 
                     33: struct nameblock *srchname(s)
                     34: char *s;
                     35: {
                     36: return( hashtab[hashloc(s)] );
                     37: }
                     38: 
                     39: 
                     40: 
                     41: struct nameblock *makename(s)
                     42: char *s;
                     43: {
                     44: /* make a fresh copy of the string s */
                     45: 
                     46: char *copys();
                     47: register struct nameblock *p;
                     48: 
                     49: if(nhashed++ > HASHSIZE-3)
                     50:        fatal("Hash table overflow");
                     51: 
                     52: p = ALLOC(nameblock);
                     53: p->nxtnameblock = firstname;
                     54: p->namep = copys(s);
                     55: p->linep = 0;
                     56: p->done = 0;
                     57: p->septype = 0;
                     58: p->modtime = 0;
                     59: 
                     60: firstname = p;
                     61: if(mainname == NULL)
                     62:        if(s[0]!='.' || hasslash(s) )
                     63:                mainname = p;
                     64: 
                     65: hashtab[hashloc(s)] = p;
                     66: 
                     67: return(p);
                     68: }
                     69: 
                     70: 
                     71: 
                     72: hasslash(s)
                     73: char *s;
                     74: {
                     75: for( ; *s ; ++s)
                     76:        if(*s == '/')
                     77:                return(YES);
                     78: return(NO);
                     79: }
                     80: 
                     81: 
                     82: 
                     83: char *copys(s)
                     84: register char *s;
                     85: {
                     86: char *calloc();
                     87: register char *t, *t0;
                     88: 
                     89: if( (t = t0 = calloc( strlen(s)+1 , sizeof(char)) ) == NULL)
                     90:        fatal("out of memory");
                     91: while(*t++ = *s++)
                     92:        ;
                     93: return(t0);
                     94: }
                     95: 
                     96: 
                     97: 
                     98: char *concat(a,b,c)   /* c = concatenation of a and b */
                     99: register char *a,*b;
                    100: char *c;
                    101: {
                    102: register char *t;
                    103: t = c;
                    104: 
                    105: while(*t = *a++) t++;
                    106: while(*t++ = *b++);
                    107: return(c);
                    108: }
                    109: 
                    110: 
                    111: 
                    112: suffix(a,b,p)  /* is b the suffix of a?  if so, set p = prefix */
                    113: register char *a,*b,*p;
                    114: {
                    115: char *a0,*b0;
                    116: a0 = a;
                    117: b0 = b;
                    118: 
                    119: while(*a++);
                    120: while(*b++);
                    121: 
                    122: if( (a-a0) < (b-b0) ) return(0);
                    123: 
                    124: while(b>b0)
                    125:        if(*--a != *--b) return(0);
                    126: 
                    127: while(a0<a) *p++ = *a0++;
                    128: *p = '\0';
                    129: 
                    130: return(1);
                    131: }
                    132: 
                    133: 
                    134: 
                    135: 
                    136: 
                    137: 
                    138: int *ckalloc(n)
                    139: register int n;
                    140: {
                    141: register int *p;
                    142: 
                    143: if( p = (int *) calloc(1,n) )
                    144:        return(p);
                    145: 
                    146: fatal("out of memory");
                    147: /* NOTREACHED */
                    148: }
                    149: 
                    150: /* copy string a into b, substituting for arguments */
                    151: char *subst(a,b)
                    152: register char *a,*b;
                    153: {
                    154: static depth   = 0;
                    155: register char *s;
                    156: char vname[100];
                    157: struct varblock *varptr(), *vbp;
                    158: char closer;
                    159: 
                    160: if(++depth > 100)
                    161:        fatal("infinitely recursive macro?");
                    162: if(a!=0)  while(*a)
                    163:        {
                    164:        if(*a != '$') *b++ = *a++;
                    165:        else if(*++a=='\0' || *a=='$')
                    166:                *b++ = *a++;
                    167:        else    {
                    168:                s = vname;
                    169:                if( *a=='(' || *a=='{' )
                    170:                        {
                    171:                        closer = ( *a=='(' ? ')' : '}');
                    172:                        ++a;
                    173:                        while(*a == ' ') ++a;
                    174:                        while(*a!=' ' && *a!=closer && *a!='\0') *s++ = *a++;
                    175:                        while(*a!=closer && *a!='\0') ++a;
                    176:                        if(*a == closer) ++a;
                    177:                        }
                    178:                else    *s++ = *a++;
                    179: 
                    180:                *s = '\0';
                    181:                if( (vbp = varptr(vname)) ->varval != 0)
                    182:                        {
                    183:                        b = subst(vbp->varval, b);
                    184:                        vbp->used = YES;
                    185:                        }
                    186:                }
                    187:        }
                    188: 
                    189: *b = '\0';
                    190: --depth;
                    191: return(b);
                    192: }
                    193: 
                    194: 
                    195: setvar(v,s)
                    196: char *v, *s;
                    197: {
                    198: struct varblock *varptr(), *p;
                    199: 
                    200: p = varptr(v);
                    201: if(p->noreset == 0)
                    202:        {
                    203:        p->varval = s;
                    204:        p->noreset = inarglist;
                    205:        if(p->used && unequal(v,"@") && unequal(v,"*")
                    206:            && unequal(v,"<") && unequal(v,"?") )
                    207:                fprintf(stderr, "Warning: %s changed after being used\n",v);
                    208:        }
                    209: }
                    210: 
                    211: 
                    212: eqsign(a)   /*look for arguments with equal signs but not colons */
                    213: char *a;
                    214: {
                    215: register char *s, *t;
                    216: 
                    217: while(*a == ' ') ++a;
                    218: for(s=a  ;   *s!='\0' && *s!=':'  ; ++s)
                    219:        if(*s == '=')
                    220:                {
                    221:                for(t = a ; *t!='=' && *t!=' ' && *t!='\t' ;  ++t );
                    222:                *t = '\0';
                    223: 
                    224:                for(++s; *s==' ' || *s=='\t' ; ++s);
                    225:                setvar(a, copys(s));
                    226:                return(YES);
                    227:                }
                    228: 
                    229: return(NO);
                    230: }
                    231: 
                    232: 
                    233: struct varblock *varptr(v)
                    234: char *v;
                    235: {
                    236: register struct varblock *vp;
                    237: 
                    238: for(vp = firstvar; vp ; vp = vp->nxtvarblock)
                    239:        if(! unequal(v , vp->varname))
                    240:                return(vp);
                    241: 
                    242: vp = ALLOC(varblock);
                    243: vp->nxtvarblock = firstvar;
                    244: firstvar = vp;
                    245: vp->varname = copys(v);
                    246: vp->varval = 0;
                    247: return(vp);
                    248: }
                    249: 
                    250: 
                    251: fatal1(s, t)
                    252: char *s, *t;
                    253: {
                    254: char buf[BUFSIZ];
                    255: sprintf(buf, s, t);
                    256: fatal(buf);
                    257: }
                    258: 
                    259: 
                    260: 
                    261: fatal(s)
                    262: char *s;
                    263: {
                    264: if(s) fprintf(stderr, "Make: %s.  Stop.\n", s);
                    265: else fprintf(stderr, "\nStop.\n");
                    266: #ifdef unix
                    267: exit(1);
                    268: #endif
                    269: #ifdef gcos
                    270: exit(0);
                    271: #endif
                    272: }
                    273: 
                    274: 
                    275: 
                    276: yyerror(s)
                    277: char *s;
                    278: {
                    279: char buf[50];
                    280: extern int yylineno;
                    281: 
                    282: sprintf(buf, "line %d: %s", yylineno, s);
                    283: fatal(buf);
                    284: }
                    285: 
                    286: 
                    287: 
                    288: struct chain *appendq(head, tail)
                    289: struct chain *head;
                    290: char *tail;
                    291: {
                    292: register struct chain *p, *q;
                    293: 
                    294: p = ALLOC(chain);
                    295: p->datap = tail;
                    296: 
                    297: if(head)
                    298:        {
                    299:        for(q = head ; q->nextp ; q = q->nextp)
                    300:                ;
                    301:        q->nextp = p;
                    302:        return(head);
                    303:        }
                    304: else
                    305:        return(p);
                    306: }
                    307: 
                    308: 
                    309: 
                    310: 
                    311: 
                    312: char *mkqlist(p)
                    313: struct chain *p;
                    314: {
                    315: register char *qbufp, *s;
                    316: static char qbuf[QBUFMAX];
                    317: 
                    318: if(p == NULL)
                    319:        {
                    320:        qbuf[0] = '\0';
                    321:        return;
                    322:        }
                    323: 
                    324: qbufp = qbuf;
                    325: 
                    326: for( ; p ; p = p->nextp)
                    327:        {
                    328:        s = p->datap;
                    329:        if(qbufp+strlen(s) > &qbuf[QBUFMAX-3])
                    330:                {
                    331:                fprintf(stderr, "$? list too long\n");
                    332:                break;
                    333:                }
                    334:        while (*s)
                    335:                *qbufp++ = *s++;
                    336:        *qbufp++ = ' ';
                    337:        }
                    338: *--qbufp = '\0';
                    339: return(qbuf);
                    340: }

unix.superglobalmegacorp.com

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