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