summaryrefslogtreecommitdiff
path: root/lisp/ob-C.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/ob-C.el')
-rw-r--r--lisp/ob-C.el150
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)