From 3d33c38601e2cedd3891c65c31993fd28d8e95bc Mon Sep 17 00:00:00 2001 From: Bui Nguyen Quoc Thanh Date: Fri, 17 Apr 2020 15:37:52 +0700 Subject: Improve performance of DLT file parsing Introduce new API to support quick parsing a DLT file. Signed-off-by: Bui Nguyen Quoc Thanh --- include/dlt/dlt_common.h | 14 ++++++++++ src/shared/dlt_common.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/include/dlt/dlt_common.h b/include/dlt/dlt_common.h index 026cf75..be033db 100644 --- a/include/dlt/dlt_common.h +++ b/include/dlt/dlt_common.h @@ -210,6 +210,9 @@ enum { # define DLT_SIZE_WSID (sizeof(uint32_t)) # define DLT_SIZE_WTMS (sizeof(uint32_t)) +/* Size of buffer for text output */ +#define DLT_CONVERT_TEXTBUFSIZE 10024 + /** * Definitions for GET_LOG_INFO */ @@ -1041,6 +1044,17 @@ DltReturnValue dlt_file_set_filter(DltFile *file, DltFilter *filter, int verbose * @return negative value if there was an error */ DltReturnValue dlt_file_open(DltFile *file, const char *filename, int verbose); +/** + * This function reads DLT file and parse DLT message one by one. + * Each message will be written into new file. + * If a filter is set, the filter list is used. + * @param file pointer to structure of organizing access to DLT file + * @param filename file to contain parsed DLT messages. + * @param type 1 = payload as hex, 2 = payload as ASCII. + * @param verbose if set to true verbose information is printed out. + * @return 0 = message does not match filter, 1 = message was read, negative value if there was an error + */ +DltReturnValue dlt_file_quick_parsing(DltFile *file, const char *filename, int type, int verbose); /** * Find next message in the DLT file and parse them. * This function finds the next message in the DLT file. diff --git a/src/shared/dlt_common.c b/src/shared/dlt_common.c index c462ed0..5697163 100644 --- a/src/shared/dlt_common.c +++ b/src/shared/dlt_common.c @@ -3985,3 +3985,72 @@ int dlt_mkdir_recursive(const char *dir) return ret; } #endif + +DltReturnValue dlt_file_quick_parsing(DltFile *file, const char *filename, + int type, int verbose) +{ + PRINT_FUNCTION_VERBOSE(verbose); + int ret = DLT_RETURN_OK; + char text[DLT_CONVERT_TEXTBUFSIZE] = { 0 }; + + if (file == NULL || filename == NULL) + return DLT_RETURN_WRONG_PARAMETER; + + FILE *output = fopen(filename, "w+"); + if (output == NULL) { + dlt_vlog(LOG_ERR, "Cannot open output file %s for parsing\n", filename); + return DLT_RETURN_ERROR; + } + + while(ret >= DLT_RETURN_OK && file->file_position < file->file_length) { + /* get file position at start of DLT message */ + if (verbose) { + dlt_vlog(LOG_DEBUG, "Position in file: %ld\n", file->file_position); + } + + /* read all header and payload */ + ret = dlt_file_read_header(file, verbose); + if (ret < DLT_RETURN_OK) + break; + + ret = dlt_file_read_header_extended(file, verbose); + if (ret < DLT_RETURN_OK) + break; + + ret = dlt_file_read_data(file, verbose); + if (ret < DLT_RETURN_OK) + break; + + if (file->filter) { + /* check the filters if message is used */ + ret = dlt_message_filter_check(&(file->msg), file->filter, verbose); + if (ret != DLT_RETURN_TRUE) + continue; + } + + ret = dlt_message_header(&(file->msg), text, + DLT_CONVERT_TEXTBUFSIZE, verbose); + if (ret < DLT_RETURN_OK) + break; + + fprintf(output, "%s", text); + + ret = dlt_message_payload(&(file->msg), text, + DLT_CONVERT_TEXTBUFSIZE, type, verbose); + if (ret < DLT_RETURN_OK) + break; + + fprintf(output, "[%s]\n", text); + + /* store index pointer to message position in DLT file */ + file->counter++; + file->position = file->counter_total - 1; + /* increase total message counter */ + file->counter_total++; + /* store position to next message */ + file->file_position = ftell(file->handle); + } // while() + + fclose(output); + return ret; +} -- cgit v1.2.1