+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));
+}
+