msvcrt: Move the code to demangle a name with its template argument list out of get_class() and into a separate function.

This commit is contained in:
Michael Stefaniuc 2007-04-06 00:49:18 +02:00 committed by Alexandre Julliard
parent 1360357f92
commit 4718261e9b
1 changed files with 30 additions and 22 deletions

View File

@ -426,6 +426,35 @@ static char* get_literal_string(struct parsed_symbol* sym)
return str_array_get_ref(&sym->names, sym->names.num - sym->names.start - 1);
}
/******************************************************************
* get_template_name
* Parses a name with a template argument list and returns it as
* a string.
* In a template argument list the back reference to the names
* table is separately created. '0' points to the class component
* name with the template arguments. We use the same stack array
* to hold the names but save/restore the stack state before/after
* parsing the template argument list.
*/
static char* get_template_name(struct parsed_symbol* sym)
{
char *name, *args;
unsigned num_mark = sym->names.num;
unsigned start_mark = sym->names.start;
unsigned stack_mark = sym->stack.num;
sym->names.start = sym->names.num;
if (!(name = get_literal_string(sym)))
return FALSE;
args = get_args(sym, NULL, FALSE, '<', '>');
if (args != NULL)
name = str_printf(sym, "%s%s", name, args);
sym->names.num = num_mark;
sym->names.start = start_mark;
sym->stack.num = stack_mark;
return name;
}
/******************************************************************
* get_class
* Parses class as a list of parent-classes, terminated by '@' and stores the
@ -457,29 +486,8 @@ static BOOL get_class(struct parsed_symbol* sym)
case '?':
if (*++sym->current == '$')
{
/* In a template argument list the back reference to names
table is separately created. '0' points to the class
component name with the template arguments. We use the same
stack array to hold the names but save/restore the stack
state before/after parsing the template argument list. */
char* args = NULL;
unsigned num_mark = sym->names.num;
unsigned start_mark = sym->names.start;
unsigned stack_mark = sym->stack.num;
sym->names.start = sym->names.num;
sym->current++;
if (!(name = get_literal_string(sym)))
return FALSE;
args = get_args(sym, NULL, FALSE, '<', '>');
if (args != NULL)
name = str_printf(sym, "%s%s", name, args);
sym->names.num = num_mark;
sym->names.start = start_mark;
sym->stack.num = stack_mark;
/* Now that we are back to the standard name scope push
the class component with all its template arguments
to the names array for back reference. */
name = get_template_name(sym);
str_array_push(sym, name, -1, &sym->names);
}
break;