Type *Parse_(CYPool &pool, const char **name, char eos, bool named, Callback callback) {
char next = *(*name)++;
- if (next == '?')
- return NULL;
Type *type(new(pool) Type());
_assert(type != NULL);
parse:
switch (next) {
+ case '?': type->primitive = unknown_P; break;
case '#': type->primitive = typename_P; break;
case '(':
case '^':
type->primitive = pointer_P;
- if (**name == '"') {
+ if (**name == '"')
+ // XXX: why is this here?
type->data.data.type = NULL;
- } else {
+ else
type->data.data.type = Parse_(pool, name, eos, named, callback);
- sig::Type *&target(type->data.data.type);
- if (target != NULL && target->primitive == void_P)
- target = NULL;
- }
break;
case 'b':
return pool.strdup(out.str().c_str());
} break;
+ case unknown_P: return "?";
case typename_P: return "#";
case union_P: return pool.strcat("(", Unparse(pool, &type->data.signature), ")", NULL);
case string_P: return "*";
} break;
case pointer_P: {
- if (type->data.data.type == NULL)
- return "^v";
- else if (type->data.data.type->primitive == function_P)
+ // XXX: protect against the weird '"' check in Parse_
+ _assert(type->data.data.type != NULL);
+ if (type->data.data.type->primitive == function_P)
return "^?";
else
return pool.strcat("^", Unparse(pool, type->data.data.type), NULL);