ogl_beamforming

Ultrasound Beamforming Implemented with OpenGL
git clone anongit@rnpnr.xyz:ogl_beamforming.git
Log | Files | Refs | Feed | Submodules | README | LICENSE

Commit: 3982c25d2f76c72a5f52935ef126620a4f0686b8
Parent: 476bce1acbaaf7243bcb9babd29237fd4b4d3df8
Author: Randy Palamar
Date:   Sun, 27 Jul 2025 11:59:30 -0600

build: rework bindings generator

Diffstat:
Mbuild.c | 90+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
1 file changed, 58 insertions(+), 32 deletions(-)

diff --git a/build.c b/build.c @@ -710,66 +710,92 @@ build_tests(Arena arena, CommandList cc) return result; } + +typedef struct { + Stream stream; + i32 indentation_level; +} MetaprogramContext; + +function b32 +meta_write_and_reset(MetaprogramContext *m, char *file) +{ + b32 result = os_write_new_file(file, stream_to_s8(&m->stream)); + if (!result) build_log_failure("%s", file); + m->stream.widx = 0; + m->indentation_level = 0; + return result; +} + +function void +meta_indent(MetaprogramContext *m) +{ + for (i32 count = m->indentation_level; count > 0; count--) + stream_append_byte(&m->stream, '\t'); +} + function void -stream_begin_matlab_enumeration(Stream *s, s8 name, s8 type) +meta_begin_scope(MetaprogramContext *m, s8 line) { - stream_append_s8s(s, s8("classdef "), name, s8(" < "), type, s8("\n"), s8(" enumeration\n")); + meta_indent(m); + m->indentation_level++; + stream_append_s8s(&m->stream, line, s8("\n")); } function void -stream_append_matlab_enumeration_field(Stream *s, s8 field) +meta_append_line(MetaprogramContext *m, s8 line) { - stream_append_s8s(s, s8(" "), field, s8("\n")); + meta_indent(m); + stream_append_s8s(&m->stream, line, s8("\n")); } function void -stream_end_matlab_enumeration(Stream *s) +meta_end_scope(MetaprogramContext *m, s8 line) { - stream_append_s8(s, s8(" end\nend\n")); + m->indentation_level--; + meta_append_line(m, line); } +#define meta_begin_matlab_class(m, name, type) \ + meta_begin_scope(m, s8("classdef " name " < " type)) +#define meta_end_matlab_scope(m) meta_end_scope(m, s8("end")) + function b32 build_matlab_bindings(Arena arena) { b32 result = 1; os_make_directory(OUTPUT("matlab")); - char *feedback_out = OUTPUT("matlab/LiveFeedbackFlags.m"); + char *out = OUTPUT("matlab/LiveFeedbackFlags.m"); /* NOTE(rnp): if one file is outdated all files are outdated */ - if (needs_rebuild(feedback_out, "beamformer_parameters.h")) { - Stream sb = arena_stream(arena); - b32 write_result; + if (needs_rebuild(out, "beamformer_parameters.h")) { + MetaprogramContext m = {.stream = arena_stream(arena)}; - #define X(name, flag) stream_append_matlab_enumeration_field(&sb, s8(#name " (" str(flag) ")")); - stream_begin_matlab_enumeration(&sb, s8("LiveFeedbackFlags"), s8("int32")); + meta_begin_matlab_class(&m, "LiveFeedbackFlags", "int32"); + meta_begin_scope(&m, s8("enumeration")); + #define X(name, flag, ...) meta_append_line(&m, s8(#name " (" str(flag) ")")); BEAMFORMER_LIVE_IMAGING_DIRTY_FLAG_LIST - stream_end_matlab_enumeration(&sb); - write_result = os_write_new_file(feedback_out, stream_to_s8(&sb)); #undef X - if (!write_result) build_log_failure("%s", feedback_out); - result &= write_result; + meta_end_matlab_scope(&m); + meta_end_matlab_scope(&m); + result &= meta_write_and_reset(&m, out); - sb.widx = 0; - char *shader_stages_out = OUTPUT("matlab/OGLShaderStage.m"); - #define X(name, n, ...) stream_append_matlab_enumeration_field(&sb, s8(#name " (" str(n) ")")); - stream_begin_matlab_enumeration(&sb, s8("OGLShaderStage"), s8("int32")); + meta_begin_matlab_class(&m, "OGLShaderStage", "int32"); + meta_begin_scope(&m, s8("enumeration")); + #define X(name, flag, ...) meta_append_line(&m, s8(#name " (" str(flag) ")")); COMPUTE_SHADERS - stream_end_matlab_enumeration(&sb); - write_result = os_write_new_file(shader_stages_out, stream_to_s8(&sb)); #undef X - if (!write_result) build_log_failure("%s", shader_stages_out); - result &= write_result; + meta_end_matlab_scope(&m); + meta_end_matlab_scope(&m); + result &= meta_write_and_reset(&m, OUTPUT("matlab/OGLShaderStage.m")); - sb.widx = 0; - char *data_kinds_out = OUTPUT("matlab/OGLBeamformerDataKind.m"); - #define X(name, n, ...) stream_append_matlab_enumeration_field(&sb, s8(#name " (" str(n) ")")); - stream_begin_matlab_enumeration(&sb, s8("OGLBeamformerDataKind"), s8("int32")); + meta_begin_matlab_class(&m, "OGLBeamformerDataKind", "int32"); + meta_begin_scope(&m, s8("enumeration")); + #define X(name, flag, ...) meta_append_line(&m, s8(#name " (" str(flag) ")")); BEAMFORMER_DATA_KIND_LIST - stream_end_matlab_enumeration(&sb); - write_result = os_write_new_file(data_kinds_out, stream_to_s8(&sb)); #undef X - if (!write_result) build_log_failure("%s", data_kinds_out); - result &= write_result; + meta_end_matlab_scope(&m); + meta_end_matlab_scope(&m); + result &= meta_write_and_reset(&m, OUTPUT("matlab/OGLBeamformerDataKind.m")); } return result;