string: Clean up for_each_line() and related functions.
[paraslash.git] / string.c
index c001b15d7dc8eca43d50af650a3dadf1693ed7ab..68e1f8a2d31735dae1e663bf833d2937e6466f4c 100644 (file)
--- a/string.c
+++ b/string.c
@@ -350,19 +350,38 @@ __malloc char *para_hostname(void)
 }
 
 /**
- * Used to distinguish between read-only and read-write mode.
+ * Call a custom function for each complete line.
+ *
+ * \param flags Any combination of flags defined in \ref for_each_line_flags.
+ * \param buf The buffer containing data separated by newlines.
+ * \param size The number of bytes in \a buf.
+ * \param line_handler The custom function.
+ * \param private_data Pointer passed to \a line_handler.
  *
- * \sa for_each_line(), for_each_line_ro().
+ * If \p line_handler is \p NULL, the function returns the number of complete
+ * lines in \p buf.
+ *
+ * Otherwise, \p line_handler is called for each complete line in \p buf. The
+ * first argument to \p line_handler is (a copy of) the current line, and \p
+ * private_data is passed as the second argument.  If the \p FELF_READ_ONLY
+ * flag is unset, a pointer into \a buf is passed to the line handler,
+ * otherwise a pointer to a copy of each line is passed instead.  This copy is
+ * freed immediately after the line handler returns.
+ *
+ * The function returns if \p line_handler returns a negative value or no more
+ * lines are in the buffer.  The rest of the buffer (last chunk containing an
+ * incomplete line) is moved to the beginning of the buffer if FELF_READ_ONLY is
+ * unset.
+ *
+ * \return If \p line_handler is not \p NULL and FELF_READ_ONLY is not set,
+ * this function returns the number of bytes not handled to \p line_handler,
+ * otherwise number of complete lines.  On errors the negative error code of
+ * the \p line_handler is returned.
+ *
+ * \sa \ref for_each_line_flags.
  */
-enum for_each_line_modes{
-       /** Activate read-only mode. */
-       LINE_MODE_RO,
-       /** Activate read-write mode. */
-       LINE_MODE_RW
-};
-
-static int for_each_complete_line(enum for_each_line_modes mode, char *buf,
-               size_t size, line_handler_t *line_handler, void *private_data)
+int for_each_line(unsigned flags, char *buf, size_t size,
+               line_handler_t *line_handler, void *private_data)
 {
        char *start = buf, *end;
        int ret, i, num_lines = 0;
@@ -387,7 +406,7 @@ static int for_each_complete_line(enum for_each_line_modes mode, char *buf,
                        start = ++end;
                        continue;
                }
-               if (mode == LINE_MODE_RO) {
+               if (flags & FELF_READ_ONLY) {
                        size_t s = end - start;
                        char *b = para_malloc(s + 1);
                        memcpy(b, start, s);
@@ -403,7 +422,7 @@ static int for_each_complete_line(enum for_each_line_modes mode, char *buf,
                        return ret;
                start = ++end;
        }
-       if (!line_handler || mode == LINE_MODE_RO)
+       if (!line_handler || (flags & FELF_READ_ONLY))
                return num_lines;
        i = buf + size - start;
        if (i && i != size)
@@ -411,57 +430,6 @@ static int for_each_complete_line(enum for_each_line_modes mode, char *buf,
        return i;
 }
 
-/**
- * Call a custom function for each complete line.
- *
- * \param buf The buffer containing data separated by newlines.
- * \param size The number of bytes in \a buf.
- * \param line_handler The custom function.
- * \param private_data Pointer passed to \a line_handler.
- *
- * If \p line_handler is \p NULL, the function returns the number of complete
- * lines in \p buf.  Otherwise, \p line_handler is called for each complete
- * line in \p buf.  The first argument to \p line_handler is the current line,
- * and \p private_data is passed as the second argument.  The function returns
- * if \p line_handler returns a negative value or no more lines are in the
- * buffer.  The rest of the buffer (last chunk containing an incomplete line)
- * is moved to the beginning of the buffer.
- *
- * \return If \p line_handler is not \p NULL, this function returns the number
- * of bytes not handled to \p line_handler on success, or the negative return
- * value of the \p line_handler on errors.
- *
- * \sa for_each_line_ro().
- */
-int for_each_line(char *buf, size_t size, line_handler_t *line_handler,
-               void *private_data)
-{
-       return for_each_complete_line(LINE_MODE_RW, buf, size, line_handler,
-               private_data);
-}
-
-/**
- * Call a custom function for each complete line.
- *
- * \param buf Same meaning as in \p for_each_line().
- * \param size Same meaning as in \p for_each_line().
- * \param line_handler Same meaning as in \p for_each_line().
- * \param private_data Same meaning as in \p for_each_line().
- *
- * This function behaves like \p for_each_line(), but \a buf is left unchanged.
- *
- * \return On success, the function returns the number of complete lines in \p
- * buf, otherwise the (negative) return value of \p line_handler is returned.
- *
- * \sa for_each_line().
- */
-int for_each_line_ro(char *buf, size_t size, line_handler_t *line_handler,
-               void *private_data)
-{
-       return for_each_complete_line(LINE_MODE_RO, buf, size, line_handler,
-               private_data);
-}
-
 /** Return the hex characters of the lower 4 bits. */
 #define hex(a) (hexchar[(a) & 15])