|
|
|
@ -9891,25 +9891,39 @@ bool parse_re_part(char *start_re, char *end_re, |
|
|
|
|
|
|
|
Returns: st_replace_regex struct with pairs of substitutions |
|
|
|
*/ |
|
|
|
void append_replace_regex(char*, char*, struct st_replace_regex*, char**); |
|
|
|
|
|
|
|
struct st_replace_regex* init_replace_regex(char* expr) |
|
|
|
{ |
|
|
|
char *expr_end, *buf_p; |
|
|
|
struct st_replace_regex* res; |
|
|
|
char* buf,*expr_end; |
|
|
|
char* p, start_re, end_re= 1; |
|
|
|
char* buf_p; |
|
|
|
uint expr_len= strlen(expr); |
|
|
|
struct st_regex reg; |
|
|
|
|
|
|
|
/* my_malloc() will die on fail with MY_FAE */ |
|
|
|
res=(struct st_replace_regex*)my_malloc( |
|
|
|
sizeof(*res)+expr_len ,MYF(MY_FAE+MY_WME)); |
|
|
|
sizeof(*res)+8192 ,MYF(MY_FAE+MY_WME)); |
|
|
|
my_init_dynamic_array(&res->regex_arr,sizeof(struct st_regex), 128, 128, MYF(0)); |
|
|
|
|
|
|
|
buf= (char*)res + sizeof(*res); |
|
|
|
expr_end= expr + expr_len; |
|
|
|
buf_p= (char*)res + sizeof(*res); |
|
|
|
append_replace_regex(expr, expr_end, res, &buf_p); |
|
|
|
|
|
|
|
res->odd_buf_len= res->even_buf_len= 8192; |
|
|
|
res->even_buf= (char*)my_malloc(res->even_buf_len,MYF(MY_WME+MY_FAE)); |
|
|
|
res->odd_buf= (char*)my_malloc(res->odd_buf_len,MYF(MY_WME+MY_FAE)); |
|
|
|
res->buf= res->even_buf; |
|
|
|
|
|
|
|
return res; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void append_replace_regex(char* expr, char *expr_end, struct st_replace_regex* res, |
|
|
|
char **buf_p) |
|
|
|
{ |
|
|
|
char* p, start_re, end_re= 1; |
|
|
|
struct st_regex reg; |
|
|
|
|
|
|
|
p= expr; |
|
|
|
buf_p= buf; |
|
|
|
|
|
|
|
/* for each regexp substitution statement */ |
|
|
|
while (p < expr_end) |
|
|
|
@ -9928,13 +9942,34 @@ struct st_replace_regex* init_replace_regex(char* expr) |
|
|
|
} |
|
|
|
|
|
|
|
start_re= 0; |
|
|
|
reg.pattern= buf_p; |
|
|
|
if (parse_re_part(&start_re, &end_re, &p, expr_end, &buf_p)) |
|
|
|
goto err; |
|
|
|
reg.pattern= *buf_p; |
|
|
|
|
|
|
|
/* Allow variable for the *entire* list of replacements */ |
|
|
|
if (*p == '$') |
|
|
|
{ |
|
|
|
const char *v_end; |
|
|
|
VAR *val= var_get(p, &v_end, 0, 1); |
|
|
|
|
|
|
|
if (val) |
|
|
|
{ |
|
|
|
char *expr, *expr_end; |
|
|
|
expr= val->str_val; |
|
|
|
expr_end= expr + val->str_val_len; |
|
|
|
append_replace_regex(expr, expr_end, res, buf_p); |
|
|
|
} |
|
|
|
|
|
|
|
p= (char *) v_end + 1; |
|
|
|
continue; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
if (parse_re_part(&start_re, &end_re, &p, expr_end, buf_p)) |
|
|
|
goto err; |
|
|
|
|
|
|
|
reg.replace= buf_p; |
|
|
|
if (parse_re_part(&start_re, &end_re, &p, expr_end, &buf_p)) |
|
|
|
goto err; |
|
|
|
reg.replace= *buf_p; |
|
|
|
if (parse_re_part(&start_re, &end_re, &p, expr_end, buf_p)) |
|
|
|
goto err; |
|
|
|
} |
|
|
|
|
|
|
|
/* Check if we should do matching case insensitive */ |
|
|
|
if (p < expr_end && *p == 'i') |
|
|
|
@ -9947,17 +9982,12 @@ struct st_replace_regex* init_replace_regex(char* expr) |
|
|
|
if (insert_dynamic(&res->regex_arr,(uchar*) ®)) |
|
|
|
die("Out of memory"); |
|
|
|
} |
|
|
|
res->odd_buf_len= res->even_buf_len= 8192; |
|
|
|
res->even_buf= (char*)my_malloc(res->even_buf_len,MYF(MY_WME+MY_FAE)); |
|
|
|
res->odd_buf= (char*)my_malloc(res->odd_buf_len,MYF(MY_WME+MY_FAE)); |
|
|
|
res->buf= res->even_buf; |
|
|
|
|
|
|
|
return res; |
|
|
|
return; |
|
|
|
|
|
|
|
err: |
|
|
|
my_free(res); |
|
|
|
die("Error parsing replace_regex \"%s\"", expr); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
/*
|
|
|
|
@ -10037,12 +10067,6 @@ void do_get_replace_regex(struct st_command *command) |
|
|
|
{ |
|
|
|
char *expr= command->first_argument; |
|
|
|
free_replace_regex(); |
|
|
|
/* Allow variable for the *entire* list of replacements */ |
|
|
|
if (*expr == '$') |
|
|
|
{ |
|
|
|
VAR *val= var_get(expr, NULL, 0, 1); |
|
|
|
expr= val ? val->str_val : NULL; |
|
|
|
} |
|
|
|
if (expr && *expr && !(glob_replace_regex=init_replace_regex(expr))) |
|
|
|
die("Could not init replace_regex"); |
|
|
|
command->last_argument= command->end; |
|
|
|
|