From 2f2576e9d507b08666012f6c2312867b34382bea Mon Sep 17 00:00:00 2001 From: Benedikt Rips Date: Wed, 21 Jan 2026 13:15:47 +0100 Subject: [PATCH 1/2] deprecate the List module --- src/structures/List.sac | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/structures/List.sac b/src/structures/List.sac index d9a053a6..edf0e95b 100644 --- a/src/structures/List.sac +++ b/src/structures/List.sac @@ -1,6 +1,6 @@ #pragma safe -module List; +module List deprecated "The List module contains a space leak."; export all; @@ -63,6 +63,3 @@ external list take( int N, list LIST); #pragma linksign [1,2,3] #pragma refcounting [0,2] #pragma linkobj "src/List/take.o" - - - From 15e1f06973e163f4fae6a102aad3640f7d1278dd Mon Sep 17 00:00:00 2001 From: Benedikt Rips Date: Thu, 22 Jan 2026 17:43:22 +0100 Subject: [PATCH 2/2] Remove refcount in BinFile.sac Besides that, the implementation of the functions were merged and the newest sac2c pragmas (ctype/header) were used to increase type safety. --- src/CMakeLists.txt | 6 +- src/stdio/BinFile.sac | 43 ++++++++------ src/stdio/src/BinFile.c | 74 +++++++++++++++++++++++++ src/stdio/src/{BinFile => }/BinFile.h | 17 +++--- src/stdio/src/BinFile/binfReadDblArr.c | 45 --------------- src/stdio/src/BinFile/binfWriteDblArr.c | 28 ---------- src/stdio/src/BinFile/binfclose.c | 28 ---------- src/stdio/src/BinFile/binfflags.c | 42 -------------- src/stdio/src/BinFile/binfopen.c | 31 ----------- 9 files changed, 109 insertions(+), 205 deletions(-) create mode 100644 src/stdio/src/BinFile.c rename src/stdio/src/{BinFile => }/BinFile.h (72%) delete mode 100644 src/stdio/src/BinFile/binfReadDblArr.c delete mode 100644 src/stdio/src/BinFile/binfWriteDblArr.c delete mode 100644 src/stdio/src/BinFile/binfclose.c delete mode 100644 src/stdio/src/BinFile/binfflags.c delete mode 100644 src/stdio/src/BinFile/binfopen.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5b895ec9..71787321 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -299,11 +299,7 @@ SET (C_DEPS_SRC stdio/src/FibreIO/ScanDbl.c stdio/src/FibreIO/FibrePrint.c stdio/src/ComplexIO/PrintComplexArray.c - stdio/src/BinFile/binfopen.c - stdio/src/BinFile/binfflags.c - stdio/src/BinFile/binfclose.c - stdio/src/BinFile/binfWriteDblArr.c - stdio/src/BinFile/binfReadDblArr.c + stdio/src/BinFile.c stdio/src/ArrayIO/ShowArray.c stdio/src/ArrayIO/PrintArray.c numerical/src/Math/int_log.c diff --git a/src/stdio/BinFile.sac b/src/stdio/BinFile.sac index fd64ebae..67009a09 100644 --- a/src/stdio/BinFile.sac +++ b/src/stdio/BinFile.sac @@ -2,6 +2,7 @@ class BinFile; external classtype; + #pragma ctype "int" use FileSystem: { TheFileSystem }; use String: { string }; @@ -16,7 +17,8 @@ export all; ******************************************************************************/ external syserr, BinFile binfopen(string filename, int flags); - #pragma linkobj "src/BinFile/binfopen.o" + // #pragma header "src/BinFile.h" + #pragma linkobj "src/BinFile.o" #pragma effect TheFileSystem #pragma linkname "SACbinfopen" #pragma linksign [0,1,2,3] @@ -29,7 +31,8 @@ external syserr, BinFile binfopen(string filename, int flags); */ external syserr binfclose(BinFile stream); - #pragma linkobj "src/BinFile/binfclose.o" + // #pragma header "src/BinFile.h" + #pragma linkobj "src/BinFile.o" #pragma effect TheFileSystem #pragma linkname "SACbinfclose" #pragma linksign [0,1] @@ -45,8 +48,9 @@ external syserr binfclose(BinFile stream); ******************************************************************************/ external int O_RDONLY(); - #pragma linkobj "src/BinFile/binfflags.o" - #pragma linkname "SACbinf_O_RDONLY" + // #pragma header "src/BinFile.h" + #pragma linkobj "src/BinFile.o" + #pragma linkname "SAC_O_RDONLY" #pragma linksign [0] /* * Returns the C constant O_RDONLY, which is used to open files with @@ -54,8 +58,9 @@ external int O_RDONLY(); */ external int O_WRONLY(); - #pragma linkobj "src/BinFile/binfflags.o" - #pragma linkname "SACbinf_O_WRONLY" + // #pragma header "src/BinFile.h" + #pragma linkobj "src/BinFile.o" + #pragma linkname "SAC_O_WRONLY" #pragma linksign [0] /* * Returns the C constant O_WRONLY, which is used to open files with @@ -63,8 +68,9 @@ external int O_WRONLY(); */ external int O_RDWR(); - #pragma linkobj "src/BinFile/binfflags.o" - #pragma linkname "SACbinf_O_RDWR" + // #pragma header "src/BinFile.h" + #pragma linkobj "src/BinFile.o" + #pragma linkname "SAC_O_RDWR" #pragma linksign [0] /* * Returns the C constant O_RDWR, which is used to open files with @@ -72,8 +78,9 @@ external int O_RDWR(); */ external int O_CREAT(); - #pragma linkobj "src/BinFile/binfflags.o" - #pragma linkname "SACbinf_O_CREAT" + // #pragma header "src/BinFile.h" + #pragma linkobj "src/BinFile.o" + #pragma linkname "SAC_O_CREAT" #pragma linksign [0] /* * Returns the C constant O_CREAT, meaning that a file with the designated @@ -81,8 +88,9 @@ external int O_CREAT(); */ external int O_TRUNC(); - #pragma linkobj "src/BinFile/binfflags.o" - #pragma linkname "SACbinf_O_TRUNC" + // #pragma header "src/BinFile.h" + #pragma linkobj "src/BinFile.o" + #pragma linkname "SAC_O_TRUNC" #pragma linksign [0] /* * Returns the C constant O_TRUNC. If a file already exists and the @@ -96,10 +104,11 @@ external int O_TRUNC(); ******************************************************************************/ external double[*] binfReadDoubleArray(BinFile &stream, int d, int[.] shp); - #pragma refcounting [0] + // #pragma header "src/BinFile.h" + #pragma linkobj "src/BinFile.o" #pragma linkname "SACbinfReadDoubleArray" - #pragma linksign[1,2,3,4] - #pragma linkobj "src/BinFile/binfReadDblArr.o" + #pragma linksign [0,1,2,3] + #pragma sacarg [0] /* * Reads an array of dimension d and shape shp of doubles from * file stream. Caution: This function does not check whether @@ -108,8 +117,10 @@ external double[*] binfReadDoubleArray(BinFile &stream, int d, int[.] shp); external void binfWriteDoubleArray(BinFile &stream, int d, int[.] shp, double[*] arr); + // #pragma header "src/BinFile.h" + #pragma linkobj "src/BinFile.o" #pragma linkname "SACbinfWriteDoubleArray" - #pragma linkobj "src/BinFile/binfWriteDblArr.o" + #pragma linksign [1,2,3,4] /* * Writes the array arr of dimension d and shape shp to file stream. */ diff --git a/src/stdio/src/BinFile.c b/src/stdio/src/BinFile.c new file mode 100644 index 00000000..b9cd99c6 --- /dev/null +++ b/src/stdio/src/BinFile.c @@ -0,0 +1,74 @@ +#include + +#include "sacinterface.h" +#include "BinFile.h" + +sac_int SACbinfopen(int *fd, char *name, sac_int flags) +{ + *fd = open (name, flags, S_IRUSR | S_IWUSR); + sac_int error = *fd == -1 ? errno : -1; + return error; +} + +sac_int SACbinfclose(int fd) +{ + int retVal = close (fd); + int error = retVal == -1 ? errno : -1; + return (sac_int) error; +} + +sac_int SAC_O_RDONLY(void) +{ + return (sac_int) O_RDONLY; +} + +sac_int SAC_O_WRONLY(void) +{ + return (sac_int) O_WRONLY; +} + +sac_int SAC_O_RDWR(void) +{ + return (sac_int) O_RDWR; +} + +sac_int SAC_O_CREAT(void) +{ + return (sac_int) O_CREAT; +} + +sac_int SAC_O_TRUNC(void) +{ + return (sac_int) O_TRUNC; +} + +SACarg *SACbinfReadDoubleArray (int fd, sac_int dim, sac_int *shp) +{ + size_t size = sizeof (double); + for (sac_int i = 0; i < dim; i++) { + size *= (size_t) (shp[i]); + } + + double *data = (double *) malloc (size); + ssize_t bytesRead = read (fd, data, size); + + if (bytesRead == -1) { + SAC_RuntimeError ("Reading the file failed with error code %d\n", errno); + } + + return SACARGcreateFromPointer (SACTYPE__MAIN__double, data, dim, shp); +} + +void SACbinfWriteDoubleArray (int fd, sac_int dim, sac_int *shp, double *data) +{ + sac_int size = sizeof (double); + for (sac_int i = 0; i < dim; i++) { + size *= (size_t) (shp[i]); + } + + ssize_t res = write (fd, data, size); + + if (res == -1) { + SAC_RuntimeError ("Reading the file failed with error code %d\n", errno); + } +} diff --git a/src/stdio/src/BinFile/BinFile.h b/src/stdio/src/BinFile.h similarity index 72% rename from src/stdio/src/BinFile/BinFile.h rename to src/stdio/src/BinFile.h index c098b9f7..5a4e061c 100644 --- a/src/stdio/src/BinFile/BinFile.h +++ b/src/stdio/src/BinFile.h @@ -1,17 +1,14 @@ -/* - * implementation of class File - */ +#ifndef _STDLIB_BINFILE_H_ +#define _STDLIB_BINFILE_H_ - -#include +#include +#include #include +#include #include -#include -#include #include -#include - +#include #include "sac.h" - +#endif diff --git a/src/stdio/src/BinFile/binfReadDblArr.c b/src/stdio/src/BinFile/binfReadDblArr.c deleted file mode 100644 index 17203662..00000000 --- a/src/stdio/src/BinFile/binfReadDblArr.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Implementation of module BinFile - */ - - -#include "BinFile.h" - -#define array_nt (array, T_OLD((AUD, (NHD, (NUQ, ))))) -#define ret_nt (ret, T_OLD((AUD, (NHD, (NUQ, ))))) - -void SACbinfReadDoubleArray( SAC_ND_PARAM_out( array_nt, double), int fd, int dim, int *shp) -{ - SAC_ND_DECL__DATA( ret_nt, double, ) - SAC_ND_DECL__DESC( ret_nt, ) - int SAC_ND_A_MIRROR_DIM( ret_nt) = dim; - int i, size; - int bytesRead; - double *doublearray; - int given_dim; - int *given_shp; - - SAC_ND_ALLOC__DESC( ret_nt, dim) - SAC_ND_SET__RC( ret_nt, 1) - - /* start_token = PARSE_DOUBLE_ARRAY; */ - /* yyin = stream; */ - given_dim = dim; - given_shp = shp; - for( i = 0, size = 1; i < dim; i++) { - size *= shp[i]; - SAC_ND_A_DESC_SHAPE( ret_nt, i) = shp[i]; - } - SAC_ND_A_DESC_SIZE( ret_nt) = size; - doublearray = (double *) SAC_MALLOC( size * sizeof( double)); - - /* read double array from file fd */ - bytesRead = read(fd,doublearray,size * sizeof(double)); - - SAC_ND_A_FIELD( ret_nt) = doublearray; - - SAC_ND_RET_out( array_nt, ret_nt) -} - -#undef array_nt -#undef ret_nt diff --git a/src/stdio/src/BinFile/binfWriteDblArr.c b/src/stdio/src/BinFile/binfWriteDblArr.c deleted file mode 100644 index 1919f8b7..00000000 --- a/src/stdio/src/BinFile/binfWriteDblArr.c +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Implementation of module BinFile - */ - - -#include "BinFile.h" - -#define array_nt (array, (AUD, (NHD, (NUQ, )))) -#define ret_nt (ret, (AUD, (NHD, (NUQ, )))) - -void SACbinfWriteDoubleArray(int fd, int dim, int *shp, double* array) -{ - int i; - size_t size; - ssize_t res; // the return value of write can be negative! - for( i = 0, size = 1; i < dim; i++) { - size *= shp[i]; - } - - res = write(fd,array,size*sizeof(double)); - if( res != (ssize_t) (size*sizeof(double))) { - SAC_RuntimeWarning( "only managed to write %d bytes of a %d byte array of doubles", - res, size*sizeof(double)); - } -} - -#undef array_nt -#undef ret_nt diff --git a/src/stdio/src/BinFile/binfclose.c b/src/stdio/src/BinFile/binfclose.c deleted file mode 100644 index 326db04c..00000000 --- a/src/stdio/src/BinFile/binfclose.c +++ /dev/null @@ -1,28 +0,0 @@ -/* - * implementation of class BinFile - */ - - - -#include "BinFile.h" - - - -/*****************************************************************/ - -int SACbinfclose(int fd) -{ - int error=-1; - int retVal; - retVal = close(fd); - if (retVal==-1) { - error=errno; - } - - return(error); -} - -/*****************************************************************/ - - - diff --git a/src/stdio/src/BinFile/binfflags.c b/src/stdio/src/BinFile/binfflags.c deleted file mode 100644 index 9bedbca8..00000000 --- a/src/stdio/src/BinFile/binfflags.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - * implementation of class BinFile - */ - - - -#include "BinFile.h" - - - -/*****************************************************************/ - -int SACbinf_O_RDONLY( void) -{ - return(O_RDONLY); -} - -int SACbinf_O_WRONLY( void) -{ - return(O_WRONLY); -} - -int SACbinf_O_RDWR( void) -{ - return(O_RDWR); -} - -int SACbinf_O_CREAT( void) -{ - return(O_CREAT); -} - -int SACbinf_O_TRUNC( void) -{ - return(O_TRUNC); -} - - -/*****************************************************************/ - - - diff --git a/src/stdio/src/BinFile/binfopen.c b/src/stdio/src/BinFile/binfopen.c deleted file mode 100644 index 4cd6584b..00000000 --- a/src/stdio/src/BinFile/binfopen.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * implementation of class BinFile - */ - - - -#include "BinFile.h" - - - -/*****************************************************************/ - -int SACbinfopen(int *fd, char *name, int flags) -{ - int error=-1; - - *fd = open(name, flags, S_IRUSR | S_IWUSR); - - if (*fd==-1) - { - error=errno; - } - - return(error); -} - - -/*****************************************************************/ - - -