From a74f8f3fd6a7c03b03461451b9dc869ce5123e9a Mon Sep 17 00:00:00 2001 From: Weijia Wang Date: Tue, 27 May 2025 21:17:13 +0200 Subject: [PATCH] Port to Windows --- src/fglm/Makefile.am | 3 +- src/fglm/aligned_alloc.h | 50 +++++++++++ src/fglm/data_fglm.c | 9 +- src/fglm/fglm_core.c | 14 +-- src/msolve/Makefile.am | 1 + src/msolve/getdelim.h | 131 ++++++++++++++++++++++++++++ src/msolve/hilbert.c | 182 +++++++++++++++++++-------------------- src/msolve/iofiles.c | 2 + src/msolve/lifting-gb.c | 6 +- src/msolve/main.c | 2 +- src/msolve/msolve.c | 24 +++--- src/neogb/sort_r.h | 2 +- 12 files changed, 307 insertions(+), 119 deletions(-) create mode 100644 src/fglm/aligned_alloc.h create mode 100644 src/msolve/getdelim.h diff --git a/src/fglm/Makefile.am b/src/fglm/Makefile.am index 80904d0e..1cb80ea7 100644 --- a/src/fglm/Makefile.am +++ b/src/fglm/Makefile.am @@ -11,4 +11,5 @@ EXTRA_DIST = fglm.h \ fglm_core.c \ inner-product.c \ matrix-mult.c \ - linalg-fglm.c + linalg-fglm.c \ + aligned_alloc.h diff --git a/src/fglm/aligned_alloc.h b/src/fglm/aligned_alloc.h new file mode 100644 index 00000000..1553d05c --- /dev/null +++ b/src/fglm/aligned_alloc.h @@ -0,0 +1,50 @@ +/* This file is part of msolve. + * + * msolve is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * msolve is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with msolve. If not, see + * + * Authors: + * Jérémy Berthomieu + * Christian Eder + * Mohab Safey El Din */ + +#ifndef ALIGNED_ALLOC_HEADER_H +#define ALIGNED_ALLOC_HEADER_H + +#ifdef _WIN32 + +#include +#include + +static inline int posix_memalign(void **__memptr, size_t __alignment, size_t __size) +{ + void *p = _aligned_malloc(__size, __alignment); + if (!p) + { + return ENOMEM; + } + *__memptr = p; + return 0; +} +#endif + +static inline void posix_memalign_free(void *__p) +{ +#ifdef _WIN32 + _aligned_free(__p); +#else + free(__p); +#endif +} + +#endif /* ALIGNED_ALLOC_HEADER_H */ diff --git a/src/fglm/data_fglm.c b/src/fglm/data_fglm.c index 368c85e5..343a9766 100644 --- a/src/fglm/data_fglm.c +++ b/src/fglm/data_fglm.c @@ -26,6 +26,7 @@ #include #include +#include "aligned_alloc.h" static inline void free_sp_mat_fglm(sp_matfglm_t *mat){ if(mat!=NULL){ @@ -80,10 +81,10 @@ static inline fglm_data_t *allocate_fglm_data(szmat_t nrows, szmat_t ncols, szma static inline void free_fglm_data(fglm_data_t *data){ - free(data->vecinit); - free(data->res); - free(data->vecmult); - free(data->vvec); + posix_memalign_free(data->vecinit); + posix_memalign_free(data->res); + posix_memalign_free(data->vecmult); + posix_memalign_free(data->vvec); free(data->pts); free(data); } diff --git a/src/fglm/fglm_core.c b/src/fglm/fglm_core.c index ae04cbe1..c8eeb051 100644 --- a/src/fglm/fglm_core.c +++ b/src/fglm/fglm_core.c @@ -70,6 +70,8 @@ double omp_get_wtime(void) { return realtime();} #include "../upolmat/nmod_poly_mat_pmbasis.c" #endif +#include "aligned_alloc.h" + void print_fglm_data( FILE *file, const md_t * const st, @@ -756,9 +758,9 @@ static void generate_matrix_sequence(sp_matfglm_t *matxn, fglm_data_t *data, RED_32, RED_64); } - free(Rmat); - free(res); - free(tres); + posix_memalign_free(Rmat); + posix_memalign_free(res); + posix_memalign_free(tres); } @@ -1525,7 +1527,7 @@ param_t *nmod_fglm_compute_trace_data(sp_matfglm_t *matrix, mod_t prime, #endif #if DEBUGFGLM >= 1 - FILE *fmat = fopen("/tmp/matrix.fglm", "w"); + FILE *fmat = fopen("/tmp/matrix.fglm", "wb"); display_fglm_matrix(fmat, matrix); fclose(fmat); #endif @@ -1728,7 +1730,7 @@ int nmod_fglm_compute_apply_trace_data(sp_matfglm_t *matrix, #endif #if DEBUGFGLM >= 1 - FILE *fmat = fopen("/tmp/matrix.fglm", "w"); + FILE *fmat = fopen("/tmp/matrix.fglm", "wb"); display_fglm_matrix(fmat, matrix); fclose(fmat); #endif @@ -2077,7 +2079,7 @@ param_t *nmod_fglm_guess_colon(sp_matfglmcol_t *matrix, #endif #if DEBUGFGLM >= 1 - FILE *fmat = fopen("/tmp/matrix.fglm", "w"); + FILE *fmat = fopen("/tmp/matrix.fglm", "wb"); display_fglm_colon_matrix(fmat, matrix); fclose(fmat); #endif diff --git a/src/msolve/Makefile.am b/src/msolve/Makefile.am index bfe5f6d9..1a713b4b 100644 --- a/src/msolve/Makefile.am +++ b/src/msolve/Makefile.am @@ -17,6 +17,7 @@ EXTRA_DIST = msolve-data.h \ iofiles.c \ msolve.c \ primes.c \ + getdelim.h \ ../crt/longlong.h \ ../crt/ulong_extras.h \ ../crt/mpq_reconstruct.c \ diff --git a/src/msolve/getdelim.h b/src/msolve/getdelim.h new file mode 100644 index 00000000..70033b73 --- /dev/null +++ b/src/msolve/getdelim.h @@ -0,0 +1,131 @@ +/* getdelim.h --- Implementation of replacement getdelim/getline function. + Copyright (C) 1994, 1996-1998, 2001, 2003, 2005-2025 Free Software + Foundation, Inc. + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +/* Ported from glibc by Simon Josefsson. */ + +#ifndef GETDELIM_HEADER_H +#define GETDELIM_HEADER_H + +#ifdef _WIN32 + +#include + +#include +#include +#include +#include + +static inline void +alloc_failed (void) +{ +#if defined _WIN32 && ! defined __CYGWIN__ + /* Avoid errno problem without using the realloc module; see: + https://lists.gnu.org/r/bug-gnulib/2016-08/msg00025.html */ + errno = ENOMEM; +#endif +} + +/* Read up to (and including) a DELIMITER from FP into *LINEPTR (and + NUL-terminate it). *LINEPTR is a pointer returned from malloc (or + NULL), pointing to *N characters of space. It is realloc'ed as + necessary. Returns the number of characters read (not including + the null terminator), or -1 on error or EOF. */ + +static inline ssize_t +getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) +{ + ssize_t result; + size_t cur_len = 0; + + if (lineptr == NULL || n == NULL || fp == NULL) + { + errno = EINVAL; + return -1; + } + + if (*lineptr == NULL || *n == 0) + { + char *new_lineptr; + *n = 120; + new_lineptr = (char *) realloc (*lineptr, *n); + if (new_lineptr == NULL) + { + alloc_failed (); + return -1; + } + *lineptr = new_lineptr; + } + + for (;;) + { + int i; + + i = getc (fp); + if (i == EOF) + { + result = -1; + break; + } + + /* Make enough space for len+1 (for final NUL) bytes. */ + if (cur_len + 1 >= *n) + { + size_t needed_max = + SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX; + size_t needed = 2 * *n + 1; /* Be generous. */ + char *new_lineptr; + + if (needed_max < needed) + needed = needed_max; + if (cur_len + 1 >= needed) + { + errno = EOVERFLOW; + return -1; + } + + new_lineptr = (char *) realloc (*lineptr, needed); + if (new_lineptr == NULL) + { + alloc_failed (); + return -1; + } + + *lineptr = new_lineptr; + *n = needed; + } + + (*lineptr)[cur_len] = i; + cur_len++; + + if (i == delimiter) + break; + } + (*lineptr)[cur_len] = '\0'; + result = cur_len ? cur_len : result; + + return result; +} + +static inline ssize_t +getline (char **lineptr, size_t *n, FILE *stream) +{ + return getdelim (lineptr, n, '\n', stream); +} + +#endif + +#endif /* GETDELIM_HEADER_H */ diff --git a/src/msolve/hilbert.c b/src/msolve/hilbert.c index 579b7fe4..f4dde1b4 100644 --- a/src/msolve/hilbert.c +++ b/src/msolve/hilbert.c @@ -1544,10 +1544,10 @@ static inline sp_matfglm_t * build_matrixn(int32_t *lmb, long dquot, int32_t bld count++; if(len_xn < count && i < dquot){ fprintf(stderr, "One should not arrive here (build_matrix)\n"); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); free(matrix); free(len_gb_xn); @@ -1561,11 +1561,11 @@ static inline sp_matfglm_t * build_matrixn(int32_t *lmb, long dquot, int32_t bld fprintf(stderr, "Multiplication by "); display_monomial_full(stderr, nv, NULL, 0, exp); fprintf(stderr, " gets outside the staircase\n"); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); matrix = NULL; @@ -1927,12 +1927,12 @@ build_matrixn_colon(int32_t *lmb, long dquot, int32_t bld, free(lens); free(exps); free(cfs); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->zero_idx); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->zero_idx); + posix_memalign_free(matrix->dst); free(matrix); free(evi); free(len_gb_xn); @@ -2387,12 +2387,12 @@ build_matrixn_colon_no_zero(int32_t *lmb, long dquot, int32_t bld, free(lens); free(exps); free(cfs); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); - /* free(matrix->zero_idx); */ + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); + /* posix_memalign_free(matrix->zero_idx); */ free(matrix); free(evi); free(len_gb_xn); @@ -2605,11 +2605,11 @@ static inline sp_matfglm_t * build_matrixn_trace(int32_t **bdiv_xn, count++; if(len_xn < count && i < dquot){ fprintf(stderr, "One should not arrive here (build_matrix)\n"); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free(len_gb_xn); @@ -2623,11 +2623,11 @@ static inline sp_matfglm_t * build_matrixn_trace(int32_t **bdiv_xn, fprintf(stderr, "Multiplication by "); display_monomial_full(stderr, nv, NULL, 0, exp); fprintf(stderr, " gets outside the staircase\n"); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free(len_gb_xn); @@ -2802,11 +2802,11 @@ static inline sp_matfglm_t * build_matrixn_from_bs(int32_t *lmb, long dquot, count++; if(len_xn < count && i < dquot){ fprintf(stderr, "One should not arrive here (build_matrix with trace)\n"); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free(len_gb_xn); @@ -2822,11 +2822,11 @@ static inline sp_matfglm_t * build_matrixn_from_bs(int32_t *lmb, long dquot, display_monomial_full(stderr, nv, NULL, 0, exp); #endif fprintf(stderr, " gets outside the staircase\n"); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free(len_gb_xn); @@ -2997,11 +2997,11 @@ static inline void build_matrixn_from_bs_trace_application(sp_matfglm_t *matrix, count++; if(len_xn < count && i < dquot){ fprintf(stderr, "One should not arrive here (build_matrix with trace)\n"); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free(len_gb_xn); @@ -3015,11 +3015,11 @@ static inline void build_matrixn_from_bs_trace_application(sp_matfglm_t *matrix, fprintf(stderr, "Multiplication by "); display_monomial_full(stderr, nv, NULL, 0, exp); fprintf(stderr, " gets outside the staircase\n"); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free(len_gb_xn); @@ -3172,11 +3172,11 @@ static inline void build_matrixn_unstable_from_bs_trace_application(sp_matfglm_t count++; if(len_xn < count && i < dquot){ fprintf(stderr, "One should not arrive here (build_matrix with trace)\n"); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free_basis_without_hash_table(&tbr); @@ -3201,11 +3201,11 @@ static inline void build_matrixn_unstable_from_bs_trace_application(sp_matfglm_t count_nf++; if (count_not_lm < count_nf && i < dquot) { fprintf(stderr, "One should not arrive here (build_matrix with trace)\n"); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free_basis_without_hash_table(&tbr); @@ -3225,11 +3225,11 @@ static inline void build_matrixn_unstable_from_bs_trace_application(sp_matfglm_t fprintf(stderr, "Multiplication by "); display_monomial_full(stderr, nv, NULL, 0, exp); fprintf(stderr, " gets outside the staircase\n"); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free_basis_without_hash_table(&tbr); @@ -3419,11 +3419,11 @@ static inline sp_matfglm_t * build_matrixn_from_bs_trace(int32_t **bdiv_xn, if(info_level){ fprintf(stderr, "Staircase is not generic (1 => explain better)\n"); } - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free(len_gb_xn); @@ -3439,11 +3439,11 @@ static inline sp_matfglm_t * build_matrixn_from_bs_trace(int32_t **bdiv_xn, display_monomial_full(stderr, nv, NULL, 0, exp); fprintf(stderr, " gets outside the staircase\n"); } - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free(len_gb_xn); @@ -3776,11 +3776,11 @@ static inline sp_matfglm_t * build_matrixn_unstable_from_bs_trace(int32_t **bdiv if (info_level){ fprintf(stderr, "Staircase is not generic (1 => explain better)\n"); } - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free_basis_without_hash_table(&tbr); @@ -3812,11 +3812,11 @@ static inline sp_matfglm_t * build_matrixn_unstable_from_bs_trace(int32_t **bdiv if (info_level){ fprintf(stderr, "Staircase is not generic (1 => explain better)\n"); } - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free_basis_without_hash_table(&tbr); @@ -3836,11 +3836,11 @@ static inline sp_matfglm_t * build_matrixn_unstable_from_bs_trace(int32_t **bdiv fprintf(stderr, "Multiplication by "); display_monomial_full(stderr, nv, NULL, 0, exp); fprintf(stderr, " gets outside the staircase\n"); - free(matrix->dense_mat); - free(matrix->dense_idx); - free(matrix->triv_idx); - free(matrix->triv_pos); - free(matrix->dst); + posix_memalign_free(matrix->dense_mat); + posix_memalign_free(matrix->dense_idx); + posix_memalign_free(matrix->triv_idx); + posix_memalign_free(matrix->triv_pos); + posix_memalign_free(matrix->dst); free(matrix); free_basis_without_hash_table(&tbr); diff --git a/src/msolve/iofiles.c b/src/msolve/iofiles.c index c2994c9e..5b12b561 100644 --- a/src/msolve/iofiles.c +++ b/src/msolve/iofiles.c @@ -18,6 +18,8 @@ * Christian Eder * Mohab Safey El Din */ +#include "getdelim.h" + static inline void store_exponent(const char *term, data_gens_ff_t *gens, int32_t pos) { len_t i, j, k; diff --git a/src/msolve/lifting-gb.c b/src/msolve/lifting-gb.c index e7525507..48c748b9 100644 --- a/src/msolve/lifting-gb.c +++ b/src/msolve/lifting-gb.c @@ -1829,7 +1829,7 @@ void print_msolve_gbtrace_qq(data_gens_ff_t *gens, FILE *ofile; if (flags->files->out_file != NULL) { - ofile = fopen(flags->files->out_file, "w+"); + ofile = fopen(flags->files->out_file, "wb+"); } else { ofile = stdout; } @@ -1866,7 +1866,7 @@ void print_msolve_gbtrace_qq(data_gens_ff_t *gens, if(flags->print_gb > 1){ if(flags->files->out_file != NULL){ - FILE *ofile = fopen(flags->files->out_file, "a+"); + FILE *ofile = fopen(flags->files->out_file, "ab+"); display_gbmodpoly_cf_qq(ofile, (*modgbsp), gens); fclose(ofile); } @@ -1876,7 +1876,7 @@ void print_msolve_gbtrace_qq(data_gens_ff_t *gens, } if(flags->print_gb == 1){ if(flags->files->out_file != NULL){ - FILE *ofile = fopen(flags->files->out_file, "a+"); + FILE *ofile = fopen(flags->files->out_file, "ab+"); display_lm_gbmodpoly_cf_qq(ofile, (*modgbsp), gens); fclose(ofile); } diff --git a/src/msolve/main.c b/src/msolve/main.c index 343b2fd2..43f2ccf7 100644 --- a/src/msolve/main.c +++ b/src/msolve/main.c @@ -404,7 +404,7 @@ int main(int argc, char **argv){ /* clear out_file if given */ if(files->out_file != NULL){ - FILE *ofile = fopen(files->out_file, "w"); + FILE *ofile = fopen(files->out_file, "wb"); if(ofile == NULL){ fprintf(stderr, "Cannot open output file\n"); exit(1); diff --git a/src/msolve/msolve.c b/src/msolve/msolve.c index 99b2c9c8..f0478b69 100644 --- a/src/msolve/msolve.c +++ b/src/msolve/msolve.c @@ -1504,7 +1504,7 @@ static inline void print_groebner_basis(files_gb *files, if (md->print_gb) { int32_t gfc = md->gfc; md->gfc = fc; - print_ff_basis_data(files->out_file, "a", bs, bs->ht, md, gens, + print_ff_basis_data(files->out_file, "ab", bs, bs->ht, md, gens, md->print_gb); md->gfc = gfc; } @@ -2523,11 +2523,11 @@ int msolve_trace_qq(mpz_param_t *mpz_paramp, free(blen_gb_xn[i]); free(bstart_cf_gb_xn[i]); free(bdiv_xn[i]); - free(bmatrix[i]->dense_mat); - free(bmatrix[i]->dense_idx); - free(bmatrix[i]->triv_idx); - free(bmatrix[i]->triv_pos); - free(bmatrix[i]->dst); + posix_memalign_free(bmatrix[i]->dense_mat); + posix_memalign_free(bmatrix[i]->dense_idx); + posix_memalign_free(bmatrix[i]->triv_idx); + posix_memalign_free(bmatrix[i]->triv_pos); + posix_memalign_free(bmatrix[i]->dst); free(bmatrix[i]); free(leadmons_ori[i]); free(leadmons_current[i]); @@ -3426,7 +3426,7 @@ int real_msolve_qq(mpz_param_t *mpz_paramp, param_t **nmod_param, int *dim_ptr, void display_arrays_of_real_roots(files_gb *files, int32_t len, real_point_t **lreal_pts, long *lnbr) { if (files->out_file != NULL) { - FILE *ofile = fopen(files->out_file, "a+"); + FILE *ofile = fopen(files->out_file, "ab+"); fprintf(ofile, "["); for (int i = 0; i < len - 1; i++) { display_real_points(ofile, lreal_pts[i], lnbr[i]); @@ -3453,7 +3453,7 @@ void display_output(int b, int dim, int dquot, files_gb *files, real_point_t **real_pts_ptr, int info_level) { if (dquot == 0) { if (files->out_file != NULL) { - FILE *ofile = fopen(files->out_file, "a+"); + FILE *ofile = fopen(files->out_file, "ab+"); fprintf(ofile, "[-1]:\n"); fclose(ofile); } else { @@ -3465,7 +3465,7 @@ void display_output(int b, int dim, int dquot, files_gb *files, if (dim == 0 && dquot >= 0) { (*mpz_paramp)->nvars = gens->nvars; if (files->out_file != NULL) { - FILE *ofile = fopen(files->out_file, "a+"); + FILE *ofile = fopen(files->out_file, "ab+"); fprintf(ofile, "[0, "); if (get_param >= 1 || gens->field_char) { mpz_param_out_str_maple(ofile, gens, dquot, *mpz_paramp, param); @@ -3497,7 +3497,7 @@ void display_output(int b, int dim, int dquot, files_gb *files, fprintf(stderr, "The ideal has positive dimension\n"); } if (files->out_file != NULL) { - FILE *ofile2 = fopen(files->out_file, "a+"); + FILE *ofile2 = fopen(files->out_file, "ab+"); // 1 because dim is >0 fprintf(ofile2, "[1, %d, -1, []]:\n", gens->nvars); fclose(ofile2); @@ -3732,7 +3732,7 @@ int core_msolve( return -1; } if (print_gb) { - print_ff_basis_data(files->out_file, "a", bs, bht, + print_ff_basis_data(files->out_file, "ab", bs, bht, st, gens, print_gb); } } @@ -4209,7 +4209,7 @@ int core_msolve( } /* print all reduced elements in tbr, first normal_form ones * are the input elements */ - print_ff_nf_data(files->out_file, "a", 0, normal_form, tbr, bht, st, gens, 2); + print_ff_nf_data(files->out_file, "ab", 0, normal_form, tbr, bht, st, gens, 2); if (normal_form_matrix > 0) { /* sht and hcm will store the union of the support * of all normal forms in tbr. */ diff --git a/src/neogb/sort_r.h b/src/neogb/sort_r.h index 147d3834..bc6842af 100644 --- a/src/neogb/sort_r.h +++ b/src/neogb/sort_r.h @@ -47,7 +47,7 @@ void sort_r(void *base, size_t nel, size_t width, #if (defined __APPLE__ || defined __MACH__ || defined __DARWIN__ || \ (defined __FreeBSD__ && !defined(qsort_r)) || defined __DragonFly__) # define _SORT_R_BSD -#elif (defined __MINGW32__ || defined __GLIBC__ || \ +#elif (defined __GLIBC__ || \ (defined (__FreeBSD__) && defined(qsort_r))) # define _SORT_R_LINUX