|
|
1.1 root 1: #ifndef STRING_DOT_H
2: #define STRING_DOT_H
3:
4: #define _OVERLOAD_STAT sleaze
5: #include <sys/types.h>
6: #include <sys/stat.h>
7: #undef _OVERLOAD_STAT
8:
9: overload system, access, acct, chdir, chmod, chown, creat, link, mknod, mount,
10: open, umount, unlink, read, write;
11: #include <sysent.h>
12:
13: overload fopen, fdopen, freopen, gets, fgets, puts, fputs;
14:
15: #include <string.h>
16: #include <stream.h>
17: #ifndef GENERICH
18: #include <generic.h>
19: #endif
20:
21: #ifndef TRUE
22: #define FALSE 0
23: #define TRUE (!FALSE)
24: #endif
25:
26: #ifndef BIT_DEFINED
27: #define BIT_DEFINED
28: typedef int bit;
29: #endif
30:
31: #define MAXSUBSTRINGLENGTH 0x7FFF
32: const MAXSTRINGLENGTH = 0xFFFF-1;
33:
34: class Rep;
35: class String;
36: class SubString;
37: class Subchar; /* the result of [] */
38: class Regexp;
39:
40: struct Charfield;
41:
42: struct MtRep
43: {
44: MtRep *next;
45: int dummy;
46: };
47:
48: const empty_dummy = ~0 << 16 | 0374;
49:
50: struct Rep
51: {
52: char *start; // the characters (NOT null terminated)
53: unsigned short len;
54: unsigned char refCount;
55: unsigned char flags;
56: bit is_immutable() { return (flags & 02) != 0; }
57: void immutable() { flags |= 02; }
58: void mutable() { flags &= ~02; }
59: bit is_constant() { return (flags & 01) != 0; }
60: void now_constant() { flags |= 01; }
61: void not_constant() { flags &= ~01; }
62: Rep() {}
63: Rep(const Rep&);
64: Rep(unsigned);
65: Rep(const char *, unsigned);
66: Rep(const char *s) { this = new Rep(s, strlen(s)); }
67: ~Rep();
68: void refDecr() { if (!is_constant() && --refCount == 0 )
69: delete this;
70: }
71: void refIncr() { if (!is_constant()) ++refCount; }
72: unsigned length () { return len; }
73: int compare (const Rep&); /* like strcmp(3C) */
74: int compare (const char*);
75: int match(const Rep&); // return first differing position
76: int match(const char*);
77: int hashval (); // for use in hash tables, etc.
78: bit extend(int); // TRUE if the Rep is extended
79: bit isMt() { return ((MtRep *)this)->dummy == empty_dummy; }
80: Charfield *myField();
81: Rep *canCat(int); // returns a new Rep if this can be catenated
82: Rep *newSub(int offset, int length);
83: /* the following are from String(3) */
84: int strchr(char); // position of first occurrence of char
85: int strrchr(char); // ... last ... (-1 if char not there)
86: int strpbrk(const Rep&);
87: int strspn(const Rep&);
88: int strcspn(const Rep&);
89: };
90:
91: // Strings are at the bottom working up, and Reps are at the top working down
92: struct Charfield
93: {
94: Charfield *next;
95: MtRep *emptyHead; /* of list of free Reps with no space */
96: Rep *lastRep;
97: char *field; /* beginning of characters */
98: char *end; /* ... of data area */
99: char *firstFree;
100: int usedSpace;
101: Charfield();
102: Charfield(unsigned int);
103: int compactify(unsigned int); /* return TRUE if no use */
104: Rep *newRep(unsigned int);
105: char *getSpace(int); /* new String space for old Rep */
106: void putMt(MtRep *);
107: Rep *getMt();
108: };
109:
110: extern Rep *nullRep; /* the null String */
111: extern Rep *oneChar; /* all one-character Strings */
112: extern Charfield *currfield;
113:
114: extern char *Memcpy(char *to, const char *from, int);
115:
116: extern ostream& operator<<(ostream&, Rep&);
117:
118: class String
119: {
120: static GPT handler;
121: static bit startedUp;
122: void error(int = 0, char * = 0);
123: Rep *d;
124: friend SubString;
125: friend Subchar;
126: public:
127: String();
128: String(char);
129: String(char, char);
130: String(char, char, char);
131: String(char, char, char, char);
132: String(const char *);
133: String(const char *, int);
134: String(const String& s) { d = s.d; d->refIncr(); }
135: String(const SubString&);
136: String(Rep& r) { d = &r; r.refCount++; }
137: ~String() { d->refDecr(); }
138: friend int stat(const String&, struct stat*);
139: friend int system(const String&);
140: friend int access(const String&, int);
141: friend int acct(const String&);
142: friend int chdir(const String&);
143: friend int chmod(const String&, int);
144: friend int chown(const String&, int, int);
145: friend int creat(const String&, int);
146: friend int link(const String&, const String&);
147: friend int mknod(const String&, int, int);
148: friend int mount(const String&, const String&, int);
149: friend int open(const String&, int);
150: friend int umount(const String&);
151: friend int unlink(const String&);
152: friend int read(int, String&, int);
153: friend int write(int, const String&);
154: friend FILE* fopen(const String&, const String&);
155: friend FILE* fdopen(int, const String&);
156: friend FILE* freopen(const String&, const String&, FILE*);
157: friend puts(const String&);
158: friend fputs(const String&, FILE*);
159: friend inline ostream& operator<<(ostream&, const String&);
160: friend istream& operator>>(istream&, String&);
161: friend String sgets(istream&);
162: friend String operator+(const char, const String&);
163: friend String operator+(const char*, const String&);
164: friend Rep;
165: friend Regexp;
166: friend void startUp();
167: unsigned length (){ return d->length(); }
168: operator void*() { return length() ? this : 0; }
169: int hashval() { return d->hashval(); }
170: int compare(const String&); /* like strcmp(3C) */
171: int compare(const char *p) { return d->compare(p); }
172: bit operator==(const String& oo) { return compare(oo) == 0; }
173: bit operator>(const String& oo) { return compare(oo) > 0; }
174: bit operator>=(const String& oo) { return compare(oo) >= 0; }
175: bit operator<=(const String& oo) { return compare(oo) <= 0; }
176: bit operator<(const String& oo) { return compare(oo) < 0; }
177: bit operator!=(const String& oo) { return compare(oo) != 0; }
178: bit operator==(const char* p) { return compare(p) == 0; }
179: bit operator>(const char* p) { return compare(p) > 0; }
180: bit operator>=(const char* p) { return compare(p) >= 0; }
181: bit operator<=(const char* p) { return compare(p) <= 0; }
182: bit operator<(const char* p) { return compare(p) < 0; }
183: bit operator!=(const char* p) { return compare(p) != 0; }
184: // match returns the first differing position
185: int match(const String&);
186: int match (const char* p) { return d->match(p); }
187: String operator+(const String&); /* catenate */
188: String operator+(const char*); /* catenate */
189: String operator+(const char); /* catenate */
190: String& operator=(const char);
191: String& operator=(const char *);
192: String& operator=(const String& oo);
193: String& put(const char); /* append or put */
194: String& put(const String&); /* append or put */
195: String& operator+=(const char c) { return put(c); }
196: String& operator+=(const String& oo) { return put(oo); }
197: bit getX(char&); /* get or lop */
198: bit get() { char c; return getX(c); }
199: String& unget(const char); /* prepend */
200: String& unget(const String&); /* prepend */
201: bit unputX(char&); /* remove from back */
202: bit unput() { char c; return unputX(c); }
203: bit firstX(char&);
204: bit lastX(char&);
205: SubString& operator() (const unsigned start, const unsigned length);
206: Subchar& operator[] (const unsigned); /* character selection */
207: void dump(char *);
208: GPT sethandler(GPT);
209: /* the following are from String(3) */
210: /* position of first occurrence of char */
211: int strchr(const char c) { return d->strchr(c); }
212: /* ... last ... (-1 if char not there) */
213: int strrchr(const char c) { return d->strrchr(c); }
214: int strpbrk(const String& oo) { return d->strpbrk(*oo.d); }
215: int strspn(const String& oo) { return d->strspn(*oo.d); }
216: int strcspn(const String& oo) { return d->strcspn(*oo.d); }
217: };
218:
219: inline bit
220: operator==(const char* p, const String s)
221: {
222: return s.compare(p) == 0;
223: }
224: inline bit
225: operator>(const char* p, const String s)
226: {
227: return s < p;
228: }
229: inline bit
230: operator>=(const char* p, const String s)
231: {
232: return s >= p;
233: }
234: inline bit
235: operator<=(const char* p, const String s)
236: {
237: return s >= p;
238: }
239: inline bit
240: operator<(const char* p, const String s)
241: {
242: return s > p;
243: }
244: inline bit
245: operator!=(const char* p, const String s)
246: {
247: return s != p;
248: }
249:
250: inline ostream&
251: operator<<(ostream& oo, const String& ss)
252: {
253: return oo << *ss.d;
254: }
255:
256: class SubString
257: {
258: static String *ss;
259: static int oo;
260: static int ll;
261: static GPT handler;
262: void error(int = 0, char * = 0);
263: SubString(const SubString&);
264: SubString(const String &ii, int off, int len) { this = 0;
265: ss = ⅈ oo = off; ll = len; }
266: ~SubString() { this = 0; }
267: void operator=(const String&);
268: public:
269: GPT sethandler(GPT);
270: String *it() { return ss; }
271: int offset() { return oo; }
272: int length() { return ll; }
273: };
274:
275: class Subchar
276: {
277: static String *ss;
278: static int oo; /* position in the String */
279: static GPT handler;
280: void error(int = 0, char * = 0);
281: Subchar(const Subchar&);
282: Subchar(const String &ii, int off) {
283: this = 0; ss = ⅈ oo = off; }
284: ~Subchar() { this = 0; }
285: char operator=(const char);
286: operator char() { return *(ss->d->start + oo); }
287: public:
288: GPT sethandler(GPT);
289: String *it() { return ss; }
290: int offset() { return oo; }
291: };
292:
293: overload length;
294: int length(const String&);
295: inline int length(const String &s) { return s.length(); }
296: overload hashval;
297: int hashval(const String&);
298: inline int hashval(const String &s) { return s.hashval(); }
299: overload compare;
300: int compare(const String&,const String&);
301: inline int compare(const String &s,const String &t) { return s.compare(t); }
302: overload strchr;
303: int strchr(const String&, const char);
304: inline int strchr(const String& s, const char c) { return s.strchr(c); }
305: overload strrchr;
306: int strrchr(const String&, const char);
307: inline int strrchr(const String& s, const char c) { return s.strrchr(c); }
308: overload strpbrk;
309: int strpbrk(const String&, const String&);
310: inline int strpbrk(const String& s, const String& t) { return s.strpbrk(t); }
311: overload strspn;
312: int strspn(const String&, const String&);
313: inline int strspn(const String& s, const String& t) { return s.strspn(t); }
314: overload strcspn;
315: int strcspn(const String&, const String&);
316: inline int strcspn(const String& s, const String& t) { return s.strcspn(t); }
317:
318: overload min;
319: int min(int, int);
320: int min(int, int, int);
321: inline int min(int i, int j) { return i<j ? i : j; }
322: inline int min(int i, int j, int k) { return i<j ? min(i,k) : min(j,k); }
323:
324: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.