Supporting comma separated variable definition (int8_t varA, varB, varC[], *varD, varE[12];)
This commit is contained in:
@@ -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(®XfunctionPointer, aExpression, CFILE_PARSER_MAX_REGEX_MATCHING_GROUPS, matchGroup, 0) //
|
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;
|
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)
|
||||||
{
|
{
|
||||||
@@ -793,7 +814,7 @@ uint32_t cfile_parser(char *aPath, cfile_t *aCfile)
|
|||||||
free(fileLine);
|
free(fileLine);
|
||||||
(void) fclose(fdesc);
|
(void) fclose(fdesc);
|
||||||
|
|
||||||
// error detection for block removal
|
// error detection for block removal
|
||||||
if (0 != cfile_parser_removeCommentHelper || 0 != cfile_parser_removeBraceHelper)
|
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));
|
DEBUG_LOG_APPEND(1, "Helper (%d/%d) %s\n", cfile_parser_removeCommentHelper, cfile_parser_removeBraceHelper, gnu_basename(aPath));
|
||||||
|
@@ -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:]]*(.*)"
|
||||||
|
Reference in New Issue
Block a user