this repo has no description
at main 277 lines 4.5 kB view raw
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