xref: /csrg-svn/usr.bin/pascal/src/string.c (revision 776)
1*776Speter /* Copyright (c) 1979 Regents of the University of California */
2*776Speter 
3*776Speter static	char sccsid[] = "@(#)string.c 1.1 08/27/80";
4*776Speter 
5*776Speter #include "whoami.h"
6*776Speter #include "0.h"
7*776Speter #ifndef PI01
8*776Speter #ifndef PXP
9*776Speter #include "send.h"
10*776Speter #endif
11*776Speter #endif
12*776Speter 
13*776Speter /*
14*776Speter  * STRING SPACE DECLARATIONS
15*776Speter  *
16*776Speter  * Strng is the base of the current
17*776Speter  * string space and strngp the
18*776Speter  * base of the free area therein.
19*776Speter  * Strp is the array of descriptors.
20*776Speter  */
21*776Speter #ifndef PI0
22*776Speter STATIC	char strings[STRINC];
23*776Speter STATIC	char *strng = strings;
24*776Speter STATIC	char *strngp = strings;
25*776Speter #else
26*776Speter char	*strng, *strngp;
27*776Speter #endif
28*776Speter #ifndef PI01
29*776Speter #ifndef PXP
30*776Speter STATIC	char *strp[20];
31*776Speter STATIC	char **stract strp;
32*776Speter int	strmax;
33*776Speter #endif
34*776Speter #endif
35*776Speter 
36*776Speter #ifndef PI01
37*776Speter #ifndef PXP
38*776Speter #ifndef PI0
39*776Speter initstring()
40*776Speter #else
41*776Speter initstring(strings)
42*776Speter 	char *strings;
43*776Speter #endif
44*776Speter {
45*776Speter 
46*776Speter 	*stract++ = strings;
47*776Speter #ifdef PI0
48*776Speter 	strng = strngp = strings;
49*776Speter #endif
50*776Speter 	strmax = STRINC * 2;
51*776Speter }
52*776Speter #endif
53*776Speter #endif
54*776Speter 
55*776Speter /*
56*776Speter  * Copy a string into the string area.
57*776Speter  */
58*776Speter char *
59*776Speter savestr(cp)
60*776Speter 	register char *cp;
61*776Speter {
62*776Speter 	register int i;
63*776Speter 
64*776Speter 	i = strlen(cp) + 1;
65*776Speter 	if (strngp + i >= strng + STRINC) {
66*776Speter 		strngp = malloc(STRINC);
67*776Speter 		if (strngp == -1) {
68*776Speter 			yerror("Ran out of memory (string)");
69*776Speter 			pexit(DIED);
70*776Speter 		}
71*776Speter #ifndef PI01
72*776Speter #ifndef PXP
73*776Speter 		*stract++ = strngp;
74*776Speter 		strmax =+ STRINC;
75*776Speter #endif
76*776Speter #endif
77*776Speter 		strng = strngp;
78*776Speter 	}
79*776Speter 	strcpy(strngp, cp);
80*776Speter 	cp = strngp;
81*776Speter 	strngp = cp + i;
82*776Speter #ifdef PI0
83*776Speter 	send(RSTRING, cp);
84*776Speter #endif
85*776Speter 	return (cp);
86*776Speter }
87*776Speter 
88*776Speter #ifndef PI1
89*776Speter #ifndef PXP
90*776Speter esavestr(cp)
91*776Speter 	char *cp;
92*776Speter {
93*776Speter 
94*776Speter #ifdef PI0
95*776Speter 	send(REVENIT);
96*776Speter #endif
97*776Speter 	strngp = ( (char *) ( ( (int) (strngp + 1) ) &~ 1 ) );
98*776Speter 	return (savestr(cp));
99*776Speter }
100*776Speter #endif
101*776Speter #endif
102*776Speter 
103*776Speter #ifndef PI01
104*776Speter #ifndef PXP
105*776Speter soffset(cp)
106*776Speter 	register char *cp;
107*776Speter {
108*776Speter 	register char **sp;
109*776Speter 	register int i;
110*776Speter 
111*776Speter 	if (cp == NIL || cp == OCT || cp == HEX)
112*776Speter 		return (-cp);
113*776Speter 	for (i = STRINC, sp = strp; sp < stract; sp++) {
114*776Speter 		if (cp >= *sp && cp < (*sp + STRINC))
115*776Speter 			return (i + (cp - *sp));
116*776Speter 		i =+ STRINC;
117*776Speter 	}
118*776Speter 	i = nlfund(cp);
119*776Speter 	if (i != 0)
120*776Speter 		return (i);
121*776Speter 	panic("soffset");
122*776Speter }
123*776Speter #ifdef PI1
124*776Speter sreloc(i)
125*776Speter 	register int i;
126*776Speter {
127*776Speter 
128*776Speter 	if (i == 0 || i == -OCT || i == -HEX)
129*776Speter 		return (-i);
130*776Speter 	if (i < STRINC) {
131*776Speter 		if (i >= INL)
132*776Speter 			panic("sreloc INL");
133*776Speter 		i = nl[i].symbol;
134*776Speter 		if (i == 0)
135*776Speter 			panic("sreloc nl[i]");
136*776Speter 		return (i);
137*776Speter 	}
138*776Speter 	if (i > strmax || i < 0)
139*776Speter 		panic("sreloc");
140*776Speter 	return (strp[(i / STRINC) - 1] + (i % STRINC));
141*776Speter }
142*776Speter 
143*776Speter evenit()
144*776Speter {
145*776Speter 
146*776Speter 	strngp = (strngp + 1) &~ 1;
147*776Speter }
148*776Speter #endif
149*776Speter #endif
150*776Speter #endif
151