1 /* 2 * Copyright (c) 1983, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Edward Wang at The University of California, Berkeley. 7 * 8 * %sccs.include.redist.c% 9 */ 10 11 #ifndef lint 12 static char sccsid[] = "@(#)string.c 8.1 (Berkeley) 06/06/93"; 13 #endif /* not lint */ 14 15 #include "string.h" 16 17 char *malloc(); 18 19 char * 20 str_cpy(s) 21 register char *s; 22 { 23 char *str; 24 register char *p; 25 26 str = p = str_alloc(strlen(s) + 1); 27 if (p == 0) 28 return 0; 29 while (*p++ = *s++) 30 ; 31 return str; 32 } 33 34 char * 35 str_ncpy(s, n) 36 register char *s; 37 register n; 38 { 39 int l = strlen(s); 40 char *str; 41 register char *p; 42 43 if (n > l) 44 n = l; 45 str = p = str_alloc(n + 1); 46 if (p == 0) 47 return 0; 48 while (--n >= 0) 49 *p++ = *s++; 50 *p = 0; 51 return str; 52 } 53 54 char * 55 str_itoa(i) 56 int i; 57 { 58 char buf[30]; 59 60 (void) sprintf(buf, "%d", i); 61 return str_cpy(buf); 62 } 63 64 char * 65 str_cat(s1, s2) 66 char *s1, *s2; 67 { 68 char *str; 69 register char *p, *q; 70 71 str = p = str_alloc(strlen(s1) + strlen(s2) + 1); 72 if (p == 0) 73 return 0; 74 for (q = s1; *p++ = *q++;) 75 ; 76 for (q = s2, p--; *p++ = *q++;) 77 ; 78 return str; 79 } 80 81 /* 82 * match s against p. 83 * s can be a prefix of p with at least min characters. 84 */ 85 str_match(s, p, min) 86 register char *s, *p; 87 register min; 88 { 89 for (; *s && *p && *s == *p; s++, p++, min--) 90 ; 91 return *s == *p || *s == 0 && min <= 0; 92 } 93 94 #ifdef STR_DEBUG 95 char * 96 str_alloc(l) 97 int l; 98 { 99 register struct string *s; 100 101 s = (struct string *) malloc((unsigned)l + str_offset); 102 if (s == 0) 103 return 0; 104 if (str_head.s_forw == 0) 105 str_head.s_forw = str_head.s_back = &str_head; 106 s->s_forw = str_head.s_forw; 107 s->s_back = &str_head; 108 str_head.s_forw = s; 109 s->s_forw->s_back = s; 110 return s->s_data; 111 } 112 113 str_free(str) 114 char *str; 115 { 116 register struct string *s; 117 118 for (s = str_head.s_forw; s != &str_head && s->s_data != str; 119 s = s->s_forw) 120 ; 121 if (s == &str_head) 122 abort(); 123 s->s_back->s_forw = s->s_forw; 124 s->s_forw->s_back = s->s_back; 125 free((char *)s); 126 } 127 #endif 128