src/final.lisp (test-parse-c-type): Abstract out the tedious setup stage.
authorMark Wooding <mdw@distorted.org.uk>
Fri, 6 Jul 2018 23:06:15 +0000 (00:06 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 9 Jul 2018 11:02:05 +0000 (12:02 +0100)
src/final.lisp

index 96e9625..0b7a366 100644 (file)
        (output-module module reason out)))
     (list nerror nwarning)))
 
+(defmacro with-test-scanner ((scanner string) &body body)
+  "Common machinery for `test-parse-MUMBLE' below.
+
+   This is too specialized to make more widely available."
+  (with-gensyms (in charscan)
+    (once-only (string)
+      `(with-input-from-string (,in ,string)
+        (let* ((*module-type-map* (make-hash-table))
+               (,charscan (make-instance 'charbuf-scanner
+                                         :stream ,in
+                                         :filename "<string>"))
+               (,scanner (make-instance 'sod-token-scanner
+                                        :char-scanner ,charscan
+                                        :filename "<string>")))
+          (with-parser-context (token-scanner-context :scanner ,scanner)
+            ,@body))))))
+
 (export 'test-parse-c-type)
 (defun test-parse-c-type (string)
   "Parse STRING as a C type, with optional kernel, and show the results."
-  (with-input-from-string (in string)
-    (let* ((*module-type-map* (make-hash-table))
-          (charscan (make-instance 'charbuf-scanner
-                                   :stream in
-                                   :filename "<string>"))
-          (tokscan (make-instance 'sod-token-scanner
-                                  :char-scanner charscan
-                                  :filename "<string>")))
-      (with-parser-context (token-scanner-context :scanner tokscan)
-       (multiple-value-bind (value winp consumedp)
-           (parse (seq ((decls (parse-c-type tokscan))
-                        (type (parse-declarator tokscan decls :abstractp t))
-                        :eof)
-                    type))
-         (declare (ignore consumedp))
-         (if winp
-             (values t (car value) (cdr value)
-                     (princ-to-string (car value)))
-             (values nil value)))))))
+  (with-test-scanner (scanner string)
+    (multiple-value-bind (value winp consumedp)
+       (parse (seq ((decls (parse-c-type scanner))
+                    (type (parse-declarator scanner decls :abstractp t))
+                    :eof)
+                   type))
+      (declare (ignore consumedp))
+      (if winp
+         (values t (car value) (cdr value)
+                 (princ-to-string (car value)))
+         (values nil value)))))
 
 (export 'test-parser)
 (defmacro test-parser ((scanner &key backtrace) parser input)