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)
{
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(&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;
}
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)
{

View File

@@ -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:]]*(.*)"