016376e733bfe96b72cde7428eeb6a24f51c5800
[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 int str_casecmp (const char *a, const char *b)
21 {
22   return strcasecmp (NONULL (a), NONULL (b));
23 }
24
25 int str_ncmp (const char *a, const char *b, size_t l)
26 {
27   return strncmp (NONULL (a), NONULL (b), l);
28 }
29
30 int str_ncasecmp (const char *a, const char *b, size_t l)
31 {
32   return strncasecmp (NONULL (a), NONULL (b), l);
33 }
34
35 int str_coll (const char *a, const char *b)
36 {
37   return strcoll (NONULL (a), NONULL (b));
38 }
39
40 void str_replace (char **p, const char *s)
41 {
42   p_delete(p);
43   *p = m_strdup(s);
44 }
45
46 void str_adjust (char **p)
47 {
48   if (!p || !*p)
49     return;
50   p_realloc(p, m_strlen(*p) + 1);
51 }
52
53 /* convert all characters in the string to lowercase */
54 char *str_tolower (char *s)
55 {
56   char *p = s;
57
58   while (*p) {
59     *p = tolower ((unsigned char) *p);
60     p++;
61   }
62
63   return (s);
64 }
65
66 /* NULL-pointer aware string comparison functions */
67
68 char *str_substrcpy (char *dest, const char *beg, const char *end,
69                       size_t destlen)
70 {
71   size_t len;
72
73   len = end - beg;
74   if (len > destlen - 1)
75     len = destlen - 1;
76   memcpy (dest, beg, len);
77   dest[len] = 0;
78   return dest;
79 }
80
81 char *str_substrdup(const char *begin, const char *end)
82 {
83     return p_dupstr(begin, (end ? end - begin : strlen(begin)));
84 }
85
86 const char *str_isstr (const char *haystack, const char *needle)
87 {
88   const char *p, *q;
89
90   if (!haystack)
91     return NULL;
92   if (!needle)
93     return (haystack);
94
95   while (*(p = haystack)) {
96     for (q = needle;
97          *p && *q &&
98          tolower ((unsigned char) *p) == tolower ((unsigned char) *q);
99          p++, q++);
100     if (!*q)
101       return (haystack);
102     haystack++;
103   }
104   return NULL;
105 }
106
107 int str_eq (const char* s1, const char* s2) {
108   int l = m_strlen(s1);
109
110   if (l != m_strlen(s2))
111     return (0);
112   return (str_ncmp (s1, s2, l) == 0);
113 }
114
115 char* str_skip_initws (char* s) {
116   SKIPWS (s);
117   return (s);
118 }
119
120 void str_skip_trailws (char *s) {
121   char *p;
122
123   for (p = s + m_strlen(s) - 1; p >= s && ISSPACE (*p); p--)
124     *p = 0;
125 }