Re: [O] [PATCH] ob-C: Add list support.

2013-06-06 Thread Rüdiger Sonderfeld
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.

2013-06-06 Thread Eric Schulte
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.

2013-06-06 Thread Rüdiger Sonderfeld
* 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.

2013-06-06 Thread Eric Schulte
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.

2013-06-06 Thread Rüdiger Sonderfeld
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.

2013-06-06 Thread Eric Schulte
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.

2013-06-05 Thread Rüdiger Sonderfeld
* 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)))
+