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