X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=string.c;h=cefb45d674075cf1fcb2e42b42e5b0a929a52c16;hp=5479e5b4fb43f6f0bac87e6cfba42ec011f30beb;hb=a7a72ca4acf7f44abca866d410e2bc80590e7fab;hpb=5440b8c0464829022a0ba5dd5daa931b15712a11 diff --git a/string.c b/string.c index 5479e5b4..cefb45d6 100644 --- a/string.c +++ b/string.c @@ -1,19 +1,19 @@ /* - * Copyright (C) 2004-2009 Andre Noll + * Copyright (C) 2004-2011 Andre Noll * * 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 /* gettimeofday */ #include #include /* uname() */ #include +#include +#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,14 +521,15 @@ __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_minmax */ +/* 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) #endif -/** \endcond */ +/** \endcond llong_minmax */ /** * Convert a string to a 64-bit signed integer value. @@ -588,7 +616,7 @@ int get_loglevel_by_name(const char *txt) return -1; } -static int get_next_word(const char *buf, const char *delim, char **word) +static int get_next_word(const char *buf, const char *delim, char **word) { enum line_state_flags {LSF_HAVE_WORD = 1, LSF_BACKSLASH = 2, LSF_SINGLE_QUOTE = 4, LSF_DOUBLE_QUOTE = 8}; @@ -692,6 +720,8 @@ void free_argv(char **argv) { int i; + if (!argv) + return; for (i = 0; argv[i]; i++) free(argv[i]); free(argv); @@ -733,5 +763,33 @@ err: while (num_words > 0) free(argv[--num_words]); free(argv); + *result = NULL; 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; +}