summaryrefslogtreecommitdiff
path: root/mysys
diff options
context:
space:
mode:
authorunknown <tsmith@siva.hindu.god>2007-01-18 10:34:51 -0700
committerunknown <tsmith@siva.hindu.god>2007-01-18 10:34:51 -0700
commitc7b6685f9fb33f88eb10c68366f3e1f99173f2ad (patch)
tree00cce2c3a12803a2531276fd42772d9586b6157e /mysys
parent73dcec767800c00ce55922d1673da09de13ac54f (diff)
parent104ce0dce92391e28ec49008fd4825f0c7773e6b (diff)
downloadmariadb-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.c52
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)