Archeus 0.0.0
A C library and game engine that focuses on documentation
Loading...
Searching...
No Matches
parserlang.c
Go to the documentation of this file.
2#include "arc/std/bool.h"
3#include "arc/std/errno.h"
4#include "arc/std/lexer.h"
5#include "arc/std/parser.h"
6#include "arc/std/string.h"
7#include "arc/std/vector.h"
8#include <stddef.h>
9#include <stdlib.h>
10
11//private function to initalize the lexer rules for the language
13 //null
15
16 //number
18
19 //alpha char
22
23 //whitespace
24 ARC_String *whitespaceString;
25 ARC_String_CreateWithStrlen(&whitespaceString, " \t");
27 ARC_String_Destroy(whitespaceString);
28
29 //single char tokens
35
36 //arrow
37 ARC_String *arrowString;
40 ARC_String_Destroy(arrowString);
41}
42
44 ARC_Vector *vector = (ARC_Vector *)data;
45 ARC_Vector_Destroy(vector);
46}
47
49 uint32_t *uint = (uint32_t *)data;
50 free(uint);
51}
52
54 ARC_ParserTag *currentTag = (ARC_ParserTag *)data;
55
56 //free the orIndex vlues
57 for(uint32_t orIndex = 0; orIndex < currentTag->tokensOrTagsSize; orIndex++){
58 free(currentTag->tokensOrTags[orIndex]);
59 }
60
61 //free the tokens or tags
62 free(currentTag->tokensOrTags);
63
64 //free the tag itself
65 free(currentTag);
66}
67
69 if(tagToken->token != NULL){
70 //less than rule does not have a string so add it manually and return
73 ARC_String_AppendCString(data, &tokenChar, 1);
74 return;
75 }
76
77 //greater than rule does not have a string so add it manually and return
80 ARC_String_AppendCString(data, &tokenChar, 1);
81 return;
82 }
83
86 ARC_String_AppendCString(data, &tokenChar, 1);
87 return;
88 }
89
90 ARC_String_Append(data, tagToken->token->data);
91 return;
92 }
93
94 //TODO: probs don't need this
95 if(tagToken->tagTokens == NULL){
96 return;
97 }
98
99 for(uint32_t index = 0; index < ARC_Vector_GetSize(tagToken->tagTokens); index++){
101 }
102}
103
105 ARC_String_Create(tagString, NULL, 0);
106
107 for(uint32_t index = 0; index < ARC_Vector_GetSize(tagToken->tagTokens); index++){
108 ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(tagToken->tagTokens, index);
109
110 ARC_ParserLangParsedData_RecurseStringAdd(tagString, childTagToken);
111 }
112}
113
114/*
115 <argument> -> <tagOrConstant> WHITESPACE <argument> | <tagOrConstant>
116*/
118 for(uint32_t index = 0; index < ARC_Vector_GetSize(tagToken->tagTokens); index++){
119 ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(tagToken->tagTokens, index);
120
121 //switch variables
122 ARC_String *tagOrConstantString = NULL;
123 uint32_t *id = NULL;
124
125 switch(childTagToken->id){
127 //recurse to check all the arguments
128 ARC_ParserLangParsedData_GetArgumentTag(orTokensOrTags, childTagToken, getStringIdFn);
129 continue;
130
132 //initialize the string to use
133 ARC_String_Create(&tagOrConstantString, NULL, 0);
134
135 //get the id of the tag/constant
136 ARC_ParserLangParsedData_RecurseStringAdd(&tagOrConstantString, childTagToken);
137 id = (uint32_t *)malloc(sizeof(uint32_t));
138 *id = (*getStringIdFn)(tagOrConstantString);
139
140 //add the id to the matching or vector
141 ARC_Vector_Add(orTokensOrTags, (void *)id);
142
143 //cleanup
144 ARC_String_Destroy(tagOrConstantString);
145 continue;
146
147 default:
148 //this should only be whitespace
149 continue;
150 }
151 }
152}
153
154/*
155 <arguments> -> <argument> WHITESPACE OR WHITESPACE <arguments> | <argument>
156*/
158 for(uint32_t index = 0; index < ARC_Vector_GetSize(tagToken->tagTokens); index++){
159 ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(tagToken->tagTokens, index);
160
161 //switch variables
162 uint32_t tokensOrTagsIndex = 0;
163 ARC_Vector *orTokensOrTags = NULL;
164
166
167 switch(childTagToken->id){
169 //get the last vector within tokens or tags to add the tag/constant to
170 tokensOrTagsIndex = ARC_Vector_GetSize(tokensOrTags);
171 orTokensOrTags = (ARC_Vector *)ARC_Vector_Get(tokensOrTags, tokensOrTagsIndex - 1);
172
173 ARC_ParserLangParsedData_GetArgumentTag(orTokensOrTags, childTagToken, getStringIdFn);
174 continue;
175
177 //add a new vector to tagsOrTokens for the or statment
178 ARC_Vector_Create(&orTokensOrTags, NULL, &destroyUint32Fn);
179
180 //add the first or vector to the tokensOrTags
181 ARC_Vector_Add(tokensOrTags, (void *)orTokensOrTags);
182 continue;
183
185 //recurse to check all the arguments
186 ARC_ParserLangParsedData_GetArgumentsTag(tokensOrTags, childTagToken, getStringIdFn);
187 continue;
188
189 default:
190 //this should only be whitespace
191 continue;
192 }
193 }
194}
195
197 //create the tag to store the body in
198 ARC_ParserTag *bodyTag = (ARC_ParserTag *)malloc(sizeof(ARC_ParserTag));
199
200 /* ~ Tag Id ~ */
201 //the first tag will always be the tagId, and as the rule is validated there is no need to check for NULL
202 ARC_ParserTagToken *tagIdToken = (ARC_ParserTagToken *)ARC_Vector_Get(tagToken->tagTokens, 0);
203
204 //get the tagId as a string
205 ARC_String *tagIdString;
206 ARC_ParserLangParsedData_CreateTagString(&tagIdString, tagIdToken);
207
208 //get the tag id as a uint32_t
209 bodyTag->tagId = (*getStringIdFn)(tagIdString);
210
211 //cleanup the tagIdString
212 ARC_String_Destroy(tagIdString);
213
214 /* ~ Tokens Or Tags Array ~ */
215 //create a vector to store another vector of data
216 ARC_Vector *tokensOrTags;
218 ARC_Vector_Create(&tokensOrTags, NULL, &destroyVectorFn);
219
220 //create vector within the tokens or tags vector to store the or rule in
221 ARC_Vector *orTokensOrTags;
223 ARC_Vector_Create(&orTokensOrTags, NULL, &destroyUint32Fn);
224
225 //add the first or vector to the tokensOrTags
226 ARC_Vector_Add(tokensOrTags, (void *)orTokensOrTags);
227
228 //skipping whitespace and arrow tokens, the arguments index starts at 4
229 ARC_ParserTagToken *argumentsToken = (ARC_ParserTagToken *)ARC_Vector_Get(tagToken->tagTokens, 4);
230 ARC_ParserLangParsedData_GetArgumentsTag(tokensOrTags, argumentsToken, getStringIdFn);
231
232 //initialize the tokens or tags array to the needed size
233 bodyTag->tokensOrTagsSize = ARC_Vector_GetSize(tokensOrTags);
234 bodyTag->tokensOrTags = (uint32_t **)malloc(sizeof(uint32_t *) * bodyTag->tokensOrTagsSize);
235
236 //copy each or section into the tokensOrTags
237 for(uint32_t orIndex = 0; orIndex < bodyTag->tokensOrTagsSize; orIndex++){
238 //get the current or vector and its tags
239 orTokensOrTags = (ARC_Vector *)ARC_Vector_Get(tokensOrTags, orIndex);
240 uint32_t orTokensOrTagsSize = ARC_Vector_GetSize(orTokensOrTags);
241
242 //create the or array with one extra space and store the size in that space
243 bodyTag->tokensOrTags[orIndex] = (uint32_t *)malloc(sizeof(uint32_t) * (orTokensOrTagsSize + 1));
244 bodyTag->tokensOrTags[orIndex][0] = orTokensOrTagsSize;
245
246 //copy the or data to the tokensOrTags
247 for(uint32_t tokenOrTagIndex = 0; tokenOrTagIndex < orTokensOrTagsSize; tokenOrTagIndex++){
248 bodyTag->tokensOrTags[orIndex][tokenOrTagIndex + 1] = *(uint32_t *)ARC_Vector_Get(orTokensOrTags, tokenOrTagIndex);
249 }
250 }
251
252 //set the tag to the bodyTag
253 *tag = bodyTag;
254
255 //cleanup
256 ARC_Vector_Destroy(tokensOrTags);
257}
258
260 //loop through the tags either going to the next line or the next body
261 for(uint32_t index = 0; index < ARC_Vector_GetSize(tagToken->tagTokens); index++){
262 ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(tagToken->tagTokens, index);
263
264 //for some reason can't create this in the switch, so placed here
265 ARC_ParserTag *tag;
266
267 switch(childTagToken->id){
268 //recuse to run the next line
270 ARC_ParserLangParsedData_RunLineTag(tags, childTagToken, getStringIdFn);
271 continue;
272
273 //get a tag
275 ARC_ParserLangParsedData_CreateBodyTag(&tag, childTagToken, getStringIdFn);
276 ARC_Vector_Add(tags, (void *)tag);
277 continue;
278
279 default:
280 continue;
281 }
282 }
283}
284
285//private function to create the saved data for the language
286void ARC_ParserLang_CreateDataFn(void **data, ARC_ParserTagToken *parsedData, void *userData){
287 ARC_Parser_GetStringIdFn *getStringIdFn = (ARC_Parser_GetStringIdFn *)userData;
288
289 //make sure there is parsed data to use
290 if(parsedData == NULL){
292 ARC_DEBUG_LOG_ERROR("ARC_ParserLang_CreateDataFn(void **data, ARC_ParserTagToken *parsedData, void *userData), parsedData was NULL when passed in");
293 return;
294 }
295
296 //function callback to cleanup added tags
298
299 //I don't see a reason to have a comparison function right now. this might change in the future
300 ARC_Vector_Create((ARC_Vector **)data, NULL, &destroyParserTagFn);
301
302 //check if there are any tags (thes could be empty if a file is blank)
303 if(parsedData->tagTokens == NULL){
304 return;
305 }
306
307 //load the language into a vector recursivly
308 ARC_ParserLangParsedData_RunLineTag(*((ARC_Vector **)data), parsedData, getStringIdFn);
309}
310
311//private function to destroy the saved data for the language
312void ARC_ParserLang_DestroyDataFn(void *data, ARC_Bool clear, void *userData){
313 if(userData != NULL){
314 ARC_Parser_GetStringIdFn *getStringIdFn = (ARC_Parser_GetStringIdFn *)userData;
315 free(getStringIdFn);
316 }
317
318 //if not clearing (full destroy) check if there is data to free
319 if(clear == ARC_False && (ARC_Vector *)data != NULL){
321 }
322}
323
325 //<line> -> <body> NEWLINE <line> | <body> | NEWLINE <line> | LAMBDA
326 uint32_t *line[] = { (uint32_t[]){ 3, ARC_PARSERLANG_BODY, ARC_PARSERLANG_TOKEN_NEWLINE_ID, ARC_PARSERLANG_LINE }, (uint32_t[]){ 1, ARC_PARSERLANG_BODY }, (uint32_t[]){ 2, ARC_PARSERLANG_TOKEN_NEWLINE_ID, ARC_PARSERLANG_LINE }, (uint32_t[]){ 1, ARC_PARSERLANG_LAMBDA } };
327
328 //<body> -> <tag> <whitespace> ARROW <whitespace> <arguments>
330
331 //<arguments> -> <argument> <whitespace> OR <whitespace> <arguments> | <argument>
333
334 //<argument> -> <tagOrConstant> <whitespace> <argument> | <tagOrConstant>
335 uint32_t *argument[] = { (uint32_t[]){ 3, ARC_PARSERLANG_TAG_OR_CONSTANT, ARC_PARSERLANG_WHITESPACE, ARC_PARSERLANG_ARGUMENT }, (uint32_t[]){ 1, ARC_PARSERLANG_TAG_OR_CONSTANT } };
336
337 //<tagOrConstant> -> <parserLangageTag> | <constant>
338 uint32_t *tagOrConstant[] = { (uint32_t[]){ 1, ARC_PARSERLANG_TAG }, (uint32_t[]){ 1, ARC_PARSERLANG_CONSTANT } };
339
340 //<constant> -> ALPHA_UPPER_CHAR <constantBody>
341 uint32_t *constant[] = { (uint32_t[]){ 2, ARC_PARSERLANG_TOKEN_ALPHA_UPPER_CHAR, ARC_PARSERLANG_CONSTANT_BODY } };
342
343 //<constantBody> -> <constantChar> <constantBody> | LAMBDA
344 uint32_t *constantBody[] = { (uint32_t[]){ 2, ARC_PARSERLANG_CONSTANT_CHAR, ARC_PARSERLANG_CONSTANT_BODY }, (uint32_t[]){ 1, ARC_PARSERLANG_LAMBDA } };
345
346 //<constantChar> -> ALPHA_UPPER_CHAR | UNDERSCORE
347 uint32_t *constantChar[] = { (uint32_t[]){ 1, ARC_PARSERLANG_TOKEN_ALPHA_UPPER_CHAR }, (uint32_t[]){ 1, ARC_PARSERLANG_TOKEN_UNDERSCORE_ID } };
348
349 //<tag> -> LESS_THAN <variable> GREATER_THAN
351
352 //<variable> -> <alphaChar> <variableBody> | UNDERSCORE <variableBody>
353 uint32_t *variable[] = { (uint32_t[]){ 2, ARC_PARSERLANG_ALPHA_CHAR, ARC_PARSERLANG_VARIABLE_BODY }, (uint32_t[]){ 2, ARC_PARSERLANG_TOKEN_UNDERSCORE_ID, ARC_PARSERLANG_VARIABLE_BODY } };
354
355 //<variableBody> -> <variableChar> <variableBody> | LAMBDA
356 uint32_t *variableBody[] = { (uint32_t[]){ 2, ARC_PARSERLANG_VARIABLE_CHAR, ARC_PARSERLANG_VARIABLE_BODY }, (uint32_t[]){ 1, ARC_PARSERLANG_LAMBDA } };
357
358 //<variableChar> -> <alphaChar> | NUMBER | UNDERSCORE
359 uint32_t *variableChar[] = { (uint32_t[]){ 1, ARC_PARSERLANG_ALPHA_CHAR }, (uint32_t[]){ 1, ARC_PARSERLANG_TOKEN_NUMBER }, (uint32_t[]){ 1, ARC_PARSERLANG_TOKEN_UNDERSCORE_ID } };
360
361 //<alphaChar> -> ALPHA_LOWER_CHAR | ALPHA_UPPER_CHAR
362 uint32_t *alphaChar[] = { (uint32_t[]){ 1, ARC_PARSERLANG_TOKEN_ALPHA_LOWER_CHAR }, (uint32_t[]){ 1, ARC_PARSERLANG_TOKEN_ALPHA_UPPER_CHAR }};
363
364 //<whitespace> -> WHITESPACE <whitespace> | WHITESPACE
365 uint32_t *whitespace[] = { (uint32_t[]){ 2, ARC_PARSERLANG_TOKEN_WHITESPACE, ARC_PARSERLANG_WHITESPACE }, (uint32_t[]){ 1, ARC_PARSERLANG_TOKEN_WHITESPACE }};
366
367 ARC_ParserTag parserLangTags[14] = {
368 { ARC_PARSERLANG_LINE , line , 4 },
369 { ARC_PARSERLANG_BODY , body , 1 },
370 { ARC_PARSERLANG_ARGUMENTS , arguments , 2 },
371 { ARC_PARSERLANG_ARGUMENT , argument , 2 },
372 { ARC_PARSERLANG_TAG_OR_CONSTANT, tagOrConstant, 2 },
373 { ARC_PARSERLANG_CONSTANT , constant , 1 },
374 { ARC_PARSERLANG_CONSTANT_BODY , constantBody , 2 },
375 { ARC_PARSERLANG_CONSTANT_CHAR , constantChar , 2 },
376 { ARC_PARSERLANG_TAG , tag , 1 },
377 { ARC_PARSERLANG_VARIABLE , variable , 2 },
378 { ARC_PARSERLANG_VARIABLE_BODY , variableBody , 2 },
379 { ARC_PARSERLANG_VARIABLE_CHAR , variableChar , 3 },
380 { ARC_PARSERLANG_ALPHA_CHAR , alphaChar , 2 },
381 { ARC_PARSERLANG_WHITESPACE , whitespace , 2 }
382 };
383
384 ARC_Array parserLanguageArray = {
385 14, //size
386 parserLangTags //data
387 };
388
391
392 //this will be cleaned up by the destroyDataFn
394 *newGetStringIdFn = getStringIdFn;
395
396 //create the parserlang
397 ARC_Parser_Create(parser, &parserLanguageArray, ARC_ParserLang_InitLexerRulesFn, &createDataFn, &destroyDataFn, (void *)newGetStringIdFn);
398}
#define ARC_False
Definition bool.h:12
#define ARC_Bool
Definition bool.h:10
int32_t arc_errno
Definition errno.c:5
#define ARC_ERRNO_NULL
Definition errno.h:6
#define ARC_DEBUG_LOG_ERROR(STR)
Definition errno.h:39
#define ARC_LEXER_TOKEN_WHITESPACE
Definition lexer.h:252
void ARC_Lexer_RegisterTokenRule(ARC_Lexer *lexer, ARC_LexerTokenRule tokenRule)
adds a token rule to a lexer
Definition lexer.c:79
ARC_LexerTokenRule ARC_LexerTokenRule_CreateAndReturnMatchStringRule(uint32_t id, ARC_String *string)
creates a ARC_LexerTokenRule with a given id and string
Definition lexer.c:428
ARC_LexerTokenRule ARC_LexerTokenRule_CreateAndReturnMatchCharRule(uint32_t id, char character)
creates a ARC_LexerTokenRule with a given id and character
Definition lexer.c:378
ARC_LexerTokenRule ARC_LexerTokenRule_CreateAndReturnMatchCharOrBetween(uint32_t id, char start, char end)
creates a ARC_LexerTokenRule with a given id and character range
Definition lexer.c:400
ARC_LexerTokenRule ARC_LexerTokenRule_CreateAndReturnMatchCharInStringRule(uint32_t id, ARC_String *string)
creates a ARC_LexerTokenRule with a given id and string
Definition lexer.c:450
void ARC_Parser_Create(ARC_Parser **parser, ARC_Array *language, ARC_Parser_InitLexerRulesFn initLexerRulesFn, ARC_ParserData_CreateFn *createDataFn, ARC_ParserData_DestroyFn *destroyDataFn, void *userData)
creates an ARC_Parser type
Definition parser.c:24
uint32_t(* ARC_Parser_GetStringIdFn)(ARC_String *string)
TODO: write this.
Definition parser.h:52
void(* ARC_ParserData_CreateFn)(void **data, ARC_ParserTagToken *parsedData, void *userData)
TODO: write this.
Definition parser.h:57
void(* ARC_ParserData_DestroyFn)(void *data, ARC_Bool clear, void *userData)
TODO: write this.
Definition parser.h:62
void ARC_ParserLangParsedData_GetArgumentTag(ARC_Vector *orTokensOrTags, ARC_ParserTagToken *tagToken, ARC_Parser_GetStringIdFn *getStringIdFn)
Definition parserlang.c:117
void ARC_ParserLangParsedData_CreateTagString(ARC_String **tagString, ARC_ParserTagToken *tagToken)
Definition parserlang.c:104
void ARC_ParserLang_VectorDestroyVectorFn(void *data)
Definition parserlang.c:43
void ARC_ParserLang_CreateDataFn(void **data, ARC_ParserTagToken *parsedData, void *userData)
Definition parserlang.c:286
void ARC_ParserLang_CreateAsParser(ARC_Parser **parser, ARC_Parser_GetStringIdFn getStringIdFn)
creates a parser for the Parser Lang
Definition parserlang.c:324
void ARC_ParserLangParsedData_CreateBodyTag(ARC_ParserTag **tag, ARC_ParserTagToken *tagToken, ARC_Parser_GetStringIdFn *getStringIdFn)
Definition parserlang.c:196
void ARC_ParserLangParsedData_GetArgumentsTag(ARC_Vector *tokensOrTags, ARC_ParserTagToken *tagToken, ARC_Parser_GetStringIdFn *getStringIdFn)
Definition parserlang.c:157
void ARC_ParserLang_VectorDestroyParserTagFn(void *data)
Definition parserlang.c:53
void ARC_ParserLang_VectorDestroyUInt32Fn(void *data)
Definition parserlang.c:48
void ARC_ParserLangParsedData_RunLineTag(ARC_Vector *tags, ARC_ParserTagToken *tagToken, ARC_Parser_GetStringIdFn *getStringIdFn)
Definition parserlang.c:259
void ARC_ParserLang_DestroyDataFn(void *data, ARC_Bool clear, void *userData)
Definition parserlang.c:312
void ARC_ParserLang_InitLexerRulesFn(ARC_Lexer *lexer)
Definition parserlang.c:12
void ARC_ParserLangParsedData_RecurseStringAdd(ARC_String **data, ARC_ParserTagToken *tagToken)
Definition parserlang.c:68
#define ARC_PARSERLANG_TOKEN_OR_CHAR
Definition parserlang.h:54
#define ARC_PARSERLANG_TOKEN_UNDERSCORE_CHAR
Definition parserlang.h:56
#define ARC_PARSERLANG_CONSTANT_CHAR
Definition parserlang.h:69
#define ARC_PARSERLANG_TAG
Definition parserlang.h:70
#define ARC_PARSERLANG_ALPHA_CHAR
Definition parserlang.h:74
#define ARC_PARSERLANG_TOKEN_NEWLINE_ID
Definition parserlang.h:47
#define ARC_PARSERLANG_BODY
Definition parserlang.h:63
#define ARC_PARSERLANG_WHITESPACE
Definition parserlang.h:75
#define ARC_PARSERLANG_CONSTANT
Definition parserlang.h:67
#define ARC_PARSERLANG_TOKEN_NUMBER
Definition parserlang.h:42
#define ARC_PARSERLANG_TOKEN_GREATER_THAN_CHAR
Definition parserlang.h:52
#define ARC_PARSERLANG_TAG_OR_CONSTANT
Definition parserlang.h:66
#define ARC_PARSERLANG_TOKEN_ARROW_ID
Definition parserlang.h:58
#define ARC_PARSERLANG_TOKEN_LESS_THAN_ID
Definition parserlang.h:49
#define ARC_PARSERLANG_TOKEN_GREATER_THAN_ID
Definition parserlang.h:51
#define ARC_PARSERLANG_TOKEN_OR_ID
Definition parserlang.h:53
#define ARC_PARSERLANG_TOKEN_WHITESPACE
Definition parserlang.h:45
#define ARC_PARSERLANG_TOKEN_ALPHA_UPPER_CHAR
Definition parserlang.h:44
#define ARC_PARSERLANG_LINE
Definition parserlang.h:62
#define ARC_PARSERLANG_TOKEN_NEWLINE_CHAR
Definition parserlang.h:48
#define ARC_PARSERLANG_VARIABLE_BODY
Definition parserlang.h:72
#define ARC_PARSERLANG_TOKEN_NULL
Definition parserlang.h:41
#define ARC_PARSERLANG_VARIABLE_CHAR
Definition parserlang.h:73
#define ARC_PARSERLANG_CONSTANT_BODY
Definition parserlang.h:68
#define ARC_PARSERLANG_TOKEN_ALPHA_LOWER_CHAR
Definition parserlang.h:43
#define ARC_PARSERLANG_ARGUMENT
Definition parserlang.h:65
#define ARC_PARSERLANG_TOKEN_UNDERSCORE_ID
Definition parserlang.h:55
#define ARC_PARSERLANG_ARGUMENTS
Definition parserlang.h:64
#define ARC_PARSERLANG_TOKEN_ARROW_CSTRING
Definition parserlang.h:59
#define ARC_PARSERLANG_VARIABLE
Definition parserlang.h:71
#define ARC_PARSERLANG_TOKEN_LESS_THAN_CHAR
Definition parserlang.h:50
#define ARC_PARSERLANG_LAMBDA
Definition parserlang.h:61
void ARC_String_CreateWithStrlen(ARC_String **string, char *data)
creates ARC_String type with strinlen
Definition string.c:32
void ARC_String_AppendCString(ARC_String **string, const char *cstring, uint64_t length)
appends to an ARC_String with an ARC_String
Definition string.c:130
void ARC_String_Create(ARC_String **string, char *data, uint64_t length)
creates ARC_String type
Definition string.c:9
void ARC_String_Append(ARC_String **string, ARC_String *append)
appends to an ARC_String with an ARC_String
Definition string.c:126
void ARC_String_Destroy(ARC_String *string)
destroys ARC_String type
Definition string.c:52
a type that holds an array of data and its size
Definition array.h:13
uint32_t rule
Definition lexer.h:19
ARC_String * data
Definition lexer.h:20
a parser type used inside of the parser data create function
Definition parser.h:35
ARC_LexerToken * token
Definition parser.h:38
uint32_t id
Definition parser.h:36
ARC_Vector * tagTokens
Definition parser.h:39
a langue tag type for the parser //TODO: explain this better
Definition parser.h:21
uint32_t tagId
Definition parser.h:22
uint32_t tokensOrTagsSize
Definition parser.h:25
uint32_t ** tokensOrTags
Definition parser.h:24
substring position within a string
Definition string.h:14
void(* ARC_Vector_DestroyDataFn)(void *data)
a callback that cleans up memory when it is removed from the vector
Definition vector.h:31
uint32_t ARC_Vector_GetSize(ARC_Vector *vector)
gets the current size of an ARC_Vector as an unsigned 32 bit integer
Definition vector.c:146
void * ARC_Vector_Get(ARC_Vector *vector, uint32_t index)
gets an item from an ARC_Vector at a position index
Definition vector.c:150
void ARC_Vector_Add(ARC_Vector *vector, void *data)
adds an item to an ARC_Vector
Definition vector.c:67
void ARC_Vector_Destroy(ARC_Vector *vector)
destroys an ARC_Vector
Definition vector.c:51
void ARC_Vector_Create(ARC_Vector **vector, ARC_Vector_CompareDataFn *compareDataFn, ARC_Vector_DestroyDataFn *destroyDataFn)
creates an ARC_Vector which is an "expandable" array
Definition vector.c:28