xref: /csrg-svn/usr.bin/pascal/src/string.c (revision 1835)
1776Speter /* Copyright (c) 1979 Regents of the University of California */
2776Speter 
3*1835Speter static	char sccsid[] = "@(#)string.c 1.2 11/24/80";
4776Speter 
5776Speter #include "whoami.h"
6776Speter #include "0.h"
7776Speter #ifndef PI01
8776Speter #ifndef PXP
9776Speter #include "send.h"
10776Speter #endif
11776Speter #endif
12776Speter 
13776Speter /*
14776Speter  * STRING SPACE DECLARATIONS
15776Speter  *
16776Speter  * Strng is the base of the current
17776Speter  * string space and strngp the
18776Speter  * base of the free area therein.
19776Speter  * Strp is the array of descriptors.
20776Speter  */
21776Speter #ifndef PI0
22776Speter STATIC	char strings[STRINC];
23776Speter STATIC	char *strng = strings;
24776Speter STATIC	char *strngp = strings;
25776Speter #else
26776Speter char	*strng, *strngp;
27776Speter #endif
28776Speter #ifndef PI01
29776Speter #ifndef PXP
30776Speter STATIC	char *strp[20];
31776Speter STATIC	char **stract strp;
32776Speter int	strmax;
33776Speter #endif
34776Speter #endif
35776Speter 
36776Speter #ifndef PI01
37776Speter #ifndef PXP
38776Speter #ifndef PI0
39776Speter initstring()
40776Speter #else
41776Speter initstring(strings)
42776Speter 	char *strings;
43776Speter #endif
44776Speter {
45776Speter 
46776Speter 	*stract++ = strings;
47776Speter #ifdef PI0
48776Speter 	strng = strngp = strings;
49776Speter #endif
50776Speter 	strmax = STRINC * 2;
51776Speter }
52776Speter #endif
53776Speter #endif
54776Speter 
55776Speter /*
56776Speter  * Copy a string into the string area.
57776Speter  */
58776Speter char *
59776Speter savestr(cp)
60776Speter 	register char *cp;
61776Speter {
62776Speter 	register int i;
63776Speter 
64776Speter 	i = strlen(cp) + 1;
65776Speter 	if (strngp + i >= strng + STRINC) {
66776Speter 		strngp = malloc(STRINC);
67*1835Speter 		if (strngp == 0) {
68776Speter 			yerror("Ran out of memory (string)");
69776Speter 			pexit(DIED);
70776Speter 		}
71776Speter #ifndef PI01
72776Speter #ifndef PXP
73776Speter 		*stract++ = strngp;
74776Speter 		strmax =+ STRINC;
75776Speter #endif
76776Speter #endif
77776Speter 		strng = strngp;
78776Speter 	}
79776Speter 	strcpy(strngp, cp);
80776Speter 	cp = strngp;
81776Speter 	strngp = cp + i;
82776Speter #ifdef PI0
83776Speter 	send(RSTRING, cp);
84776Speter #endif
85776Speter 	return (cp);
86776Speter }
87776Speter 
88776Speter #ifndef PI1
89776Speter #ifndef PXP
90776Speter esavestr(cp)
91776Speter 	char *cp;
92776Speter {
93776Speter 
94776Speter #ifdef PI0
95776Speter 	send(REVENIT);
96776Speter #endif
97776Speter 	strngp = ( (char *) ( ( (int) (strngp + 1) ) &~ 1 ) );
98776Speter 	return (savestr(cp));
99776Speter }
100776Speter #endif
101776Speter #endif
102776Speter 
103776Speter #ifndef PI01
104776Speter #ifndef PXP
105776Speter soffset(cp)
106776Speter 	register char *cp;
107776Speter {
108776Speter 	register char **sp;
109776Speter 	register int i;
110776Speter 
111776Speter 	if (cp == NIL || cp == OCT || cp == HEX)
112776Speter 		return (-cp);
113776Speter 	for (i = STRINC, sp = strp; sp < stract; sp++) {
114776Speter 		if (cp >= *sp && cp < (*sp + STRINC))
115776Speter 			return (i + (cp - *sp));
116776Speter 		i =+ STRINC;
117776Speter 	}
118776Speter 	i = nlfund(cp);
119776Speter 	if (i != 0)
120776Speter 		return (i);
121776Speter 	panic("soffset");
122776Speter }
123776Speter #ifdef PI1
124776Speter sreloc(i)
125776Speter 	register int i;
126776Speter {
127776Speter 
128776Speter 	if (i == 0 || i == -OCT || i == -HEX)
129776Speter 		return (-i);
130776Speter 	if (i < STRINC) {
131776Speter 		if (i >= INL)
132776Speter 			panic("sreloc INL");
133776Speter 		i = nl[i].symbol;
134776Speter 		if (i == 0)
135776Speter 			panic("sreloc nl[i]");
136776Speter 		return (i);
137776Speter 	}
138776Speter 	if (i > strmax || i < 0)
139776Speter 		panic("sreloc");
140776Speter 	return (strp[(i / STRINC) - 1] + (i % STRINC));
141776Speter }
142776Speter 
143776Speter evenit()
144776Speter {
145776Speter 
146776Speter 	strngp = (strngp + 1) &~ 1;
147776Speter }
148776Speter #endif
149776Speter #endif
150776Speter #endif
151