From: Eric Pouech eric.pouech@gmail.com
simplifying a bunch of invocations to str_build
Signed-off-by: Eric Pouech eric.pouech@gmail.com --- dlls/msvcrt/undname.c | 84 ++++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 33 deletions(-)
diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c index 2f5adefc0d8..8c361643b0b 100644 --- a/dlls/msvcrt/undname.c +++ b/dlls/msvcrt/undname.c @@ -233,6 +233,12 @@ static char* str_array_get_ref(struct array* cref, unsigned idx) * + %S same as %s, but insert before the string a ' ' as separator if in * previous contiguous %s or %S something has been inserted and argument isn't NULL * + %c inserts a char + * + * Returns: + * + if format is only made of %s and %S, + * + returns NULL if all arguments are NULL + * + returns arg if only one argument (call it arg) is not NULL + + + allocates a new buffer in all the other cases */ static char* WINAPIV str_build(struct parsed_symbol* sym, const char* format, ...) { @@ -242,6 +248,8 @@ static char* WINAPIV str_build(struct parsed_symbol* sym, const char* format, .. char* p; char* t; BOOL s_printed = FALSE; + BOOL pure_concat = TRUE; + char* single = NULL;
va_start(args, format); for (i = 0; format[i]; i++) @@ -250,16 +258,41 @@ static char* WINAPIV str_build(struct parsed_symbol* sym, const char* format, .. { switch (format[++i]) { - case 'S': len++; /* fall through */ - case 's': t = va_arg(args, char*); if (t) len += strlen(t); break; - case 'c': (void)va_arg(args, int); len++; break; - default: i--; /* fall through */ - case '%': len++; break; + case 'S': + len++; + /* fall through */ + case 's': + t = va_arg(args, char*); + if (t) + { + len += strlen(t); + if (!single) single = t; + else pure_concat = FALSE; + } + break; + case 'c': + (void)va_arg(args, int); + len++; + pure_concat = FALSE; + break; + default: + i--; + /* fall through */ + case '%': + len++; + pure_concat = FALSE; + break; } } - else len++; + else + { + len++; + pure_concat = FALSE; + } } va_end(args); + if (pure_concat) return single; + if (!(tmp = und_alloc(sym, len))) return NULL; va_start(args, format); for (p = tmp, i = 0; format[i]; i++) @@ -416,7 +449,7 @@ static void append_extended_modifier(struct parsed_symbol *sym, const char **whe { if (sym->flags & UNDNAME_NO_LEADING_UNDERSCORES) str += 2; - *where = *where ? str_build(sym, "%s %s", *where, str) : str; + *where = str_build(sym, "%s%S", *where, str); } }
@@ -453,10 +486,7 @@ static BOOL get_modifier(struct parsed_symbol *sym, struct datatype_t *xdt) case 'D': mod = "const volatile"; break; default: return FALSE; } - if (xdt->left && mod) - xdt->left = str_build(sym, "%s %s", xdt->left, mod); - else if (mod) - xdt->left = mod; + xdt->left = str_build(sym, "%s%S", xdt->left, mod); return TRUE; }
@@ -481,10 +511,7 @@ static BOOL get_modified_type(struct datatype_t *ct, struct parsed_symbol* sym, case '$': ref = "&&"; str_modif = NULL; break; default: return FALSE; } - if (ref || str_modif || xdt.left || xdt.right) - ct->left = str_build(sym, "%s%S%S%S", xdt.left, ref, xdt.right, str_modif); - else - ct->left = NULL; + ct->left = str_build(sym, "%s%S%S%S", xdt.left, ref, xdt.right, str_modif); ct->right = NULL;
if (get_modifier(sym, &xdt)) @@ -522,7 +549,7 @@ static BOOL get_modified_type(struct datatype_t *ct, struct parsed_symbol* sym, else ct->left = str_build(sym, "%s%S%S", sub_ct.left, xdt.left, ct->left);
- if (sub_ct.right) ct->right = str_build(sym, "%s%s", ct->right, sub_ct.right); + ct->right = str_build(sym, "%s%s", ct->right, sub_ct.right); sym->stack.num = mark; } return TRUE; @@ -567,7 +594,7 @@ static char* get_literal_string(struct parsed_symbol* sym) */ static char* get_template_name(struct parsed_symbol* sym) { - char *name, *args; + char *name; unsigned num_mark = sym->names.num; unsigned start_mark = sym->names.start; unsigned stack_mark = sym->stack.num; @@ -579,9 +606,7 @@ static char* get_template_name(struct parsed_symbol* sym) return FALSE; } str_array_init(&array_pmt); - args = get_args(sym, &array_pmt, FALSE, '<', '>'); - if (args != NULL) - name = str_build(sym, "%s%s", name, args); + name = str_build(sym, "%s%s", name, get_args(sym, &array_pmt, FALSE, '<', '>')); sym->names.num = num_mark; sym->names.start = start_mark; sym->stack.num = stack_mark; @@ -906,10 +931,6 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, goto done; if (!get_modifier(sym, &xdt)) goto done; - if (xdt.left) - xdt.left = str_build(sym, "%s %s", xdt.left, xdt.right); - else if (xdt.right) - xdt.left = str_build(sym, " %s", xdt.right); if (!get_calling_convention(*sym->current++, &call_conv, &exported, sym->flags & ~UNDNAME_NO_ALLOCATION_LANGUAGE)) @@ -923,7 +944,8 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct,
ct->left = str_build(sym, "%s%s (%s %s::*", sub_ct.left, sub_ct.right, call_conv, class); - ct->right = str_build(sym, ")%s%s", args, xdt.left); + ct->right = str_build(sym, ")%s%s%s%s", + args, xdt.left, xdt.left || xdt.right ? " " : NULL, xdt.right); } else if (*sym->current == '6') { @@ -1041,10 +1063,7 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct,
if (!demangle_datatype(sym, &sub_ct, pmt_ref, FALSE)) goto done;
- if (arr) - ct->left = str_build(sym, "%s %s", sub_ct.left, arr); - else - ct->left = sub_ct.left; + ct->left = str_build(sym, "%s%S", sub_ct.left, arr); ct->right = sub_ct.right; sym->stack.num = mark; } @@ -1136,8 +1155,7 @@ static BOOL handle_data(struct parsed_symbol* sym)
if (!demangle_datatype(sym, &ct, &pmt, FALSE)) goto done; if (!get_modifier(sym, &xdt)) goto done; - if (xdt.left && xdt.right) xdt.left = str_build(sym, "%s %s", xdt.left, xdt.right); - else if (!xdt.left) xdt.left = xdt.right; + xdt.left = str_build(sym, "%s%S", xdt.left, xdt.right); sym->stack.num = mark; } break; @@ -1312,7 +1330,7 @@ static BOOL handle_method(struct parsed_symbol* sym, BOOL cast_op) /* Implicit 'this' pointer */ /* If there is an implicit this pointer, const modifier follows */ if (!get_modifier(sym, &xdt)) goto done; - if (xdt.left || xdt.right) xdt.left = str_build(sym, "%s %s", xdt.left, xdt.right); + xdt.left = str_build(sym, "%s%s%s", xdt.left, xdt.left || xdt.right ? " " : NULL, xdt.right); }
if (!get_calling_convention(*sym->current++, &call_conv, &exported, @@ -1544,7 +1562,7 @@ static BOOL symbol_demangle(struct parsed_symbol* sym)
str_array_init(&array_pmt); args = get_args(sym, &array_pmt, FALSE, '<', '>'); - if (args) function_name = function_name ? str_build(sym, "%s%s", function_name, args) : args; + function_name = str_build(sym, "%s%s", function_name, args); sym->names.num = 0; } switch (do_after)