1*8677Ssam static char *sccsid = "@(#)misc.c 4.2 (Berkeley) 82/10/19"; 22810Swnj #include "defs" 32810Swnj 42810Swnj FSTATIC struct nameblock *hashtab[HASHSIZE]; 52810Swnj FSTATIC int nhashed = 0; 62810Swnj 72810Swnj 82810Swnj /* simple linear hash. hash function is sum of 92810Swnj characters mod hash table size. 102810Swnj */ 112810Swnj hashloc(s) 122810Swnj char *s; 132810Swnj { 142810Swnj register int i; 152810Swnj register int hashval; 162810Swnj register char *t; 172810Swnj 182810Swnj hashval = 0; 192810Swnj 202810Swnj for(t=s; *t!='\0' ; ++t) 212810Swnj hashval += *t; 222810Swnj 232810Swnj hashval %= HASHSIZE; 242810Swnj 252810Swnj for(i=hashval; 262810Swnj hashtab[i]!=0 && unequal(s,hashtab[i]->namep); 272810Swnj i = (i+1)%HASHSIZE ) ; 282810Swnj 292810Swnj return(i); 302810Swnj } 312810Swnj 322810Swnj 332810Swnj struct nameblock *srchname(s) 342810Swnj char *s; 352810Swnj { 362810Swnj return( hashtab[hashloc(s)] ); 372810Swnj } 382810Swnj 392810Swnj 402810Swnj 412810Swnj struct nameblock *makename(s) 422810Swnj char *s; 432810Swnj { 442810Swnj /* make a fresh copy of the string s */ 452810Swnj 462810Swnj char *copys(); 472810Swnj register struct nameblock *p; 482810Swnj 492810Swnj if(nhashed++ > HASHSIZE-3) 502810Swnj fatal("Hash table overflow"); 512810Swnj 522810Swnj p = ALLOC(nameblock); 532810Swnj p->nxtnameblock = firstname; 542810Swnj p->namep = copys(s); 552810Swnj p->linep = 0; 562810Swnj p->done = 0; 572810Swnj p->septype = 0; 582810Swnj p->modtime = 0; 592810Swnj 602810Swnj firstname = p; 612810Swnj if(mainname == NULL) 622810Swnj if(s[0]!='.' || hasslash(s) ) 632810Swnj mainname = p; 642810Swnj 652810Swnj hashtab[hashloc(s)] = p; 662810Swnj 672810Swnj return(p); 682810Swnj } 692810Swnj 702810Swnj 712810Swnj 722810Swnj hasslash(s) 732810Swnj char *s; 742810Swnj { 752810Swnj for( ; *s ; ++s) 762810Swnj if(*s == '/') 772810Swnj return(YES); 782810Swnj return(NO); 792810Swnj } 802810Swnj 812810Swnj 822810Swnj 832810Swnj char *copys(s) 842810Swnj register char *s; 852810Swnj { 862810Swnj char *calloc(); 872810Swnj register char *t, *t0; 882810Swnj 892810Swnj if( (t = t0 = calloc( strlen(s)+1 , sizeof(char)) ) == NULL) 902810Swnj fatal("out of memory"); 912810Swnj while(*t++ = *s++) 922810Swnj ; 932810Swnj return(t0); 942810Swnj } 952810Swnj 962810Swnj 972810Swnj 982810Swnj char *concat(a,b,c) /* c = concatenation of a and b */ 992810Swnj register char *a,*b; 1002810Swnj char *c; 1012810Swnj { 1022810Swnj register char *t; 1032810Swnj t = c; 1042810Swnj 1052810Swnj while(*t = *a++) t++; 1062810Swnj while(*t++ = *b++); 1072810Swnj return(c); 1082810Swnj } 1092810Swnj 1102810Swnj 1112810Swnj 1122810Swnj suffix(a,b,p) /* is b the suffix of a? if so, set p = prefix */ 1132810Swnj register char *a,*b,*p; 1142810Swnj { 1152810Swnj char *a0,*b0; 1162810Swnj a0 = a; 1172810Swnj b0 = b; 1182810Swnj 1192810Swnj while(*a++); 1202810Swnj while(*b++); 1212810Swnj 1222810Swnj if( (a-a0) < (b-b0) ) return(0); 1232810Swnj 1242810Swnj while(b>b0) 1252810Swnj if(*--a != *--b) return(0); 1262810Swnj 1272810Swnj while(a0<a) *p++ = *a0++; 1282810Swnj *p = '\0'; 1292810Swnj 1302810Swnj return(1); 1312810Swnj } 1322810Swnj 1332810Swnj 1342810Swnj 1352810Swnj 1362810Swnj 1372810Swnj 1382810Swnj int *ckalloc(n) 1392810Swnj register int n; 1402810Swnj { 1412810Swnj register int *p; 1422810Swnj 1432810Swnj if( p = (int *) calloc(1,n) ) 1442810Swnj return(p); 1452810Swnj 1462810Swnj fatal("out of memory"); 1472810Swnj /* NOTREACHED */ 1482810Swnj } 1492810Swnj 1502810Swnj /* copy string a into b, substituting for arguments */ 1512810Swnj char *subst(a,b) 1522810Swnj register char *a,*b; 1532810Swnj { 1542810Swnj static depth = 0; 1552810Swnj register char *s; 1562810Swnj char vname[100]; 1572810Swnj struct varblock *varptr(), *vbp; 1582810Swnj char closer; 1592810Swnj 1602810Swnj if(++depth > 100) 1612810Swnj fatal("infinitely recursive macro?"); 1622810Swnj if(a!=0) while(*a) 1632810Swnj { 1642810Swnj if(*a != '$') *b++ = *a++; 1652810Swnj else if(*++a=='\0' || *a=='$') 1662810Swnj *b++ = *a++; 1672810Swnj else { 1682810Swnj s = vname; 1692810Swnj if( *a=='(' || *a=='{' ) 1702810Swnj { 1712810Swnj closer = ( *a=='(' ? ')' : '}'); 1722810Swnj ++a; 1732810Swnj while(*a == ' ') ++a; 1742810Swnj while(*a!=' ' && *a!=closer && *a!='\0') *s++ = *a++; 1752810Swnj while(*a!=closer && *a!='\0') ++a; 1762810Swnj if(*a == closer) ++a; 1772810Swnj } 1782810Swnj else *s++ = *a++; 1792810Swnj 1802810Swnj *s = '\0'; 1812810Swnj if( (vbp = varptr(vname)) ->varval != 0) 1822810Swnj { 1832810Swnj b = subst(vbp->varval, b); 1842810Swnj vbp->used = YES; 1852810Swnj } 1862810Swnj } 1872810Swnj } 1882810Swnj 1892810Swnj *b = '\0'; 1902810Swnj --depth; 1912810Swnj return(b); 1922810Swnj } 1932810Swnj 1942810Swnj 1952810Swnj setvar(v,s) 1962810Swnj char *v, *s; 1972810Swnj { 1982810Swnj struct varblock *varptr(), *p; 1992810Swnj 2002810Swnj p = varptr(v); 2012810Swnj if(p->noreset == 0) 2022810Swnj { 2032810Swnj p->varval = s; 2042810Swnj p->noreset = inarglist; 2052810Swnj if(p->used && unequal(v,"@") && unequal(v,"*") 2062810Swnj && unequal(v,"<") && unequal(v,"?") ) 2072810Swnj fprintf(stderr, "Warning: %s changed after being used\n",v); 2082810Swnj } 2092810Swnj } 2102810Swnj 2112810Swnj 2122810Swnj eqsign(a) /*look for arguments with equal signs but not colons */ 2132810Swnj char *a; 2142810Swnj { 2152810Swnj register char *s, *t; 2162810Swnj 2172810Swnj while(*a == ' ') ++a; 2182810Swnj for(s=a ; *s!='\0' && *s!=':' ; ++s) 2192810Swnj if(*s == '=') 2202810Swnj { 2212810Swnj for(t = a ; *t!='=' && *t!=' ' && *t!='\t' ; ++t ); 2222810Swnj *t = '\0'; 2232810Swnj 2242810Swnj for(++s; *s==' ' || *s=='\t' ; ++s); 2252810Swnj setvar(a, copys(s)); 2262810Swnj return(YES); 2272810Swnj } 2282810Swnj 2292810Swnj return(NO); 2302810Swnj } 2312810Swnj 2322810Swnj 2332810Swnj struct varblock *varptr(v) 2342810Swnj char *v; 2352810Swnj { 2362810Swnj register struct varblock *vp; 2372810Swnj 2382810Swnj for(vp = firstvar; vp ; vp = vp->nxtvarblock) 2392810Swnj if(! unequal(v , vp->varname)) 2402810Swnj return(vp); 2412810Swnj 2422810Swnj vp = ALLOC(varblock); 2432810Swnj vp->nxtvarblock = firstvar; 2442810Swnj firstvar = vp; 2452810Swnj vp->varname = copys(v); 2462810Swnj vp->varval = 0; 2472810Swnj return(vp); 2482810Swnj } 2492810Swnj 2502810Swnj 2512810Swnj fatal1(s, t) 2522810Swnj char *s, *t; 2532810Swnj { 254*8677Ssam char buf[BUFSIZ]; 2552810Swnj sprintf(buf, s, t); 2562810Swnj fatal(buf); 2572810Swnj } 2582810Swnj 2592810Swnj 2602810Swnj 2612810Swnj fatal(s) 2622810Swnj char *s; 2632810Swnj { 2642810Swnj if(s) fprintf(stderr, "Make: %s. Stop.\n", s); 2652810Swnj else fprintf(stderr, "\nStop.\n"); 2662810Swnj #ifdef unix 2672810Swnj exit(1); 2682810Swnj #endif 2692810Swnj #ifdef gcos 2702810Swnj exit(0); 2712810Swnj #endif 2722810Swnj } 2732810Swnj 2742810Swnj 2752810Swnj 2762810Swnj yyerror(s) 2772810Swnj char *s; 2782810Swnj { 2792810Swnj char buf[50]; 2802810Swnj extern int yylineno; 2812810Swnj 2822810Swnj sprintf(buf, "line %d: %s", yylineno, s); 2832810Swnj fatal(buf); 2842810Swnj } 2852810Swnj 2862810Swnj 2872810Swnj 2882810Swnj struct chain *appendq(head, tail) 2892810Swnj struct chain *head; 2902810Swnj char *tail; 2912810Swnj { 2922810Swnj register struct chain *p, *q; 2932810Swnj 2942810Swnj p = ALLOC(chain); 2952810Swnj p->datap = tail; 2962810Swnj 2972810Swnj if(head) 2982810Swnj { 2992810Swnj for(q = head ; q->nextp ; q = q->nextp) 3002810Swnj ; 3012810Swnj q->nextp = p; 3022810Swnj return(head); 3032810Swnj } 3042810Swnj else 3052810Swnj return(p); 3062810Swnj } 3072810Swnj 3082810Swnj 3092810Swnj 3102810Swnj 3112810Swnj 3122810Swnj char *mkqlist(p) 3132810Swnj struct chain *p; 3142810Swnj { 3152810Swnj register char *qbufp, *s; 3162810Swnj static char qbuf[QBUFMAX]; 3172810Swnj 3182810Swnj if(p == NULL) 3192810Swnj { 3202810Swnj qbuf[0] = '\0'; 3212810Swnj return; 3222810Swnj } 3232810Swnj 3242810Swnj qbufp = qbuf; 3252810Swnj 3262810Swnj for( ; p ; p = p->nextp) 3272810Swnj { 3282810Swnj s = p->datap; 3292810Swnj if(qbufp+strlen(s) > &qbuf[QBUFMAX-3]) 3302810Swnj { 3312810Swnj fprintf(stderr, "$? list too long\n"); 3322810Swnj break; 3332810Swnj } 3342810Swnj while (*s) 3352810Swnj *qbufp++ = *s++; 3362810Swnj *qbufp++ = ' '; 3372810Swnj } 3382810Swnj *--qbufp = '\0'; 3392810Swnj return(qbuf); 3402810Swnj } 341