Annotation of 40BSD/cmd/make/misc.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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