chiark / gitweb /
src/module-output.lisp, test/chimaera.sod: Add output items for user code.
[sod] / src / module-output.lisp
index b093b82c4138671523a906c34f4beabdac34138e..8632a029d5a8882756524da1629e3d9677b1f20e 100644 (file)
@@ -78,10 +78,10 @@ (defun output-module (module reason stream)
                    stream
                    (make-instance 'position-aware-output-stream
                                   :stream stream
-                                  :file (or (stream-pathname stream)
-                                            #p"<unnamed>")))))
-    (hook-output module reason sequencer)
-    (invoke-sequencer-items sequencer stream)))
+                                  :file (stream-pathname stream)))))
+    (with-module-environment (module)
+      (hook-output module reason sequencer)
+      (invoke-sequencer-items sequencer stream))))
 
 ;;;--------------------------------------------------------------------------
 ;;; Output implementation.
@@ -113,13 +113,15 @@ (defmethod hook-output progn ((module module) (reason (eql :h)) sequencer)
      (:guard :start)
      (:typedefs :start) :typedefs (:typedefs :end)
      (:includes :start) :includes (:includes :end)
-     (:classes :start) :classes (:classes :end)
+     (:early-user :start) :early-user (:early-user :end)
+     (:classes :start) (:classes :end)
+     (:user :start) :user (:user :end)
      (:guard :end)
      :epilogue)
 
     (:prologue
      (format stream "~
-/* -*-c-*-
+/* -*- mode: c; indent-tabs-mode: nil -*-
  *
  * Header file generated by SOD for ~A
  */~2%"
@@ -161,12 +163,14 @@ (defmethod hook-output progn ((module module) (reason (eql :c)) sequencer)
     :constraint
     (:prologue
      (:includes :start) :includes (:includes :end)
+     (:early-user :start) :early-user (:early-user :end)
      (:classes :start) (:classes :end)
+     (:user :start) :user (:user :end)
      :epilogue)
 
     (:prologue
      (format stream "~
-/* -*-c-*-
+/* -*- mode: c; indent-tabs-mode: nil -*-
  *
  * Implementation file generated by SOD for ~A
  */~2%"
@@ -180,4 +184,33 @@ (defmethod hook-output progn ((module module) (reason (eql :c)) sequencer)
     ((:includes :end)
      (terpri stream))))
 
+;;;--------------------------------------------------------------------------
+;;; Output types.
+
+(defvar *output-types* nil
+  "List of known output types.")
+
+(export 'declare-output-type)
+(defun declare-output-type (reason pathname)
+  "Record that REASON is a valid user-level output type.
+
+   The output file name will be constructed by merging the module's pathname
+   with PATHNAME."
+  (setf (get reason 'output-type) pathname))
+
+(export 'output-type-pathname)
+(defun output-type-pathname (reason)
+  "Return the PATHNAME template for the output type REASON.
+
+   Report an error if there is no such output type."
+  (or (get reason 'output-type)
+      (error "Unknown output type `~(~A~)'" reason)))
+
+(define-clear-the-decks reset-output-types
+  "Clear out the registered output types."
+  (dolist (reason *output-types*) (remprop reason 'output-type))
+  (setf *output-types* nil)
+  (declare-output-type :c (make-pathname :type "C" :case :common))
+  (declare-output-type :h (make-pathname :type "H" :case :common)))
+
 ;;;----- That's all, folks --------------------------------------------------