diff --git a/src/stubser/cfile_parser.c b/src/stubser/cfile_parser.c index 5ff7a2c..26adc65 100644 --- a/src/stubser/cfile_parser.c +++ b/src/stubser/cfile_parser.c @@ -611,6 +611,7 @@ STATIC int8_t evaluateParameter(char *aParameter, cfunction_t *aFunction) STATIC int8_t cfile_parser_evaluateExpression(char *aExpression, cfile_t *aCfile) { + uint16_t tempInt16 = 0; char *tempChar = NULL; cfile_variable_t *variable = NULL; cfunction_t *function = NULL; @@ -648,7 +649,8 @@ STATIC int8_t cfile_parser_evaluateExpression(char *aExpression, cfile_t *aCfile { (void) matchPrefix(variable, CELEMENT_TYPE_VARIABLE, &aExpression[matchGroup[1].rm_so], XREGEX_SIZEOF_MATCHGROUP(matchGroup, 1)); xmallocStrlcpy(&variable->name, &aExpression[matchGroup[2].rm_so], XREGEX_SIZEOF_MATCHGROUP(matchGroup, 2)); - // contains array information if available "[10]" + + // group 3 contains array information, if available if (XREGEX_IS_MATCHGROUP(matchGroup, 3)) { xmallocStrlcpy(&tempChar, &aExpression[matchGroup[3].rm_so], XREGEX_SIZEOF_MATCHGROUP(matchGroup, 3)); @@ -666,9 +668,28 @@ STATIC int8_t cfile_parser_evaluateExpression(char *aExpression, cfile_t *aCfile { xmallocStrlcpy(&variable->array, tempChar, strlen(tempChar)); } - xfree((void**) &tempChar); } + + // would contain more variables separated by ',' + if (XREGEX_IS_MATCHGROUP(matchGroup, 4)) + { + if (NULL != (tempChar = strstr(&aExpression[matchGroup[4].rm_so], ","))) + { + // remove leading , + tempInt16 = tempChar - &aExpression[matchGroup[4].rm_so]; + matchGroup[4].rm_so += tempInt16 + 1; + tempChar = NULL; + + DEBUG_LOG_APPEND(1, "Variable list: %s\n", &aExpression[matchGroup[4].rm_so]); + xmallocStrlcpy(&tempChar, aCfile->variables.head->dataType, strlen(aCfile->variables.head->dataType)); + xmallocStrlcat(&tempChar, &aExpression[matchGroup[4].rm_so], XREGEX_SIZEOF_MATCHGROUP(matchGroup, 4) + 1); + DEBUG_LOG_APPEND(1, "Result: %s\n", tempChar); + + cfile_parser_evaluateExpression(tempChar, aCfile); + } + } + xfree((void**) &tempChar); } } else if (0 == regexec(®XfunctionPointer, aExpression, CFILE_PARSER_MAX_REGEX_MATCHING_GROUPS, matchGroup, 0) // @@ -726,7 +747,7 @@ STATIC uint32_t cfile_parser_evaluateLine(uint32_t aNumber, char *aLine, cfile_t { return 0; } - DEBUG_LOG_APPEND(2, "[ Li %04u] %s", aNumber, aLine); + DEBUG_LOG_APPEND(2, "[ Li %04u] %s\n", aNumber, aLine); tempChar = strrchr(aLine, '\n'); if (tempChar) { @@ -793,7 +814,7 @@ uint32_t cfile_parser(char *aPath, cfile_t *aCfile) free(fileLine); (void) fclose(fdesc); - // error detection for block removal +// error detection for block removal if (0 != cfile_parser_removeCommentHelper || 0 != cfile_parser_removeBraceHelper) { DEBUG_LOG_APPEND(1, "Helper (%d/%d) %s\n", cfile_parser_removeCommentHelper, cfile_parser_removeBraceHelper, gnu_basename(aPath)); diff --git a/src/stubser/cfile_parser_loc.h b/src/stubser/cfile_parser_loc.h index 66d12c3..509c81e 100644 --- a/src/stubser/cfile_parser_loc.h +++ b/src/stubser/cfile_parser_loc.h @@ -10,7 +10,6 @@ * @date 28.02.2017 * @author SESA354004 */ - #ifndef STUBSER_CFILE_PARSER_LOC_H_ #define STUBSER_CFILE_PARSER_LOC_H_ @@ -31,7 +30,7 @@ #define FUNCTION_BASE CPARS_EXPRESSION_BASE "[[:blank:]]*\\([[:blank:]]*" #define CPARS_REGEX_FUNCTION FUNCTION_BASE "(.*)\\)[[:blank:]\\{\\};]+[[:blank:]]*" -#define CPARS_REGEX_VARIABLE CPARS_EXPRESSION_BASE "[[:blank:]]*(\\[*[^;=]*)[[:blank:]]*[;=]" +#define CPARS_REGEX_VARIABLE CPARS_EXPRESSION_BASE "[[:blank:]]*(\\[*[^;=,]*)[[:blank:]]*(\\[*[^;=]*[;=])" #define CPARS_REGEX_PARAMETER CPARS_EXPRESSION_BASE "[[:blank:]]*(\\[*[^;=]*)" #define CPARS_REGEX_PARAMETER_FUPTR_SEPA "\\([^\\,)]*(,)" // function pointer parameter separation #define CPARS_REGEX_PREFIX "("CPARS_PREFIX_EXTERN_S"|EXTERN|"CPARS_PREFIX_STATIC_S"|STATIC|volatile|near|far)[[:blank:]]*(.*)"