Commit c65106e1 authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard

msvcrt: In undname helpers, allow str_array_push to return errors (instead of asserting).

parent 76c7f280
...@@ -181,12 +181,13 @@ static void str_array_init(struct array* a) ...@@ -181,12 +181,13 @@ static void str_array_init(struct array* a)
* str_array_push * str_array_push
* Adding a new string to an array * Adding a new string to an array
*/ */
static void str_array_push(struct parsed_symbol* sym, const char* ptr, int len, static BOOL str_array_push(struct parsed_symbol* sym, const char* ptr, int len,
struct array* a) struct array* a)
{ {
assert(ptr); assert(ptr);
assert(a); assert(a);
assert(a->num < MAX_ARRAY_ELTS); if (a->num >= MAX_ARRAY_ELTS) return FALSE;
if (len == -1) len = strlen(ptr); if (len == -1) len = strlen(ptr);
a->elts[a->num] = und_alloc(sym, len + 1); a->elts[a->num] = und_alloc(sym, len + 1);
assert(a->elts[a->num]); assert(a->elts[a->num]);
...@@ -205,6 +206,8 @@ static void str_array_push(struct parsed_symbol* sym, const char* ptr, int len, ...@@ -205,6 +206,8 @@ static void str_array_push(struct parsed_symbol* sym, const char* ptr, int len,
TRACE("%p\t%d%c %s\n", a, i, c, a->elts[i]); TRACE("%p\t%d%c %s\n", a, i, c, a->elts[i]);
} }
} }
return TRUE;
} }
/****************************************************************** /******************************************************************
...@@ -365,8 +368,9 @@ static char* get_args(struct parsed_symbol* sym, struct array* pmt_ref, BOOL z_t ...@@ -365,8 +368,9 @@ static char* get_args(struct parsed_symbol* sym, struct array* pmt_ref, BOOL z_t
return NULL; return NULL;
/* 'void' terminates an argument list in a function */ /* 'void' terminates an argument list in a function */
if (z_term && !strcmp(ct.left, "void")) break; if (z_term && !strcmp(ct.left, "void")) break;
str_array_push(sym, str_printf(sym, "%s%s", ct.left, ct.right), -1, if (!str_array_push(sym, str_printf(sym, "%s%s", ct.left, ct.right), -1,
&arg_collect); &arg_collect))
return NULL;
if (!strcmp(ct.left, "...")) break; if (!strcmp(ct.left, "...")) break;
} }
/* Functions are always terminated by 'Z'. If we made it this far and /* Functions are always terminated by 'Z'. If we made it this far and
...@@ -496,7 +500,8 @@ static char* get_literal_string(struct parsed_symbol* sym) ...@@ -496,7 +500,8 @@ static char* get_literal_string(struct parsed_symbol* sym)
} }
} while (*++sym->current != '@'); } while (*++sym->current != '@');
sym->current++; sym->current++;
str_array_push(sym, ptr, sym->current - 1 - ptr, &sym->names); if (!str_array_push(sym, ptr, sym->current - 1 - ptr, &sym->names))
return NULL;
return str_array_get_ref(&sym->names, sym->names.num - sym->names.start - 1); return str_array_get_ref(&sym->names, sym->names.num - sym->names.start - 1);
} }
...@@ -564,17 +569,17 @@ static BOOL get_class(struct parsed_symbol* sym) ...@@ -564,17 +569,17 @@ static BOOL get_class(struct parsed_symbol* sym)
if (*++sym->current == '$') if (*++sym->current == '$')
{ {
sym->current++; sym->current++;
if ((name = get_template_name(sym))) if ((name = get_template_name(sym)) &&
str_array_push(sym, name, -1, &sym->names); !str_array_push(sym, name, -1, &sym->names))
return FALSE;
} }
break; break;
default: default:
name = get_literal_string(sym); name = get_literal_string(sym);
break; break;
} }
if (!name) if (!name || !str_array_push(sym, name, -1, &sym->stack))
return FALSE; return FALSE;
str_array_push(sym, name, -1, &sym->stack);
} }
sym->current++; sym->current++;
return TRUE; return TRUE;
...@@ -918,8 +923,9 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct, ...@@ -918,8 +923,9 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct,
if (add_pmt && pmt_ref && in_args) if (add_pmt && pmt_ref && in_args)
{ {
/* left and right are pushed as two separate strings */ /* left and right are pushed as two separate strings */
str_array_push(sym, ct->left ? ct->left : "", -1, pmt_ref); if (!str_array_push(sym, ct->left ? ct->left : "", -1, pmt_ref) ||
str_array_push(sym, ct->right ? ct->right : "", -1, pmt_ref); !str_array_push(sym, ct->right ? ct->right : "", -1, pmt_ref))
return FALSE;
} }
done: done:
...@@ -1334,7 +1340,8 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) ...@@ -1334,7 +1340,8 @@ static BOOL symbol_demangle(struct parsed_symbol* sym)
ret = TRUE; ret = TRUE;
goto done; goto done;
default: default:
str_array_push(sym, function_name, -1, &sym->stack); if (!str_array_push(sym, function_name, -1, &sym->stack))
return FALSE;
break; break;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment