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