Kill afhi->header_offset.
[paraslash.git] / string.c
index 5479e5b4fb43f6f0bac87e6cfba42ec011f30beb..813999bbf1ced122ea8aa1347929ee03ce045c77 100644 (file)
--- a/string.c
+++ b/string.c
@@ -1,19 +1,19 @@
 /*
- * Copyright (C) 2004-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2004-2011 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
 
 /** \file string.c Memory allocation and string handling functions. */
 
-#include "para.h"
-#include "string.h"
-
 #include <sys/time.h> /* gettimeofday */
 #include <pwd.h>
 #include <sys/utsname.h> /* uname() */
 #include <string.h>
+#include <regex.h>
 
+#include "para.h"
+#include "string.h"
 #include "error.h"
 
 /**
@@ -135,6 +135,20 @@ __must_check __printf_1_2 __malloc char *make_message(const char *fmt, ...)
        return msg;
 }
 
+/**
+ * Free the content of a pointer and set it to \p NULL.
+ *
+ * This is equivalent to "free(*arg); *arg = NULL;".
+ *
+ * \param arg The pointer whose content should be freed.
+ */
+void freep(void *arg)
+{
+       void **ptr = (void **)arg;
+       free(*ptr);
+       *ptr = NULL;
+}
+
 /**
  * Paraslash's version of strcat().
  *
@@ -386,7 +400,9 @@ int for_each_line_ro(char *buf, size_t size, line_handler_t *line_handler,
                private_data);
 }
 
+/** Return the hex characters of the lower 4 bits. */
 #define hex(a) (hexchar[(a) & 15])
+
 static void write_size_header(char *buf, int n)
 {
        static char hexchar[] = "0123456789abcdef";
@@ -398,6 +414,17 @@ static void write_size_header(char *buf, int n)
        buf[4] = ' ';
 }
 
+/**
+ * Read a four-byte hex-number and return its value.
+ *
+ * Each status item sent by para_server is prefixed with such a hex number in
+ * ASCII which describes the size of the status item.
+ *
+ * \param buf The buffer which must be at least four bytes long.
+ *
+ * \return The value of the hex number on success, \p -E_SIZE_PREFIX if the
+ * buffer did not contain only hex digits.
+ */
 int read_size_header(const char *buf)
 {
        int i, len = 0;
@@ -494,9 +521,9 @@ __printf_2_3 int para_printf(struct para_buffer *b, const char *fmt, ...)
        }
 }
 
-/** \cond LLONG_MAX and LLONG_LIN might not be defined. */
+/** \cond LLONG_MAX and LLONG_MIN might not be defined. */
 #ifndef LLONG_MAX
-#define LLONG_MAX (1 << (sizeof(long) - 1))
+#define LLONG_MAX 9223372036854775807LL
 #endif
 #ifndef LLONG_MIN
 #define LLONG_MIN (-LLONG_MAX - 1LL)
@@ -735,3 +762,30 @@ err:
        free(argv);
        return ret;
 }
+
+/**
+ * Compile a regular expression.
+ *
+ * This simple wrapper calls regcomp() and logs a message on errors.
+ *
+ * \param preg See regcomp(3).
+ * \param regex See regcomp(3).
+ * \param cflags See regcomp(3).
+ *
+ * \return Standard.
+ */
+int para_regcomp(regex_t *preg, const char *regex, int cflags)
+{
+       char *buf;
+       size_t size;
+       int ret = regcomp(preg, regex, cflags);
+
+       if (ret == 0)
+               return 1;
+       size = regerror(ret, preg, NULL, 0);
+       buf = para_malloc(size);
+       regerror(ret, preg, buf, size);
+       PARA_ERROR_LOG("%s\n", buf);
+       free(buf);
+       return -E_REGEX;
+}