char **values;
size_t count;
size_t capacity;
- size_t total_length;
- bool has_args;
+ size_t total_length;
+ struct {
+ int32_t has_args;
+ int32_t spacing;
+ } signature;
} CB_Generator;
// ======================================================================
free(full_string);
cb_handle_close(file);
cb_dyn_free(gen);
- gen->has_args = false;
+
+ gen->signature.has_args = 0;
+ gen->signature.spacing = 0;
+ gen->total_length = 0;
}
static void cb_gen_push(CB_Generator *gen, char *string) {
static void cb_gen_sig_begin(CB_Generator *gen, char *signature_no_args) {
cb_gen_push(gen, cb_format("%s(", signature_no_args));
+ gen->signature.spacing = strlen(signature_no_args) + 1;
}
static void cb_gen_sig_arg(CB_Generator *gen, char *argument) {
- if (gen->has_args) {
+ if (gen->signature.has_args > 0 && gen->signature.has_args % 4 == 0) {
+ cb_gen_push(gen, ",\n");
+ cb_gen_push(gen, cb_format("%*s", gen->signature.spacing, ""));
+ } else if (gen->signature.has_args) {
cb_gen_push(gen, ", ");
}
- gen->has_args = true;
+ gen->signature.has_args += 1;
cb_gen_push(gen, argument);
}
static void cb_gen_sig_end(CB_Generator *gen, bool implementation) {
- if (!gen->has_args) {
+ if (!gen->signature.has_args) {
cb_gen_push(gen, "void");
}
cb_gen_push(gen, ")");
if (!implementation) {
cb_gen_push(gen, ";\n");
}
+ gen->signature.has_args = 0;
+ gen->signature.spacing = 0;
}
#endif
#ifndef CBUILD_EXTRA_LINEAR_ALGEBRA_H
#define CBUILD_EXTRA_LINEAR_ALGEBRA_H
-static void cb_linagen_define_vecn(CB_Generator *gen, char *type,
- char *suffix, int32_t n) {
+static char char_toupper(char ch) {
+ if (ch >= 'a' && ch <= 'z') {
+ return ch - ('a' - 'A');
+ }
+ return ch;
+}
+
+static void cb_linagen_define_vecn(CB_Generator *gen, char *type, int32_t n) {
+ char *suffix = strdup(type);
+ *suffix = char_toupper(*type);
cb_gen_push(gen, cb_format("typedef union {"
"\n %s values[%d];"
"\n struct {",
n, suffix));
}
+static void cb_linagen_defun_vecn_add(CB_Generator *gen, char *type,
+ int32_t n, bool implementation) {
+ char *vec_suffix = strdup(type);
+ *vec_suffix = char_toupper(*type);
+ cb_gen_sig_begin(gen, cb_format("linagen_fn Vec%d%s vec%d%s_add",
+ n, vec_suffix, n, type));
+ cb_gen_sig_arg(gen, cb_format("Vec%d%s v1", n, vec_suffix));
+ cb_gen_sig_arg(gen, cb_format("Vec%d%s v2", n, vec_suffix));
+ cb_gen_sig_end(gen, implementation);
+ if (!implementation) { return; }
+
+ cb_gen_push(gen, cb_format(" {"
+ "\n Vec%d%s res = {0};",
+ n, vec_suffix));
+ for (int32_t i = 0; i < n; ++i) {
+ cb_gen_push(gen, cb_format("\n res._%d = v1._%d + v2._%d;", i, i, i));
+ }
+ cb_gen_push(gen, "\n return res;"
+ "\n}\n\n");
+}
+
+static void cb_linagen_defun_vecn_add_assign(CB_Generator *gen, char *type,
+ int32_t n, bool implementation) {
+ char *vec_suffix = strdup(type);
+ *vec_suffix = char_toupper(*type);
+ cb_gen_sig_begin(gen, cb_format("linagen_fn void vec%d%s_add_assign",
+ n, type));
+ cb_gen_sig_arg(gen, cb_format("Vec%d%s *v1", n, vec_suffix));
+ cb_gen_sig_arg(gen, cb_format("Vec%d%s v2", n, vec_suffix));
+ cb_gen_sig_end(gen, implementation);
+ if (!implementation) { return; }
+
+ cb_gen_push(gen, " {");
+ for (int32_t i = 0; i < n; ++i) {
+ cb_gen_push(gen, cb_format("\n v1->_%d += v2._%d;", i, i));
+ }
+ cb_gen_push(gen, "\n}\n\n");
+}
+
#endif