|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)string.c 5.1 (Berkeley) 6/5/85";
9: #endif not lint
10:
11: #include "whoami.h"
12: #include "0.h"
13: #ifndef PI01
14: #ifndef PXP
15: #include "send.h"
16: #endif
17: #endif
18:
19: /*
20: * STRING SPACE DECLARATIONS
21: *
22: * Strng is the base of the current
23: * string space and strngp the
24: * base of the free area therein.
25: * Strp is the array of descriptors.
26: */
27: #ifndef PI0
28: STATIC char strings[STRINC];
29: STATIC char *strng = strings;
30: STATIC char *strngp = strings;
31: #else
32: char *strng, *strngp;
33: #endif
34: #ifndef PI01
35: #ifndef PXP
36: STATIC char *strp[20];
37: STATIC char **stract strp;
38: int strmax;
39: #endif
40: #endif
41:
42: #ifndef PI01
43: #ifndef PXP
44: #ifndef PI0
45: initstring()
46: #else
47: initstring(strings)
48: char *strings;
49: #endif
50: {
51:
52: *stract++ = strings;
53: #ifdef PI0
54: strng = strngp = strings;
55: #endif
56: strmax = STRINC * 2;
57: }
58: #endif
59: #endif
60:
61: /*
62: * Copy a string into the string area.
63: */
64: char *
65: savestr(cp)
66: register char *cp;
67: {
68: register int i;
69:
70: i = strlen(cp) + 1;
71: if (strngp + i >= strng + STRINC) {
72: strngp = malloc(STRINC);
73: if (strngp == 0) {
74: yerror("Ran out of memory (string)");
75: pexit(DIED);
76: }
77: #ifndef PI01
78: #ifndef PXP
79: *stract++ = strngp;
80: strmax =+ STRINC;
81: #endif
82: #endif
83: strng = strngp;
84: }
85: (void) pstrcpy(strngp, cp);
86: cp = strngp;
87: strngp = cp + i;
88: #ifdef PI0
89: send(RSTRING, cp);
90: #endif
91: return (cp);
92: }
93:
94: #ifndef PI1
95: #ifndef PXP
96: char *
97: esavestr(cp)
98: char *cp;
99: {
100:
101: #ifdef PI0
102: send(REVENIT);
103: #endif
104: strngp = ( (char *) ( ( (int) (strngp + 1) ) &~ 1 ) );
105: return (savestr(cp));
106: }
107: #endif
108: #endif
109:
110: #ifndef PI01
111: #ifndef PXP
112: soffset(cp)
113: register char *cp;
114: {
115: register char **sp;
116: register int i;
117:
118: if (cp == NIL || cp == OCT || cp == HEX)
119: return (-cp);
120: for (i = STRINC, sp = strp; sp < stract; sp++) {
121: if (cp >= *sp && cp < (*sp + STRINC))
122: return (i + (cp - *sp));
123: i =+ STRINC;
124: }
125: i = nlfund(cp);
126: if (i != 0)
127: return (i);
128: panic("soffset");
129: }
130: #ifdef PI1
131: sreloc(i)
132: register int i;
133: {
134:
135: if (i == 0 || i == -OCT || i == -HEX)
136: return (-i);
137: if (i < STRINC) {
138: if (i >= INL)
139: panic("sreloc INL");
140: i = nl[i].symbol;
141: if (i == 0)
142: panic("sreloc nl[i]");
143: return (i);
144: }
145: if (i > strmax || i < 0)
146: panic("sreloc");
147: return (strp[(i / STRINC) - 1] + (i % STRINC));
148: }
149:
150: evenit()
151: {
152:
153: strngp = (strngp + 1) &~ 1;
154: }
155: #endif
156: #endif
157: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.