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>
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.
19 char *safe_strdup (const char *s)
26 l = safe_strlen (s) + 1;
27 p = (char *) safe_malloc (l);
32 char *safe_strcat (char *d, size_t l, const char *s)
39 l--; /* Space for the trailing '\0'. */
51 char *safe_strncat (char *d, size_t l, const char *s, size_t sl)
58 l--; /* Space for the trailing '\0'. */
62 for (; *s && l && sl; l--, sl--)
70 int safe_strcmp (const char *a, const char *b)
72 return strcmp (NONULL (a), NONULL (b));
75 int safe_strcasecmp (const char *a, const char *b)
77 return strcasecmp (NONULL (a), NONULL (b));
80 int safe_strncmp (const char *a, const char *b, size_t l)
82 return strncmp (NONULL (a), NONULL (b), l);
85 int safe_strncasecmp (const char *a, const char *b, size_t l)
87 return strncasecmp (NONULL (a), NONULL (b), l);
90 size_t safe_strlen (const char *a)
92 return a ? strlen (a) : 0;
95 int safe_strcoll (const char *a, const char *b)
97 return strcoll (NONULL (a), NONULL (b));
100 void str_replace (char **p, const char *s)
103 *p = safe_strdup (s);
106 void str_adjust (char **p)
110 safe_realloc (p, safe_strlen (*p) + 1);
113 /* convert all characters in the string to lowercase */
114 char *str_tolower (char *s)
119 *p = tolower ((unsigned char) *p);
126 /* NULL-pointer aware string comparison functions */
128 char *str_substrcpy (char *dest, const char *beg, const char *end,
134 if (len > destlen - 1)
136 memcpy (dest, beg, len);
141 char *str_substrdup (const char *begin, const char *end)
149 len = safe_strlen (begin);
151 p = safe_malloc (len + 1);
152 memcpy (p, begin, len);
157 const char *str_isstr (const char *haystack, const char *needle)
166 while (*(p = haystack)) {
169 tolower ((unsigned char) *p) == tolower ((unsigned char) *q);
178 int str_eq (const char* s1, const char* s2) {
179 int l = safe_strlen (s1);
181 if (l != safe_strlen (s2))
183 return (safe_strncmp (s1, s2, l) == 0);
186 char* str_skip_initws (char* s) {
191 void str_skip_trailws (char *s) {
194 for (p = s + safe_strlen (s) - 1; p >= s && ISSPACE (*p); p--)