|
|
1.1 root 1: /*% cc -c -O %
2: */
3: #include "vars.h"
4: #define strfree string[NSTRING].str
5: char *strstart;
6:
7: length(s)
8: register char *s;
9: {
10: register char *t;
11: if((t=s)==0)
12: return(0);
13: do;while(*t++);
14: return(t-s-1);
15: }
16: startstring(){
17: strstart=strfree;
18: }
19: addstring(c){
20: if(strfree==strchars+NSTRCHARS)
21: strcompact();
22: *strfree++ = c;
23: }
24: dropstring(){
25: --strfree;
26: }
27: cpstr(a, b)
28: register char *a, *b;
29: {
30: do;while (*b++ = *a++);
31: }
32: shiftstring(up){ /* A highly machine-dependent routine */
33: register struct string *sp;
34: for(sp=string; sp<=string+NSTRING; sp++)
35: if(up)
36: sp->str += (int)strarea;
37: else
38: sp->str -= (int)strarea;
39: }
40: clearstring(z){
41: string[z].len = 0;
42: string[z].str = nullstr;
43: }
44: copystring(s)
45: register char *s;
46: {
47: while(*s)
48: addstring(*s++);
49: }
50: eqstr(a, b)
51: register char *a, *b;
52: {
53: while(*a)
54: if(*a++ != *b++)
55: return(FALSE);
56: return(*b=='\0');
57: }
58: /*
59: * dupstring duplicates a string.
60: * Because we may strcompact(), we do it first if necessary.
61: */
62: dupstring(z)
63: {
64: if(strfree+string[z].len > strchars+NSTRCHARS)
65: strcompact(); /* if insufficient, will get error when we copystring() */
66: copystring(string[z].str);
67: }
68: setstring(n){
69: addstring('\0');
70: if((string[n].len = length(strstart)) == 0)
71: string[n].str = nullstr;
72: else
73: string[n].str = strstart;
74: if(strfree >= strchars + NSTRCHARS)
75: strcompact();
76: }
77: strcompact(){
78: register struct string *cursor;
79: struct string *thisstr;
80: register char *s, *t;
81: lock++;
82: s=strchars;
83: for(;;){
84: t=strchars+NSTRCHARS;
85: for(cursor=string;cursor!=string+NSTRING;cursor++)
86: if(s<=cursor->str && cursor->str<t){
87: t = cursor->str;
88: thisstr = cursor;
89: }
90: if(t==strchars+NSTRCHARS)
91: break;
92: thisstr->str=s;
93: do;while(*s++ = *t++);
94: }
95: t=strstart;
96: strstart=s;
97: while(t!=strfree)
98: *s++ = *t++;
99: strfree=s;
100: if(s==strchars+NSTRCHARS){
101: strfree=strstart;
102: error('Z');
103: }
104: unlock();
105: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.