]> git.saurik.com Git - cycript.git/blobdiff - sig/parse.cpp
Only link libcycript against libffi (not cycript).
[cycript.git] / sig / parse.cpp
index 51782d2f98f0175c6dffcb22a42e1a75093bc240..a0e1a96bdf73a0788c59678bde697cf0f14a220c 100644 (file)
@@ -1,20 +1,20 @@
 /* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2012  Jay Freeman (saurik)
+ * Copyright (C) 2009-2013  Jay Freeman (saurik)
 */
 
-/* GNU Lesser General Public License, Version 3 {{{ */
+/* GNU General Public License, Version 3 {{{ */
 /*
- * Cycript is free software: you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
+ * Cycript is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
  *
- * Cycript is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
- * License for more details.
+ * Cycript is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU Lesser General Public License
+ * You should have received a copy of the GNU General Public License
  * along with Cycript.  If not, see <http://www.gnu.org/licenses/>.
 **/
 /* }}} */
@@ -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<char *>(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);
+}
+
 }