Function: org-babel-C-expand-C

org-babel-C-expand-C is a byte-compiled function defined in ob-C.el.gz.

Signature

(org-babel-C-expand-C BODY PARAMS)

Documentation

Expand a block of C/C++ code with org-babel according to its header arguments.

Source Code

;; Defined in /usr/src/emacs/lisp/org/ob-C.el.gz
(defun org-babel-C-expand-C (body params)
  "Expand a block of C/C++ code with org-babel according to its header arguments."
  (let ((vars (org-babel--get-vars params))
	(colnames (cdr (assq :colname-names params)))
	(main-p (not (string= (cdr (assq :main params)) "no")))
	(includes (org-babel-read
		   (cdr (assq :includes params))
		   nil))
	(defines (org-babel-read
		  (cdr (assq :defines params))
		  nil))
	(namespaces (org-babel-read
		     (cdr (assq :namespaces params))
		     nil)))
    (when (stringp includes)
      (setq includes (split-string includes)))
    (when (stringp namespaces)
      (setq namespaces (split-string namespaces)))
    (when (stringp defines)
      (let ((y nil)
	    (result (list t)))
	(dolist (x (split-string defines))
	  (if (null y)
	      (setq y x)
	    (nconc result (list (concat y " " x)))
	    (setq y nil)))
	(setq defines (cdr result))))
    (mapconcat 'identity
	       (list
		;; includes
		(mapconcat
		 (lambda (inc)
		   ;; :includes '(<foo> <bar>) gives us a list of
		   ;; symbols; convert those to strings.
		   (when (symbolp inc) (setq inc (symbol-name inc)))
		   (if (string-prefix-p "<" inc)
		       (format "#include %s" inc)
		     (format "#include \"%s\"" inc)))
		 includes "\n")
		;; defines
		(mapconcat
		 (lambda (inc) (format "#define %s" inc))
		 (if (listp defines) defines (list defines)) "\n")
		;; namespaces
		(mapconcat
		 (lambda (inc) (format "using namespace %s;" inc))
		 namespaces
		 "\n")
		;; variables
		(mapconcat 'org-babel-C-var-to-C vars "\n")
		;; table sizes
		(mapconcat 'org-babel-C-table-sizes-to-C vars "\n")
		;; tables headers utility
		(when colnames
		  (org-babel-C-utility-header-to-C))
		;; tables headers
		(mapconcat (lambda (head)
                             (let* ((tblnm (car head))
                                    (tbl (cdr (car (let* ((el vars))
                                                     (while (not (or (equal tblnm (caar el)) (not el)))
                                                       (setq el (cdr el)))
                                                     el))))
                                    (type (org-babel-C-val-to-base-type tbl)))
                               (org-babel-C-header-to-C head type))) colnames "\n")
		;; body
		(if main-p
		    (org-babel-C-ensure-main-wrap body)
		  body) "\n") "\n")))