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