From de6e91099af05b579eca7828aa1a4dafd0e9d7b5 Mon Sep 17 00:00:00 2001 From: Thomas Koopman Date: Thu, 22 Jan 2026 20:33:00 +0100 Subject: [PATCH 1/9] Something like this? --- src/structures/StringArray.sac | 17 +++--- src/structures/src/StringArray/StringArray.h | 34 ++++++++---- src/structures/src/StringArray/alloc.c | 17 +++--- src/structures/src/StringArray/copy.c | 30 ++++------ src/structures/src/StringArray/dim.c | 15 +---- src/structures/src/StringArray/free.c | 22 ++------ src/structures/src/StringArray/genarray.c | 55 ++++++------------- src/structures/src/StringArray/index2offset.c | 23 ++++---- src/structures/src/StringArray/modarray.c | 37 ++----------- src/structures/src/StringArray/sel.c | 31 +---------- src/structures/src/StringArray/shape.c | 32 +++-------- 11 files changed, 100 insertions(+), 213 deletions(-) diff --git a/src/structures/StringArray.sac b/src/structures/StringArray.sac index 60990f3d..aac0c1d8 100644 --- a/src/structures/StringArray.sac +++ b/src/structures/StringArray.sac @@ -24,38 +24,39 @@ external typedef stringArray; #pragma linkobj "src/StringArray/alloc.o" #pragma freefun "SAC_StringArray_free" #pragma copyfun "SAC_StringArray_copy" + #pragma ctype "array *" external int dim(stringArray s); #pragma linkname "SAC_StringArray_dim" #pragma linkobj "src/StringArray/dim.o" - #pragma refcounting [0,1] - #pragma linksign [1,2] + #pragma linksign [0,1] + #pragma header "src/StringArray/StringArray.h" external int[.] shape(stringArray s); #pragma linkname "SAC_StringArray_shape" #pragma linkobj "src/StringArray/shape.o" - #pragma refcounting [0,1] - #pragma linksign [1,2] + #pragma linksign [0,1] + #pragma header "src/StringArray/StringArray.h" external stringArray _to_stringArray(int[.] shp, string s); #pragma linkname "SAC_StringArray_genarray" #pragma linkobj "src/StringArray/genarray.o" - #pragma refcounting [0,1,2] #pragma linksign [1,2,3] + #pragma header "src/StringArray/StringArray.h" external string _sel(int[.] idx, stringArray labs); #pragma linkname "SAC_StringArray_sel" #pragma linkobj "src/StringArray/sel.o" #pragma linkobj "src/StringArray/index2offset.o" - #pragma refcounting [0,1,2] #pragma linksign [1,2,3] + #pragma header "src/StringArray/StringArray.h" external stringArray _modarray(stringArray labs, int[.] idx, string str); #pragma linkname "SAC_StringArray_modarray" #pragma linkobj "src/StringArray/modarray.o" #pragma linkobj "src/StringArray/index2offset.o" - #pragma refcounting [0,1,2,3] - #pragma linksign [1,2,3,4] + #pragma linksign [1,1,2,3] + #pragma header "src/StringArray/StringArray.h" stringArray modarray(stringArray arr, int[n] idx, stringArray val) { diff --git a/src/structures/src/StringArray/StringArray.h b/src/structures/src/StringArray/StringArray.h index f2310eb0..780e020c 100644 --- a/src/structures/src/StringArray/StringArray.h +++ b/src/structures/src/StringArray/StringArray.h @@ -6,22 +6,32 @@ #include #include -#include "sac.h" +#include - -#define TRACE 0 +/* Keep consistent with src/String/StringC.h */ +typedef char* string; typedef struct ARRAY { - int dim; - int size; - int *shp; - char **data; - SAC_array_descriptor_t *descs; + sac_int dim; + sac_int size; + sac_int *shp; + SACarg **elems; } array; -extern array *SAC_StringArray_alloc( int dim, int size); -extern int SAC_StringArray_index2offset( int dim, int *idx, int *shp); +extern array *SAC_StringArray_alloc(sac_int dim, sac_int size); + +extern sac_int dim(array *s); + +/* This is just a helper function */ +extern sac_int SAC_StringArray_index2offset(SACarg *idx, sac_int *shp); + +extern void SAC_StringArray_free(array *arr); +extern array *SAC_StringArray_copy(array *arr); + +extern SACarg *shape(array *s); + +extern array *SAC_StringArray_genarray(SACarg *shp, SACarg *s); -extern void SAC_StringArray_free( array *arr); -extern array *SAC_StringArray_copy( array *arr); +extern SACarg *SAC_StringArray_sel(SACarg *idx, stringArray labs); +extern array *SAC_StringArray_modarray(array *labs, SACarg *idx, SACarg *str); diff --git a/src/structures/src/StringArray/alloc.c b/src/structures/src/StringArray/alloc.c index 31856761..37d1bcf6 100644 --- a/src/structures/src/StringArray/alloc.c +++ b/src/structures/src/StringArray/alloc.c @@ -1,20 +1,19 @@ #include #include +#include #include "StringArray.h" -array *SAC_StringArray_alloc( int dim, int size) +array *SAC_StringArray_alloc(sac_int dim, sac_int size) { array *res; - res = (array *)malloc( sizeof( array)); - res->dim = dim; - res->size = size; - res->shp = (int*)malloc( res->dim * sizeof( int)); - res->data = (char**) malloc( res->size * sizeof( char *)); - res->descs = (SAC_array_descriptor_t*) - malloc( res->size * sizeof( SAC_array_descriptor_t *)); + res = (array *)malloc(sizeof(array)); + res->dim = dim; + res->size = size; + res->shp = (sac_int *)malloc(res->dim * sizeof(sac_int)); + res->elems = (SACarg **)malloc(res->size * sizeof(SACarg *)); - return( res); + return res; } diff --git a/src/structures/src/StringArray/copy.c b/src/structures/src/StringArray/copy.c index 034fff54..c40f93d0 100644 --- a/src/structures/src/StringArray/copy.c +++ b/src/structures/src/StringArray/copy.c @@ -3,26 +3,18 @@ #include "StringArray.h" -#define subs_nt (subs, T_OLD((SCL, (HID, (NUQ,))))) - -array *SAC_StringArray_copy( array *arr) +array *SAC_StringArray_copy(array *arr) { - int i; - array *res; - SAC_ND_DECL__DESC( subs_nt, ); - char * SAC_ND_A_FIELD( subs_nt); + array *res = SAC_StringArray_alloc(arr->dim, arr->size); + + for (sac_int l = 0; l < arr->dim; l++) { + (res->shp)[l] = (arr->shp)[l]; + } + + for (sac_int i = 0; i < arr->size; i++) { + (res->elems)[l] = SACARGduplicateSaCArray((arr->elems)[l]); + } - res = SAC_StringArray_alloc( arr->dim, arr->size); - for( i=0; idim; i++) { - res->shp[i] = arr->shp[i]; - } - for( i=0; isize; i++) { - SAC_ND_A_DESC( subs_nt) = arr->descs[i]; - SAC_ND_A_FIELD( subs_nt) = arr->data[i]; - SAC_ND_INC_RC( subs_nt, 1 ); - res->descs[i] = SAC_ND_A_DESC( subs_nt); - res->data[i] = SAC_ND_A_FIELD( subs_nt); - } - return( res); + return res; } diff --git a/src/structures/src/StringArray/dim.c b/src/structures/src/StringArray/dim.c index bc39d48b..3a3abcad 100644 --- a/src/structures/src/StringArray/dim.c +++ b/src/structures/src/StringArray/dim.c @@ -1,18 +1,7 @@ #include "StringArray.h" -#define s_nt (s, T_OLD((SCL, (HID, (NUQ,))))) -#define dim_nt (dim, T_OLD((SCL, (NHD, (NUQ,))))) -#define res_nt (res, T_OLD((SCL, (NHD, (NUQ,))))) - -void SAC_StringArray_dim( SAC_ND_PARAM_out( dim_nt, int), - SAC_ND_PARAM_in( s_nt, array *)) +sac_int SAC_StringArray_dim(array *x) { - SAC_ND_DECL__DESC( res_nt, ); - SAC_ND_DECL__DATA( res_nt, int,); - - SAC_ND_ALLOC__DESC( res_nt, 0); - SAC_ND_CREATE__SCALAR__DATA( res_nt, s->dim); - - SAC_ND_RET_out( dim_nt , res_nt ) + return x->dim; } diff --git a/src/structures/src/StringArray/free.c b/src/structures/src/StringArray/free.c index 19af2bbd..82e5e343 100644 --- a/src/structures/src/StringArray/free.c +++ b/src/structures/src/StringArray/free.c @@ -3,22 +3,12 @@ #include "StringArray.h" -#define subs_nt (subs, T_OLD((SCL, (HID, (NUQ,))))) - -void SAC_StringArray_free( array *arr) +void SAC_StringArray_free(array *arr) { - int i; - SAC_ND_DECL__DESC( subs_nt, ); - char * SAC_ND_A_FIELD( subs_nt); - - for( i=0; isize; i++) { - SAC_ND_A_DESC( subs_nt) = arr->descs[i]; - SAC_ND_A_FIELD( subs_nt) = arr->data[i]; - SAC_ND_DEC_RC_FREE( subs_nt, 1 , free ); - } - free( arr->shp); - free( arr->data); - free( arr->descs); - free( arr); + for (sac_int i = 0; i < arr->size; i++) { + SACARGdeleteSacArray(&(arr->elems)[i]); + } + free(arr->shp); + free(arr->elems); } diff --git a/src/structures/src/StringArray/genarray.c b/src/structures/src/StringArray/genarray.c index 877d59f8..0e537e14 100644 --- a/src/structures/src/StringArray/genarray.c +++ b/src/structures/src/StringArray/genarray.c @@ -3,46 +3,23 @@ #include "StringArray.h" -#define resout_nt (resout, T_OLD((SCL, (HID, (NUQ,))))) -#define res_nt (res, T_OLD((SCL, (HID, (NUQ,))))) -#define shp_nt (shp, T_OLD((AKD, (NHD, (NUQ,))))) -#define s_nt (s, T_OLD((SCL, (HID, (NUQ,))))) - -void SAC_StringArray_genarray( SAC_ND_PARAM_out( resout_nt, array *), - SAC_ND_PARAM_in( shp_nt, int ), - SAC_ND_PARAM_in( s_nt, char *)) +array *SAC_StringArray_genarray(SACarg *shp, SACarg *s) { - SAC_ND_DECL__DESC( res_nt, ); - array *SAC_ND_A_FIELD( res_nt ); - int dim, size; - int i; - - SAC_ND_ALLOC__DESC( res_nt, 0); - SAC_ND_SET__RC( res_nt, 1); - - dim = SAC_ND_A_DESC_SIZE( shp_nt ); - size = 1; - for( i=0; i < dim; i++) { - size *= SAC_ND_READ( shp_nt, i); - } - - res = SAC_StringArray_alloc( dim, size); - - for( i=0; i < dim; i++) { - res->shp[i] = SAC_ND_READ( shp_nt, i); - } - - for( i=0; i < size ; i++) { - res->data[i] = SAC_ND_A_FIELD( s_nt ); - res->descs[i] = SAC_ND_A_DESC( s_nt ); - SAC_ND_INC_RC( s_nt, 1); - } - - SAC_ND_DEC_RC_FREE( s_nt, 1 , free ); - SAC_ND_DEC_RC_FREE( shp_nt, 1,); - - SAC_ND_RET_out( resout_nt , res_nt ) - + sac_int dim = SACARGgetDim(shp); + sac_int size = 1; + for (sac_int pos = 0; pos < dim; pos++) { + size *= SACARGgetShape(shp, pos); + } + array *res = SAC_StringArray_alloc(dim, size); + for (sac_int pos = 0; pos < dim; pos++) { + res->shp[pos] = SACARGgetShape(shp, pos); + } + + for (sac_int i = 0; i < size; i++) { + res->elems[i] = SACARGduplicateSaCArray(s); + } + + return res; } diff --git a/src/structures/src/StringArray/index2offset.c b/src/structures/src/StringArray/index2offset.c index 4478086d..2ab7211c 100644 --- a/src/structures/src/StringArray/index2offset.c +++ b/src/structures/src/StringArray/index2offset.c @@ -3,17 +3,16 @@ #include "StringArray.h" -int SAC_StringArray_index2offset( int dim, int *idx, int *shp) +sac_int SAC_StringArray_index2offset(SACarg *idx, sac_int *shp) { - int i, offset, size; - - offset = 0; - size = 1; - for( i=dim - 1; i >= 0; i--) { - offset += size * idx[i]; - size *= shp[i]; - } - - return( offset); + sac_int dim = SACARGgetDim(idx); + + sac_int offset = 0; + sac_int size = 1; + for (sac_int i = dim - 1; i >= 0; i--) { + offset += size * idx[i]; + size *= shp[i]; + } + + return offset; } - diff --git a/src/structures/src/StringArray/modarray.c b/src/structures/src/StringArray/modarray.c index 967ce527..099b67c5 100644 --- a/src/structures/src/StringArray/modarray.c +++ b/src/structures/src/StringArray/modarray.c @@ -3,39 +3,10 @@ #include "StringArray.h" -#define arrout_nt (arrout, T_OLD((SCL, (HID, (NUQ,))))) -#define str_nt (str, T_OLD((SCL, (HID, (NUQ,))))) -#define val_nt (val, T_OLD((SCL, (HID, (NUQ,))))) -#define idx_nt (idx, T_OLD((AKD, (NHD, (NUQ,))))) -#define arr_nt (arr, T_OLD((SCL, (HID, (NUQ,))))) - -void SAC_StringArray_modarray( SAC_ND_PARAM_out( arrout_nt, array *), - SAC_ND_PARAM_in( arr_nt, array *), - SAC_ND_PARAM_in( idx_nt, int ), - SAC_ND_PARAM_in( val_nt, char * )) +void SAC_StringArray_modarray(array *labs, SACarg *idx, SACarg *str) { - int offset; - SAC_ND_DECL__DESC( str_nt, ); - char *SAC_ND_A_FIELD( str_nt ); - - if( SAC_ND_A_RC( arr_nt) > 1 ) { - SAC_ND_DEC_RC( arr_nt, 1); - SAC_ND_A_FIELD( arr_nt) = SAC_StringArray_copy( SAC_ND_A_FIELD( arr_nt)); - SAC_ND_ALLOC__DESC( arr_nt, 0); - SAC_ND_SET__RC( arr_nt, 1); - } - offset = SAC_StringArray_index2offset( arr->dim, - SAC_ND_A_FIELD(idx_nt), - arr->shp); - - SAC_ND_A_FIELD( str_nt) = arr->data[offset]; - SAC_ND_A_DESC( str_nt) = arr->descs[offset]; - SAC_ND_DEC_RC_FREE( str_nt, 1, free); - arr->data[offset] = SAC_ND_A_FIELD( val_nt); - arr->descs[offset] = SAC_ND_A_DESC( val_nt); - - SAC_ND_DEC_RC_FREE( idx_nt, 1 , ); - - SAC_ND_RET_out( arrout_nt , arr_nt ) + sac_int offset = SAC_StringArray_index2offset(idx, labs->shp); + SACARGdeleteSacArray(&(labs->elems[offset])); + labs->elems[offset] = SACARGduplicateSaCArray(str); } diff --git a/src/structures/src/StringArray/sel.c b/src/structures/src/StringArray/sel.c index 660f46a6..9de5b231 100644 --- a/src/structures/src/StringArray/sel.c +++ b/src/structures/src/StringArray/sel.c @@ -3,34 +3,9 @@ #include "StringArray.h" -#define strout_nt (strout, T_OLD((SCL, (HID, (NUQ,))))) -#define str_nt (str, T_OLD((SCL, (HID, (NUQ,))))) -#define idx_nt (idx, T_OLD((AKD, (NHD, (NUQ,))))) -#define arr_nt (arr, T_OLD((SCL, (HID, (NUQ,))))) - -void SAC_StringArray_sel( SAC_ND_PARAM_out( strout_nt, char *), - SAC_ND_PARAM_in( idx_nt, int ), - SAC_ND_PARAM_in( arr_nt, array *)) +SACarg *SAC_StringArray_sel(SACarg *idx, array *labs) { - int offset; - SAC_ND_DECL__DESC( str_nt, ); - char *SAC_ND_A_FIELD( str_nt ); - - offset = SAC_StringArray_index2offset( arr->dim, - SAC_ND_A_FIELD(idx_nt), - arr->shp); - - SAC_ND_A_FIELD( str_nt) = arr->data[offset]; - SAC_ND_A_DESC( str_nt) = arr->descs[offset]; - SAC_ND_INC_RC( str_nt, 1); + sac_int offset = SAC_StringArray_index2offset(idx, labs->shp); - /* DSR: Removing the line below makes StringArray usable for now - * but we need to investigate why this works. - * See bug 616 for details. - */ - SAC_ND_DEC_RC_FREE( idx_nt, 1 , ); - SAC_ND_DEC_RC_FREE( arr_nt, 1 , SAC_StringArray_free ); - - SAC_ND_RET_out( strout_nt , str_nt ) + return SACARGduplicateSaCArray(labs->elems[offset]); } - diff --git a/src/structures/src/StringArray/shape.c b/src/structures/src/StringArray/shape.c index 48496aa6..d41f964b 100644 --- a/src/structures/src/StringArray/shape.c +++ b/src/structures/src/StringArray/shape.c @@ -1,31 +1,15 @@ #include "StringArray.h" -#define s_nt (s, T_OLD((SCL, (HID, (NUQ,))))) -#define shp_nt (shp, T_OLD((AKD, (NHD, (NUQ,))))) -#define res_nt (res, T_OLD((AKD, (NHD, (NUQ,))))) - -void SAC_StringArray_shape( SAC_ND_PARAM_out( shp_nt, int), - SAC_ND_PARAM_in( s_nt, array *)) +SACarg *SAC_StringArray_shape(array *x) { - int i; - int SAC_ND_A_MIRROR_DIM( res_nt) = 1; - SAC_ND_DECL__DESC( res_nt, ); - SAC_ND_DECL__DATA( res_nt, int, ); - - SAC_ND_ALLOC__DESC( res_nt, 1); + sac_int d = x->dim; + sac_int *shp = malloc(d * sizeof(sac_int)); - SAC_ND_A_DESC_SHAPE( res_nt, 0) = s->dim; + for (sac_int l = 0; l < d; l++) { + shp[l] = x->shp[l]; + } - SAC_ND_SET__RC( res_nt, 1); - SAC_ND_A_DESC_SIZE( res_nt) = SAC_ND_A_DESC_SHAPE( res_nt, 0); - SAC_ND_A_FIELD( res_nt) = SAC_MALLOC( s->dim * sizeof( int)); - for( i=0; idim; i++) { - SAC_ND_A_FIELD( res_nt)[i] = s->shp[i]; - } + sac_int n[1] = {d}; - SAC_ND_RET_out( shp_nt , res_nt ) + return SACARGcreateFromPointer(SACTYPE__MAIN__int, shp, d, n); } - -#undef s_nt -#undef shp_nt -#undef res_nt From 5062ac6e8811e9c2c6766d9207b60d1842237520 Mon Sep 17 00:00:00 2001 From: Thomas Koopman Date: Thu, 22 Jan 2026 20:53:39 +0100 Subject: [PATCH 2/9] Small fixes --- src/structures/src/StringArray/StringArray.h | 4 ++-- src/structures/src/StringArray/copy.c | 2 +- src/structures/src/StringArray/index2offset.c | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/structures/src/StringArray/StringArray.h b/src/structures/src/StringArray/StringArray.h index 780e020c..0a25bcce 100644 --- a/src/structures/src/StringArray/StringArray.h +++ b/src/structures/src/StringArray/StringArray.h @@ -32,6 +32,6 @@ extern SACarg *shape(array *s); extern array *SAC_StringArray_genarray(SACarg *shp, SACarg *s); -extern SACarg *SAC_StringArray_sel(SACarg *idx, stringArray labs); +extern SACarg *SAC_StringArray_sel(SACarg *idx, array *labs); -extern array *SAC_StringArray_modarray(array *labs, SACarg *idx, SACarg *str); +extern void SAC_StringArray_modarray(array *labs, SACarg *idx, SACarg *str); diff --git a/src/structures/src/StringArray/copy.c b/src/structures/src/StringArray/copy.c index c40f93d0..9ec62f31 100644 --- a/src/structures/src/StringArray/copy.c +++ b/src/structures/src/StringArray/copy.c @@ -12,7 +12,7 @@ array *SAC_StringArray_copy(array *arr) } for (sac_int i = 0; i < arr->size; i++) { - (res->elems)[l] = SACARGduplicateSaCArray((arr->elems)[l]); + (res->elems)[i] = SACARGduplicateSaCArray((arr->elems)[i]); } return res; diff --git a/src/structures/src/StringArray/index2offset.c b/src/structures/src/StringArray/index2offset.c index 2ab7211c..283efd1b 100644 --- a/src/structures/src/StringArray/index2offset.c +++ b/src/structures/src/StringArray/index2offset.c @@ -3,9 +3,11 @@ #include "StringArray.h" -sac_int SAC_StringArray_index2offset(SACarg *idx, sac_int *shp) +sac_int SAC_StringArray_index2offset(SACarg *idx_in, sac_int *shp) { - sac_int dim = SACARGgetDim(idx); + sac_int dim = SACARGgetDim(idx_in); + + sac_int *idx = (sac_int *)SACARGgetSharedData (SACTYPE__MAIN__int, idx_in); sac_int offset = 0; sac_int size = 1; From f22e353b36ca68c933b09d7f635b96f0135831ee Mon Sep 17 00:00:00 2001 From: Thomas Koopman Date: Thu, 22 Jan 2026 21:02:01 +0100 Subject: [PATCH 3/9] Another fix --- src/structures/StringArray.sac | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/structures/StringArray.sac b/src/structures/StringArray.sac index aac0c1d8..548dc75c 100644 --- a/src/structures/StringArray.sac +++ b/src/structures/StringArray.sac @@ -36,12 +36,14 @@ external int[.] shape(stringArray s); #pragma linkname "SAC_StringArray_shape" #pragma linkobj "src/StringArray/shape.o" #pragma linksign [0,1] + #pragma sacarg [0] #pragma header "src/StringArray/StringArray.h" external stringArray _to_stringArray(int[.] shp, string s); #pragma linkname "SAC_StringArray_genarray" #pragma linkobj "src/StringArray/genarray.o" #pragma linksign [1,2,3] + #pragma sacarg [1] #pragma header "src/StringArray/StringArray.h" external string _sel(int[.] idx, stringArray labs); @@ -49,6 +51,7 @@ external string _sel(int[.] idx, stringArray labs); #pragma linkobj "src/StringArray/sel.o" #pragma linkobj "src/StringArray/index2offset.o" #pragma linksign [1,2,3] + #pragma sacarg [0, 1] #pragma header "src/StringArray/StringArray.h" external stringArray _modarray(stringArray labs, int[.] idx, string str); @@ -56,6 +59,7 @@ external stringArray _modarray(stringArray labs, int[.] idx, string str); #pragma linkobj "src/StringArray/modarray.o" #pragma linkobj "src/StringArray/index2offset.o" #pragma linksign [1,1,2,3] + #pragma sacarg [2, 3] #pragma header "src/StringArray/StringArray.h" stringArray modarray(stringArray arr, int[n] idx, stringArray val) From 46aa6190a2b45515fcd46510a249b02fbe95b369 Mon Sep 17 00:00:00 2001 From: Thomas Koopman Date: Thu, 22 Jan 2026 21:12:13 +0100 Subject: [PATCH 4/9] Some more fixes --- CMakeLists.txt | 7 +++++-- src/structures/StringArray.sac | 10 +++++----- src/structures/src/StringArray/free.c | 1 + 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fb06ae6..bd615b74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,12 +16,15 @@ SET (IS_RELEASE FALSE CACHE BOOL "Indicate if we are building w SET (SAC2C_EXTRA_INC -DHAVE_CONFIG_H -I${PROJECT_BINARY_DIR}/include - -I${PROJECT_SOURCE_DIR}/include) + -I${PROJECT_SOURCE_DIR}/include + -I${PROJECT_SOURCE_DIR} + ) SET (SAC2C_CPP_INC -DHAVE_CONFIG_H -cppI${PROJECT_BINARY_DIR}/include - -cppI${PROJECT_SOURCE_DIR}/include) + -cppI${PROJECT_SOURCE_DIR}/include + -cppI${PROJECT_SOURCE_DIR}) # Check whether sac2c is operational LIST (APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake-common") diff --git a/src/structures/StringArray.sac b/src/structures/StringArray.sac index 548dc75c..5bda0b63 100644 --- a/src/structures/StringArray.sac +++ b/src/structures/StringArray.sac @@ -30,21 +30,21 @@ external int dim(stringArray s); #pragma linkname "SAC_StringArray_dim" #pragma linkobj "src/StringArray/dim.o" #pragma linksign [0,1] - #pragma header "src/StringArray/StringArray.h" + #pragma header "src/structures/src/StringArray/StringArray.h" external int[.] shape(stringArray s); #pragma linkname "SAC_StringArray_shape" #pragma linkobj "src/StringArray/shape.o" #pragma linksign [0,1] #pragma sacarg [0] - #pragma header "src/StringArray/StringArray.h" + #pragma header "src/structures/src/StringArray/StringArray.h" external stringArray _to_stringArray(int[.] shp, string s); #pragma linkname "SAC_StringArray_genarray" #pragma linkobj "src/StringArray/genarray.o" #pragma linksign [1,2,3] #pragma sacarg [1] - #pragma header "src/StringArray/StringArray.h" + #pragma header "src/structures/src/StringArray/StringArray.h" external string _sel(int[.] idx, stringArray labs); #pragma linkname "SAC_StringArray_sel" @@ -52,7 +52,7 @@ external string _sel(int[.] idx, stringArray labs); #pragma linkobj "src/StringArray/index2offset.o" #pragma linksign [1,2,3] #pragma sacarg [0, 1] - #pragma header "src/StringArray/StringArray.h" + #pragma header "src/structures/src/StringArray/StringArray.h" external stringArray _modarray(stringArray labs, int[.] idx, string str); #pragma linkname "SAC_StringArray_modarray" @@ -60,7 +60,7 @@ external stringArray _modarray(stringArray labs, int[.] idx, string str); #pragma linkobj "src/StringArray/index2offset.o" #pragma linksign [1,1,2,3] #pragma sacarg [2, 3] - #pragma header "src/StringArray/StringArray.h" + #pragma header "src/structures/src/StringArray/StringArray.h" stringArray modarray(stringArray arr, int[n] idx, stringArray val) { diff --git a/src/structures/src/StringArray/free.c b/src/structures/src/StringArray/free.c index 82e5e343..ca001b07 100644 --- a/src/structures/src/StringArray/free.c +++ b/src/structures/src/StringArray/free.c @@ -10,5 +10,6 @@ void SAC_StringArray_free(array *arr) } free(arr->shp); free(arr->elems); + free(arr); } From 75b1b5eb7eba3e3e85e17ae1337a6242d01a584b Mon Sep 17 00:00:00 2001 From: Thomas Koopman Date: Thu, 22 Jan 2026 21:42:23 +0100 Subject: [PATCH 5/9] Apparently need to return NULL from free --- src/structures/src/StringArray/StringArray.h | 2 +- src/structures/src/StringArray/free.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/structures/src/StringArray/StringArray.h b/src/structures/src/StringArray/StringArray.h index 0a25bcce..4b66ca2e 100644 --- a/src/structures/src/StringArray/StringArray.h +++ b/src/structures/src/StringArray/StringArray.h @@ -25,7 +25,7 @@ extern sac_int dim(array *s); /* This is just a helper function */ extern sac_int SAC_StringArray_index2offset(SACarg *idx, sac_int *shp); -extern void SAC_StringArray_free(array *arr); +extern array *SAC_StringArray_free(array *arr); extern array *SAC_StringArray_copy(array *arr); extern SACarg *shape(array *s); diff --git a/src/structures/src/StringArray/free.c b/src/structures/src/StringArray/free.c index ca001b07..56b8bbeb 100644 --- a/src/structures/src/StringArray/free.c +++ b/src/structures/src/StringArray/free.c @@ -3,7 +3,7 @@ #include "StringArray.h" -void SAC_StringArray_free(array *arr) +array *SAC_StringArray_free(array *arr) { for (sac_int i = 0; i < arr->size; i++) { SACARGdeleteSacArray(&(arr->elems)[i]); @@ -11,5 +11,6 @@ void SAC_StringArray_free(array *arr) free(arr->shp); free(arr->elems); free(arr); + return NULL; } From 3bb6a4ee830f1a10d3d1717a450c90945b859569 Mon Sep 17 00:00:00 2001 From: Thomas Koopman Date: Thu, 22 Jan 2026 21:48:00 +0100 Subject: [PATCH 6/9] Compilation only fails at FibreIO now. Which looks at the internals of StringArray... --- src/structures/StringArray.sac | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/structures/StringArray.sac b/src/structures/StringArray.sac index 5bda0b63..a3680799 100644 --- a/src/structures/StringArray.sac +++ b/src/structures/StringArray.sac @@ -42,15 +42,15 @@ external int[.] shape(stringArray s); external stringArray _to_stringArray(int[.] shp, string s); #pragma linkname "SAC_StringArray_genarray" #pragma linkobj "src/StringArray/genarray.o" - #pragma linksign [1,2,3] - #pragma sacarg [1] + #pragma linksign [0,1,2] + #pragma sacarg [1, 2] #pragma header "src/structures/src/StringArray/StringArray.h" external string _sel(int[.] idx, stringArray labs); #pragma linkname "SAC_StringArray_sel" #pragma linkobj "src/StringArray/sel.o" #pragma linkobj "src/StringArray/index2offset.o" - #pragma linksign [1,2,3] + #pragma linksign [0,1,2] #pragma sacarg [0, 1] #pragma header "src/structures/src/StringArray/StringArray.h" From 6059ac51c92a95bff907faac8649b371629669bc Mon Sep 17 00:00:00 2001 From: Thomas Koopman Date: Thu, 22 Jan 2026 22:22:00 +0100 Subject: [PATCH 7/9] Change the y file. No idea what it does, so may be wrong --- src/stdio/src/FibreIO/FibreScan.y | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/stdio/src/FibreIO/FibreScan.y b/src/stdio/src/FibreIO/FibreScan.y index 3804d793..7b51bd55 100644 --- a/src/stdio/src/FibreIO/FibreScan.y +++ b/src/stdio/src/FibreIO/FibreScan.y @@ -4,6 +4,8 @@ extern int linenum; extern char yytext[]; #include +#include +#include #include "FibreScan.h" enum READMODE { @@ -22,10 +24,10 @@ enum READMODE { string_mode, }; -int boolval; +bool boolval; char byteval; short shortval; -int intval; +sac_int intval; long longval; long long longlongval; unsigned char ubyteval; @@ -40,7 +42,7 @@ double *doublearray; float *floatarray; char *bytearray; short *shortarray; -int *intarray; +sac_int *intarray; long *longarray; long long *longlongarray; unsigned char *ubytearray; @@ -50,17 +52,17 @@ unsigned long *ulongarray; unsigned long long *ulonglongarray; char **stringarray; -static int i; -int shape[ MAXDIM]; -static int dim_pos; +static sac_int i; +sac_int shape[ MAXDIM]; +static sac_int dim_pos; static enum READMODE mode; static int got_scalar; static int size_fixed; -int dims; -int size; -static int array_pos; -static int elems_left[MAXDIM]; +sac_int dims; +sac_int size; +static sac_int array_pos; +static sac_int elems_left[MAXDIM]; extern int yychar; extern int yynerrs; @@ -70,7 +72,7 @@ extern int yynerrs; %union { char cbyte; short cshort; - int cint; + sac_int cint; long clong; long long clonglong; unsigned char cubyte; @@ -252,7 +254,7 @@ parse_scalar: NUM *floatarray = $1; } else if( mode == int_mode) { - intarray = (int *) SAC_MALLOC( sizeof( int)); + intarray = (int *) SAC_MALLOC( sizeof( sac_int)); *intarray = $1; } else { @@ -491,7 +493,7 @@ array: SQBR_L desc COLON shortarray = (short *) SAC_MALLOC( size * sizeof( short)); break; case int_mode: - intarray = (int *) SAC_MALLOC( size * sizeof( int)); + intarray = (sac_int *) SAC_MALLOC( size * sizeof( sac_int)); break; case long_mode: longarray = (long *) SAC_MALLOC( size * sizeof( long)); From 4ff30cb061708a894b9a7d62e80fa086caa3a720 Mon Sep 17 00:00:00 2001 From: Thomas Koopman Date: Thu, 22 Jan 2026 22:30:10 +0100 Subject: [PATCH 8/9] Try some stuff out. Still a lot to do --- src/stdio/FibreIO.sac | 8 ++-- src/stdio/src/FibreIO/ScanDblArr.c | 66 ++++++++++-------------------- src/stdio/src/FibreIO/ScanString.c | 4 -- src/structures/StringArray.sac | 10 ++--- 4 files changed, 30 insertions(+), 58 deletions(-) diff --git a/src/stdio/FibreIO.sac b/src/stdio/FibreIO.sac index 1ede60b9..688cdae2 100644 --- a/src/stdio/FibreIO.sac +++ b/src/stdio/FibreIO.sac @@ -40,8 +40,8 @@ external float[*] FibreScanFloatArray(File &stream); #pragma linkobj "src/FibreIO/ScanFltArr.o" external double[*] FibreScanDoubleArray(File &stream); - #pragma refcounting [0] - #pragma linksign [1,2] + #pragma linksign [0, 1] + #pragma sacarg [0] #pragma linkobj "src/FibreIO/ScanDblArr.o" external stringArray FibreScanStringArray(File &stream); @@ -106,8 +106,8 @@ external float[*] FibreScanFloatArrayStr(string stream); #pragma linkobj "src/FibreIO/ScanFltArr.o" external double[*] FibreScanDoubleArrayStr(string stream); - #pragma refcounting [0] - #pragma linksign [1,2] + #pragma linksign [0, 1] + #pragma sacarg [0, 1] #pragma linkobj "src/FibreIO/ScanDblArr.o" external stringArray FibreScanStringArrayStr(string stream); diff --git a/src/stdio/src/FibreIO/ScanDblArr.c b/src/stdio/src/FibreIO/ScanDblArr.c index 1561d644..602ff909 100644 --- a/src/stdio/src/FibreIO/ScanDblArr.c +++ b/src/stdio/src/FibreIO/ScanDblArr.c @@ -6,53 +6,29 @@ #include "FibreScan.h" #include "FibreScan.tab.h" - - -#define array_nt (array, T_OLD((AUD, (NHD, (NUQ, ))))) -#define ret_nt (ret, T_OLD((AUD, (NHD, (NUQ, ))))) - -void FibreScanDoubleArray( SAC_ND_PARAM_out( array_nt, double), FILE *stream) +SACarg *FibreScanDoubleArray(FILE *stream) { - SAC_ND_DECL__DATA( ret_nt, double, ) - SAC_ND_DECL__DESC( ret_nt, ) - int i; - start_token = PARSE_DOUBLE_ARRAY; - doScan( stream); - int SAC_ND_A_MIRROR_DIM( ret_nt) = dims; - SAC_ND_ALLOC__DESC( ret_nt, dims) - SAC_ND_SET__RC( ret_nt, 1) - for( i = 0; i < dims; i++) { - SAC_ND_A_DESC_SHAPE( ret_nt, i) = shape[i]; - } - SAC_ND_A_DESC_SIZE( ret_nt) = size; - SAC_ND_A_FIELD( ret_nt) = doublearray; - SAC_ND_RET_out( array_nt, ret_nt) + /** + * Global variables created by the .y file: + * double *doublearray + * sac_int *shp + * sac_int dims + * sac_int size + **/ + sac_int i; + start_token = PARSE_DOUBLE_ARRAY; + doScan(stream); + + return SACARGcreateFromPointer(SACTYPE__MAIN__double, doublearray, dims, shp); } -#undef array_nt -#undef ret_nt - -#define array_nt (array, T_OLD((AUD, (NHD, (NUQ, ))))) -#define ret_nt (ret, T_OLD((AUD, (NHD, (NUQ, ))))) - -void FibreScanDoubleArrayStr( SAC_ND_PARAM_out( array_nt, double), char *stream) +SACarg *FibreScanDoubleArrayStr(SACarg *stream_in) { - SAC_ND_DECL__DATA( ret_nt, double, ) - SAC_ND_DECL__DESC( ret_nt, ) - int i; - start_token = PARSE_DOUBLE_ARRAY; - yy_scan_string( stream); - FibreScanparse(); - int SAC_ND_A_MIRROR_DIM( ret_nt) = dims; - SAC_ND_ALLOC__DESC( ret_nt, dims) - SAC_ND_SET__RC( ret_nt, 1) - for( i = 0; i < dims; i++) { - SAC_ND_A_DESC_SHAPE( ret_nt, i) = shape[i]; - } - SAC_ND_A_DESC_SIZE( ret_nt) = size; - SAC_ND_A_FIELD( ret_nt) = doublearray; - SAC_ND_RET_out( array_nt, ret_nt) -} + char *stream = SACARGgetSharedData(SACARGgetType(stream_in), stream_in); + sac_int i; + start_token = PARSE_DOUBLE_ARRAY; + yy_scan_string(stream); + FibreScanparse(); -#undef array_nt -#undef ret_nt + return SACARGcreateFromPointer(SACTYPE__MAIN__double, doublearray, dims, shp); +} diff --git a/src/stdio/src/FibreIO/ScanString.c b/src/stdio/src/FibreIO/ScanString.c index 8cda7f92..732e752f 100644 --- a/src/stdio/src/FibreIO/ScanString.c +++ b/src/stdio/src/FibreIO/ScanString.c @@ -6,13 +6,9 @@ #include "FibreScan.h" #include "FibreScan.tab.h" - char *FibreScanString( FILE *stream) { start_token = PARSE_STRING; doScan( stream); return( stringval); } - - - diff --git a/src/structures/StringArray.sac b/src/structures/StringArray.sac index a3680799..a8cb97ff 100644 --- a/src/structures/StringArray.sac +++ b/src/structures/StringArray.sac @@ -30,21 +30,21 @@ external int dim(stringArray s); #pragma linkname "SAC_StringArray_dim" #pragma linkobj "src/StringArray/dim.o" #pragma linksign [0,1] - #pragma header "src/structures/src/StringArray/StringArray.h" +// #pragma header "src/structures/src/StringArray/StringArray.h" external int[.] shape(stringArray s); #pragma linkname "SAC_StringArray_shape" #pragma linkobj "src/StringArray/shape.o" #pragma linksign [0,1] #pragma sacarg [0] - #pragma header "src/structures/src/StringArray/StringArray.h" +// #pragma header "src/structures/src/StringArray/StringArray.h" external stringArray _to_stringArray(int[.] shp, string s); #pragma linkname "SAC_StringArray_genarray" #pragma linkobj "src/StringArray/genarray.o" #pragma linksign [0,1,2] #pragma sacarg [1, 2] - #pragma header "src/structures/src/StringArray/StringArray.h" +// #pragma header "src/structures/src/StringArray/StringArray.h" external string _sel(int[.] idx, stringArray labs); #pragma linkname "SAC_StringArray_sel" @@ -52,7 +52,7 @@ external string _sel(int[.] idx, stringArray labs); #pragma linkobj "src/StringArray/index2offset.o" #pragma linksign [0,1,2] #pragma sacarg [0, 1] - #pragma header "src/structures/src/StringArray/StringArray.h" +// #pragma header "src/structures/src/StringArray/StringArray.h" external stringArray _modarray(stringArray labs, int[.] idx, string str); #pragma linkname "SAC_StringArray_modarray" @@ -60,7 +60,7 @@ external stringArray _modarray(stringArray labs, int[.] idx, string str); #pragma linkobj "src/StringArray/index2offset.o" #pragma linksign [1,1,2,3] #pragma sacarg [2, 3] - #pragma header "src/structures/src/StringArray/StringArray.h" +// #pragma header "src/structures/src/StringArray/StringArray.h" stringArray modarray(stringArray arr, int[n] idx, stringArray val) { From c907722edf197315319c58ee50bad01cba717213 Mon Sep 17 00:00:00 2001 From: Thomas Koopman Date: Thu, 22 Jan 2026 22:37:32 +0100 Subject: [PATCH 9/9] Some more stuff --- src/stdio/FibreIO.sac | 12 +++--- src/stdio/src/FibreIO/ScanFltArr.c | 65 ++++++++++------------------- src/stdio/src/FibreIO/ScanIntArr.c | 66 ++++++++++-------------------- 3 files changed, 48 insertions(+), 95 deletions(-) diff --git a/src/stdio/FibreIO.sac b/src/stdio/FibreIO.sac index 688cdae2..a463b8ba 100644 --- a/src/stdio/FibreIO.sac +++ b/src/stdio/FibreIO.sac @@ -30,13 +30,13 @@ external double FibreScanDouble(File &stream); #pragma linkobj "src/FibreIO/ScanDbl.o" external int[*] FibreScanIntArray(File &stream); - #pragma refcounting [0] - #pragma linksign [1,2] + #pragma linksign [0, 1] + #pragma sacarg [0] #pragma linkobj "src/FibreIO/ScanIntArr.o" external float[*] FibreScanFloatArray(File &stream); - #pragma refcounting [0] - #pragma linksign [1,2] + #pragma linksign [0, 1] + #pragma sacarg [0] #pragma linkobj "src/FibreIO/ScanFltArr.o" external double[*] FibreScanDoubleArray(File &stream); @@ -45,8 +45,8 @@ external double[*] FibreScanDoubleArray(File &stream); #pragma linkobj "src/FibreIO/ScanDblArr.o" external stringArray FibreScanStringArray(File &stream); - #pragma refcounting [0] - #pragma linksign [1,2] + #pragma linksign [0, 1] + #pragma sacarg [0] #pragma linkobj "src/FibreIO/ScanStringArr.o" /****************************************************************************** diff --git a/src/stdio/src/FibreIO/ScanFltArr.c b/src/stdio/src/FibreIO/ScanFltArr.c index 394bca40..4f7124c9 100644 --- a/src/stdio/src/FibreIO/ScanFltArr.c +++ b/src/stdio/src/FibreIO/ScanFltArr.c @@ -6,52 +6,29 @@ #include "FibreScan.h" #include "FibreScan.tab.h" - -#define array_nt (array, T_OLD((AUD, (NHD, (NUQ, ))))) -#define ret_nt (ret, T_OLD((AUD, (NHD, (NUQ, ))))) - -void FibreScanFloatArray( SAC_ND_PARAM_out( array_nt, float), FILE *stream) +SACarg *FibreScanFloatArray(FILE *stream) { - SAC_ND_DECL__DATA( ret_nt, float, ) - SAC_ND_DECL__DESC( ret_nt, ) - int i; - start_token = PARSE_FLOAT_ARRAY; - doScan( stream); - int SAC_ND_A_MIRROR_DIM( ret_nt) = dims; - SAC_ND_ALLOC__DESC( ret_nt, dims) - SAC_ND_SET__RC( ret_nt, 1) - for( i = 0; i < dims; i++) { - SAC_ND_A_DESC_SHAPE( ret_nt, i) = shape[i]; - } - SAC_ND_A_DESC_SIZE( ret_nt) = size; - SAC_ND_A_FIELD( ret_nt) = floatarray; - SAC_ND_RET_out( array_nt, ret_nt) + /** + * Global variables created by the .y file: + * float *floatarray + * sac_int *shp + * sac_int dims + * sac_int size + **/ + sac_int i; + start_token = PARSE_FLOAT_ARRAY; + doScan(stream); + + return SACARGcreateFromPointer(SACTYPE__MAIN__float, floatarray, dims, shp); } -#undef array_nt -#undef ret_nt - -#define array_nt (array, T_OLD((AUD, (NHD, (NUQ, ))))) -#define ret_nt (ret, T_OLD((AUD, (NHD, (NUQ, ))))) - -void FibreScanFloatArrayStr( SAC_ND_PARAM_out( array_nt, float), char *stream) +SACarg *FibreScanFloatArrayStr(SACarg *stream_in) { - SAC_ND_DECL__DATA( ret_nt, float, ) - SAC_ND_DECL__DESC( ret_nt, ) - int i; - start_token = PARSE_FLOAT_ARRAY; - yy_scan_string( stream); - FibreScanparse(); - int SAC_ND_A_MIRROR_DIM( ret_nt) = dims; - SAC_ND_ALLOC__DESC( ret_nt, dims) - SAC_ND_SET__RC( ret_nt, 1) - for( i = 0; i < dims; i++) { - SAC_ND_A_DESC_SHAPE( ret_nt, i) = shape[i]; - } - SAC_ND_A_DESC_SIZE( ret_nt) = size; - SAC_ND_A_FIELD( ret_nt) = floatarray; - SAC_ND_RET_out( array_nt, ret_nt) -} + char *stream = SACARGgetSharedData(SACARGgetType(stream_in), stream_in); + sac_int i; + start_token = PARSE_FLOAT_ARRAY; + yy_scan_string(stream); + FibreScanparse(); -#undef array_nt -#undef ret_nt + return SACARGcreateFromPointer(SACTYPE__MAIN__float, floatarray, dims, shp); +} diff --git a/src/stdio/src/FibreIO/ScanIntArr.c b/src/stdio/src/FibreIO/ScanIntArr.c index 1a92b39c..6171fc67 100644 --- a/src/stdio/src/FibreIO/ScanIntArr.c +++ b/src/stdio/src/FibreIO/ScanIntArr.c @@ -6,53 +6,29 @@ #include "FibreScan.h" #include "FibreScan.tab.h" - -#define array_nt (array, T_OLD((AUD, (NHD, (NUQ, ))))) -#define ret_nt (ret, T_OLD((AUD, (NHD, (NUQ, ))))) - -void FibreScanIntArray( SAC_ND_PARAM_out( array_nt, int), FILE *stream) +SACarg *FibreScanIntArray(FILE *stream) { - SAC_ND_DECL__DATA( ret_nt, int, ) - SAC_ND_DECL__DESC( ret_nt, ) - int i; - start_token = PARSE_INT_ARRAY; - doScan( stream); - int SAC_ND_A_MIRROR_DIM( ret_nt) = dims; - SAC_ND_ALLOC__DESC( ret_nt, dims) - SAC_ND_SET__RC( ret_nt, 1) - for( i = 0; i < dims; i++) { - SAC_ND_A_DESC_SHAPE( ret_nt, i) = shape[i]; - } - SAC_ND_A_DESC_SIZE( ret_nt) = size; - SAC_ND_A_FIELD( ret_nt) = intarray; - SAC_ND_RET_out( array_nt, ret_nt) + /** + * Global variables created by the .y file: + * sac_int *intarray + * sac_int *shp + * sac_int dims + * sac_int size + **/ + sac_int i; + start_token = PARSE_INT_ARRAY; + doScan(stream); + + return SACARGcreateFromPointer(SACTYPE__MAIN__int, intarray, dims, shp); } -#undef array_nt -#undef ret_nt - -#define array_nt (array, T_OLD((AUD, (NHD, (NUQ, ))))) -#define ret_nt (ret, T_OLD((AUD, (NHD, (NUQ, ))))) - -void FibreScanIntArrayStr( SAC_ND_PARAM_out( array_nt, int), char *stream) +SACarg *FibreScanIntArrayStr(SACarg *stream_in) { - SAC_ND_DECL__DATA( ret_nt, int, ) - SAC_ND_DECL__DESC( ret_nt, ) - int i; - start_token = PARSE_INT_ARRAY; - yy_scan_string( stream); - FibreScanparse(); - int SAC_ND_A_MIRROR_DIM( ret_nt) = dims; - SAC_ND_ALLOC__DESC( ret_nt, dims) - SAC_ND_SET__RC( ret_nt, 1) - for( i = 0; i < dims; i++) { - SAC_ND_A_DESC_SHAPE( ret_nt, i) = shape[i]; - } - SAC_ND_A_DESC_SIZE( ret_nt) = size; - SAC_ND_A_FIELD( ret_nt) = intarray; - SAC_ND_RET_out( array_nt, ret_nt) -} - -#undef array_nt -#undef ret_nt + char *stream = SACARGgetSharedData(SACARGgetType(stream_in), stream_in); + sac_int i; + start_token = PARSE_INT_ARRAY; + yy_scan_string(stream); + FibreScanparse(); + return SACARGcreateFromPointer(SACTYPE__MAIN__int, intarray, dims, shp); +}