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