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