this repo has no description
1/*
2 STRUTILS.i
3 Copyright (C) 2007 Paul C. Pratt
4
5 You can redistribute this file and/or modify it under the terms
6 of version 2 of the GNU General Public License as published by
7 the Free Software Foundation. You should have received a copy
8 of the license along with this file; see the file COPYING.
9
10 This file is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 license for more details.
14*/
15
16/*
17 STRing UTILitieS
18
19 Some very basic string macros and routines.
20*/
21
22
23#define PStrLength(s) (*(s))
24#define PStrToMyCharPtr(s) ((s) + 1)
25
26#define PStrMaxLength 255
27
28#define SizeOfListMyChar(n) (n)
29#define PStrToPtr(s) ((MyPtr)PStrToMyCharPtr(s))
30#define PStrToSize(s) (SizeOfListMyChar(PStrLength(s)))
31#define PStrToTotSize(s) (SizeOfListMyChar(PStrLength(s) + 1))
32 /* + 1 for length byte */
33
34#define PStrClear(s) PStrLength(s) = 0
35
36GLOBALPROC PStrCopy(ps3p r, ps3p s)
37{
38 MyMoveBytes((MyPtr)s, (MyPtr)r, PStrToTotSize(s));
39}
40
41GLOBALPROC PStrApndChar(ps3p s, MyCharR x)
42{
43 si4r n = s[0] + 1;
44
45 if (n <= PStrMaxLength) {
46 s[0] = (MyCharR)n;
47 s[n] = x;
48 }
49}
50
51GLOBALPROC PStrPrependChar(ps3p s, MyCharR x)
52{
53 ps3p p = s;
54 si4r n0 = *p++;
55 si4r n = n0 + 1;
56
57 if (n <= PStrMaxLength) {
58 MyMoveBytes((MyPtr)p, (MyPtr)(p + 1), SizeOfListMyChar(n0));
59 s[1] = x;
60 s[0] = (MyCharR)n;
61 }
62}
63
64GLOBALPROC PStrAppend(ps3p r, ps3p s)
65{
66 ps3p p = s;
67 ps3p q = r;
68 si4r m = *p++;
69 si4r n = *q++;
70
71 if (n + m > PStrMaxLength) {
72 m = PStrMaxLength - n;
73 }
74
75 *r = (MyCharR)(n + m);
76 MyMoveBytes((MyPtr)p, (MyPtr)(q + n), m);
77}
78
79GLOBALFUNC uimr CStrLength(char *s)
80{
81 char *p = s;
82
83 while (0 != *p++) {
84 }
85 return p - s - 1;
86}
87
88GLOBALPROC PStrFromCStr(ps3p r, /* CONST */ char *s)
89{
90 uimr L;
91
92 L = CStrLength(s);
93 if (L > PStrMaxLength) {
94 L = PStrMaxLength;
95 }
96 *r++ = (MyCharR)L;
97 MyMoveBytes((MyPtr)s, (MyPtr)r, L);
98}
99
100GLOBALPROC PStrFromChar(ps3p r, char x)
101{
102 r[0] = 1;
103 r[1] = x;
104}
105
106GLOBALPROC PStrFromPtr(MyPtr p, uimr L, ps3p s)
107{
108 uimr tL;
109
110 if (L <= PStrMaxLength) {
111 tL = L;
112 } else {
113 tL = PStrMaxLength;
114 }
115 s[0] = (MyCharR)tL;
116 MyMoveBytes(p, PStrToPtr(s), SizeOfListMyChar(tL));
117}
118
119GLOBALPROC PStrApndCStr(ps3p r, /* CONST */ char *s)
120{
121 MyPStr t;
122
123 PStrFromCStr(t, s);
124 PStrAppend(r, t);
125}
126
127GLOBALFUNC blnr PStrEq(ps3p s1, ps3p s2)
128{
129 register si4r i;
130 MyCharPtr p1 = s1;
131 MyCharPtr p2 = s2;
132 MyCharR n = *p1++;
133 MyCharR m = *p2++;
134
135 if (n != m) {
136 return falseblnr;
137 } else {
138 for (i = n; --i >= 0; ) {
139 if (*p1++ != *p2++) {
140 return falseblnr;
141 }
142 }
143 return trueblnr;
144 }
145}
146
147GLOBALFUNC blnr CStrEq(char *s1, char *s2)
148{
149 MyCharR c1;
150
151 while ((c1 = *s1++) == *s2++) {
152 if (0 == c1) {
153 return trueblnr;
154 }
155 }
156 return falseblnr;
157}
158
159GLOBALPROC CStrFromPtr(MyPtr p, uimr L, char *s)
160{
161 MyMoveBytes(p, (MyPtr)s, SizeOfListMyChar(L));
162 s[L] = (MyCharR)0;
163}
164
165GLOBALPROC CStrFromPStr(ps3p x, char *s)
166{
167 CStrFromPtr(PStrToMyCharPtr(x), PStrLength(x), s);
168}
169
170GLOBALPROC CStrCopy(char *r, char *s)
171{
172 while (0 != (*r++ = *s++)) {
173 }
174}
175
176LOCALPROC ReversePStr(ps3p s)
177{
178 MyCharR c;
179 MyCharR *p1 = PStrToMyCharPtr(s);
180 MyCharR *p2 = p1 + PStrLength(s) - 1;
181
182 while (p1 < p2) {
183 c = *p1;
184 *p1 = *p2;
185 *p2 = c;
186 ++p1;
187 --p2;
188 }
189}
190
191LOCALPROC PStrFromUimr(uimr v, ps3p s)
192{
193 MyCharR *p = PStrToMyCharPtr(s);
194 uimr newv;
195
196 do {
197 newv = v / (uimr)10;
198 *p++ = '0' + (v - newv * 10);
199 v = newv;
200 } while (v != 0);
201 s[0] = p - PStrToMyCharPtr(s);
202
203 ReversePStr(s);
204}
205
206LOCALFUNC uimr MyCharPtrToUimr(MyCharPtr p, MyCharR n)
207{
208 register si4r i;
209 uimr v = 0;
210
211 for (i = n; --i >= 0; ) {
212 v = (v * 10) + (*p++ - '0');
213 }
214
215 return v;
216}
217
218LOCALFUNC uimr PStrToUimr(ps3p s)
219{
220 MyCharPtr p = s;
221 MyCharR n = *p++;
222
223 return MyCharPtrToUimr(p, n);
224}
225
226LOCALFUNC simr PStrToSimr(ps3p s)
227{
228 simr v;
229 MyCharPtr p = s;
230 MyCharR n = *p++;
231
232 if (0 == n) {
233 v = 0;
234 } else if ('-' == p[0]) {
235 v = - MyCharPtrToUimr(++p, --n);
236 } else {
237 v = MyCharPtrToUimr(p, n);
238 }
239
240 return v;
241}
242
243LOCALPROC PStrFromSimr(simr v, ps3p s)
244{
245 if (v < 0) {
246 PStrFromUimr(- v, s);
247 PStrPrependChar(s, '-');
248 } else {
249 PStrFromUimr(v, s);
250 }
251}
252
253LOCALPROC PStrFromNUimr(uimr v, ui3r n, ps3p s)
254{
255 uimr i;
256 uimr newv;
257 MyCharR *p = PStrToMyCharPtr(s);
258
259 s[0] = n;
260 for (i = n + 1; 0 != --i; ) {
261 newv = v / (uimr)10;
262 *p++ = '0' + (v - newv * 10);
263 v = newv;
264 }
265
266 ReversePStr(s);
267}
268
269GLOBALPROC PStrApndNUimr(ps3p r, uimr v, ui3r n)
270{
271 MyPStr t;
272
273 PStrFromNUimr(v, n, t);
274 PStrAppend(r, t);
275}
276
277#define Have_STRUTILS 1