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