Supporting comma separated variable definition (int8_t varA, varB, varC[], *varD, varE[12];)

This commit is contained in:
2018-08-31 12:19:01 +00:00
parent 335b74a844
commit f313252d79
2 changed files with 26 additions and 6 deletions

View File

@@ -611,6 +611,7 @@ STATIC int8_t evaluateParameter(char *aParameter, cfunction_t *aFunction)
STATIC int8_t cfile_parser_evaluateExpression(char *aExpression, cfile_t *aCfile) STATIC int8_t cfile_parser_evaluateExpression(char *aExpression, cfile_t *aCfile)
{ {
uint16_t tempInt16 = 0;
char *tempChar = NULL; char *tempChar = NULL;
cfile_variable_t *variable = NULL; cfile_variable_t *variable = NULL;
cfunction_t *function = 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)); (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)); 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)) if (XREGEX_IS_MATCHGROUP(matchGroup, 3))
{ {
xmallocStrlcpy(&tempChar, &aExpression[matchGroup[3].rm_so], XREGEX_SIZEOF_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)); xmallocStrlcpy(&variable->array, tempChar, strlen(tempChar));
} }
xfree((void**) &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(&regXfunctionPointer, aExpression, CFILE_PARSER_MAX_REGEX_MATCHING_GROUPS, matchGroup, 0) // else if (0 == regexec(&regXfunctionPointer, 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; 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'); tempChar = strrchr(aLine, '\n');
if (tempChar) if (tempChar)
{ {

View File

@@ -10,7 +10,6 @@
* @date 28.02.2017 * @date 28.02.2017
* @author SESA354004 * @author SESA354004
*/ */
#ifndef STUBSER_CFILE_PARSER_LOC_H_ #ifndef STUBSER_CFILE_PARSER_LOC_H_
#define STUBSER_CFILE_PARSER_LOC_H_ #define STUBSER_CFILE_PARSER_LOC_H_
@@ -31,7 +30,7 @@
#define FUNCTION_BASE CPARS_EXPRESSION_BASE "[[:blank:]]*\\([[:blank:]]*" #define FUNCTION_BASE CPARS_EXPRESSION_BASE "[[:blank:]]*\\([[:blank:]]*"
#define CPARS_REGEX_FUNCTION FUNCTION_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 CPARS_EXPRESSION_BASE "[[:blank:]]*(\\[*[^;=]*)"
#define CPARS_REGEX_PARAMETER_FUPTR_SEPA "\\([^\\,)]*(,)" // function pointer parameter separation #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:]]*(.*)" #define CPARS_REGEX_PREFIX "("CPARS_PREFIX_EXTERN_S"|EXTERN|"CPARS_PREFIX_STATIC_S"|STATIC|volatile|near|far)[[:blank:]]*(.*)"