X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/f33b048af6516bdeff373d3eb709f3d445233dc4..032e971ea180d9e7f9df03887bedd233c8d5c537:/sig/parse.cpp?ds=sidebyside diff --git a/sig/parse.cpp b/sig/parse.cpp index 1c0ec23..05b3213 100644 --- a/sig/parse.cpp +++ b/sig/parse.cpp @@ -37,17 +37,13 @@ */ /* }}} */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include "minimal/stdlib.h" - -#include - -#include - +#include #include "sig/parse.hpp" +#include "Error.hpp" + +#include +#include +#include namespace sig { @@ -118,7 +114,10 @@ struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named, C case '#': type->primitive = typename_P; break; case '(': - type->primitive = union_P; + if (type->data.signature.count < 2) + type->primitive = struct_P; + else + type->primitive = union_P; next = ')'; goto aggregate; @@ -157,13 +156,13 @@ struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named, C case '^': type->primitive = pointer_P; - if (**name == 'v') { - type->data.data.type = NULL; - ++*name; - } else if (**name == '"') { + if (**name == '"') { type->data.data.type = NULL; } 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; @@ -275,7 +274,7 @@ const char *Unparse(apr_pool_t *pool, struct Type *type) { return apr_psprintf(pool, "[%lu%s]", type->data.data.size, value); } break; - case pointer_P: return apr_psprintf(pool, "^%s", type->data.data.type == NULL ? "" : Unparse(pool, type->data.data.type)); + case pointer_P: return apr_psprintf(pool, "^%s", type->data.data.type == NULL ? "v" : Unparse(pool, type->data.data.type)); case bit_P: return apr_psprintf(pool, "b%zu", type->data.data.size); case char_P: return "c"; case double_P: return "d";