1 /*- 2 * Copyright (c) 1991 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8 #ifndef lint 9 static char sccsid[] = "@(#)str.c 5.6 (Berkeley) 07/02/91"; 10 #endif /* not lint */ 11 12 /* 13 * tc.str.c: Short string package 14 * This has been a lesson of how to write buggy code! 15 */ 16 #ifdef SHORT_STRINGS 17 18 #if __STDC__ 19 # include <stdarg.h> 20 #else 21 # include <varargs.h> 22 #endif 23 24 #include "csh.h" 25 #include "extern.h" 26 27 Char ** 28 blk2short(src) 29 register char **src; 30 { 31 size_t n; 32 register Char **sdst, **dst; 33 34 /* 35 * Count 36 */ 37 for (n = 0; src[n] != NULL; n++); 38 sdst = dst = (Char **) xmalloc((size_t) ((n + 1) * sizeof(Char *))); 39 40 for (; *src != NULL; src++) 41 *dst++ = SAVE(*src); 42 *dst = NULL; 43 return (sdst); 44 } 45 46 char ** 47 short2blk(src) 48 register Char **src; 49 { 50 size_t n; 51 register char **sdst, **dst; 52 53 /* 54 * Count 55 */ 56 for (n = 0; src[n] != NULL; n++); 57 sdst = dst = (char **) xmalloc((size_t) ((n + 1) * sizeof(char *))); 58 59 for (; *src != NULL; src++) 60 *dst++ = strsave(short2str(*src)); 61 *dst = NULL; 62 return (sdst); 63 } 64 65 #define MALLOC_INCR 1024 66 Char * 67 str2short(src) 68 register char *src; 69 { 70 static Char *sdst; 71 static size_t dstsize = 0; 72 register Char *dst, *edst; 73 74 if (src == NULL) 75 return (NULL); 76 77 if (sdst == (NULL)) { 78 dstsize = MALLOC_INCR; 79 sdst = (Char *) xmalloc((size_t) dstsize * sizeof(Char)); 80 } 81 82 dst = sdst; 83 edst = &dst[dstsize]; 84 while (*src) { 85 *dst++ = (Char) ((unsigned char) *src++); 86 if (dst == edst) { 87 dstsize += MALLOC_INCR; 88 sdst = (Char *) xrealloc((ptr_t) sdst, 89 (size_t) dstsize * sizeof(Char)); 90 edst = &sdst[dstsize]; 91 dst = &edst[-MALLOC_INCR]; 92 } 93 } 94 *dst = 0; 95 return (sdst); 96 } 97 98 char * 99 short2qstr(src) 100 register Char *src; 101 { 102 static char *sdst = NULL; 103 static size_t dstsize = 0; 104 register char *dst, *edst; 105 106 if (src == NULL) 107 return (NULL); 108 109 if (sdst == NULL) { 110 dstsize = MALLOC_INCR; 111 sdst = (char *) xmalloc((size_t) dstsize * sizeof(char)); 112 } 113 dst = sdst; 114 edst = &dst[dstsize]; 115 while (*src) { 116 if (*src & QUOTE) { 117 *dst++ = '\\'; 118 if (dst == edst) { 119 dstsize += MALLOC_INCR; 120 sdst = (char *) xrealloc((ptr_t) sdst, 121 (size_t) dstsize * sizeof(char)); 122 edst = &sdst[dstsize]; 123 dst = &edst[-MALLOC_INCR]; 124 } 125 } 126 *dst++ = (char) *src++; 127 if (dst == edst) { 128 dstsize += MALLOC_INCR; 129 sdst = (char *) xrealloc((ptr_t) sdst, 130 (size_t) dstsize * sizeof(char)); 131 edst = &sdst[dstsize]; 132 dst = &edst[-MALLOC_INCR]; 133 } 134 } 135 *dst = 0; 136 return (sdst); 137 } 138 char * 139 short2str(src) 140 register Char *src; 141 { 142 static char *sdst = NULL; 143 static size_t dstsize = 0; 144 register char *dst, *edst; 145 146 if (src == NULL) 147 return (NULL); 148 149 if (sdst == NULL) { 150 dstsize = MALLOC_INCR; 151 sdst = (char *) xmalloc((size_t) dstsize * sizeof(char)); 152 } 153 dst = sdst; 154 edst = &dst[dstsize]; 155 while (*src) { 156 *dst++ = (char) *src++; 157 if (dst == edst) { 158 dstsize += MALLOC_INCR; 159 sdst = (char *) xrealloc((ptr_t) sdst, 160 (size_t) dstsize * sizeof(char)); 161 edst = &sdst[dstsize]; 162 dst = &edst[-MALLOC_INCR]; 163 } 164 } 165 *dst = 0; 166 return (sdst); 167 } 168 169 Char * 170 s_strcpy(dst, src) 171 register Char *dst, *src; 172 { 173 register Char *sdst; 174 175 sdst = dst; 176 while (*dst++ = *src++); 177 return (sdst); 178 } 179 180 Char * 181 s_strncpy(dst, src, n) 182 register Char *dst, *src; 183 register size_t n; 184 { 185 register Char *sdst; 186 187 if (n == 0) 188 return(dst); 189 190 sdst = dst; 191 do 192 if ((*dst++ = *src++) == '\0') { 193 while (--n != 0) 194 *dst++ = '\0'; 195 return(sdst); 196 } 197 while (--n != 0); 198 return (sdst); 199 } 200 201 Char * 202 s_strcat(dst, src) 203 register Char *dst, *src; 204 { 205 register short *sdst; 206 207 sdst = dst; 208 while (*dst++); 209 --dst; 210 while (*dst++ = *src++); 211 return (sdst); 212 } 213 214 #ifdef NOTUSED 215 Char * 216 s_strncat(dst, src, n) 217 register Char *dst, *src; 218 register size_t n; 219 { 220 register Char *sdst; 221 222 if (n == 0) 223 return (dst); 224 225 sdst = dst; 226 227 while (*dst++); 228 --dst; 229 230 do 231 if ((*dst++ = *src++) == '\0') 232 return(sdst); 233 while (--n != 0); 234 235 *dst = '\0'; 236 return (sdst); 237 } 238 239 #endif 240 241 Char * 242 s_strchr(str, ch) 243 register Char *str; 244 int ch; 245 { 246 do 247 if (*str == ch) 248 return (str); 249 while (*str++); 250 return (NULL); 251 } 252 253 Char * 254 s_strrchr(str, ch) 255 register Char *str; 256 int ch; 257 { 258 register Char *rstr; 259 260 rstr = NULL; 261 do 262 if (*str == ch) 263 rstr = str; 264 while (*str++); 265 return (rstr); 266 } 267 268 size_t 269 s_strlen(str) 270 register Char *str; 271 { 272 register size_t n; 273 274 for (n = 0; *str++; n++); 275 return (n); 276 } 277 278 int 279 s_strcmp(str1, str2) 280 register Char *str1, *str2; 281 { 282 for (; *str1 && *str1 == *str2; str1++, str2++); 283 /* 284 * The following case analysis is necessary so that characters which look 285 * negative collate low against normal characters but high against the 286 * end-of-string NUL. 287 */ 288 if (*str1 == '\0' && *str2 == '\0') 289 return (0); 290 else if (*str1 == '\0') 291 return (-1); 292 else if (*str2 == '\0') 293 return (1); 294 else 295 return (*str1 - *str2); 296 } 297 298 int 299 s_strncmp(str1, str2, n) 300 register Char *str1, *str2; 301 register size_t n; 302 { 303 if (n == 0) 304 return (0); 305 do { 306 if (*str1 != *str2) { 307 /* 308 * The following case analysis is necessary so that characters 309 * which look negative collate low against normal characters 310 * but high against the end-of-string NUL. 311 */ 312 if (*str1 == '\0') 313 return (-1); 314 else if (*str2 == '\0') 315 return (1); 316 else 317 return (*str1 - *str2); 318 break; 319 } 320 if (*str1 == '\0') 321 return(0); 322 str1++, str2++; 323 } while (--n != 0); 324 return(0); 325 } 326 327 Char * 328 s_strsave(s) 329 register Char *s; 330 { 331 Char *n; 332 register Char *p; 333 334 if (s == 0) 335 s = STRNULL; 336 for (p = s; *p++;); 337 n = p = (Char *) xmalloc((size_t) ((p - s) * sizeof(Char))); 338 while (*p++ = *s++); 339 return (n); 340 } 341 342 Char * 343 s_strspl(cp, dp) 344 Char *cp, *dp; 345 { 346 Char *ep; 347 register Char *p, *q; 348 349 if (!cp) 350 cp = STRNULL; 351 if (!dp) 352 dp = STRNULL; 353 for (p = cp; *p++;); 354 for (q = dp; *q++;); 355 ep = (Char *) xmalloc((size_t) 356 (((p - cp) + (q - dp) - 1) * sizeof(Char))); 357 for (p = ep, q = cp; *p++ = *q++;); 358 for (p--, q = dp; *p++ = *q++;); 359 return (ep); 360 } 361 362 Char * 363 s_strend(cp) 364 register Char *cp; 365 { 366 if (!cp) 367 return (cp); 368 while (*cp) 369 cp++; 370 return (cp); 371 } 372 373 #ifdef NOTUSED 374 Char * 375 s_strstr(s, t) 376 register Char *s, *t; 377 { 378 do { 379 register Char *ss = s; 380 register Char *tt = t; 381 382 do 383 if (*tt == '\0') 384 return (s); 385 while (*ss++ == *tt++); 386 } while (*s++ != '\0'); 387 return (NULL); 388 } 389 #endif 390 391 #endif /* SHORT_STRINGS */ 392