From 7598d7747435c4de259df09bdb82911ff893113d Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Thu, 1 Feb 2007 21:03:03 +0100 Subject: [PATCH] move s_a_r() and s_a_r_list() from string.c to mysql_selector.c And make them static as they are only used in mysql_selector.c. This reduces the stripped code size of all executables (except para_server of course) by about 1K. --- mysql_selector.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++ string.c | 88 ----------------------------------------- string.h | 14 +------ 3 files changed, 101 insertions(+), 101 deletions(-) diff --git a/mysql_selector.c b/mysql_selector.c index 0eb19bc5..f8885f9a 100644 --- a/mysql_selector.c +++ b/mysql_selector.c @@ -28,6 +28,7 @@ #include "db.h" #include #include +#include #include "error.h" #include "net.h" #include "string.h" @@ -39,6 +40,18 @@ extern struct misc_meta_data *mmd; static void *mysql_ptr = NULL; +/** + * contains name/replacement pairs used by s_a_r_list() + * + * \sa s_a_r() + */ +struct para_macro { + /** the name of the macro */ + const char *name; + /** the replacement text */ + const char *replacement; +}; + static struct para_macro macro_list[] = { { .name = "IS_N_SET", .replacement = "(data.%s != '1')" @@ -63,6 +76,93 @@ static struct para_macro macro_list[] = { } }; +/** + * simple search and replace routine + * + * \param src source string + * \param macro_name the name of the macro + * \param replacement the replacement format string + * + * In \p src, replace each occurence of \p macro_name(arg) by the string + * determined by the \p replacement format string. \p replacement may (but + * needs not) contain a single string conversion specifier (%s) which gets + * replaced by \p arg. + * + * \return A string in which all matches in \p src are replaced, or \p NULL if + * an syntax error was encountered. Caller must free the result. + * + * \sa regcomp(3) + */ +__must_check __malloc static char *s_a_r(const char *src, const char* macro_name, + const char *replacement) +{ + regex_t preg; + size_t nmatch = 1; + regmatch_t pmatch[1]; + int eflags = 0; + char *dest = NULL; + const char *bufptr = src; + + if (!macro_name || !replacement || !src) + return para_strdup(src); + regcomp(&preg, macro_name, 0); + while (regexec(&preg, bufptr, nmatch, pmatch, eflags) + != REG_NOMATCH) { + char *tmp, *arg, *o_bracket, *c_bracket; + + o_bracket = strchr(bufptr + pmatch[0].rm_so, '('); + c_bracket = o_bracket? strchr(o_bracket, ')') : NULL; + if (!c_bracket) + goto out; + tmp = para_strdup(bufptr); + tmp[pmatch[0].rm_so] = '\0'; + dest = para_strcat(dest, tmp); + free(tmp); + + arg = para_strdup(o_bracket + 1); + arg[c_bracket - o_bracket - 1] = '\0'; + tmp = make_message(replacement, arg); + free(arg); + dest = para_strcat(dest, tmp); + free(tmp); + bufptr = c_bracket; + bufptr++; + } + dest = para_strcat(dest, bufptr); +// PARA_DEBUG_LOG("%s: returning %s\n", __func__, dest); +out: + regfree(&preg); + return dest; +} + +/** + * replace a string according to a list of macros + * + * \param macro_list the array containing a macro/replacement pairs. + * \param src the source string + * + * This function just calls s_a_r() for each element of \p macro_list. + * + * \return \p NULL if one of the underlying calls to \p s_a_r returned \p NULL. + * Otherwise the completely expanded version of \p src is returned. + */ +__must_check __malloc static char *s_a_r_list(struct para_macro *macro_list, char *src) +{ + struct para_macro *mp = macro_list; + char *ret = NULL, *tmp = para_strdup(src); + + while (mp->name) { + ret = s_a_r(tmp, mp->name, mp->replacement); + free(tmp); + if (!ret) /* syntax error */ + return NULL; + tmp = ret; + mp++; + } + //PARA_DEBUG_LOG("%s: returning %s\n", __func__, dest); + return ret; +} + static int real_query(const char *query) { if (!mysql_ptr) diff --git a/string.c b/string.c index 52c5183b..47c5417d 100644 --- a/string.c +++ b/string.c @@ -22,7 +22,6 @@ #include "string.h" #include /* gettimeofday */ -#include #include #include /* uname() */ #include @@ -223,93 +222,6 @@ __must_check __malloc char *para_basename(const char *name) return para_strdup(p); } -/** - * simple search and replace routine - * - * \param src source string - * \param macro_name the name of the macro - * \param replacement the replacement format string - * - * In \p src, replace each occurence of \p macro_name(arg) by the string - * determined by the \p replacement format string. \p replacement may (but - * needs not) contain a single string conversion specifier (%s) which gets - * replaced by \p arg. - * - * \return A string in which all matches in \p src are replaced, or \p NULL if - * an syntax error was encountered. Caller must free the result. - * - * \sa regcomp(3) - */ -__must_check __malloc char *s_a_r(const char *src, const char* macro_name, - const char *replacement) -{ - regex_t preg; - size_t nmatch = 1; - regmatch_t pmatch[1]; - int eflags = 0; - char *dest = NULL; - const char *bufptr = src; - - if (!macro_name || !replacement || !src) - return para_strdup(src); - regcomp(&preg, macro_name, 0); - while (regexec(&preg, bufptr, nmatch, pmatch, eflags) - != REG_NOMATCH) { - char *tmp, *arg, *o_bracket, *c_bracket; - - o_bracket = strchr(bufptr + pmatch[0].rm_so, '('); - c_bracket = o_bracket? strchr(o_bracket, ')') : NULL; - if (!c_bracket) - goto out; - tmp = para_strdup(bufptr); - tmp[pmatch[0].rm_so] = '\0'; - dest = para_strcat(dest, tmp); - free(tmp); - - arg = para_strdup(o_bracket + 1); - arg[c_bracket - o_bracket - 1] = '\0'; - tmp = make_message(replacement, arg); - free(arg); - dest = para_strcat(dest, tmp); - free(tmp); - bufptr = c_bracket; - bufptr++; - } - dest = para_strcat(dest, bufptr); -// PARA_DEBUG_LOG("%s: returning %s\n", __func__, dest); -out: - regfree(&preg); - return dest; -} - -/** - * replace a string according to a list of macros - * - * \param macro_list the array containing a macro/replacement pairs. - * \param src the source string - * - * This function just calls s_a_r() for each element of \p macro_list. - * - * \return \p NULL if one of the underlying calls to \p s_a_r returned \p NULL. - * Otherwise the completely expanded version of \p src is returned. - */ -__must_check __malloc char *s_a_r_list(struct para_macro *macro_list, char *src) -{ - struct para_macro *mp = macro_list; - char *ret = NULL, *tmp = para_strdup(src); - - while (mp->name) { - ret = s_a_r(tmp, mp->name, mp->replacement); - free(tmp); - if (!ret) /* syntax error */ - return NULL; - tmp = ret; - mp++; - } - //PARA_DEBUG_LOG("%s: returning %s\n", __func__, dest); - return ret; -} - /** * cut trailing newline * diff --git a/string.h b/string.h index e5033db2..5a76c049 100644 --- a/string.h +++ b/string.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Andre Noll + * Copyright (C) 2006-2007 Andre Noll * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,16 +18,6 @@ /** \file string.h exported sybmols from string.c */ -/** contains name/replacement pairs used by s_a_r_list() - * - * \sa s_a_r() - */ -struct para_macro { - /** the name of the macro */ - const char *name; - /** the replacement text */ - const char *replacement; -}; __must_check __malloc void *para_realloc(void *p, size_t size); __must_check __malloc void *para_malloc(size_t size); __must_check __malloc void *para_calloc(size_t size); @@ -36,8 +26,6 @@ __must_check __malloc __printf_1_2 char *make_message(const char *fmt, ...); __must_check __malloc char *para_strcat(char *a, const char *b); __must_check __malloc char *para_dirname(const char *name); __must_check __malloc char *para_basename(const char *name); -__must_check __malloc char *s_a_r(const char *src, const char* regex, const char *replacement); -__must_check __malloc char *s_a_r_list(struct para_macro *pm, char *src); void chop(char* buf); __must_check __malloc char *para_tmpname(void); __must_check int para_mkstemp(char *template, mode_t mode); -- 2.30.2