From 244c56f9ba0c412b20d2bd9590ae6d07a799cbc9 Mon Sep 17 00:00:00 2001 From: Alexander Wenzel Date: Wed, 24 Jul 2013 11:26:21 +0200 Subject: Bug 84 - Adding utf8 support to dlt-daemon, dlt-viewer. Modified patch, originally provided by Stefan Vacek. Signed-off-by: Alexander Wenzel --- include/dlt/dlt_protocol.h | 16 +++++----- include/dlt/dlt_user.h | 10 +++++++ include/dlt/dlt_user_macros.h | 8 +++++ src/lib/dlt_user.c | 49 ++++++++++++++++++++++++++++++- src/shared/dlt_common.c | 4 +-- src/tests/dlt-test-client.c | 68 +++++++++++++++++++++++++++++++++---------- src/tests/dlt-test-user.c | 30 ++++++++++--------- 7 files changed, 145 insertions(+), 40 deletions(-) diff --git a/include/dlt/dlt_protocol.h b/include/dlt/dlt_protocol.h index 1c30d66..c2e91d7 100755 --- a/include/dlt/dlt_protocol.h +++ b/include/dlt/dlt_protocol.h @@ -155,14 +155,14 @@ #define DLT_TYPE_INFO_STRU 0x00004000 /**< Struct */ #define DLT_TYPE_INFO_SCOD 0x00038000 /**< coding of the type string: 0 = ASCII, 1 = UTF-8 */ -#define DLT_TYLE_8BIT 1 -#define DLT_TYLE_16BIT 2 -#define DLT_TYLE_32BIT 3 -#define DLT_TYLE_64BIT 4 -#define DLT_TYLE_128BIT 5 - -#define DLT_SCOD_ASCII 0 -#define DLT_SCOD_UTF8 1 +#define DLT_TYLE_8BIT 0x00000001 +#define DLT_TYLE_16BIT 0x00000002 +#define DLT_TYLE_32BIT 0x00000003 +#define DLT_TYLE_64BIT 0x00000004 +#define DLT_TYLE_128BIT 0x00000005 + +#define DLT_SCOD_ASCII 0x00000000 +#define DLT_SCOD_UTF8 0x00008000 /* * Definitions of DLT services. diff --git a/include/dlt/dlt_user.h b/include/dlt/dlt_user.h index 0523da2..b548707 100644 --- a/include/dlt/dlt_user.h +++ b/include/dlt/dlt_user.h @@ -345,6 +345,16 @@ int dlt_user_log_write_int64(DltContextData *log, int64_t data); */ int dlt_user_log_write_string( DltContextData *log, const char *text); + /** + * Write a null terminated UTF8 string into a DLT log message. + * dlt_user_log_write_start has to be called before adding any attributes to the log message. + * Finish sending log message by calling dlt_user_log_write_finish. + * @param log pointer to an object containing information about logging context data + * @param text pointer to the parameter written into log message containing null termination. + * @return negative value if there was an error + */ +int dlt_user_log_write_utf8_string(DltContextData *log, const char *text); + /** * Write a binary memory block into a DLT log message. * dlt_user_log_write_start has to be called before adding any attributes to the log message. diff --git a/include/dlt/dlt_user_macros.h b/include/dlt/dlt_user_macros.h index 20f605d..c8551b1 100644 --- a/include/dlt/dlt_user_macros.h +++ b/include/dlt/dlt_user_macros.h @@ -201,6 +201,14 @@ extern DltContext CONTEXT; dlt_user_log_write_string(&log,TEXT); \ }) +/** + * Add utf8-encoded string parameter to the log messsage. + * @param TEXT UTF8-encoded string + */ +#define DLT_UTF8(TEXT) ({ \ + dlt_user_log_write_utf8_string(&log,TEXT); \ + }) + /** * Add boolean parameter to the log messsage. * @param BOOL_VAR Boolean value (mapped to uint8) diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c index d6c761c..1f43801 100644 --- a/src/lib/dlt_user.c +++ b/src/lib/dlt_user.c @@ -438,6 +438,10 @@ int dlt_init_common(void) void dlt_user_atexit_handler(void) { + if (dlt_user_initialised==0) + { + return; + } /* Try to resend potential log messages in the user buffer */ int count = dlt_user_atexit_blow_out_user_buffer(); @@ -1764,7 +1768,50 @@ int dlt_user_log_write_string(DltContextData *log, const char *text) return -1; } - type_info = DLT_TYPE_INFO_STRG; + type_info = DLT_TYPE_INFO_STRG | DLT_SCOD_ASCII; + + memcpy((log->buffer)+log->size,&(type_info),sizeof(uint32_t)); + log->size += sizeof(uint32_t); + } + + arg_size = strlen(text) + 1; + + memcpy((log->buffer)+log->size,&(arg_size),sizeof(uint16_t)); + log->size += sizeof(uint16_t); + + memcpy((log->buffer)+log->size,text,arg_size); + log->size += arg_size; + + log->args_num ++; + + return 0; +} + +int dlt_user_log_write_utf8_string(DltContextData *log, const char *text) +{ + uint16_t arg_size; + uint32_t type_info; + + if ((log==0) || (text==0)) + { + return -1; + } + + arg_size = strlen(text)+1; + + if ((log->size+arg_size+sizeof(uint16_t))>DLT_USER_BUF_MAX_SIZE) + { + return -1; + } + + if (dlt_user.verbose_mode) + { + if ((log->size+arg_size+sizeof(uint32_t)+sizeof(uint16_t))>DLT_USER_BUF_MAX_SIZE) + { + return -1; + } + + type_info = DLT_TYPE_INFO_STRG | DLT_SCOD_UTF8; memcpy((log->buffer)+log->size,&(type_info),sizeof(uint32_t)); log->size += sizeof(uint32_t); diff --git a/src/shared/dlt_common.c b/src/shared/dlt_common.c index b7a865e..54a99c3 100755 --- a/src/shared/dlt_common.c +++ b/src/shared/dlt_common.c @@ -3230,10 +3230,10 @@ int dlt_message_argument_print(DltMessage *msg,uint32_t type_info,uint8_t **ptr, uint32_t quantisation_tmp=0; - if (type_info & DLT_TYPE_INFO_STRG) + if ( (type_info & DLT_TYPE_INFO_STRG) && (((type_info & DLT_TYPE_INFO_SCOD) == DLT_SCOD_ASCII) || ((type_info & DLT_TYPE_INFO_SCOD) == DLT_SCOD_UTF8)) ) { - /* string type */ + /* string type or utf8-encoded string type */ if (byteLength<0) { DLT_MSG_READ_VALUE(length_tmp,*ptr,*datalength,uint16_t); diff --git a/src/tests/dlt-test-client.c b/src/tests/dlt-test-client.c index 5da480f..a8f10ff 100755 --- a/src/tests/dlt-test-client.c +++ b/src/tests/dlt-test-client.c @@ -492,7 +492,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } else if (strcmp(text,"Test2: (Macro IF) finished")==0) { - if (dltdata->test_counter_macro[1]==14) + if (dltdata->test_counter_macro[1]==16) { printf("Test2m PASSED\n"); dltdata->tests_passed++; @@ -540,7 +540,21 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) DLT_MSG_READ_VALUE(type_info_tmp,ptr,datalength,uint32_t); type_info=DLT_ENDIAN_GET_32(message->standardheader->htyp, type_info_tmp); - if (type_info & DLT_TYPE_INFO_BOOL) + if ((type_info & DLT_TYPE_INFO_STRG) && ((type_info & DLT_TYPE_INFO_SCOD) == DLT_SCOD_ASCII)) + { + if (datalength==(sizeof(uint16_t)+strlen("Hello world")+1)) + { + dltdata->test_counter_macro[1]++; + } + } + else if ((type_info & DLT_TYPE_INFO_STRG) && ((type_info & DLT_TYPE_INFO_SCOD) == DLT_SCOD_UTF8)) + { + if (datalength==(sizeof(uint16_t)+strlen("Hello world")+1)) + { + dltdata->test_counter_macro[1]++; + } + } + else if (type_info & DLT_TYPE_INFO_BOOL) { if (datalength==sizeof(uint8_t)) { @@ -694,7 +708,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } else if (strcmp(text,"Test3: (Macro IF) finished")==0) { - if (dltdata->test_counter_macro[2]==14) + if (dltdata->test_counter_macro[2]==16) { printf("Test3m PASSED\n"); dltdata->tests_passed++; @@ -730,6 +744,28 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) switch (id) { case 1: + { + slen=strlen("string")+1; + datalength-=slen; + ptr+=slen; + if (datalength==sizeof(uint16_t)+strlen("Hello world")+1) + { + dltdata->test_counter_macro[2]++; + } + break; + } + case 2: + { + slen=strlen("utf8")+1; + datalength-=slen; + ptr+=slen; + if (datalength==sizeof(uint16_t)+strlen("Hello world")+1) + { + dltdata->test_counter_macro[2]++; + } + break; + } + case 3: { slen=strlen("bool")+1; datalength-=slen; @@ -740,7 +776,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } break; } - case 2: + case 4: { slen=strlen("int")+1; datalength-=slen; @@ -751,7 +787,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } break; } - case 3: + case 5: { slen=strlen("int8")+1; datalength-=slen; @@ -762,7 +798,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } break; } - case 4: + case 6: { slen=strlen("int16")+1; datalength-=slen; @@ -773,7 +809,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } break; } - case 5: + case 7: { slen=strlen("int32")+1; datalength-=slen; @@ -784,7 +820,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } break; } - case 6: + case 8: { slen=strlen("int64")+1; datalength-=slen; @@ -795,7 +831,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } break; } - case 7: + case 9: { slen=strlen("uint")+1; datalength-=slen; @@ -806,7 +842,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } break; } - case 8: + case 10: { slen=strlen("uint8")+1; datalength-=slen; @@ -817,7 +853,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } break; } - case 9: + case 11: { slen=strlen("uint16")+1; datalength-=slen; @@ -828,7 +864,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } break; } - case 10: + case 12: { slen=strlen("uint32")+1; datalength-=slen; @@ -839,7 +875,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } break; } - case 11: + case 13: { slen=strlen("uint64")+1; datalength-=slen; @@ -850,7 +886,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } break; } - case 12: + case 14: { slen=strlen("float32")+1; datalength-=slen; @@ -862,7 +898,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } break; } - case 13: + case 15: { slen=strlen("float64")+1; datalength-=slen; @@ -874,7 +910,7 @@ int dlt_testclient_message_callback(DltMessage *message, void *data) } break; } - case 14: + case 16: { slen=strlen("raw")+1; datalength-=slen; diff --git a/src/tests/dlt-test-user.c b/src/tests/dlt-test-user.c index 16c3cab..caef49f 100755 --- a/src/tests/dlt-test-user.c +++ b/src/tests/dlt-test-user.c @@ -373,6 +373,8 @@ int test2m(void) printf("Test2m: (Macro IF) Test all variable types (verbose)\n"); DLT_LOG(context_info,DLT_LOG_INFO,DLT_STRING("Test2: (Macro IF) Test all variable types (verbose)")); + DLT_LOG(context_macro_test[1],DLT_LOG_INFO,DLT_STRING("string"),DLT_STRING("Hello world")); + DLT_LOG(context_macro_test[1],DLT_LOG_INFO,DLT_STRING("utf8"),DLT_UTF8("Hello world")); DLT_LOG(context_macro_test[1],DLT_LOG_INFO,DLT_STRING("bool"),DLT_BOOL(1)); DLT_LOG(context_macro_test[1],DLT_LOG_INFO,DLT_STRING("int"),DLT_INT(INT32_MIN)); /* (-2147483647-1) */ DLT_LOG(context_macro_test[1],DLT_LOG_INFO,DLT_STRING("int8"),DLT_INT8(INT8_MIN)); /* (-128) */ @@ -412,19 +414,21 @@ int test3m(void) DLT_NONVERBOSE_MODE(); - DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,1,DLT_STRING("bool"),DLT_BOOL(1)); - DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,2,DLT_STRING("int"),DLT_INT(INT32_MIN)); /* (-2147483647-1) */ - DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,3,DLT_STRING("int8"),DLT_INT8(INT8_MIN)); /* (-128) */ - DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,4,DLT_STRING("int16"),DLT_INT16(INT16_MIN)); /* (-32767-1) */ - DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,5,DLT_STRING("int32"),DLT_INT32(INT32_MIN)); /* (-2147483647-1) */ - DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,6,DLT_STRING("int64"),DLT_INT64(INT64_MIN)); /* (-__INT64_C(9223372036854775807)-1) */ - DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,7,DLT_STRING("uint"),DLT_UINT(UINT32_MAX)); /* (4294967295U) */ - DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,8,DLT_STRING("uint8"),DLT_UINT8(UINT8_MAX)); /* (255) */ - DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,9,DLT_STRING("uint16"),DLT_UINT16(UINT16_MAX)); /* (65535) */ - DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,10,DLT_STRING("uint32"),DLT_UINT32(UINT32_MAX)); /* (4294967295U) */ - DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,11,DLT_STRING("uint64"),DLT_UINT64(UINT64_MAX)); /* (__UINT64_C(18446744073709551615)) */ - DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,12,DLT_STRING("float32"),DLT_FLOAT32(FLT_MIN),DLT_FLOAT32(FLT_MAX)); - DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,13,DLT_STRING("float64"),DLT_FLOAT64(DBL_MIN),DLT_FLOAT64(DBL_MAX)); + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,1,DLT_STRING("string"),DLT_STRING("Hello world")); + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,2,DLT_STRING("utf8"),DLT_UTF8("Hello world")); + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,3,DLT_STRING("bool"),DLT_BOOL(1)); + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,4,DLT_STRING("int"),DLT_INT(INT32_MIN)); /* (-2147483647-1) */ + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,5,DLT_STRING("int8"),DLT_INT8(INT8_MIN)); /* (-128) */ + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,6,DLT_STRING("int16"),DLT_INT16(INT16_MIN)); /* (-32767-1) */ + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,7,DLT_STRING("int32"),DLT_INT32(INT32_MIN)); /* (-2147483647-1) */ + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,8,DLT_STRING("int64"),DLT_INT64(INT64_MIN)); /* (-__INT64_C(9223372036854775807)-1) */ + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,9,DLT_STRING("uint"),DLT_UINT(UINT32_MAX)); /* (4294967295U) */ + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,10,DLT_STRING("uint8"),DLT_UINT8(UINT8_MAX)); /* (255) */ + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,11,DLT_STRING("uint16"),DLT_UINT16(UINT16_MAX)); /* (65535) */ + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,12,DLT_STRING("uint32"),DLT_UINT32(UINT32_MAX)); /* (4294967295U) */ + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,13,DLT_STRING("uint64"),DLT_UINT64(UINT64_MAX)); /* (__UINT64_C(18446744073709551615)) */ + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,14,DLT_STRING("float32"),DLT_FLOAT32(FLT_MIN),DLT_FLOAT32(FLT_MAX)); + DLT_LOG_ID(context_macro_test[2],DLT_LOG_INFO,15,DLT_STRING("float64"),DLT_FLOAT64(DBL_MIN),DLT_FLOAT64(DBL_MAX)); for(num2=0;num2<10;num2++) -- cgit v1.2.1