X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=converter%2Fbabeltrace-lib.c;h=35f50719359c527f6db230bd05739b0b71727d8f;hp=3c51d840830aba40a3c379dadd3de6fe789498cb;hb=b38819fce90ca2303e3e615e40dd0379096ff7a0;hpb=46322b331aefc5739efd841df72d1928e35050e6 diff --git a/converter/babeltrace-lib.c b/converter/babeltrace-lib.c index 3c51d840..35f50719 100644 --- a/converter/babeltrace-lib.c +++ b/converter/babeltrace-lib.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -26,20 +27,28 @@ #include static -int print_event(struct format *fmt_write, struct ctf_text_stream_pos *sout, - struct format *fmt_read, struct ctf_file_stream *sin) +int convert_event(struct ctf_text_stream_pos *sout, + struct ctf_file_stream *sin) { struct ctf_stream *stream_class = sin->stream; struct ctf_event *event_class; uint64_t id = 0; int len_index; + int ret; + + if (sin->pos.offset == EOF) + return EOF; + + /* Hide event payload struct brackets */ + sout->depth = -1; /* Read and print event header */ if (stream_class->event_header) { - fmt_read->struct_read(&sin->pos.parent, stream_class->event_header); - + ret = generic_rw(&sin->pos.parent, &stream_class->event_header->p); + if (ret) + goto error; /* lookup event id */ - len_index = struct_declaration_lookup_field_index(td->packet_header->declaration, + len_index = struct_declaration_lookup_field_index(stream_class->event_header_decl, g_quark_from_static_string("id")); if (len_index >= 0) { struct definition_integer *defint; @@ -52,13 +61,19 @@ int print_event(struct format *fmt_write, struct ctf_text_stream_pos *sout, id = defint->value._unsigned; /* set id */ } - fmt_write->struct_write(&sout->parent, stream_class->event_header); + ret = generic_rw(&sout->parent, &stream_class->event_header->p); + if (ret) + goto error; } /* Read and print stream-declared event context */ if (stream_class->event_context) { - fmt_read->struct_read(&sin->pos.parent, stream_class->event_context); - fmt_write->struct_write(&sout->parent, stream_class->event_context); + ret = generic_rw(&sin->pos.parent, &stream_class->event_context->p); + if (ret) + goto error; + ret = generic_rw(&sout->parent, &stream_class->event_context->p); + if (ret) + goto error; } if (id >= stream_class->events_by_id->len) { @@ -73,30 +88,42 @@ int print_event(struct format *fmt_write, struct ctf_text_stream_pos *sout, /* Read and print event-declared event context */ if (event_class->context) { - fmt_read->struct_read(&sin->pos.parent, event_class->context); - fmt_write->struct_write(&sout->parent, event_class->context); + ret = generic_rw(&sin->pos.parent, &event_class->context->p); + if (ret) + goto error; + ret = generic_rw(&sout->parent, &event_class->context->p); + if (ret) + goto error; } /* Read and print event payload */ if (event_class->fields) { - fmt_read->struct_read(&sin->pos.parent, event_class->fields); - fmt_write->struct_write(&sout->parent, event_class->fields); + ret = generic_rw(&sin->pos.parent, &event_class->fields->p); + if (ret) + goto error; + ret = generic_rw(&sout->parent, &event_class->fields->p); + if (ret) + goto error; } return 0; + +error: + fprintf(stdout, "[error] Unexpected end of stream. Either the trace data stream is corrupted or metadata description does not match data layout.\n"); + return ret; } static -int print_stream(struct format *fmt_write, struct ctf_text_stream_pos *sout, - struct format *fmt_read, struct ctf_file_stream *sin) +int convert_stream(struct ctf_text_stream_pos *sout, + struct ctf_file_stream *sin) { int ret; /* For each event, print header, context, payload */ /* TODO: order events by timestamps across streams */ for (;;) { - ret = print_event(fmt_write, sout, fmt_read, sin); - if (ret == -EOF) + ret = convert_event(sout, sin); + if (ret == EOF) break; else if (ret) { fprintf(stdout, "[error] Printing event failed.\n"); @@ -110,13 +137,12 @@ error: return ret; } -int print_trace(struct format *fmt_write, - struct trace_descriptor *td_write, - struct format *fmt_read, - struct trace_descriptor *td_read) +int convert_trace(struct trace_descriptor *td_write, + struct trace_descriptor *td_read) { struct ctf_trace *tin = container_of(td_read, struct ctf_trace, parent); - struct ctf_text_stream_pos *sout = container_of(td_write, struct ctf_text_stream_pos, parent); + struct ctf_text_stream_pos *sout = + container_of(td_write, struct ctf_text_stream_pos, trace_descriptor); int stream_id, filenr; int ret; @@ -128,7 +154,7 @@ int print_trace(struct format *fmt_write, continue; for (filenr = 0; filenr < stream->files->len; filenr++) { struct ctf_file_stream *file_stream = g_ptr_array_index(stream->files, filenr); - ret = print_stream(fmt_write, sout, fmt_read, file_stream); + ret = convert_stream(sout, file_stream); if (ret) { fprintf(stdout, "[error] Printing stream %d failed.\n", stream_id); goto error;