commit 05764643c4b83b600862dbc4e02167590531f874 Author: Denis Tereshkin Date: Sat Nov 22 10:05:04 2025 +0700 Initial commit diff --git a/event_template.j2 b/event_template.j2 new file mode 100644 index 0000000..95ebda5 --- /dev/null +++ b/event_template.j2 @@ -0,0 +1,105 @@ +{% set counter = event_start %} + +{%- for event in events %} + +#define EVENT_ID_{{ event.name }} ({{ counter + loop.index }}) + +struct event_{{ event.name }} +{ +{%- for field in event.fields %} + {%- if field.size %} + {{ field.type }} {{ field.name }}[{{ field.size }}]; + {%- else %} + {{ field.type }} {{ field.name }}; + {%- endif %} +{%- endfor %} +}; + +void event_trace_{{ event.name }}( +{%- for field in event.fields %} + {%- if field.size or field.pass_by == "ptr" %} + const {{ field.type }} * {{ field.name }}{%- if not loop.last %}, {% endif %} + {%- else %} + {{ field.type }} {{ field.name }}{%- if not loop.last %}, {% endif %} + {%- endif %} +{%- endfor %} +) +{ + struct event_{{ event.name }} d; +{%- for field in event.fields %} +{%- if field.size %} + strncpy(d.{{ field.name }}, {{ field.name }}, sizeof(d.{{ field.name }}) - 1); + d.{{ field.name }}[sizeof(d.{{ field.name }}) - 1] = '\0'; +{%- elif "const char*" == field.type %} + strncpy(d.{{ field.name }}, {{ field.name }}, sizeof(d.{{ field.name }}) - 1); + d.{{ field.name }}[sizeof(d.{{ field.name }}) - 1] = '\0'; +{%- elif field.pass_by == "ptr" %} + d.{{ field.name }} = *{{ field.name }}; +{%- else %} + d.{{ field.name }} = {{ field.name }}; +{%- endif %} +{%- endfor %} + eventlog_emit_event_struct(eventlog_get_timestamp(), EVENT_ID_{{ event.name }}, &d, sizeof(d)); +} + +void print_{{ event.name }}(const void* data, char* buf, size_t buf_size) +{ + const struct event_{{ event.name }}* d = (const struct event_{{ event.name }}*)data; +{%- set format_parts = [] %} +{%- set args = [] %} +{%- set unknown = false %} +{%- for field in event.fields %} +{%- if field.converter %} + {%- set _ = format_parts.append(field.format) %} + {%- if field.pass_by == "ptr" %} + {%- set _ = args.append(field.converter + "(&d->" + field.name + ")") %} + {%- else %} + {%- set _ = args.append(field.converter + "(d->" + field.name + ")") %} + {%- endif %} +{%- elif "uint64_t" == field.type %} + {%- set _ = format_parts.append("%llu") %} +{%- elif "int64_t" == field.type %} + {%- set _ = format_parts.append("%lld") %} +{%- elif "uint32_t" == field.type %} + {%- set _ = format_parts.append("%u") %} +{%- elif "int32_t" == field.type %} + {%- set _ = format_parts.append("%d") %} +{%- elif "uint16_t" == field.type %} + {%- set _ = format_parts.append("%u") %} +{%- elif "int16_t" == field.type %} + {%- set _ = format_parts.append("%d") %} +{%- elif "uint8_t" == field.type %} + {%- set _ = format_parts.append("%u") %} +{%- elif "int8_t" == field.type %} + {%- set _ = format_parts.append("%d") %} +{%- elif "char" == field.type and not field.size %} + {%- set _ = format_parts.append("%c") %} +{%- elif "int" == field.type %} + {%- set _ = format_parts.append("%d") %} +{%- elif "unsigned" == field.type %} + {%- set _ = format_parts.append("%u") %} +{%- elif "char[" in field.type or (field.size and field.type == "char") %} + {%- set _ = format_parts.append("%s") %} +{%- elif "const char*" == field.type %} + {%- set _ = format_parts.append("%s") %} +{%- elif "void*" == field.type %} + {%- set _ = format_parts.append("%p") %} +{%- else %} + {%- set _ = format_parts.append("%s") %} + {%- set unknown = true %} +{%- endif %} + +{%- if not unknown %} + {%- if not field.converter and field.pass_by == "ptr" %} + {%- set _ = args.append("&d->" + field.name) %} + {%- else %} + {%- set _ = args.append("d->" +field.name) %} + {%- endif %} +{%- else %} + {%- set _ = args.append("\"\"") %} +{%- endif %} + +{%- endfor %} + snprintf(buf, buf_size, "{{ event.name }}({{ format_parts|join(', ') }})", {{ args|join(', ') }}); +} +{%- endfor %} diff --git a/generate_events.py b/generate_events.py new file mode 100644 index 0000000..a169319 --- /dev/null +++ b/generate_events.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +import argparse +from jinja2 import Template + +def main(): + parser = argparse.ArgumentParser(description="Generate C event structures and functions from YAML.") + parser.add_argument("input", help="Input YAML file with event definitions") + parser.add_argument("output", help="Output C header file") + parser.add_argument("--event-start", help="Start event id", required=True) + args = parser.parse_args() + + with open(args.input, "r", encoding="utf-8") as f: + import yaml + events = yaml.safe_load(f) + + with open("event_template.j2", "r", encoding="utf-8") as f: + template = Template(f.read()) + + with open(args.output, "w", encoding="utf-8") as f: + f.write(template.render(events=events, event_start=int(args.event_start))) + +if __name__ == "__main__": + main()