|
|
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.