From fcc07493d31a4798ea54114eb70192545ac49304 Mon Sep 17 00:00:00 2001 From: herbglitch Date: Wed, 20 Nov 2024 13:50:52 -0700 Subject: [PATCH] added userdata void * for parser tag function callback --- include/arc/std/parser.h | 3 ++- src/std/parser.c | 2 +- src/std/parser/parserlang.c | 26 +++++++++++++------------- tests/std/parser.c | 15 +++++++++------ 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/include/arc/std/parser.h b/include/arc/std/parser.h index 358f32c..acb3c97 100644 --- a/include/arc/std/parser.h +++ b/include/arc/std/parser.h @@ -28,7 +28,7 @@ typedef void (* ARC_ParserData_DestroyFn)(void *data); /** * @brief TODO: write this */ -typedef void (* ARC_ParserLanguageTag_AddDataFn)(void **data, uint32_t tagId, ARC_LexerToken *token); +typedef void (* ARC_ParserLanguageTag_AddDataFn)(void **data, uint32_t tagId, ARC_LexerToken *token, void *userData); /** * @brief a langue tag type for the parser //TODO: explain this better @@ -40,6 +40,7 @@ typedef struct ARC_ParserLanguageTag { uint32_t tokensOrTagsSize; ARC_ParserLanguageTag_AddDataFn *addDataFn; + void *addUserData; } ARC_ParserLanguageTag; /** diff --git a/src/std/parser.c b/src/std/parser.c index 913bd4f..80f37d3 100644 --- a/src/std/parser.c +++ b/src/std/parser.c @@ -205,7 +205,7 @@ ARC_Bool ARC_Parser_ParseTag(ARC_Parser *parser, uint32_t *lexerIndex, uint32_t //iterate through the tokens with the add callback for(uint32_t index = 0; index < ARC_Vector_GetSize(foundTokens); index++){ ARC_LexerToken *token = (ARC_LexerToken *)ARC_Vector_Get(foundTokens, index); - (*(tag->addDataFn))(&(parser->data), tagId, token); + (*(tag->addDataFn))(&(parser->data), tagId, token, tag->addUserData); } } diff --git a/src/std/parser/parserlang.c b/src/std/parser/parserlang.c index 152a538..781dd03 100644 --- a/src/std/parser/parserlang.c +++ b/src/std/parser/parserlang.c @@ -76,19 +76,19 @@ void ARC_Parser_CreateAsParserLang(ARC_Parser **parser){ uint32_t *alphaChar[] = { (uint32_t[]){ 1, ARC_PARSERLANG_TOKEN_ALPHA_LOWER_CHAR }, (uint32_t[]){ 1, ARC_PARSERLANG_TOKEN_ALPHA_UPPER_CHAR }}; ARC_ParserLanguageTag parserLangTags[13] = { - { ARC_PARSERLANG_LINE , line , 4, NULL }, - { ARC_PARSERLANG_BODY , body , 1, NULL }, - { ARC_PARSERLANG_ARGUMENTS , arguments , 2, NULL }, - { ARC_PARSERLANG_ARGUMENT , argument , 2, NULL }, - { ARC_PARSERLANG_TAG_OR_CONSTANT, tagOrConstant, 2, NULL }, - { ARC_PARSERLANG_CONSTANT , constant , 1, NULL }, - { ARC_PARSERLANG_CONSTANT_BODY , constantBody , 2, NULL }, - { ARC_PARSERLANG_CONSTANT_CHAR , constantChar , 2, NULL }, - { ARC_PARSERLANG_TAG , tag , 1, NULL }, - { ARC_PARSERLANG_VARIABLE , variable , 2, NULL }, - { ARC_PARSERLANG_VARIABLE_BODY , variableBody , 2, NULL }, - { ARC_PARSERLANG_VARIABLE_CHAR , variableChar , 3, NULL }, - { ARC_PARSERLANG_ALPHA_CHAR , alphaChar , 2, NULL } + { ARC_PARSERLANG_LINE , line , 4, NULL, NULL }, + { ARC_PARSERLANG_BODY , body , 1, NULL, NULL }, + { ARC_PARSERLANG_ARGUMENTS , arguments , 2, NULL, NULL }, + { ARC_PARSERLANG_ARGUMENT , argument , 2, NULL, NULL }, + { ARC_PARSERLANG_TAG_OR_CONSTANT, tagOrConstant, 2, NULL, NULL }, + { ARC_PARSERLANG_CONSTANT , constant , 1, NULL, NULL }, + { ARC_PARSERLANG_CONSTANT_BODY , constantBody , 2, NULL, NULL }, + { ARC_PARSERLANG_CONSTANT_CHAR , constantChar , 2, NULL, NULL }, + { ARC_PARSERLANG_TAG , tag , 1, NULL, NULL }, + { ARC_PARSERLANG_VARIABLE , variable , 2, NULL, NULL }, + { ARC_PARSERLANG_VARIABLE_BODY , variableBody , 2, NULL, NULL }, + { ARC_PARSERLANG_VARIABLE_CHAR , variableChar , 3, NULL, NULL }, + { ARC_PARSERLANG_ALPHA_CHAR , alphaChar , 2, NULL, NULL } }; ARC_Array parserLanguageArray = { diff --git a/tests/std/parser.c b/tests/std/parser.c index 58c03ea..63ea4d7 100644 --- a/tests/std/parser.c +++ b/tests/std/parser.c @@ -21,7 +21,7 @@ void TEST_ParserLanguageTag_DestroyStringFn(void *data){ } //for this very basic example, the tagId does not matter -void TEST_ParserLanguageTag_AddFirstCharFn(void **data, uint32_t tagId, ARC_LexerToken *token){ +void TEST_ParserLanguageTag_AddFirstCharFn(void **data, uint32_t tagId, ARC_LexerToken *token, void *userData){ if(*data == NULL){ return; } @@ -34,7 +34,7 @@ void TEST_ParserLanguageTag_AddFirstCharFn(void **data, uint32_t tagId, ARC_Lexe } //for this very basic example, the tagId does not matter -void TEST_ParserLanguageTag_AddCharFn(void **data, uint32_t tagId, ARC_LexerToken *token){ +void TEST_ParserLanguageTag_AddCharFn(void **data, uint32_t tagId, ARC_LexerToken *token, void *userData){ if(*data == NULL){ return; } @@ -58,19 +58,22 @@ ARC_ParserLanguageTag testTags[3] = { VARIABLE, //tagId variableTokensOrTags, //tokensOrTags 1, //tokenOrTagsSize - &addFirstCharFn //addDataFn + &addFirstCharFn, //addDataFn + NULL //addUserData }, { VARIABLE_NAME, //tagId variableNameTags, //tokensOrTags 2, //tokenOrTagsSize - NULL, //addDataFn + NULL, //addDataFn + NULL //addUserData }, { CHAR_OR_NUM, //tagId charOrNumTokens, //tokensOrTags 2, //tokenOrTagsSize - &addCharFn //addDataFn + &addCharFn, //addDataFn + NULL //addUserData } }; @@ -111,10 +114,10 @@ ARC_TEST(Parser_Basic_Parse){ /* ~ second test ~ */ ARC_String_CreateWithStrlen(&tempString, "z1xwvq"); - //this destroys string, so no need for cleanup ARC_Parser_Parse(parser, &tempString); + ARC_CHECK(arc_errno == 0);