workarounds, I do not understand why it segfault, it should *NOT*
[apps/madmutt.git] / lib-lib / str.c
index 6537746..ab603da 100644 (file)
  *  Copyright © 2006 Pierre Habouzit
  */
 
+/** \addtogroup mutt_strings */
+/*@{*/
+
+/** \file str.c
+ * \brief Madmutt string API module implementation.
+ * \author Pierre Habouzit <madcoder@debian.org>
+ */
+
 #include "lib-lib.h"
 
+#ifndef _DOXYGEN_SKIP_ME
 #define XX 255
 unsigned char const __m_strdigits[128] = {
     XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX, XX,
@@ -66,13 +75,25 @@ char const __m_b36chars_upper[36] = {
     'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
     'U', 'V', 'W', 'X', 'Y', 'Z'
 };
+#endif
 
-
+/** \brief safe strcpy.
+ *
+ * Copies at most <tt>n-1</tt> characters from \c src into \c dst, always
+ * adding a final \c '\\0' in \c dst.
+ *
+ * \param[in]  dst      destination buffer.
+ * \param[in]  n        size of the buffer. Negative sizes are allowed.
+ * \param[in]  src      source string.
+ *
+ * \return \c src \e length. If this value is \>= \c n then the copy was
+ *         truncated.
+ */
 ssize_t m_strcpy(char *dst, ssize_t n, const char *src)
 {
     ssize_t len = m_strlen(src);
 
-    if (dst && n > 0) {
+    if (n > 0) {
         ssize_t dlen = MIN(n - 1, len);
         memcpy(dst, src, dlen);
         dst[dlen] = '\0';
@@ -85,7 +106,7 @@ ssize_t m_strncpy(char *dst, ssize_t n, const char *src, ssize_t l)
 {
     ssize_t len = MIN(m_strlen(src), l);
 
-    if (dst && n > 0) {
+    if (n > 0) {
         ssize_t dlen = MIN(n - 1, len);
         memcpy(dst, src, dlen);
         dst[dlen] = '\0';
@@ -96,16 +117,12 @@ ssize_t m_strncpy(char *dst, ssize_t n, const char *src, ssize_t l)
 
 char *m_strrtrim(char *s)
 {
-    if (s) {
-        char *p = s + m_strlen(s);
+    ssize_t len = m_strlen(s);
 
-        while (p > s && ISSPACE(p[-1])) {
-            *--p = '\0';
-        }
-        return p;
-    }
+    while (len > 1 && ISSPACE(s[len - 1]))
+        s[--len] = '\0';
 
-    return NULL;
+    return s + len;
 }
 
 const char *m_stristrn(const char *haystack, const char *needle, ssize_t nlen)
@@ -179,29 +196,4 @@ int ascii_strncasecmp (const char *a, const char *b, ssize_t n)
     return 0;
 }
 
-ssize_t m_snsubst(char *dst, ssize_t n, const char *fmt, const char *src)
-{
-    ssize_t pos = 0;
-    const char *p;
-
-    p = strchr(fmt, '%');
-    if (!p)
-        return snprintf(dst, n, "%s %s", fmt, src);
-
-    for (;;) {
-        if (p[1] == 's') {
-            pos += m_strncpy(dst + pos, n - pos, fmt, p - fmt);
-            pos += m_strcpy(dst + pos, n - pos, src);
-            fmt = p + 2;
-        } else {
-            pos += m_strncpy(dst + pos, n - pos, fmt, p + 1 - fmt);
-            fmt = p + 1;
-            if (p[1] == '%')
-                p++;
-        }
-
-        p = strchr(fmt, '%');
-        if (!p)
-            return pos + m_strcpy(dst + pos, n - pos, fmt);
-    }
-}
+/*@}*/