diff options
author | unknown <tsmith@siva.hindu.god> | 2007-01-18 10:34:51 -0700 |
---|---|---|
committer | unknown <tsmith@siva.hindu.god> | 2007-01-18 10:34:51 -0700 |
commit | c7b6685f9fb33f88eb10c68366f3e1f99173f2ad (patch) | |
tree | 00cce2c3a12803a2531276fd42772d9586b6157e /mysys | |
parent | 73dcec767800c00ce55922d1673da09de13ac54f (diff) | |
parent | 104ce0dce92391e28ec49008fd4825f0c7773e6b (diff) | |
download | mariadb-git-c7b6685f9fb33f88eb10c68366f3e1f99173f2ad.tar.gz |
Merge tsmith@bk-internal.mysql.com:/home/bk/mysql-5.1-maint
into siva.hindu.god:/home/tsmith/m/bk/mrg-jan17/maint/51
client/mysql_upgrade.c:
Auto merged
storage/myisam/mi_packrec.c:
Use local
Diffstat (limited to 'mysys')
-rw-r--r-- | mysys/string.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/mysys/string.c b/mysys/string.c index 86de7bfcf69..dd483e6da87 100644 --- a/mysys/string.c +++ b/mysys/string.c @@ -121,6 +121,58 @@ my_bool dynstr_trunc(DYNAMIC_STRING *str, int n) return FALSE; } +/** Concatenates any number of strings, escapes any OS quote in the result then + * surround the whole affair in another set of quotes which is finally appended + * to specified DYNAMIC_STRING. This function is especially useful when + * building strings to be executed with the system() function. + * @param str Dynamic String which will have addtional strings appended. + * @param append String to be appended. + * @param ... Optional. Additional string(s) to be appended. + * + * @note The final argument in the list must be NullS even if no additional + * options are passed. + * + * @return True = Success. + */ +my_bool dynstr_append_os_quoted(DYNAMIC_STRING *str, const char *append, ...) +{ +#ifdef __WIN__ + char quote_str[]= "\""; +#else + char quote_str[]= "\'"; +#endif /* __WIN__ */ + my_bool ret= TRUE; + va_list dirty_text; + + ret&= dynstr_append(str, quote_str); /* Leading quote */ + va_start(dirty_text,append); + while (append != NullS) + { + char *cur_pos= append; + char *next_pos= cur_pos; + + /* Search for quote in each string and replace with escaped quote */ + while(*(next_pos= strcend(cur_pos, quote_str[0])) != '\0') + { + char *tmp_buff= my_malloc((next_pos - cur_pos) + 1, MYF(MY_ZEROFILL)); + strnmov(tmp_buff, cur_pos, (next_pos - cur_pos)); + ret&= dynstr_append(str, tmp_buff); + my_free((gptr)tmp_buff, MYF(0)); + + ret&= dynstr_append(str ,"\\"); + ret&= dynstr_append(str, quote_str); + cur_pos= next_pos + 1; + } + ret&= dynstr_append(str, cur_pos); + append= va_arg(dirty_text, char *); + } + va_end(dirty_text); + ret&= dynstr_append(str, quote_str); /* Trailing quote */ + + return ret; +} + + void dynstr_free(DYNAMIC_STRING *str) { if (str->str) |