commit
05764643c4
2 changed files with 129 additions and 0 deletions
@ -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("\"<unknown>\"") %} |
||||||
|
{%- endif %} |
||||||
|
|
||||||
|
{%- endfor %} |
||||||
|
snprintf(buf, buf_size, "{{ event.name }}({{ format_parts|join(', ') }})", {{ args|join(', ') }}); |
||||||
|
} |
||||||
|
{%- endfor %} |
||||||
@ -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() |
||||||
Loading…
Reference in new issue