From 7f3630626a1091bfabd4f830ede3a9ddace242e7 Mon Sep 17 00:00:00 2001 From: fengzero Date: Thu, 24 Feb 2022 08:56:29 +0000 Subject: [PATCH] tag option: parse the last identification character --- src/base/neu_tag.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/base/neu_tag.c b/src/base/neu_tag.c index 8ae3df57..b0e0a61a 100644 --- a/src/base/neu_tag.c +++ b/src/base/neu_tag.c @@ -71,6 +71,19 @@ void neu_datatag_free(neu_datatag_t *datatag) free(datatag); } +static char *find_last_character(char *str, char character) +{ + char *find = strchr(str, character); + char *ret = find; + + while (find != NULL) { + ret = find; + find = strchr(find + 1, character); + } + + return ret; +} + int neu_datatag_parse_addr_option(neu_datatag_t * datatag, neu_datatag_addr_option_u *option) { @@ -78,7 +91,7 @@ int neu_datatag_parse_addr_option(neu_datatag_t * datatag, switch (datatag->type) { case NEU_DTYPE_CSTR: { - char *op = strchr(datatag->addr_str, '.'); + char *op = find_last_character(datatag->addr_str, '.'); if (op == NULL) { ret = -1; @@ -113,7 +126,7 @@ int neu_datatag_parse_addr_option(neu_datatag_t * datatag, } case NEU_DTYPE_INT16: case NEU_DTYPE_UINT16: { - char *op = strchr(datatag->addr_str, '#'); + char *op = find_last_character(datatag->addr_str, '#'); option->value16.endian = NEU_DATATAG_ENDIAN_L16; if (op != NULL) { @@ -138,7 +151,7 @@ int neu_datatag_parse_addr_option(neu_datatag_t * datatag, case NEU_DTYPE_FLOAT: case NEU_DTYPE_UINT32: case NEU_DTYPE_INT32: { - char *op = strchr(datatag->addr_str, '#'); + char *op = find_last_character(datatag->addr_str, '#'); option->value32.endian = NEU_DATATAG_ENDIAN_LL32; if (op != NULL) { @@ -165,7 +178,7 @@ int neu_datatag_parse_addr_option(neu_datatag_t * datatag, break; } case NEU_DTYPE_BIT: { - char *op = strchr(datatag->addr_str, '.'); + char *op = find_last_character(datatag->addr_str, '.'); if (op != NULL) { sscanf(op, ".%hhd", &option->bit.bit);