Function: org-babel-C-execute

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

Signature

(org-babel-C-execute BODY PARAMS)

Documentation

Execute C/C++/D BODY according to its header arguments PARAMS.

This function should only be called by org-babel-execute:C or org-babel-execute:C++ or org-babel-execute:D.

Source Code

;; Defined in /usr/src/emacs/lisp/org/ob-C.el.gz
(defun org-babel-C-execute (body params)
  "Execute C/C++/D BODY according to its header arguments PARAMS.
This function should only be called by `org-babel-execute:C' or
`org-babel-execute:C++' or `org-babel-execute:D'."
  (let* ((tmp-src-file (org-babel-temp-file
			"C-src-"
			(pcase org-babel-c-variant
			  (`c ".c") (`cpp ".cpp") (`d ".d"))))
	 (tmp-bin-file			;not used for D
	  (org-babel-process-file-name
	   (org-babel-temp-file "C-bin-" org-babel-exeext)))
	 (cmdline (cdr (assq :cmdline params)))
	 (cmdline (if cmdline (concat " " cmdline) ""))
	 (flags (cdr (assq :flags params)))
	 (flags (mapconcat 'identity
			   (if (listp flags) flags (list flags)) " "))
	 (libs (org-babel-read
		(or (cdr (assq :libs params))
		    (org-entry-get nil "libs" t))
		nil))
	 (libs (mapconcat #'identity
			  (if (listp libs) libs (list libs))
			  " "))
	 (full-body
	  (pcase org-babel-c-variant
	    (`c (org-babel-C-expand-C body params))
	    (`cpp (org-babel-C-expand-C++ body params))
	    (`d (org-babel-C-expand-D body params)))))
    (with-temp-file tmp-src-file (insert full-body))
    (pcase org-babel-c-variant
      ((or `c `cpp)
       (org-babel-eval
	(format "%s -o %s %s %s %s"
		(pcase org-babel-c-variant
		  (`c org-babel-C-compiler)
		  (`cpp org-babel-C++-compiler))
		tmp-bin-file
		flags
		(org-babel-process-file-name tmp-src-file)
		libs)
	""))
      (`d nil)) ;; no separate compilation for D
    (let ((results
	   (org-babel-eval
	    (pcase org-babel-c-variant
	      ((or `c `cpp)
	       (concat tmp-bin-file cmdline))
	      (`d
	       (format "%s %s %s %s"
		       org-babel-D-compiler
		       flags
		       (org-babel-process-file-name tmp-src-file)
		       cmdline)))
	    "")))
      (when results
	(setq results (org-remove-indentation results))
	(org-babel-reassemble-table
	 (org-babel-result-cond (cdr (assq :result-params params))
	   results
	   (let ((tmp-file (org-babel-temp-file "c-")))
	     (with-temp-file tmp-file (insert results))
	     (org-babel-import-elisp-from-file tmp-file)))
	 (org-babel-pick-name
	  (cdr (assq :colname-names params)) (cdr (assq :colnames params)))
	 (org-babel-pick-name
	  (cdr (assq :rowname-names params)) (cdr (assq :rownames params)))))
      )))