X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-lib%2Fstr.h;h=4786d2766852c05ab2e4478d4b9e8ecc914efb67;hp=d9b1f9e68728d87e938c7a27e79f299c403c214f;hb=d23094706c228c63c7c7ab8f337fb5dd886c4109;hpb=ecaab35b973fbceb58b5ed174971c82762cc0199 diff --git a/lib-lib/str.h b/lib-lib/str.h index d9b1f9e..4786d27 100644 --- a/lib-lib/str.h +++ b/lib-lib/str.h @@ -1,17 +1,18 @@ /* - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. * * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. * * Copyright © 2006 Pierre Habouzit */ @@ -20,16 +21,148 @@ #define MUTT_LIB_LIB_STR_H #include -#include "../lib/str.h" +#include #include "mem.h" +#define HUGE_STRING 5120 +#define LONG_STRING 1024 +#define STRING 256 +#define SHORT_STRING 128 + +#define NONULL(x) (x?x:"") +#define ISSPACE(c) isspace((unsigned char)c) + +extern unsigned char const __m_strdigits[128]; +extern signed char const __m_b64digits[128]; +extern char const __m_b64chars[64]; + +extern char const __m_b36chars_lower[36]; +extern char const __m_b36chars_upper[36]; + +/****************************************************************************/ +/* conversions */ +/****************************************************************************/ + +static inline int hexval(int c) { + return !(c & ~127) && __m_strdigits[c] < 16 ? __m_strdigits[c] : -1; +} + +static inline int base64val(int c) { + return (c & ~127) ? -1 : __m_b64digits[c]; +} + +static inline void m_strtolower(char *p) { + for (; *p; p++) + *p = tolower((unsigned char)*p); +} + +/****************************************************************************/ +/* length related */ +/****************************************************************************/ + +static inline int m_strisempty(const char *s) { + return !s || !*s; +} + static inline ssize_t m_strlen(const char *s) { return s ? strlen(s) : 0; } -static inline char* m_strdup(const char *s) { - return p_dupstr(s, m_strlen(s)); +static inline ssize_t m_strnlen(const char *s, ssize_t n) { + const char *p = memchr(s, '\0', n); + return p ? p - s : n; +} + +/****************************************************************************/ +/* comparisons */ +/****************************************************************************/ + +static inline int m_strcmp(const char *a, const char *b) { + return strcmp(NONULL(a), NONULL(b)); +} + +static inline int m_strcasecmp(const char *a, const char *b) { + return strcasecmp(NONULL(a), NONULL(b)); +} + +static inline int m_strncmp(const char *a, const char *b, ssize_t n) { + return strncmp (NONULL(a), NONULL(b), n); +} + +static inline int m_strncasecmp(const char *a, const char *b, ssize_t n) { + return strncasecmp(NONULL(a), NONULL(b), n); +} + +/****************************************************************************/ +/* making copies */ +/****************************************************************************/ + +static inline char *m_strdup(const char *s) { + ssize_t len = m_strlen(s); + return len ? p_dup(s, len + 1) : NULL; +} + +static inline char *m_substrdup(const char *s, const char *end) { + return p_dupstr(s, end ? end - s : m_strlen(s)); +} + +static inline char *m_strreplace(char **p, const char *s) { + p_delete(p); + return (*p = m_strdup(s)); +} + +ssize_t m_strcpy(char *dst, ssize_t n, const char *src); +ssize_t m_strncpy(char *dst, ssize_t n, const char *src, ssize_t l); + +static inline ssize_t m_strcat(char *dst, ssize_t n, const char *src) { + ssize_t dlen = m_strnlen(dst, n - 1); + return dlen + m_strcpy(dst + dlen, n - dlen, src); +} + +static inline ssize_t +m_strncat(char *dst, ssize_t n, const char *src, ssize_t l) { + ssize_t dlen = m_strnlen(dst, n - 1); + return dlen + m_strncpy(dst + dlen, n - dlen, src, l); +} + +/****************************************************************************/ +/* parsing related */ +/****************************************************************************/ + +static inline const char *m_strchrnul(const char *s, int c) { + while (*s && *s != c) + s++; + return s; +} + +static inline const char *m_strnextsp(const char *s) { + while (*s && !isspace((unsigned char)*s)) + s++; + return s; +} + +static inline const char *skipspaces(const char *s) { + while (*s && isspace((unsigned char)*s)) + s++; + return s; +} +static inline char *vskipspaces(const char *s) { + return (char *)skipspaces(s); +} + +char *m_strrtrim(char *s); + +/****************************************************************************/ +/* search */ +/****************************************************************************/ + +const char * +m_stristrn(const char *haystack, const char *needle, ssize_t nlen); + +static inline const char * +m_stristr(const char *haystack, const char *needle) { + return m_stristrn(haystack, needle, m_strlen(needle)); } #endif /* MUTT_LIB_LIB_STR_H */