From: Eric Pouech eric.pouech@gmail.com
in preparation of semantics modification to this helper (and calling it str_printf might confuse devs as new semantics will diverge from printf's)
Signed-off-by: Eric Pouech eric.pouech@gmail.com --- dlls/msvcrt/undname.c | 122 +++++++++++++++++++++--------------------- 1 file changed, 61 insertions(+), 61 deletions(-)
diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c index c30b7ebb95b..0aa22b485ac 100644 --- a/dlls/msvcrt/undname.c +++ b/dlls/msvcrt/undname.c @@ -226,11 +226,11 @@ static char* str_array_get_ref(struct array* cref, unsigned idx) }
/****************************************************************** - * str_printf + * str_build * Helper for printf type of command (only %s and %c are implemented) * while dynamically allocating the buffer */ -static char* WINAPIV str_printf(struct parsed_symbol* sym, const char* format, ...) +static char* WINAPIV str_build(struct parsed_symbol* sym, const char* format, ...) { va_list args; unsigned int len = 1, i, sz; @@ -365,7 +365,7 @@ static char* get_args(struct parsed_symbol* sym, struct array* pmt_ref, BOOL z_t return NULL; /* 'void' terminates an argument list in a function */ if (z_term && !strcmp(ct.left, "void")) break; - if (!str_array_push(sym, str_printf(sym, "%s%s", ct.left, ct.right), -1, + if (!str_array_push(sym, str_build(sym, "%s%s", ct.left, ct.right), -1, &arg_collect)) return NULL; if (!strcmp(ct.left, "...")) break; @@ -377,20 +377,20 @@ static char* get_args(struct parsed_symbol* sym, struct array* pmt_ref, BOOL z_t
if (arg_collect.num == 0 || (arg_collect.num == 1 && !strcmp(arg_collect.elts[0], "void"))) - return str_printf(sym, "%cvoid%c", open_char, close_char); + return str_build(sym, "%cvoid%c", open_char, close_char); for (i = 1; i < arg_collect.num; i++) { - args_str = str_printf(sym, "%s,%s", args_str, arg_collect.elts[i]); + args_str = str_build(sym, "%s,%s", args_str, arg_collect.elts[i]); }
last = args_str ? args_str : arg_collect.elts[0]; if (close_char == '>' && last[strlen(last) - 1] == '>') - args_str = str_printf(sym, "%c%s%s %c", - open_char, arg_collect.elts[0], args_str, close_char); + args_str = str_build(sym, "%c%s%s %c", + open_char, arg_collect.elts[0], args_str, close_char); else - args_str = str_printf(sym, "%c%s%s%c", - open_char, arg_collect.elts[0], args_str, close_char); - + args_str = str_build(sym, "%c%s%s%c", + open_char, arg_collect.elts[0], args_str, close_char); + return args_str; }
@@ -400,7 +400,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_printf(sym, "%s %s", *where, str) : str; + *where = *where ? str_build(sym, "%s %s", *where, str) : str; } }
@@ -438,7 +438,7 @@ static BOOL get_modifier(struct parsed_symbol *sym, struct datatype_t *xdt) default: return FALSE; } if (xdt->left && mod) - xdt->left = str_printf(sym, "%s %s", xdt->left, mod); + xdt->left = str_build(sym, "%s %s", xdt->left, mod); else if (mod) xdt->left = mod; return TRUE; @@ -466,11 +466,11 @@ static BOOL get_modified_type(struct datatype_t *ct, struct parsed_symbol* sym, default: return FALSE; } if (ref || str_modif || xdt.left || xdt.right) - ct->left = str_printf(sym, " %s%s%s%s%s%s%s", - xdt.left, - xdt.left && ref ? " " : NULL, ref, - (xdt.left || ref) && xdt.right ? " " : NULL, xdt.right, - (xdt.left || ref || xdt.right) && str_modif ? " " : NULL, str_modif); + ct->left = str_build(sym, " %s%s%s%s%s%s%s", + xdt.left, + xdt.left && ref ? " " : NULL, ref, + (xdt.left || ref) && xdt.right ? " " : NULL, xdt.right, + (xdt.left || ref || xdt.right) && str_modif ? " " : NULL, str_modif); else ct->left = NULL; ct->right = NULL; @@ -493,27 +493,27 @@ static BOOL get_modified_type(struct datatype_t *ct, struct parsed_symbol* sym, if (ct->left && ct->left[0] == ' ' && !xdt.left) ct->left++;
- ct->left = str_printf(sym, " (%s%s", xdt.left, ct->left); + ct->left = str_build(sym, " (%s%s", xdt.left, ct->left); ct->right = ")"; xdt.left = NULL;
while (num--) - ct->right = str_printf(sym, "%s[%s]", ct->right, get_number(sym)); + ct->right = str_build(sym, "%s[%s]", ct->right, get_number(sym)); }
/* Recurse to get the referred-to type */ if (!demangle_datatype(sym, &sub_ct, pmt_ref, FALSE)) return FALSE; if (xdt.left) - ct->left = str_printf(sym, "%s %s%s", sub_ct.left, xdt.left, ct->left); + ct->left = str_build(sym, "%s %s%s", sub_ct.left, xdt.left, ct->left); else { /* don't insert a space between duplicate '*' */ if (!in_args && ct->left && ct->left[0] && ct->left[1] == '*' && sub_ct.left[strlen(sub_ct.left)-1] == '*') ct->left++; - ct->left = str_printf(sym, "%s%s", sub_ct.left, ct->left); + ct->left = str_build(sym, "%s%s", sub_ct.left, ct->left); } - if (sub_ct.right) ct->right = str_printf(sym, "%s%s", ct->right, sub_ct.right); + if (sub_ct.right) ct->right = str_build(sym, "%s%s", ct->right, sub_ct.right); sym->stack.num = mark; } return TRUE; @@ -572,7 +572,7 @@ static char* get_template_name(struct parsed_symbol* sym) str_array_init(&array_pmt); args = get_args(sym, &array_pmt, FALSE, '<', '>'); if (args != NULL) - name = str_printf(sym, "%s%s", name, args); + name = str_build(sym, "%s%s", name, args); sym->names.num = num_mark; sym->names.start = start_mark; sym->stack.num = stack_mark; @@ -623,7 +623,7 @@ static BOOL get_class(struct parsed_symbol* sym) unsigned int num = sym->names.num;
str_array_init( &sym->stack ); - if (symbol_demangle( sym )) name = str_printf( sym, "`%s'", sym->result ); + if (symbol_demangle( sym )) name = str_build( sym, "`%s'", sym->result ); sym->names.start = start; sym->names.num = num; sym->stack = stack; @@ -631,7 +631,7 @@ static BOOL get_class(struct parsed_symbol* sym) break; default: if (!(name = get_number( sym ))) return FALSE; - name = str_printf( sym, "`%s'", name ); + name = str_build( sym, "`%s'", name ); break; } break; @@ -849,7 +849,7 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, case 'Y': type_name = "cointerface "; break; } } - ct->left = str_printf(sym, "%s%s", type_name, struct_name); + ct->left = str_build(sym, "%s%s", type_name, struct_name); } break; case '?': @@ -858,7 +858,7 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, { const char* ptr; if (!(ptr = get_number(sym))) goto done; - ct->left = str_printf(sym, "`template-parameter-%s'", ptr); + ct->left = str_build(sym, "`template-parameter-%s'", ptr); } else { @@ -898,9 +898,9 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, if (!get_modifier(sym, &xdt)) goto done; if (xdt.left) - xdt.left = str_printf(sym, "%s %s", xdt.left, xdt.right); + xdt.left = str_build(sym, "%s %s", xdt.left, xdt.right); else if (xdt.right) - xdt.left = str_printf(sym, " %s", 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)) @@ -912,9 +912,9 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, if (!args) goto done; sym->stack.num = mark;
- ct->left = str_printf(sym, "%s%s (%s %s::*", - sub_ct.left, sub_ct.right, call_conv, class); - ct->right = str_printf(sym, ")%s%s", args, xdt.left); + 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); } else if (*sym->current == '6') { @@ -936,9 +936,9 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, if (!args) goto done; sym->stack.num = mark;
- ct->left = str_printf(sym, "%s%s (%s*", - sub_ct.left, sub_ct.right, call_conv); - ct->right = str_printf(sym, ")%s", args); + ct->left = str_build(sym, "%s%s (%s*", + sub_ct.left, sub_ct.right, call_conv); + ct->right = str_build(sym, ")%s", args); } else goto done; } @@ -954,7 +954,7 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, if (sym->flags & UNDNAME_NO_COMPLEX_TYPE) ct->left = enum_name; else - ct->left = str_printf(sym, "enum %s", enum_name); + ct->left = str_build(sym, "enum %s", enum_name); } else goto done; break; @@ -978,7 +978,7 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, { const char* ptr; if (!(ptr = get_number(sym))) goto done; - ct->left = str_printf(sym, "`template-parameter%s'", ptr); + ct->left = str_build(sym, "`template-parameter%s'", ptr); } break; case 'F': @@ -987,7 +987,7 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, const char* p2; if (!(p1 = get_number(sym))) goto done; if (!(p2 = get_number(sym))) goto done; - ct->left = str_printf(sym, "{%s,%s}", p1, p2); + ct->left = str_build(sym, "{%s,%s}", p1, p2); } break; case 'G': @@ -998,14 +998,14 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, if (!(p1 = get_number(sym))) goto done; if (!(p2 = get_number(sym))) goto done; if (!(p3 = get_number(sym))) goto done; - ct->left = str_printf(sym, "{%s,%s,%s}", p1, p2, p3); + ct->left = str_build(sym, "{%s,%s,%s}", p1, p2, p3); } break; case 'Q': { const char* ptr; if (!(ptr = get_number(sym))) goto done; - ct->left = str_printf(sym, "`non-type-template-parameter%s'", ptr); + ct->left = str_build(sym, "`non-type-template-parameter%s'", ptr); } break; case '$': @@ -1027,13 +1027,13 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, num = atoi(n1);
while (num--) - arr = str_printf(sym, "%s[%s]", arr, get_number(sym)); + arr = str_build(sym, "%s[%s]", arr, get_number(sym)); }
if (!demangle_datatype(sym, &sub_ct, pmt_ref, FALSE)) goto done;
if (arr) - ct->left = str_printf(sym, "%s %s", sub_ct.left, arr); + ct->left = str_build(sym, "%s %s", sub_ct.left, arr); else ct->left = sub_ct.left; ct->right = sub_ct.right; @@ -1046,7 +1046,7 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, sym->current++; if (!get_modifier(sym, &xdt)) goto done; if (!demangle_datatype(sym, ct, pmt_ref, in_args)) goto done; - ct->left = str_printf(sym, "%s %s", ct->left, xdt.left); + ct->left = str_build(sym, "%s %s", ct->left, xdt.left); } else if (*sym->current == 'Q') { @@ -1127,7 +1127,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_printf(sym, "%s %s", xdt.left, xdt.right); + if (xdt.left && xdt.right) xdt.left = str_build(sym, "%s %s", xdt.left, xdt.right); else if (!xdt.left) xdt.left = xdt.right; sym->stack.num = mark; } @@ -1142,7 +1142,7 @@ static BOOL handle_data(struct parsed_symbol* sym)
if (!(cls = get_class_name(sym))) goto done; - ct.right = str_printf(sym, "{for `%s'}", cls); + ct.right = str_build(sym, "{for `%s'}", cls); } break; case '8': @@ -1153,7 +1153,7 @@ static BOOL handle_data(struct parsed_symbol* sym) } if (sym->flags & UNDNAME_NAME_ONLY) ct.left = ct.right = xdt.left = NULL;
- sym->result = str_printf(sym, "%s%s%s%s%s%s%s%s", access, + sym->result = str_build(sym, "%s%s%s%s%s%s%s%s", access, member_type, ct.left, xdt.left && ct.left ? " " : NULL, xdt.left, xdt.left || ct.left ? " " : NULL, name, ct.right); @@ -1241,7 +1241,7 @@ static BOOL handle_method(struct parsed_symbol* sym, BOOL cast_op) case 2: access = "public: "; break; } if (accmem == '$' || (accmem - 'A') % 8 == 6 || (accmem - 'A') % 8 == 7) - access = str_printf(sym, "[thunk]:%s", access ? access : " "); + access = str_build(sym, "[thunk]:%s", access ? access : " ");
if (accmem == '$' && *sym->current != 'B') member_type = "virtual "; @@ -1269,7 +1269,7 @@ static BOOL handle_method(struct parsed_symbol* sym, BOOL cast_op) n = get_number(sym);
if(!n || *sym->current++ != 'A') goto done; - name = str_printf(sym, "%s{%s,{flat}}' }'", name, n); + name = str_build(sym, "%s{%s,{flat}}' }'", name, n); has_args = FALSE; has_ret = FALSE; } @@ -1284,7 +1284,7 @@ static BOOL handle_method(struct parsed_symbol* sym, BOOL cast_op) n4 = get_number(sym);
if(!n1 || !n2 || !n3 || !n4) goto done; - name = str_printf(sym, "%s`vtordispex{%s,%s,%s,%s}' ", name, n1, n2, n3, n4); + name = str_build(sym, "%s`vtordispex{%s,%s,%s,%s}' ", name, n1, n2, n3, n4); } else if (accmem == '$') /* vtordisp thunk */ { @@ -1295,10 +1295,10 @@ static BOOL handle_method(struct parsed_symbol* sym, BOOL cast_op) n2 = get_number(sym);
if (!n1 || !n2) goto done; - name = str_printf(sym, "%s`vtordisp{%s,%s}' ", name, n1, n2); + name = str_build(sym, "%s`vtordisp{%s,%s}' ", name, n1, n2); } else if ((accmem - 'A') % 8 == 6 || (accmem - 'A') % 8 == 7) /* a thunk */ - name = str_printf(sym, "%s`adjustor{%s}' ", name, get_number(sym)); + name = str_build(sym, "%s`adjustor{%s}' ", name, get_number(sym));
if (has_args && (accmem == '$' || (accmem <= 'X' && (accmem - 'A') % 8 != 2 && (accmem - 'A') % 8 != 3))) @@ -1306,7 +1306,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_printf(sym, "%s %s", xdt.left, xdt.right); + if (xdt.left || xdt.right) xdt.left = str_build(sym, "%s %s", xdt.left, xdt.right); }
if (!get_calling_convention(*sym->current++, &call_conv, &exported, @@ -1331,7 +1331,7 @@ static BOOL handle_method(struct parsed_symbol* sym, BOOL cast_op) ct_ret.left = ct_ret.right = NULL; if (cast_op) { - name = str_printf(sym, "%s %s%s", name, ct_ret.left, ct_ret.right); + name = str_build(sym, "%s %s%s", name, ct_ret.left, ct_ret.right); ct_ret.left = ct_ret.right = NULL; }
@@ -1344,7 +1344,7 @@ static BOOL handle_method(struct parsed_symbol* sym, BOOL cast_op) /* Note: '()' after 'Z' means 'throws', but we don't care here * Yet!!! FIXME */ - sym->result = str_printf(sym, "%s%s%s%s%s%s%s%s%s%s%s", + sym->result = str_build(sym, "%s%s%s%s%s%s%s%s%s%s%s", access, member_type, ct_ret.left, (ct_ret.left && !ct_ret.right) ? " " : NULL, call_conv, call_conv ? " " : NULL, exported, @@ -1370,7 +1370,7 @@ static BOOL symbol_demangle(struct parsed_symbol* sym)
if (demangle_datatype(sym, &ct, NULL, FALSE)) { - sym->result = str_printf(sym, "%s%s", ct.left, ct.right); + sym->result = str_build(sym, "%s%s", ct.left, ct.right); ret = TRUE; } goto done; @@ -1470,7 +1470,7 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) sym->current++; if (!demangle_datatype(sym, &ct, NULL, FALSE)) goto done; - function_name = str_printf(sym, "%s%s `RTTI Type Descriptor'", + function_name = str_build(sym, "%s%s `RTTI Type Descriptor'", ct.left, ct.right); sym->current--; } @@ -1484,7 +1484,7 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) n3 = get_number(sym); n4 = get_number(sym); sym->current--; - function_name = str_printf(sym, "`RTTI Base Class Descriptor at (%s,%s,%s,%s)'", + function_name = str_build(sym, "`RTTI Base Class Descriptor at (%s,%s,%s,%s)'", n1, n2, n3, n4); } break; @@ -1507,7 +1507,7 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) { case 'K': sym->current++; - function_name = str_printf(sym, "operator "" %s", get_literal_string(sym)); + function_name = str_build(sym, "operator "" %s", get_literal_string(sym)); --sym->current; break; default: @@ -1538,7 +1538,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_printf(sym, "%s%s", function_name, args) : args; + if (args) function_name = function_name ? str_build(sym, "%s%s", function_name, args) : args; sym->names.num = 0; } switch (do_after) @@ -1581,9 +1581,9 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) /* it's time to set the member name for ctor & dtor */ if (sym->stack.num <= 1) goto done; if (do_after == 1) - sym->stack.elts[0] = str_printf(sym, "%s%s", sym->stack.elts[1], sym->stack.elts[0]); + sym->stack.elts[0] = str_build(sym, "%s%s", sym->stack.elts[1], sym->stack.elts[0]); else - sym->stack.elts[0] = str_printf(sym, "~%s%s", sym->stack.elts[1], sym->stack.elts[0]); + sym->stack.elts[0] = str_build(sym, "~%s%s", sym->stack.elts[1], sym->stack.elts[0]); /* ctors and dtors don't have return type */ sym->flags |= UNDNAME_NO_FUNCTION_RETURNS; break;