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.
This commit is contained in:
tbanel 2021-04-29 15:31:51 +02:00
parent 24a7ed50b3
commit 38f87a26b5
1 changed files with 46 additions and 29 deletions

View File

@ -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)