X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/8d7447c170dd11c91d0a07768f32a2699177fa54..01d0f64d1f396362fa532d04926bd90d3aa231c3:/sig/parse.cpp diff --git a/sig/parse.cpp b/sig/parse.cpp index 51782d2..77421f9 100644 --- a/sig/parse.cpp +++ b/sig/parse.cpp @@ -117,7 +117,10 @@ struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named, C if (next == '"') { const char *quote = strchr(*name + 1, '"'); - if (!named || quote[1] == eos || quote[1] == '"') { + if (quote == NULL) { + printf("unterminated specific id type {%s}\n", *name - 10); + _assert(false); + } else if (!named || quote[1] == eos || quote[1] == '"') { type->name = apr_pstrmemdup(pool, *name + 1, quote - *name - 1); *name = quote + 1; } @@ -237,10 +240,8 @@ const char *Unparse(apr_pool_t *pool, struct Signature *signature) { return value; } -const char *Unparse(apr_pool_t *pool, struct Type *type) { - if (type == NULL) - return "?"; - else switch (type->primitive) { +const char *Unparse_(apr_pool_t *pool, struct Type *type) { + switch (type->primitive) { case typename_P: return "#"; case union_P: return apr_psprintf(pool, "(%s)", Unparse(pool, &type->data.signature)); case string_P: return "*"; @@ -276,4 +277,37 @@ const char *Unparse(apr_pool_t *pool, struct Type *type) { return NULL; } +const char *Unparse(apr_pool_t *pool, struct Type *type) { + if (type == NULL) + return "?"; + + const char *base(Unparse_(pool, type)); + if (type->flags == 0) + return base; + + #define iovec_(base, size) \ + (struct iovec) {const_cast(base), size} + + struct iovec parts[8]; + memset(parts, 0, sizeof(parts)); + + if ((type->flags & JOC_TYPE_INOUT) != 0) + parts[0] = iovec_("N", 1); + if ((type->flags & JOC_TYPE_IN) != 0) + parts[1] = iovec_("n", 1); + if ((type->flags & JOC_TYPE_BYCOPY) != 0) + parts[2] = iovec_("O", 1); + if ((type->flags & JOC_TYPE_OUT) != 0) + parts[3] = iovec_("o", 1); + if ((type->flags & JOC_TYPE_BYREF) != 0) + parts[4] = iovec_("R", 1); + if ((type->flags & JOC_TYPE_CONST) != 0) + parts[5] = iovec_("r", 1); + if ((type->flags & JOC_TYPE_ONEWAY) != 0) + parts[6] = iovec_("V", 1); + + parts[7] = iovec_(base, strlen(base)); + return apr_pstrcatv(pool, parts, 8, NULL); +} + }