|
|
1.1 ! root 1: # ! 2: # include "mcons.c" ! 3: char ib1[518]; ! 4: char *ibuf &ib1; ! 5: struct htab ( ! 6: int hsiz; ! 7: int ssiz; ! 8: int nsym; ! 9: int curb; ! 10: int *hptr; ! 11: char *symt; ! 12: ); ! 13: ! 14: struct htab itab; ! 15: struct htab xtab; ! 16: ! 17: int ipsp[PTRI]; ! 18: char issp[CHARI]; ! 19: search(symbol,length,params,install) ! 20: char *symbol; ! 21: int length; ! 22: struct htab *params; ! 23: int install; ! 24: { ! 25: char *sp,*p; ! 26: int curb,*hptr,hsiz,nsym,ssiz; ! 27: char *symt; ! 28: auto h,i,j,k; ! 29: ! 30: hptr = params->hptr; ! 31: hsiz = params->hsiz; ! 32: symt = params->symt; ! 33: ssiz = params->ssiz; ! 34: curb = params->curb; ! 35: nsym = params->nsym; ! 36: ! 37: symbol[length] = '\0'; ! 38: sp = symbol; ! 39: ! 40: i = length; ! 41: h = 1; ! 42: while(i--) ! 43: h =* *sp++; ! 44: ! 45: if(h == 0100000)h = 1; ! 46: h = h<0?(-h)%hsiz:h%hsiz; ! 47: if(h == 0) h++; ! 48: /* printf("%s %d\n",symbol,h); /*DEBUG*/ ! 49: ! 50: while((p = &symt[hptr[h]]) > symt) { ! 51: j = length + 1; ! 52: sp = symbol; ! 53: while(j--) { ! 54: if(*p++ != *sp++) goto no; ! 55: } ! 56: return(*p); ! 57: no: ! 58: h = (h + h)%hsiz; ! 59: } ! 60: if(install) { ! 61: if(++nsym >= hsiz) err("too many","symbols"); ! 62: ! 63: hptr[h] = curb; ! 64: length++; ! 65: if((curb + length) >= ssiz) err("too many","chars"); ! 66: ! 67: while(length--) ! 68: symt[curb++] = *symbol++; ! 69: symt[curb++] = install; ! 70: params->curb = curb; ! 71: params->nsym = nsym; ! 72: } ! 73: return(0); ! 74: } ! 75: ! 76: main(argc,argv) char **argv; ! 77: { ! 78: ! 79: auto ifile,ofile,i,c,error,val; ! 80: char t[20]; ! 81: ! 82: if(argc != 3)exit(); ! 83: ! 84: ifile = fopen(argv[1],ibuf); ! 85: if(ifile < 0)err("open",argv[1]); ! 86: ! 87: ofile = creat(argv[2],0644); ! 88: if(ofile < 0)err("creat",argv[2]); ! 89: ! 90: xtab.hptr = &ipsp; ! 91: xtab.symt = &issp; ! 92: xtab.hsiz = PTRI; ! 93: xtab.ssiz = CHARI; ! 94: xtab.nsym = 0; ! 95: xtab.curb = 1; ! 96: ! 97: i = xtab.hsiz; ! 98: while(i)xtab.hptr[--i] = 0; ! 99: ! 100: i = -1; ! 101: while((t[++i] = getc(ibuf)) >= 0){ ! 102: if(t[i] == '\n'){ ! 103: i = search(t,i,&xtab,1); ! 104: i = -1; ! 105: } else { ! 106: if(t[i] == '\t') { ! 107: val = gen(); ! 108: search(t,i,&xtab,val); ! 109: i = -1; ! 110: } ! 111: } ! 112: } ! 113: ! 114: /* printf("collisions = %d\nsymbols = %d\n",ncol,nsym); /*INSTR*/ ! 115: i = 0100200; ! 116: error = write(ofile,&i,2); ! 117: if(error < 0)err("write",argv[2]); ! 118: i = 2*xtab.hsiz; ! 119: error = write(ofile,&i,2); ! 120: if(error < 0)err("write",argv[2]); ! 121: error = write(ofile,&xtab.ssiz,2); ! 122: if(error < 0)err("write",argv[2]); ! 123: error = write(ofile,xtab.hptr,i); ! 124: if(error < 0)err("write",argv[2]); ! 125: error = write(ofile,xtab.symt,xtab.ssiz); ! 126: if(error < 0)err("write",argv[2]); ! 127: return; ! 128: } ! 129: ! 130: err(a,b) ! 131: char *a,*b; ! 132: { ! 133: printf("%s %s\n",a,b); ! 134: exit(); ! 135: } ! 136: ! 137: gen() ! 138: { ! 139: auto i,v; ! 140: ! 141: v = 0; ! 142: while((i = getc(ibuf)) != -1) { ! 143: if(i == '\n') break; ! 144: v = v*10 + (i - '0'); ! 145: } ! 146: return(v); ! 147: } ! 148:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.