1 /* 2 * Copyright (c) 1983 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #ifndef lint 19 static char sccsid[] = "@(#)string.c 3.11 (Berkeley) 06/29/88"; 20 #endif /* not lint */ 21 22 #include "string.h" 23 24 char *malloc(); 25 26 char * 27 str_cpy(s) 28 register char *s; 29 { 30 char *str; 31 register char *p; 32 33 str = p = str_alloc(strlen(s) + 1); 34 if (p == 0) 35 return 0; 36 while (*p++ = *s++) 37 ; 38 return str; 39 } 40 41 char * 42 str_ncpy(s, n) 43 register char *s; 44 register n; 45 { 46 int l = strlen(s); 47 char *str; 48 register char *p; 49 50 if (n > l) 51 n = l; 52 str = p = str_alloc(n + 1); 53 if (p == 0) 54 return 0; 55 while (--n >= 0) 56 *p++ = *s++; 57 *p = 0; 58 return str; 59 } 60 61 char * 62 str_itoa(i) 63 int i; 64 { 65 char buf[30]; 66 67 (void) sprintf(buf, "%d", i); 68 return str_cpy(buf); 69 } 70 71 char * 72 str_cat(s1, s2) 73 char *s1, *s2; 74 { 75 char *str; 76 register char *p, *q; 77 78 str = p = str_alloc(strlen(s1) + strlen(s2) + 1); 79 if (p == 0) 80 return 0; 81 for (q = s1; *p++ = *q++;) 82 ; 83 for (q = s2, p--; *p++ = *q++;) 84 ; 85 return str; 86 } 87 88 /* 89 * match s against p. 90 * s can be a prefix of p with at least min characters. 91 */ 92 str_match(s, p, min) 93 register char *s, *p; 94 register min; 95 { 96 for (; *s && *p && *s == *p; s++, p++, min--) 97 ; 98 return *s == *p || *s == 0 && min <= 0; 99 } 100 101 #ifdef STR_DEBUG 102 char * 103 str_alloc(l) 104 int l; 105 { 106 register struct string *s; 107 108 s = (struct string *) malloc((unsigned)l + str_offset); 109 if (s == 0) 110 return 0; 111 if (str_head.s_forw == 0) 112 str_head.s_forw = str_head.s_back = &str_head; 113 s->s_forw = str_head.s_forw; 114 s->s_back = &str_head; 115 str_head.s_forw = s; 116 s->s_forw->s_back = s; 117 return s->s_data; 118 } 119 120 str_free(str) 121 char *str; 122 { 123 register struct string *s; 124 125 for (s = str_head.s_forw; s != &str_head && s->s_data != str; 126 s = s->s_forw) 127 ; 128 if (s == &str_head) 129 abort(); 130 s->s_back->s_forw = s->s_forw; 131 s->s_forw->s_back = s->s_back; 132 free((char *)s); 133 } 134 #endif 135