src/c-types-{impl,parse}.lisp: Support C11 `_Atomic'.
[sod] / src / codegen-proto.lisp
index 4bfaeca..7a6be33 100644 (file)
@@ -67,6 +67,9 @@
 (defparameter *sod-tmp-val*
   (make-instance 'temporary-name :tag "sod__t"))
 
+(export '*null-pointer*)
+(defparameter *null-pointer* "NULL")
+
 ;;;--------------------------------------------------------------------------
 ;;; Instructions.
 
          decls body))
 
 (definst if (stream :export t) (#1=#:cond conseq &optional alt)
-  (format-compound-statement (stream conseq alt)
-    (format stream "if (~A)" #1#))
-  (when alt
-    (format-compound-statement (stream alt)
-      (write-string "else" stream))))
+  (let ((stmt "if"))
+    (loop (format-compound-statement (stream conseq (if alt t nil))
+           (format stream "~A (~A)" stmt #1#))
+         (typecase alt
+           (null (return))
+           (if-inst (setf stmt "else if"
+                          #1# (inst-cond alt)
+                          conseq (inst-conseq alt)
+                          alt (inst-alt alt)))
+           (t (format-compound-statement (stream alt)
+                (format stream "else"))
+              (return))))))
 
 (definst while (stream :export t) (#1=#:cond body)
   (format-compound-statement (stream body)