emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals-release/org 38f87a2: ob-C.el: Fix a number a regression


From: ELPA Syncer
Subject: [elpa] externals-release/org 38f87a2: ob-C.el: Fix a number a regressions related to table parameters
Date: Thu, 29 Apr 2021 10:57:17 -0400 (EDT)

branch: externals-release/org
commit 38f87a26b5b825b34bd25bf9ce3d2993f65cade5
Author: tbanel <tbanelwebmin@free.fr>
Commit: tbanel <tbanelwebmin@free.fr>

    ob-C.el: Fix a number a regressions related to table parameters
    
    * ob-C.el (org-babel-C-expand-C, org-babel-C-header-to-C,
    org-babel-C-expand-D): Add a `TYPE' parameter to
    `org-babel-C-header-to-C' so that the helper functions return the
    correct type.  Previoulsy for tables of non-strings the helper
    functions would attempt to return a string, leading to compilation
    errors.
    
    * ob-C.el (org-babel-C-header-to-C): Correctly quote header elements.
    Before, if the elisp value was not a string, it would not quote it,
    leading to a syntax error.
    
    * ob-C.el (org-babel-C-utility-header-to-C): Include `string.h' in
    header `get_column_num' requires `strcmp', leading to compilation
    errors.
    
    * ob-C.el (org-babel-C-var-to-C): prefered declaration of a table in D
    differs from C and C++. Example in C: `int table[2][3] = ...;'. In D:
    `int[3][2] table=...;'
    
    This patch is mainly based on Asa Zeren <asaizeren@gmail.com> patch of
    Nov 5 2020, which was not commited at that time.
---
 lisp/ob-C.el | 75 +++++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 46 insertions(+), 29 deletions(-)

diff --git a/lisp/ob-C.el b/lisp/ob-C.el
index ad6da03..c44aedb 100644
--- a/lisp/ob-C.el
+++ b/lisp/ob-C.el
@@ -258,7 +258,14 @@ its header arguments."
                (when colnames
                  (org-babel-C-utility-header-to-C))
                ;; tables headers
-               (mapconcat 'org-babel-C-header-to-C colnames "\n")
+               (mapconcat (lambda (head)
+                             (let* ((tblnm (car head))
+                                    (tbl (cdr (car (let* ((el vars))
+                                                     (while (not (or (equal 
tblnm (caar el)) (not el)))
+                                                       (setq el (cdr el)))
+                                                     el))))
+                                    (type (org-babel-C-val-to-base-type tbl)))
+                               (org-babel-C-header-to-C head type))) colnames 
"\n")
                ;; body
                (if main-p
                    (org-babel-C-ensure-main-wrap body)
@@ -290,7 +297,14 @@ its header arguments."
                (when colnames
                  (org-babel-C-utility-header-to-C))
                ;; tables headers
-               (mapconcat 'org-babel-C-header-to-C colnames "\n")
+               (mapconcat (lambda (head)
+                             (let* ((tblnm (car head))
+                                    (tbl (cdr (car (let* ((el vars))
+                                                     (while (not (or (equal 
tblnm (caar el)) (not el)))
+                                                       (setq el (cdr el)))
+                                                     el))))
+                                    (type (org-babel-C-val-to-base-type tbl)))
+                               (org-babel-C-header-to-C head type))) colnames 
"\n")
                ;; body
                (if main-p
                    (org-babel-C-ensure-main-wrap body)
@@ -407,21 +421,17 @@ of the same value."
           (data (cdr formatted)))
       (pcase org-babel-c-variant
         ((or `c `cpp)
-         (format "%s\n%s"
-                (format "typedef %s %s_type;" type var)
-                 (format "%s %s%s = %s;"
-                        type
-                        var
-                        suffix
-                        data)))
+         (format "%s %s%s = %s;"
+                type
+                var
+                suffix
+                data))
         (`d
-         (format "%s\n%s"
-                 (format "alias %s_type = %s;" var type)
-                 (format "%s%s %s = %s;"
-                     type
-                     suffix
-                     var
-                     data)))))))
+         (format "%s%s %s = %s;"
+                type
+                suffix
+                var
+                data))))))
 
 (defun org-babel-C-table-sizes-to-C (pair)
   "Create constants of table dimensions, if PAIR is a table."
@@ -441,10 +451,10 @@ into a column number."
   (pcase org-babel-c-variant
     ((or `c `cpp)
      (concat
-      (if (eq org-babel-c-variant 'c)
-          "extern "
-       "extern \"C\" ")
-      "int strcmp (const char *, const char *);
+      "
+#ifndef _STRING_H
+#include <string.h>
+#endif
 int get_column_num (int nbcols, const char** header, const char* column)
 {
   int c;
@@ -464,33 +474,40 @@ int get_column_num (int nbcols, const char** header, 
const char* column)
 }
 ")))
 
-(defun org-babel-C-header-to-C (head)
+(defun org-babel-C-header-to-C (head type)
   "Convert an elisp list of header table into a C or D vector
 specifying a variable with the name of the table."
+  (message "%S" type)
   (let ((table (car head))
-        (headers (cdr head)))
+        (headers (cdr head))
+        (typename (pcase type
+                    ('integerp "int")
+                    ('floatp "double")
+                    ('stringp (pcase org-babel-c-variant
+                                ((or 'c 'cpp) "const char*")
+                                ('d "string"))))))
     (concat
       (pcase org-babel-c-variant
        ((or `c `cpp)
          (format "const char* %s_header[%d] = {%s};"
                  table
                  (length headers)
-                 (mapconcat (lambda (h) (format "%S" h)) headers ",")))
+                 (mapconcat (lambda (h) (format "\"%s\"" h)) headers ",")))
        (`d
          (format "string[%d] %s_header = [%s];"
                  (length headers)
                  table
-                 (mapconcat (lambda (h) (format "%S" h)) headers ","))))
-     "\n"
+                 (mapconcat (lambda (h) (format "\"%s\"" h)) headers ","))))
+      "\n"
      (pcase org-babel-c-variant
        ((or `c `cpp)
        (format
-        "%s_type %s_h (int row, const char* col) { return 
%s[row][get_column_num(%d,%s_header,col)]; }"
-        table table table (length headers) table))
+        "%s %s_h (int row, const char* col) { return 
%s[row][get_column_num(%d,%s_header,col)]; }"
+        typename table table (length headers) table))
        (`d
        (format
-        "%s_type %s_h (size_t row, string col) { return 
%s[row][get_column_num(%s_header,col)]; }"
-        table table table table))))))
+        "%s %s_h (size_t row, string col) { return 
%s[row][get_column_num(%s_header,col)]; }"
+         typename table table table))))))
 
 (provide 'ob-C)
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]