>From 06996e7af7c24b8b6adc16b13c183dcc46b5362c Mon Sep 17 00:00:00 2001 From: Thierry Banel
Date: Sun, 8 Jun 2014 22:01:56 +0200 Subject: [PATCH] Babel C, C++, D support for non-homogeneous input tables * ob-C.el: handling of non-homogeneous tables, support for table header, support for iterating over table cells. (org-babel-expand-body:C++): uncomment (org-babel-C-execute): cosmetic changes (org-babel-C-expand-C): add support for table columns names, add support for table dimensions, add standard includes (org-babel-C-val-to-C-type): rewrite to support non-homogeneous tables cells (org-babel-C-table-sizes-to-C): new function to gain access to the table dimensions (org-babel-C-utility-header-to-C): (org-babel-C-header-to-C): new functions to generate support for table header. * ob-C-test.org: added D sibling tests similar to C++, added non-homogeneous table example for C++ and D * test-ob-C.el: new tests for D and non-homogeneous tables (ob-C/simple-program): (ob-C/simple-program): (ob-D/simple-program): (ob-C/integer-var): (ob-D/integer-var): (ob-C/two-integer-var): (ob-D/two-integer-var): (ob-C/string-var): (ob-D/string-var): (ob-C/preprocessor): (ob-C/table): (ob-D/table): (ob-C/list-var): (ob-D/list-var): (ob-C/vector-var): (ob-D/vector-var): (ob-C/list-list-var): (ob-D/list-list-var): (ob-C/inhomogeneous_table): (ob-D/inhomogeneous_table): add compiler availability check (ob-D/simple-program): (ob-D/integer-var): (ob-D/two-integer-var): (ob-D/string-var): (ob-D/table): (ob-D/list-var): (ob-D/vector-var): (ob-D/list-list-var): (ob-D/inhomogeneous_table): add D unit tests (ob-C/inhomogeneous_table): (ob-D/inhomogeneous_table): add non-homogeneous table unit tests --- lisp/ob-C.el | 292 +++++++++++++++++++++++++++------------- testing/examples/ob-C-test.org | 88 ++++++++++++ testing/lisp/test-ob-C.el | 161 +++++++++++++++++----- 3 files changed, 416 insertions(+), 125 deletions(-) diff --git a/lisp/ob-C.el b/lisp/ob-C.el index 793981a..dd03fa7 100644 --- a/lisp/ob-C.el +++ b/lisp/ob-C.el @@ -34,8 +34,6 @@ (require 'cl)) (require 'ob) (require 'cc-mode) -(eval-when-compile - (require 'cl)) (declare-function org-entry-get "org" (pom property &optional inherit literal-nil)) @@ -72,40 +70,40 @@ This function calls `org-babel-execute:C++'." This function is called by `org-babel-execute-src-block'." (let ((org-babel-c-variant 'cpp)) (org-babel-C-execute body params))) -;;(defun org-babel-expand-body:C++ (body params) ;; unused -;; "Expand a block of C++ code with org-babel according to it's -;;header arguments (calls `org-babel-C-expand')." -;; (let ((org-babel-c-variant 'cpp)) (org-babel-C-expand body params))) +(defun org-babel-expand-body:C++ (body params) + "Expand a block of C++ code with org-babel according to it's +header arguments." + (let ((org-babel-c-variant 'cpp)) (org-babel-C-expand-C++ body params))) (defun org-babel-execute:D (body params) "Execute a block of D code with org-babel. This function is called by `org-babel-execute-src-block'." (let ((org-babel-c-variant 'd)) (org-babel-C-execute body params))) -;; (defun org-babel-expand-body:D (body params) ;; unused -;; "Expand a block of D code with org-babel according to it's -;;header arguments (calls `org-babel-C-expand')." -;; (let ((org-babel-c-variant 'd)) (org-babel-C-expand body params))) +(defun org-babel-expand-body:D (body params) + "Expand a block of D code with org-babel according to it's +header arguments." + (let ((org-babel-c-variant 'd)) (org-babel-C-expand-D body params))) (defun org-babel-execute:C (body params) "Execute a block of C code with org-babel. This function is called by `org-babel-execute-src-block'." (let ((org-babel-c-variant 'c)) (org-babel-C-execute body params))) -;; (defun org-babel-expand-body:c (body params) ;; unused -;; "Expand a block of C code with org-babel according to it's -;;header arguments (calls `org-babel-C-expand')." -;; (let ((org-babel-c-variant 'c)) (org-babel-C-expand body params))) +(defun org-babel-expand-body:C (body params) + "Expand a block of C code with org-babel according to it's +header arguments." + (let ((org-babel-c-variant 'c)) (org-babel-C-expand-C body params))) (defun org-babel-C-execute (body 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-" - (cond - ((equal org-babel-c-variant 'c ) ".c" ) - ((equal org-babel-c-variant 'cpp) ".cpp") - ((equal org-babel-c-variant 'd ) ".d" )))) + (case org-babel-c-variant + (c ".c" ) + (cpp ".cpp") + (d ".d" )))) (tmp-bin-file (org-babel-temp-file "C-bin-" org-babel-exeext)) ;; not used for D (cmdline (cdr (assoc :cmdline params))) (cmdline (if cmdline (concat " " cmdline) "")) @@ -113,43 +111,47 @@ or `org-babel-execute:C++' or `org-babel-execute:D'." (flags (mapconcat 'identity (if (listp flags) flags (list flags)) " ")) (full-body - (cond ((equal org-babel-c-variant 'c ) (org-babel-C-expand-C body params)) - ((equal org-babel-c-variant 'cpp) (org-babel-C-expand-C++ body params)) - ((equal org-babel-c-variant 'd ) (org-babel-C-expand-D body params))))) + (case 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)) - (if (memq org-babel-c-variant '(c cpp)) ;; no separate compilation for D - (org-babel-eval - (format "%s -o %s %s %s" - (cond - ((equal org-babel-c-variant 'c ) org-babel-C-compiler) - ((equal org-babel-c-variant 'cpp) org-babel-C++-compiler)) - (org-babel-process-file-name tmp-bin-file) - flags - (org-babel-process-file-name tmp-src-file)) "")) + (case org-babel-c-variant + ((c cpp) + (org-babel-eval + (format "%s -o %s %s %s" + (case org-babel-c-variant + (c org-babel-C-compiler) + (cpp org-babel-C++-compiler)) + (org-babel-process-file-name tmp-bin-file) + flags + (org-babel-process-file-name tmp-src-file)) "")) + (d nil)) ;; no separate compilation for D (let ((results - (org-babel-trim - (org-remove-indentation - (org-babel-eval - (cond ((memq org-babel-c-variant '(c cpp)) - (concat tmp-bin-file cmdline)) - ((equal org-babel-c-variant 'd) - (format "%s %s %s %s" - org-babel-D-compiler - flags - (org-babel-process-file-name tmp-src-file) - cmdline))) - ""))))) - (org-babel-reassemble-table - (org-babel-result-cond (cdr (assoc :result-params params)) - (org-babel-read results t) - (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 (assoc :colname-names params)) (cdr (assoc :colnames params))) - (org-babel-pick-name - (cdr (assoc :rowname-names params)) (cdr (assoc :rownames params))))) - )) + (org-babel-eval + (case org-babel-c-variant + ((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-babel-trim (org-remove-indentation results))) + (org-babel-reassemble-table + (org-babel-result-cond (cdr (assoc :result-params params)) + (org-babel-read results t) + (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 (assoc :colname-names params)) (cdr (assoc :colnames params))) + (org-babel-pick-name + (cdr (assoc :rowname-names params)) (cdr (assoc :rownames params))))) + ))) (defun org-babel-C-expand-C++ (body params) "Expand a block of C or C++ code with org-babel according to @@ -160,24 +162,34 @@ it's header arguments." "Expand a block of C or C++ code with org-babel according to it's header arguments." (let ((vars (mapcar #'cdr (org-babel-get-header params :var))) + (colnames (cdar (org-babel-get-header params :colname-names))) (main-p (not (string= (cdr (assoc :main params)) "no"))) (includes (or (cdr (assoc :includes params)) (org-babel-read (org-entry-get nil "includes" t)))) (defines (org-babel-read (or (cdr (assoc :defines params)) (org-babel-read (org-entry-get nil "defines" t)))))) + (unless (listp includes) (setq includes (list includes))) + (setq includes (append includes '("