|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.