Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
25 changes: 15 additions & 10 deletions src/structures/StringArray.sac
Original file line number Diff line number Diff line change
Expand Up @@ -24,38 +24,43 @@ 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/structures/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 sacarg [0]
#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 refcounting [0,1,2]
#pragma linksign [1,2,3]
#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 refcounting [0,1,2]
#pragma linksign [1,2,3]
#pragma linksign [0,1,2]
#pragma sacarg [0, 1]
#pragma header "src/structures/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 sacarg [2, 3]
#pragma header "src/structures/src/StringArray/StringArray.h"

stringArray modarray(stringArray arr, int[n] idx, stringArray val)
{
Expand Down
34 changes: 22 additions & 12 deletions src/structures/src/StringArray/StringArray.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,32 @@
#include <stdio.h>
#include <stdlib.h>

#include "sac.h"
#include <sacinterface.h>


#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 array *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, array *labs);

extern void SAC_StringArray_modarray(array *labs, SACarg *idx, SACarg *str);
17 changes: 8 additions & 9 deletions src/structures/src/StringArray/alloc.c
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
#include <stdio.h>
#include <stdlib.h>

#include <sacinterface.h>
#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;
}

30 changes: 11 additions & 19 deletions src/structures/src/StringArray/copy.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)[i] = SACARGduplicateSaCArray((arr->elems)[i]);
}

res = SAC_StringArray_alloc( arr->dim, arr->size);
for( i=0; i<arr->dim; i++) {
res->shp[i] = arr->shp[i];
}
for( i=0; i<arr->size; 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;
}

15 changes: 2 additions & 13 deletions src/structures/src/StringArray/dim.c
Original file line number Diff line number Diff line change
@@ -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;
}

24 changes: 8 additions & 16 deletions src/structures/src/StringArray/free.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,14 @@

#include "StringArray.h"

#define subs_nt (subs, T_OLD((SCL, (HID, (NUQ,)))))

void SAC_StringArray_free( array *arr)
array *SAC_StringArray_free(array *arr)
{
int i;
SAC_ND_DECL__DESC( subs_nt, );
char * SAC_ND_A_FIELD( subs_nt);

for( i=0; i<arr->size; 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);
free(arr);
return NULL;
}

55 changes: 16 additions & 39 deletions src/structures/src/StringArray/genarray.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}


23 changes: 12 additions & 11 deletions src/structures/src/StringArray/index2offset.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@

#include "StringArray.h"

int SAC_StringArray_index2offset( int dim, int *idx, int *shp)
sac_int SAC_StringArray_index2offset(SACarg *idx_in, sac_int *shp)
{
int i, offset, size;
sac_int dim = SACARGgetDim(idx_in);

offset = 0;
size = 1;
for( i=dim - 1; i >= 0; i--) {
offset += size * idx[i];
size *= shp[i];
}

return( offset);
sac_int *idx = (sac_int *)SACARGgetSharedData (SACTYPE__MAIN__int, idx_in);

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;
}

37 changes: 4 additions & 33 deletions src/structures/src/StringArray/modarray.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Loading
Loading