diff options
Diffstat (limited to 'lisp/ob-C.el')
-rw-r--r-- | lisp/ob-C.el | 150 |
1 files changed, 79 insertions, 71 deletions
diff --git a/lisp/ob-C.el b/lisp/ob-C.el index a6d4d5e..0bd911e 100644 --- a/lisp/ob-C.el +++ b/lisp/ob-C.el @@ -1,4 +1,4 @@ -;;; ob-C.el --- org-babel functions for C and similar languages +;;; ob-C.el --- Babel Functions for C and Similar Languages -*- lexical-binding: t; -*- ;; Copyright (C) 2010-2016 Free Software Foundation, Inc. @@ -31,12 +31,14 @@ ;; - not much in the way of error feedback ;;; Code: -(require 'ob) + (require 'cc-mode) +(require 'ob) + -(declare-function org-entry-get "org" - (pom property &optional inherit literal-nil)) +(declare-function org-entry-get "org" (pom property &optional inherit literal-nil)) (declare-function org-remove-indentation "org" (code &optional n)) +(declare-function org-trim "org" (s &optional keep-lead)) (defvar org-babel-tangle-lang-exts) (add-to-list 'org-babel-tangle-lang-exts '("C++" . "cpp")) @@ -120,39 +122,47 @@ header arguments." or `org-babel-execute:C++' or `org-babel-execute:D'." (let* ((tmp-src-file (org-babel-temp-file "C-src-" - (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))) + (pcase org-babel-c-variant + (`c ".c") (`cpp ".cpp") (`d ".d")))) + (tmp-bin-file ;not used for D + (org-babel-temp-file "C-bin-" org-babel-exeext)) + (cmdline (cdr (assq :cmdline params))) (cmdline (if cmdline (concat " " cmdline) "")) - (flags (cdr (assoc :flags params))) + (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 - (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))))) + (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)) - (case org-babel-c-variant - ((c cpp) + (pcase org-babel-c-variant + ((or `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)) + (format "%s -o %s %s %s %s" + (pcase 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 + (org-babel-process-file-name tmp-src-file) + libs) + "")) + (`d nil)) ;; no separate compilation for D (let ((results (org-babel-eval - (case org-babel-c-variant - ((c cpp) + (pcase org-babel-c-variant + ((or `c `cpp) (concat tmp-bin-file cmdline)) - (d + (`d (format "%s %s %s %s" org-babel-D-compiler flags @@ -160,17 +170,17 @@ or `org-babel-execute:C++' or `org-babel-execute:D'." cmdline))) ""))) (when results - (setq results (org-babel-trim (org-remove-indentation results))) + (setq results (org-trim (org-remove-indentation results))) (org-babel-reassemble-table - (org-babel-result-cond (cdr (assoc :result-params params)) + (org-babel-result-cond (cdr (assq :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))) + (cdr (assq :colname-names params)) (cdr (assq :colnames params))) (org-babel-pick-name - (cdr (assoc :rowname-names params)) (cdr (assoc :rownames params))))) + (cdr (assq :rowname-names params)) (cdr (assq :rownames params))))) ))) (defun org-babel-C-expand-C++ (body params) @@ -181,15 +191,15 @@ its header arguments." (defun org-babel-C-expand-C (body params) "Expand a block of C or C++ code with org-babel according to its 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"))) + (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 - (or (cdr (assoc :includes params)) + (or (cdr (assq :includes params)) (org-entry-get nil "includes" t)) nil)) (defines (org-babel-read - (or (cdr (assoc :defines params)) + (or (cdr (assq :defines params)) (org-entry-get nil "defines" t)) nil))) (when (stringp includes) @@ -230,10 +240,10 @@ its header arguments." (defun org-babel-C-expand-D (body params) "Expand a block of D code with org-babel according to its 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"))) - (imports (or (cdr (assoc :imports params)) + (let ((vars (org-babel--get-vars params)) + (colnames (cdr (assq :colname-names params))) + (main-p (not (string= (cdr (assq :main params)) "no"))) + (imports (or (cdr (assq :imports params)) (org-babel-read (org-entry-get nil "imports" t))))) (when (stringp imports) (setq imports (split-string imports))) @@ -265,12 +275,12 @@ its header arguments." body (format "int main() {\n%s\nreturn 0;\n}\n" body))) -(defun org-babel-prep-session:C (session params) +(defun org-babel-prep-session:C (_session _params) "This function does nothing as C is a compiled language with no support for sessions" (error "C is a compiled languages -- no support for sessions")) -(defun org-babel-load-session:C (session body params) +(defun org-babel-load-session:C (_session _body _params) "This function does nothing as C is a compiled language with no support for sessions" (error "C is a compiled languages -- no support for sessions")) @@ -290,14 +300,14 @@ Return a list (TYPE-NAME FORMAT). TYPE-NAME should be the name of the type. FORMAT can be either a format string or a function which is called with VAL." (let* ((basetype (org-babel-C-val-to-base-type val)) (type - (case basetype - (integerp '("int" "%d")) - (floatp '("double" "%f")) - (stringp + (pcase basetype + (`integerp '("int" "%d")) + (`floatp '("double" "%f")) + (`stringp (list - (if (equal org-babel-c-variant 'd) "string" "const char*") + (if (eq org-babel-c-variant 'd) "string" "const char*") "\"%s\"")) - (t (error "unknown type %S" basetype))))) + (_ (error "unknown type %S" basetype))))) (cond ((integerp val) type) ;; an integer declared in the #+begin_src line ((floatp val) type) ;; a numeric declared in the #+begin_src line @@ -307,25 +317,25 @@ FORMAT can be either a format string or a function which is called with VAL." (cons (format "[%d][%d]" (length val) (length (car val))) (concat - (if (equal org-babel-c-variant 'd) "[\n" "{\n") + (if (eq org-babel-c-variant 'd) "[\n" "{\n") (mapconcat (lambda (v) (concat - (if (equal org-babel-c-variant 'd) " [" " {") + (if (eq org-babel-c-variant 'd) " [" " {") (mapconcat (lambda (w) (format ,(cadr type) w)) v ",") - (if (equal org-babel-c-variant 'd) "]" "}"))) + (if (eq org-babel-c-variant 'd) "]" "}"))) val ",\n") - (if (equal org-babel-c-variant 'd) "\n]" "\n}")))))) + (if (eq org-babel-c-variant 'd) "\n]" "\n}")))))) ((or (listp val) (vectorp val)) ;; a list declared in the #+begin_src line `(,(car type) (lambda (val) (cons (format "[%d]" (length val)) (concat - (if (equal org-babel-c-variant 'd) "[" "{") + (if (eq org-babel-c-variant 'd) "[" "{") (mapconcat (lambda (v) (format ,(cadr type) v)) val ",") - (if (equal org-babel-c-variant 'd) "]" "}")))))) + (if (eq org-babel-c-variant 'd) "]" "}")))))) (t ;; treat unknown types as string type)))) @@ -340,12 +350,12 @@ FORMAT can be either a format string or a function which is called with VAL." ((or (listp val) (vectorp val)) (let ((type nil)) (mapc (lambda (v) - (case (org-babel-C-val-to-base-type v) - (stringp (setq type 'stringp)) - (floatp + (pcase (org-babel-C-val-to-base-type v) + (`stringp (setq type 'stringp)) + (`floatp (if (or (not type) (eq type 'integerp)) (setq type 'floatp))) - (integerp + (`integerp (unless type (setq type 'integerp))))) val) type)) @@ -387,8 +397,8 @@ of the same value." (defun org-babel-C-utility-header-to-C () "Generate a utility function to convert a column name into a column number." - (case org-babel-c-variant - ((c cpp) + (pcase org-babel-c-variant + ((or `c `cpp) "int get_column_num (int nbcols, const char** header, const char* column) { int c; @@ -397,9 +407,8 @@ into a column number." return c; return -1; } -" - ) - (d +") + (`d "int get_column_num (string[] header, string column) { foreach (c, h; header) @@ -407,8 +416,7 @@ into a column number." return to!int(c); return -1; } -" - ))) +"))) (defun org-babel-C-header-to-C (head) "Convert an elisp list of header table into a C or D vector @@ -417,21 +425,21 @@ specifying a variable with the name of the table." (headers (cdr head))) (concat (format - (case org-babel-c-variant - ((c cpp) "const char* %s_header[%d] = {%s};") - (d "string %s_header[%d] = [%s];")) + (pcase org-babel-c-variant + ((or `c `cpp) "const char* %s_header[%d] = {%s};") + (`d "string %s_header[%d] = [%s];")) table (length headers) (mapconcat (lambda (h) (format "%S" h)) headers ",")) "\n" - (case org-babel-c-variant - ((c cpp) + (pcase org-babel-c-variant + ((or `c `cpp) (format "const char* %s_h (int row, const char* col) { return %s[row][get_column_num(%d,%s_header,col)]; }" table table (length headers) table)) - (d + (`d (format - "string %s_h (ulong row, string col) { return %s[row][get_column_num(%s_header,col)]; }" + "string %s_h (size_t row, string col) { return %s[row][get_column_num(%s_header,col)]; }" table table table)))))) (provide 'ob-C) |