X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/b4aa79afea0c26718af8880c3ee8fea63eb21563..dc81e1c20b268c419fa88f8dd17fb92191a7ce1b:/sig/parse.cpp?ds=sidebyside diff --git a/sig/parse.cpp b/sig/parse.cpp index 5dcfd4f..2f007de 100644 --- a/sig/parse.cpp +++ b/sig/parse.cpp @@ -51,10 +51,8 @@ namespace sig { -void (*sig_aggregate)(apr_pool_t *pool, enum Primitive primitive, const char *name, struct Signature *signature, const char *types) = NULL; - -void Parse_(apr_pool_t *pool, struct Signature *signature, const char **name, char eos); -struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named); +void Parse_(apr_pool_t *pool, struct Signature *signature, const char **name, char eos, Callback callback); +struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named, Callback callback); /* XXX: I really screwed up this time */ @@ -64,10 +62,11 @@ void *prealloc_(apr_pool_t *pool, void *odata, size_t osize, size_t nsize) { return ndata; } -void Parse_(apr_pool_t *pool, struct Signature *signature, const char **name, char eos) { +void Parse_(apr_pool_t *pool, struct Signature *signature, const char **name, char eos, Callback callback) { _assert(*name != NULL); - bool named = **name == '"'; + // XXX: this is just a stupid check :( + bool named(**name == '"'); signature->elements = NULL; signature->count = 0; @@ -91,7 +90,7 @@ void Parse_(apr_pool_t *pool, struct Signature *signature, const char **name, ch *name = quote + 1; } - element->type = Parse_(pool, name, eos, named); + element->type = Parse_(pool, name, eos, named, callback); if (**name < '0' || **name > '9') element->offset = _not(size_t); @@ -105,7 +104,7 @@ void Parse_(apr_pool_t *pool, struct Signature *signature, const char **name, ch } } -struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named) { +struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named, Callback callback) { char next = *(*name)++; if (next == '?') return NULL; @@ -119,7 +118,10 @@ struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named) { 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; @@ -148,7 +150,7 @@ struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named) { case '[': type->primitive = array_P; type->data.data.size = strtoul(*name, (char **) name, 10); - type->data.data.type = Parse_(pool, name, eos, false); + type->data.data.type = Parse_(pool, name, eos, false, callback); if (**name != ']') { printf("']' != \"%s\"\n", *name); _assert(false); @@ -158,13 +160,13 @@ struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named) { 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); + 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; @@ -201,24 +203,19 @@ struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named) { else type->name = NULL; + // XXX: this types thing is a throwback to JocStrap + char *types; - if (next != '=') + if (next != '=') { types = NULL; - else { - const char *temp = *name; - Parse_(pool, &type->data.signature, name, end); + } else { + const char *temp(*name); + Parse_(pool, &type->data.signature, name, end, callback); types = (char *) apr_pstrmemdup(pool, temp, *name - temp - 1); } - if (type->name != NULL && sig_aggregate != NULL) { - char *angle = strchr(type->name, '<'); - if (angle == NULL) - (*sig_aggregate)(pool, type->primitive, type->name, &type->data.signature, types); - else { - angle = (char *) apr_pstrmemdup(pool, type->name, angle - type->name); - (*sig_aggregate)(pool, type->primitive, angle, &type->data.signature, types); - } - } + if (callback != NULL) + (*callback)(pool, type->name, types, type); } break; case 'N': type->flags |= JOC_TYPE_INOUT; goto next; @@ -242,9 +239,9 @@ struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named) { return type; } -void Parse(apr_pool_t *pool, struct Signature *signature, const char *name) { +void Parse(apr_pool_t *pool, struct Signature *signature, const char *name, Callback callback) { const char *temp = name; - Parse_(pool, signature, &temp, '\0'); + Parse_(pool, signature, &temp, '\0', callback); _assert(temp[-1] == '\0'); }