(module-name module)))
(defun output-module (module reason stream)
- (let ((sequencer (make-instance 'sequencer)))
+ (let ((sequencer (make-instance 'sequencer))
+ (stream (if (typep stream 'position-aware-output-stream)
+ stream
+ (make-instance 'position-aware-output-stream
+ :stream stream
+ :file (or (stream-pathname stream)
+ #p"<unnamed>")))))
(add-output-hooks module reason sequencer)
(invoke-sequencer-items sequencer stream)))
(dolist (item (module-items module))
(add-output-hooks item reason sequencer)))
+(defmethod add-output-hooks progn
+ ((frag code-fragment-item) reason sequencer)
+ (when (eq reason (code-fragment-reason frag))
+ (dolist (constraint (code-fragment-constraints frag))
+ (add-sequencer-constraint sequencer constraint))
+ (add-sequencer-item-function sequencer (code-fragment-name frag)
+ (lambda (stream)
+ (write (code-fragment frag)
+ :stream stream
+ :pretty nil
+ :escape nil)))))
+
;;;--------------------------------------------------------------------------
;;; Header output.
(:guard :start)
(:typedefs :start) :typedefs (:typedefs :end)
(:includes :start) :includes (:includes :end)
- (:classes :start) (:classes :end)
+ (:classes :start) :classes (:classes :end)
(:guard :end)
:epilogue)
((:includes :end)
(terpri stream))))
+;;;--------------------------------------------------------------------------
+;;; Source output.
+
+(defmethod add-output-hooks progn
+ ((module module) (reason (eql :c)) sequencer)
+ (sequence-output (stream sequencer)
+ :constraint (:prologue
+ (:includes :start) :includes (:includes :end)
+ (:classes :start) (:classes :end)
+ :epilogue)
+
+ (:prologue
+ (format stream "~
+/* -*-c-*-
+ *
+ * Implementation file generated by SOD for ~A
+ */~2%"
+ (namestring (module-name module))))
+
+ (:epilogue
+ (banner "That's all, folks" stream :blank-line-p nil))
+
+ ((:includes :start)
+ (banner "External header files" stream))
+ ((:includes :end)
+ (terpri stream))))
+
;;;----- That's all, folks --------------------------------------------------