f90e8617746f6af9cdd7f2d4e3984a0606d7f883
[apps/madmutt.git] / lib / str.c
1 /*
2  * Copyright notice from original mutt:
3  * Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
4  * Copyright (C) 1999-2000 Thomas Roessler <roessler@does-not-exist.org>
5  *
6  * This file is part of mutt-ng, see http://www.muttng.org/.
7  * It's licensed under the GNU General Public License,
8  * please see the file GPL in the top level source directory.
9  */
10
11 #include <stdlib.h>
12 #include <string.h>
13 #include <ctype.h>
14
15 #include <lib-lib/mem.h>
16 #include <lib-lib/str.h>
17
18 #include "str.h"
19
20 char *str_cat (char *d, size_t l, const char *s)
21 {
22   char *p = d;
23
24   if (!l)
25     return d;
26
27   l--;                          /* Space for the trailing '\0'. */
28
29   for (; *d && l; l--)
30     d++;
31   for (; *s && l; l--)
32     *d++ = *s++;
33
34   *d = '\0';
35
36   return p;
37 }
38
39 char *str_ncat (char *d, size_t l, const char *s, size_t sl)
40 {
41   char *p = d;
42
43   if (!l)
44     return d;
45
46   l--;                          /* Space for the trailing '\0'. */
47
48   for (; *d && l; l--)
49     d++;
50   for (; *s && l && sl; l--, sl--)
51     *d++ = *s++;
52
53   *d = '\0';
54
55   return p;
56 }
57
58 int str_casecmp (const char *a, const char *b)
59 {
60   return strcasecmp (NONULL (a), NONULL (b));
61 }
62
63 int str_ncmp (const char *a, const char *b, size_t l)
64 {
65   return strncmp (NONULL (a), NONULL (b), l);
66 }
67
68 int str_ncasecmp (const char *a, const char *b, size_t l)
69 {
70   return strncasecmp (NONULL (a), NONULL (b), l);
71 }
72
73 int str_coll (const char *a, const char *b)
74 {
75   return strcoll (NONULL (a), NONULL (b));
76 }
77
78 void str_replace (char **p, const char *s)
79 {
80   p_delete(p);
81   *p = m_strdup(s);
82 }
83
84 void str_adjust (char **p)
85 {
86   if (!p || !*p)
87     return;
88   p_realloc(p, m_strlen(*p) + 1);
89 }
90
91 /* convert all characters in the string to lowercase */
92 char *str_tolower (char *s)
93 {
94   char *p = s;
95
96   while (*p) {
97     *p = tolower ((unsigned char) *p);
98     p++;
99   }
100
101   return (s);
102 }
103
104 /* NULL-pointer aware string comparison functions */
105
106 char *str_substrcpy (char *dest, const char *beg, const char *end,
107                       size_t destlen)
108 {
109   size_t len;
110
111   len = end - beg;
112   if (len > destlen - 1)
113     len = destlen - 1;
114   memcpy (dest, beg, len);
115   dest[len] = 0;
116   return dest;
117 }
118
119 char *str_substrdup(const char *begin, const char *end)
120 {
121     return p_dupstr(begin, (end ? end - begin : strlen(begin)));
122 }
123
124 const char *str_isstr (const char *haystack, const char *needle)
125 {
126   const char *p, *q;
127
128   if (!haystack)
129     return NULL;
130   if (!needle)
131     return (haystack);
132
133   while (*(p = haystack)) {
134     for (q = needle;
135          *p && *q &&
136          tolower ((unsigned char) *p) == tolower ((unsigned char) *q);
137          p++, q++);
138     if (!*q)
139       return (haystack);
140     haystack++;
141   }
142   return NULL;
143 }
144
145 int str_eq (const char* s1, const char* s2) {
146   int l = m_strlen(s1);
147
148   if (l != m_strlen(s2))
149     return (0);
150   return (str_ncmp (s1, s2, l) == 0);
151 }
152
153 char* str_skip_initws (char* s) {
154   SKIPWS (s);
155   return (s);
156 }
157
158 void str_skip_trailws (char *s) {
159   char *p;
160
161   for (p = s + m_strlen(s) - 1; p >= s && ISSPACE (*p); p--)
162     *p = 0;
163 }