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