{% 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 %}