version 1.29, 2017/06/14 07:42:41 |
version 1.30, 2018/08/19 19:03:46 |
|
|
(*p)--; |
(*p)--; |
} |
} |
|
|
|
static int |
|
cmd_string_unicode(wchar_t *wc, const char *s, size_t *p, char ch) |
|
{ |
|
int size = (ch == 'u') ? 4 : 8; |
|
u_int tmp; |
|
|
|
if (size == 4 && sscanf(s + *p, "%4x", &tmp) != 1) |
|
return (-1); |
|
if (size == 8 && sscanf(s + *p, "%8x", &tmp) != 1) |
|
return (-1); |
|
*p += size; |
|
|
|
*wc = (wchar_t)tmp; |
|
return (0); |
|
} |
|
|
int |
int |
cmd_string_split(const char *s, int *rargc, char ***rargv) |
cmd_string_split(const char *s, int *rargc, char ***rargv) |
{ |
{ |
|
|
static char * |
static char * |
cmd_string_string(const char *s, size_t *p, char endch, int esc) |
cmd_string_string(const char *s, size_t *p, char endch, int esc) |
{ |
{ |
int ch; |
int ch; |
char *buf, *t; |
wchar_t wc; |
size_t len; |
struct utf8_data ud; |
|
char *buf = NULL, *t; |
|
size_t len = 0; |
|
|
buf = NULL; |
|
len = 0; |
|
|
|
while ((ch = cmd_string_getc(s, p)) != endch) { |
while ((ch = cmd_string_getc(s, p)) != endch) { |
switch (ch) { |
switch (ch) { |
case EOF: |
case EOF: |
|
|
case 't': |
case 't': |
ch = '\t'; |
ch = '\t'; |
break; |
break; |
|
case 'u': |
|
case 'U': |
|
if (cmd_string_unicode(&wc, s, p, ch) != 0) |
|
goto error; |
|
if (utf8_split(wc, &ud) != UTF8_DONE) |
|
goto error; |
|
if (len >= SIZE_MAX - ud.size - 1) |
|
goto error; |
|
buf = xrealloc(buf, len + ud.size); |
|
memcpy(buf + len, ud.data, ud.size); |
|
len += ud.size; |
|
continue; |
} |
} |
break; |
break; |
case '$': |
case '$': |