#include <stdio.h>
#include <stdlib.h> // malloc, free
// Define GSL matrix type for testing purposes
typedef struct gsl_matrix {
int rows;
int cols;
double **data;
} gsl_matrix;
// Define gsl_matrix_free function for testing purposes
void gsl_matrix_free(gsl_matrix *m) {
for (int i = 0; i < m->rows; i++) {
}
}
#define Fn_apply(type, fn, ...) \
{ \
void *stopper_for_apply = (int[]){0}; \
type **list_for_apply = (type*[]){__VA_ARGS__, stopper_for_apply}; \
for (int i = 0; list_for_apply[i] != stopper_for_apply; i++) \
fn(list_for_apply[i]); \
}
#define Free_all(...) Fn_apply(void, free, __VA_ARGS__)
#define Gsl_vector_free_all(...) \
Fn_apply(gsl_vector, gsl_vector_free, __VA_ARGS__)
#define Gsl_matrix_free_all(...) \
Fn_apply(gsl_matrix, gsl_matrix_free, __VA_ARGS__)
int main() {
// Allocate memory for test pointers
double *x
= malloc(10 * sizeof(double)); double *y
= malloc(100 * sizeof(double)); double *z
= malloc(1000 * sizeof(double));
// Free memory using the Free_all macro
Free_all(x, y, z);
// Allocate memory for test GSL matrices
gsl_matrix
*m1
= malloc(sizeof(gsl_matrix
)); m1->rows = 3;
m1->cols = 3;
m1
->data
= malloc(m1
->rows
* sizeof(double *)); for (int i = 0; i < m1->rows; i++) {
m1
->data
[i
] = malloc(m1
->cols
* sizeof(double)); }
gsl_matrix
*m2
= malloc(sizeof(gsl_matrix
)); m2->rows = 2;
m2->cols = 2;
m2
->data
= malloc(m2
->rows
* sizeof(double *)); for (int i = 0; i < m2->rows; i++) {
m2
->data
[i
] = malloc(m2
->cols
* sizeof(double)); }
// Free GSL matrices using the Gsl_matrix_free_all macro
Gsl_matrix_free_all(m1, m2);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4gLy8gbWFsbG9jLCBmcmVlCgovLyBEZWZpbmUgR1NMIG1hdHJpeCB0eXBlIGZvciB0ZXN0aW5nIHB1cnBvc2VzCnR5cGVkZWYgc3RydWN0IGdzbF9tYXRyaXggewogICAgaW50IHJvd3M7CiAgICBpbnQgY29sczsKICAgIGRvdWJsZSAqKmRhdGE7Cn0gZ3NsX21hdHJpeDsKCi8vIERlZmluZSBnc2xfbWF0cml4X2ZyZWUgZnVuY3Rpb24gZm9yIHRlc3RpbmcgcHVycG9zZXMKdm9pZCBnc2xfbWF0cml4X2ZyZWUoZ3NsX21hdHJpeCAqbSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtLT5yb3dzOyBpKyspIHsKICAgICAgICBmcmVlKG0tPmRhdGFbaV0pOwogICAgfQogICAgZnJlZShtLT5kYXRhKTsKICAgIGZyZWUobSk7Cn0KCiNkZWZpbmUgRm5fYXBwbHkodHlwZSwgZm4sIC4uLikgXAogICAgeyBcCiAgICAgICAgdm9pZCAqc3RvcHBlcl9mb3JfYXBwbHkgPSAoaW50W10pezB9OyBcCiAgICAgICAgdHlwZSAqKmxpc3RfZm9yX2FwcGx5ID0gKHR5cGUqW10pe19fVkFfQVJHU19fLCBzdG9wcGVyX2Zvcl9hcHBseX07IFwKICAgICAgICBmb3IgKGludCBpID0gMDsgbGlzdF9mb3JfYXBwbHlbaV0gIT0gc3RvcHBlcl9mb3JfYXBwbHk7IGkrKykgXAogICAgICAgICAgICBmbihsaXN0X2Zvcl9hcHBseVtpXSk7IFwKICAgIH0KCiNkZWZpbmUgRnJlZV9hbGwoLi4uKSBGbl9hcHBseSh2b2lkLCBmcmVlLCBfX1ZBX0FSR1NfXykKCiNkZWZpbmUgR3NsX3ZlY3Rvcl9mcmVlX2FsbCguLi4pIFwKICAgIEZuX2FwcGx5KGdzbF92ZWN0b3IsIGdzbF92ZWN0b3JfZnJlZSwgX19WQV9BUkdTX18pCgojZGVmaW5lIEdzbF9tYXRyaXhfZnJlZV9hbGwoLi4uKSBcCiAgICBGbl9hcHBseShnc2xfbWF0cml4LCBnc2xfbWF0cml4X2ZyZWUsIF9fVkFfQVJHU19fKQoKaW50IG1haW4oKSB7CiAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRlc3QgcG9pbnRlcnMKICAgIGRvdWJsZSAqeCA9IG1hbGxvYygxMCAqIHNpemVvZihkb3VibGUpKTsKICAgIGRvdWJsZSAqeSA9IG1hbGxvYygxMDAgKiBzaXplb2YoZG91YmxlKSk7CiAgICBkb3VibGUgKnogPSBtYWxsb2MoMTAwMCAqIHNpemVvZihkb3VibGUpKTsKCiAgICAvLyBGcmVlIG1lbW9yeSB1c2luZyB0aGUgRnJlZV9hbGwgbWFjcm8KICAgIEZyZWVfYWxsKHgsIHksIHopOwoKICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGVzdCBHU0wgbWF0cmljZXMKICAgIGdzbF9tYXRyaXggKm0xID0gbWFsbG9jKHNpemVvZihnc2xfbWF0cml4KSk7CiAgICBtMS0+cm93cyA9IDM7CiAgICBtMS0+Y29scyA9IDM7CiAgICBtMS0+ZGF0YSA9IG1hbGxvYyhtMS0+cm93cyAqIHNpemVvZihkb3VibGUgKikpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtMS0+cm93czsgaSsrKSB7CiAgICAgICAgbTEtPmRhdGFbaV0gPSBtYWxsb2MobTEtPmNvbHMgKiBzaXplb2YoZG91YmxlKSk7CiAgICB9CgogICAgZ3NsX21hdHJpeCAqbTIgPSBtYWxsb2Moc2l6ZW9mKGdzbF9tYXRyaXgpKTsKICAgIG0yLT5yb3dzID0gMjsKICAgIG0yLT5jb2xzID0gMjsKICAgIG0yLT5kYXRhID0gbWFsbG9jKG0yLT5yb3dzICogc2l6ZW9mKGRvdWJsZSAqKSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG0yLT5yb3dzOyBpKyspIHsKICAgICAgICBtMi0+ZGF0YVtpXSA9IG1hbGxvYyhtMi0+Y29scyAqIHNpemVvZihkb3VibGUpKTsKICAgIH0KCiAgICAvLyBGcmVlIEdTTCBtYXRyaWNlcyB1c2luZyB0aGUgR3NsX21hdHJpeF9mcmVlX2FsbCBtYWNybwogICAgR3NsX21hdHJpeF9mcmVlX2FsbChtMSwgbTIpOwoKICAgIHJldHVybiAwOwp9Cg==