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