Re: [O] [PATCH] ob-C: Add list support.
On Thursday 06 June 2013 12:10:11 Eric Schulte wrote: > Applied, Thanks for the excellent patch, test code and examples! Thank you for all the great work on org-mode! Regards Rüdiger
Re: [O] [PATCH] ob-C: Add list support.
Applied, Thanks for the excellent patch, test code and examples! Rüdiger Sonderfeld writes: > * lisp/ob-C.el (org-babel-C-var-to-C): Add list support > (org-babel-C-val-to-C-list-type, org-babel-C-val-to-C-type, > org-babel-C-format-val): New functions. > (org-babel-C-ensure-main-wrap, org-babel-execute:C, > org-babel-execute:C++, rg-babel-execute:cpp, org-babel-C++-compiler, > org-babel-C-compiler): Improve docstring. > * testing/examples/ob-C-test.org (string_var): Add required std:: > (Array): Add missing ID. > (Matrix): Add tests for list support. > * testing/lisp/test-ob-C.el (ob-C/table): Test succeeds. > (ob-C/list-var, ob-C/vector-var, ob-C/list-list-var): Add tests for > list support. > > Signed-off-by: Rüdiger Sonderfeld > --- > lisp/ob-C.el | 98 > +++--- > testing/examples/ob-C-test.org | 28 +++- > testing/lisp/test-ob-C.el | 20 - > 3 files changed, 118 insertions(+), 28 deletions(-) > > diff --git a/lisp/ob-C.el b/lisp/ob-C.el > index b1e8a06..e9eec93 100644 > --- a/lisp/ob-C.el > +++ b/lisp/ob-C.el > @@ -44,24 +44,24 @@ (defvar org-babel-default-header-args:C '()) > > (defvar org-babel-C-compiler "gcc" >"Command used to compile a C source code file into an > - executable.") > +executable.") > > (defvar org-babel-C++-compiler "g++" >"Command used to compile a C++ source code file into an > - executable.") > +executable.") > > (defvar org-babel-c-variant nil >"Internal variable used to hold which type of C (e.g. C or C++) > is currently being evaluated.") > > (defun org-babel-execute:cpp (body params) > - "Execute BODY according to PARAMS. This function calls > -`org-babel-execute:C++'." > + "Execute BODY according to PARAMS. > +This function calls `org-babel-execute:C++'." >(org-babel-execute:C++ 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'." > + "Execute a block of C++ code with org-babel. > +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) > @@ -70,8 +70,8 @@ (defun org-babel-expand-body:C++ (body params) >(let ((org-babel-c-variant 'cpp)) (org-babel-C-expand 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'." > + "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) > @@ -146,10 +146,10 @@ (defun org-babel-C-expand (body params) > body) "\n") "\n"))) > > (defun org-babel-C-ensure-main-wrap (body) > - "Wrap body in a \"main\" function call if none exists." > + "Wrap BODY in a \"main\" function call if none exists." >(if (string-match "^[ \t]*[intvod]+[ \t\n\r]*main[ \t]*(.*)" body) >body > -(format "int main() {\n%s\nreturn(0);\n}\n" body))) > +(format "int main() {\n%s\nreturn 0;\n}\n" body))) > > (defun org-babel-prep-session:C (session params) >"This function does nothing as C is a compiled language with no > @@ -163,6 +163,59 @@ (defun org-babel-load-session:C (session body params) > > ;; helper functions > > +(defun org-babel-C-format-val (type val) > + "Handle the FORMAT part of TYPE with the data from VAL." > + (let ((format-data (cadr type))) > +(if (stringp format-data) > + (cons "" (format format-data val)) > + (funcall format-data val > + > +(defun org-babel-C-val-to-C-type (val) > + "Determine the type of VAL. > +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." > + (cond > + ((integerp val) '("int" "%d")) > + ((floatp val) '("double" "%f")) > + ((or (listp val) (vectorp val)) > +(lexical-let ((type (org-babel-C-val-to-C-list-type val))) > + (list (car type) > + (lambda (val) > + (cons > +(format "[%d]%s" > +(length val) > +(car (org-babel-C-format-val type (elt val 0 > +(concat "{ " > +(mapconcat (lambda (v) > + (cdr (org-babel-C-format-val type v))) > + val > + ", ") > +" }")) > + (t ;; treat unknown types as string > +'("char" (lambda (val) > +(let ((s (format "%s" val))) ;; convert to string for unknown > types > + (cons (format "[%d]" (1+ (length s))) > +(concat "\"" s "\"" > + > +(defun org-babel-C-val-to-C-list-type (val) > +
[O] [PATCH] ob-C: Add list support.
* lisp/ob-C.el (org-babel-C-var-to-C): Add list support (org-babel-C-val-to-C-list-type, org-babel-C-val-to-C-type, org-babel-C-format-val): New functions. (org-babel-C-ensure-main-wrap, org-babel-execute:C, org-babel-execute:C++, rg-babel-execute:cpp, org-babel-C++-compiler, org-babel-C-compiler): Improve docstring. * testing/examples/ob-C-test.org (string_var): Add required std:: (Array): Add missing ID. (Matrix): Add tests for list support. * testing/lisp/test-ob-C.el (ob-C/table): Test succeeds. (ob-C/list-var, ob-C/vector-var, ob-C/list-list-var): Add tests for list support. Signed-off-by: Rüdiger Sonderfeld --- lisp/ob-C.el | 98 +++--- testing/examples/ob-C-test.org | 28 +++- testing/lisp/test-ob-C.el | 20 - 3 files changed, 118 insertions(+), 28 deletions(-) diff --git a/lisp/ob-C.el b/lisp/ob-C.el index b1e8a06..e9eec93 100644 --- a/lisp/ob-C.el +++ b/lisp/ob-C.el @@ -44,24 +44,24 @@ (defvar org-babel-default-header-args:C '()) (defvar org-babel-C-compiler "gcc" "Command used to compile a C source code file into an - executable.") +executable.") (defvar org-babel-C++-compiler "g++" "Command used to compile a C++ source code file into an - executable.") +executable.") (defvar org-babel-c-variant nil "Internal variable used to hold which type of C (e.g. C or C++) is currently being evaluated.") (defun org-babel-execute:cpp (body params) - "Execute BODY according to PARAMS. This function calls -`org-babel-execute:C++'." + "Execute BODY according to PARAMS. +This function calls `org-babel-execute:C++'." (org-babel-execute:C++ 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'." + "Execute a block of C++ code with org-babel. +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) @@ -70,8 +70,8 @@ (defun org-babel-expand-body:C++ (body params) (let ((org-babel-c-variant 'cpp)) (org-babel-C-expand 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'." + "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) @@ -146,10 +146,10 @@ (defun org-babel-C-expand (body params) body) "\n") "\n"))) (defun org-babel-C-ensure-main-wrap (body) - "Wrap body in a \"main\" function call if none exists." + "Wrap BODY in a \"main\" function call if none exists." (if (string-match "^[ \t]*[intvod]+[ \t\n\r]*main[ \t]*(.*)" body) body -(format "int main() {\n%s\nreturn(0);\n}\n" body))) +(format "int main() {\n%s\nreturn 0;\n}\n" body))) (defun org-babel-prep-session:C (session params) "This function does nothing as C is a compiled language with no @@ -163,6 +163,59 @@ (defun org-babel-load-session:C (session body params) ;; helper functions +(defun org-babel-C-format-val (type val) + "Handle the FORMAT part of TYPE with the data from VAL." + (let ((format-data (cadr type))) +(if (stringp format-data) + (cons "" (format format-data val)) + (funcall format-data val + +(defun org-babel-C-val-to-C-type (val) + "Determine the type of VAL. +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." + (cond + ((integerp val) '("int" "%d")) + ((floatp val) '("double" "%f")) + ((or (listp val) (vectorp val)) +(lexical-let ((type (org-babel-C-val-to-C-list-type val))) + (list (car type) + (lambda (val) + (cons + (format "[%d]%s" + (length val) + (car (org-babel-C-format-val type (elt val 0 + (concat "{ " + (mapconcat (lambda (v) + (cdr (org-babel-C-format-val type v))) + val + ", ") + " }")) + (t ;; treat unknown types as string +'("char" (lambda (val) + (let ((s (format "%s" val))) ;; convert to string for unknown types +(cons (format "[%d]" (1+ (length s))) + (concat "\"" s "\"" + +(defun org-babel-C-val-to-C-list-type (val) + "Determine the C array type of a VAL." + (let (type) +(mapc + #'(lambda (i) +(let* ((tmp-type (org-babel-C-val-to-C-type i)) + (type-name (car type)) + (tmp-type-name (car tmp-type))) + (when (and type (not (string= type-name tmp-type-name))) +
Re: [O] [PATCH] ob-C: Add list support.
Rüdiger Sonderfeld writes: > Hi Eric, > > On Thursday 06 June 2013 10:21:26 Eric Schulte wrote: >> Thanks for sharing this patch. I looks great, however as it is >10 >> lines long to apply it we'll need you to sign the FSF papers. Please >> see the following page for more information. > > I have signed the papers already. > Okay great, Would you mind re-sending your patch as formatted with git format-patch so that I can easily apply it? The version in your previous email throws errors when applied with "git am". Carsten, Could you add Rüdiger to the list of contributors on worg? Thanks, > > Regards > Rüdiger -- Eric Schulte http://cs.unm.edu/~eschulte
Re: [O] [PATCH] ob-C: Add list support.
Hi Eric, On Thursday 06 June 2013 10:21:26 Eric Schulte wrote: > Thanks for sharing this patch. I looks great, however as it is >10 > lines long to apply it we'll need you to sign the FSF papers. Please > see the following page for more information. I have signed the papers already. Regards Rüdiger
Re: [O] [PATCH] ob-C: Add list support.
Hi Rüdiger, Thanks for sharing this patch. I looks great, however as it is >10 lines long to apply it we'll need you to sign the FSF papers. Please see the following page for more information. http://orgmode.org/worg/org-contribute.html Thanks, Rüdiger Sonderfeld writes: > * lisp/ob-C.el (org-babel-C-var-to-C): Add list support > (org-babel-C-val-to-C-list-type, org-babel-C-val-to-C-type, > org-babel-C-format-val): New functions. > (org-babel-C-ensure-main-wrap, org-babel-execute:C, > org-babel-execute:C++, rg-babel-execute:cpp, org-babel-C++-compiler, > org-babel-C-compiler): Improve docstring. > * testing/examples/ob-C-test.org (string_var): Add required std:: > (Array): Add missing ID. > (Matrix): Add tests for list support. > * testing/lisp/test-ob-C.el (ob-C/table): Test succeeds. > (ob-C/list-var, ob-C/vector-var, ob-C/list-list-var): Add tests for > list support. > > Signed-off-by: Rüdiger Sonderfeld > --- > lisp/ob-C.el | 98 > +++--- > testing/examples/ob-C-test.org | 28 +++- > testing/lisp/test-ob-C.el | 20 - > 3 files changed, 118 insertions(+), 28 deletions(-) > > diff --git a/lisp/ob-C.el b/lisp/ob-C.el > index b1e8a06..e9eec93 100644 > --- a/lisp/ob-C.el > +++ b/lisp/ob-C.el > @@ -44,24 +44,24 @@ (defvar org-babel-default-header-args:C '()) > > (defvar org-babel-C-compiler "gcc" >"Command used to compile a C source code file into an > - executable.") > +executable.") > > (defvar org-babel-C++-compiler "g++" >"Command used to compile a C++ source code file into an > - executable.") > +executable.") > > (defvar org-babel-c-variant nil >"Internal variable used to hold which type of C (e.g. C or C++) > is currently being evaluated.") > > (defun org-babel-execute:cpp (body params) > - "Execute BODY according to PARAMS. This function calls > -`org-babel-execute:C++'." > + "Execute BODY according to PARAMS. > +This function calls `org-babel-execute:C++'." >(org-babel-execute:C++ 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'." > + "Execute a block of C++ code with org-babel. > +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) > @@ -70,8 +70,8 @@ (defun org-babel-expand-body:C++ (body params) >(let ((org-babel-c-variant 'cpp)) (org-babel-C-expand 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'." > + "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) > @@ -146,10 +146,10 @@ (defun org-babel-C-expand (body params) > body) "\n") "\n"))) > > (defun org-babel-C-ensure-main-wrap (body) > - "Wrap body in a \"main\" function call if none exists." > + "Wrap BODY in a \"main\" function call if none exists." >(if (string-match "^[ \t]*[intvod]+[ \t\n\r]*main[ \t]*(.*)" body) >body > -(format "int main() {\n%s\nreturn(0);\n}\n" body))) > +(format "int main() {\n%s\nreturn 0;\n}\n" body))) > > (defun org-babel-prep-session:C (session params) >"This function does nothing as C is a compiled language with no > @@ -163,6 +163,59 @@ (defun org-babel-load-session:C (session body params) > > ;; helper functions > > +(defun org-babel-C-format-val (type val) > + "Handle the FORMAT part of TYPE with the data from VAL." > + (let ((format-data (cadr type))) > +(if (stringp format-data) > + (cons "" (format format-data val)) > + (funcall format-data val > + > +(defun org-babel-C-val-to-C-type (val) > + "Determine the type of VAL. > +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." > + (cond > + ((integerp val) '("int" "%d")) > + ((floatp val) '("double" "%f")) > + ((or (listp val) (vectorp val)) > +(lexical-let ((type (org-babel-C-val-to-C-list-type val))) > + (list (car type) > + (lambda (val) > + (cons > +(format "[%d]%s" > +(length val) > +(car (org-babel-C-format-val type (elt val 0 > +(concat "{ " > +(mapconcat (lambda (v) > + (cdr (org-babel-C-format-val type v))) > + val > + ", ") > +" }")) > + (t ;; treat unknown types as string > +'("char" (lambda (val) > +(let ((s (format "%s" val))) ;; convert to st
[O] [PATCH] ob-C: Add list support.
* lisp/ob-C.el (org-babel-C-var-to-C): Add list support (org-babel-C-val-to-C-list-type, org-babel-C-val-to-C-type, org-babel-C-format-val): New functions. (org-babel-C-ensure-main-wrap, org-babel-execute:C, org-babel-execute:C++, rg-babel-execute:cpp, org-babel-C++-compiler, org-babel-C-compiler): Improve docstring. * testing/examples/ob-C-test.org (string_var): Add required std:: (Array): Add missing ID. (Matrix): Add tests for list support. * testing/lisp/test-ob-C.el (ob-C/table): Test succeeds. (ob-C/list-var, ob-C/vector-var, ob-C/list-list-var): Add tests for list support. Signed-off-by: Rüdiger Sonderfeld --- lisp/ob-C.el | 98 +++--- testing/examples/ob-C-test.org | 28 +++- testing/lisp/test-ob-C.el | 20 - 3 files changed, 118 insertions(+), 28 deletions(-) diff --git a/lisp/ob-C.el b/lisp/ob-C.el index b1e8a06..e9eec93 100644 --- a/lisp/ob-C.el +++ b/lisp/ob-C.el @@ -44,24 +44,24 @@ (defvar org-babel-default-header-args:C '()) (defvar org-babel-C-compiler "gcc" "Command used to compile a C source code file into an - executable.") +executable.") (defvar org-babel-C++-compiler "g++" "Command used to compile a C++ source code file into an - executable.") +executable.") (defvar org-babel-c-variant nil "Internal variable used to hold which type of C (e.g. C or C++) is currently being evaluated.") (defun org-babel-execute:cpp (body params) - "Execute BODY according to PARAMS. This function calls -`org-babel-execute:C++'." + "Execute BODY according to PARAMS. +This function calls `org-babel-execute:C++'." (org-babel-execute:C++ 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'." + "Execute a block of C++ code with org-babel. +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) @@ -70,8 +70,8 @@ (defun org-babel-expand-body:C++ (body params) (let ((org-babel-c-variant 'cpp)) (org-babel-C-expand 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'." + "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) @@ -146,10 +146,10 @@ (defun org-babel-C-expand (body params) body) "\n") "\n"))) (defun org-babel-C-ensure-main-wrap (body) - "Wrap body in a \"main\" function call if none exists." + "Wrap BODY in a \"main\" function call if none exists." (if (string-match "^[ \t]*[intvod]+[ \t\n\r]*main[ \t]*(.*)" body) body -(format "int main() {\n%s\nreturn(0);\n}\n" body))) +(format "int main() {\n%s\nreturn 0;\n}\n" body))) (defun org-babel-prep-session:C (session params) "This function does nothing as C is a compiled language with no @@ -163,6 +163,59 @@ (defun org-babel-load-session:C (session body params) ;; helper functions +(defun org-babel-C-format-val (type val) + "Handle the FORMAT part of TYPE with the data from VAL." + (let ((format-data (cadr type))) +(if (stringp format-data) + (cons "" (format format-data val)) + (funcall format-data val + +(defun org-babel-C-val-to-C-type (val) + "Determine the type of VAL. +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." + (cond + ((integerp val) '("int" "%d")) + ((floatp val) '("double" "%f")) + ((or (listp val) (vectorp val)) +(lexical-let ((type (org-babel-C-val-to-C-list-type val))) + (list (car type) + (lambda (val) + (cons + (format "[%d]%s" + (length val) + (car (org-babel-C-format-val type (elt val 0 + (concat "{ " + (mapconcat (lambda (v) + (cdr (org-babel-C-format-val type v))) + val + ", ") + " }")) + (t ;; treat unknown types as string +'("char" (lambda (val) + (let ((s (format "%s" val))) ;; convert to string for unknown types +(cons (format "[%d]" (1+ (length s))) + (concat "\"" s "\"" + +(defun org-babel-C-val-to-C-list-type (val) + "Determine the C array type of a VAL." + (let (type) +(mapc + #'(lambda (i) +(let* ((tmp-type (org-babel-C-val-to-C-type i)) + (type-name (car type)) + (tmp-type-name (car tmp-type))) + (when (and type (not (string= type-name tmp-type-name))) +