diff options
Diffstat (limited to 'Lisp/type-handling.lisp')
-rw-r--r-- | Lisp/type-handling.lisp | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/Lisp/type-handling.lisp b/Lisp/type-handling.lisp index 152a016..abee5ae 100644 --- a/Lisp/type-handling.lisp +++ b/Lisp/type-handling.lisp @@ -18,7 +18,7 @@ (in-package #:mulk.objective-cl) -(defun parse-typespec (typestring &optional (start 0)) +(defun parse-typespec (typestring &optional return-type-p (start 0)) "Parse a typestring like \"@0:4{_NSRange=II}8\" into something like (ID ()). \"rn{_NSRange=II}8\" is parsed into (STRUCT (CONST IN) @@ -79,6 +79,7 @@ Returns: (VALUES typespec byte-position string-position)" new-string-pos) (parse-typespec typestring + nil string-position) (declare (ignore byte-position)) (setq string-position new-string-pos) @@ -88,7 +89,9 @@ Returns: (VALUES typespec byte-position string-position)" (#\^ (list 'pointer qualifiers (multiple-value-bind (typespec byte-pos new-str-pos) - (parse-typespec typestring (1+ string-position)) + (parse-typespec typestring + nil + (1+ string-position)) (declare (ignore byte-pos)) (prog1 typespec (setq string-position new-str-pos))))) @@ -101,7 +104,7 @@ Returns: (VALUES typespec byte-position string-position)" (prog1 count (setq string-position new-str-pos))) (multiple-value-bind (typespec byte-pos new-str-pos) - (parse-typespec typestring string-position) + (parse-typespec typestring nil string-position) (declare (ignore byte-pos)) ;; Skip end marker (right bracket). (prog1 typespec @@ -110,7 +113,7 @@ Returns: (VALUES typespec byte-position string-position)" (list 'complex qualifiers (multiple-value-bind (typespec byte-pos new-str-pos) - (parse-typespec typestring (1+ string-position)) + (parse-typespec typestring nil (1+ string-position)) (declare (ignore byte-pos)) (prog1 typespec (setq string-position new-str-pos))))) @@ -126,7 +129,7 @@ Returns: (VALUES typespec byte-position string-position)" (multiple-value-setq (bit-field-typespec byte-position string-position) - (parse-typespec typestring string-position)) + (parse-typespec typestring nil string-position)) (multiple-value-setq (bit-field-length string-position) (parse-integer typestring :start string-position @@ -138,11 +141,31 @@ Returns: (VALUES typespec byte-position string-position)" bit-field-typespec))) (otherwise (prog1 (list (case init-char - (#\B :boolean) - (#\c :char) - (#\C :unsigned-char) - (#\s :short) - (#\S :unsigned-short) + (#\B :boolean) ;XXX :int? + (#\c (if (or return-type-p + (eq +runtime-type+ :gnu) + (and (eq +runtime-type+ :next) + (featurep 'cffi-features:ppc32))) + :int + :char)) + (#\C (if (or return-type-p + (eq +runtime-type+ :gnu) + (and (eq +runtime-type+ :next) + (featurep 'cffi-features:ppc32))) + :unsigned-int + :unsigned-char)) + (#\s (if (or return-type-p + (eq +runtime-type+ :gnu) + (and (eq +runtime-type+ :next) + (featurep 'cffi-features:ppc32))) + :int + :short)) + (#\S (if (or return-type-p + (eq +runtime-type+ :gnu) + (and (eq +runtime-type+ :next) + (featurep 'cffi-features:ppc32))) + :unsigned-int + :unsigned-short)) (#\i :int) (#\I :unsigned-int) (#\l :long) |