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