Archeus 0.0.0
A C library and game engine that focuses on documentation
Loading...
Searching...
No Matches
config.c File Reference
#include "arc/std/config.h"
#include "arc/std/errno.h"
#include "arc/std/hashtable.h"
#include "arc/std/io.h"
#include "arc/std/string.h"
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>

Go to the source code of this file.

Data Structures

struct  ARC_Config
 
struct  ARC_ConfigKey
 
struct  ARC_ConfigTypeTemplate
 
struct  ARC_ConfigDeleteKeyArgs
 

Typedefs

typedef struct ARC_ConfigKey ARC_ConfigKey
 
typedef struct ARC_ConfigTypeTemplate ARC_ConfigTypeTemplate
 
typedef struct ARC_ConfigDeleteKeyArgs ARC_ConfigDeleteKeyArgs
 

Functions

int8_t ARC_Config_KeyComp (void *key1, size_t *key1size, void *key2, size_t *key2size)
 
void ARC_Config_CreateGroup (ARC_Config *config, ARC_String *name)
 
void ARC_Config_DestroyGroup (ARC_HashtableNode *group, void *userdata)
 
void ARC_Config_DestroyGroupNode (ARC_HashtableNode *node, void *userdata)
 
void ARC_Config_RemoveKey (ARC_HashtableNode *node, void *userdata)
 
void ARC_Config_AddKey (ARC_Config *config, ARC_String *type, ARC_ConfigKeyRead keyRead, ARC_ConfigKeyDelete keyDelete)
 adds a usable key to ARC_Config
 
void ARC_Config_AddKeyCString (ARC_Config *config, const char *type, uint64_t length, ARC_ConfigKeyRead keyRead, ARC_ConfigKeyDelete keyDelete)
 adds a key from a cstring
 
void ARC_Config_Create (ARC_Config **config)
 creates ARC_Config type
 
void ARC_Config_Destroy (ARC_Config *config)
 destroys ARC_Config type
 
void ARC_Config_SetGroup (ARC_Config *config, ARC_String *groupname)
 sets current group in config
 
void ARC_Config_Get (ARC_Config *config, ARC_String *keyname, void **value)
 get a value from a given keyname
 
void ARC_Config_Recurse (ARC_Config *config, ARC_String **data, ARC_String *groupstr, uint8_t *command)
 
void ARC_Config_SetKeyGroup (ARC_Config *config, ARC_String **data, uint8_t *command)
 
void ARC_Config_LoadFromKey (ARC_Config *config, ARC_String *keyType, ARC_String *name, ARC_String *value)
 
void ARC_Config_UnloadFromKey (ARC_Config *config, ARC_String *keyType, ARC_String *name, ARC_String *value)
 
void ARC_Config_GetNameAndValue (ARC_String *data, ARC_String **name, ARC_String **value)
 
void ARC_Config_StripComment (ARC_String *original, ARC_String **stripped, ARC_String *lineStart, ARC_String *lineEnd)
 
void ARC_Config_RemoveComments (ARC_String *original, ARC_String **commentRemoved)
 
void ARC_Config_RunCommand (ARC_Config *config, ARC_String *command)
 
void ARC_Config_RemoveAndRunCommands (ARC_Config *config, ARC_String *original, ARC_String **commandRemoved)
 
void ARC_Config_FileIO (ARC_Config *config, ARC_String *path, uint8_t command)
 handles file io for ARC_Config Type
 

Typedef Documentation

◆ ARC_ConfigDeleteKeyArgs

typedef struct ARC_ConfigDeleteKeyArgs ARC_ConfigDeleteKeyArgs

◆ ARC_ConfigKey

typedef struct ARC_ConfigKey ARC_ConfigKey

◆ ARC_ConfigTypeTemplate

typedef struct ARC_ConfigTypeTemplate ARC_ConfigTypeTemplate

Function Documentation

◆ ARC_Config_AddKey()

void ARC_Config_AddKey ( ARC_Config * config,
ARC_String * type,
ARC_ConfigKeyRead keyRead,
ARC_ConfigKeyDelete keyDelete )

adds a usable key to ARC_Config

Parameters
configARC_Config to add keys to
typestring of key type
keyReadfunction for reading/creating key from string
keyDeletefunction for deleting stored key

Definition at line 45 of file config.c.

45 {
46 ARC_ConfigKey *newKey = (ARC_ConfigKey *)malloc(sizeof(ARC_ConfigKey));
47 newKey->Read = keyRead;
48 newKey->Delete = keyDelete;
49
50 char *typeval = (char *)malloc(sizeof(char) * type->length);
51 strncpy(typeval, type->data, type->length);
52 ARC_Hashtable_Add(config->keys, (void *)typeval, type->length, newKey);
53}
void ARC_Hashtable_Add(ARC_Hashtable *htable, void *key, size_t keysize, void *data)
adds value to hastable
Definition hashtable.c:75
ARC_ConfigKeyDelete Delete
Definition config.c:22
ARC_ConfigKeyRead Read
Definition config.c:21
ARC_Hashtable * keys
Definition config.c:17
uint64_t length
Definition string.h:16
char * data
Definition string.h:15

References ARC_Hashtable_Add(), ARC_String::data, ARC_ConfigKey::Delete, ARC_Config::keys, ARC_String::length, and ARC_ConfigKey::Read.

◆ ARC_Config_AddKeyCString()

void ARC_Config_AddKeyCString ( ARC_Config * config,
const char * type,
uint64_t length,
ARC_ConfigKeyRead keyRead,
ARC_ConfigKeyDelete keyDelete )

adds a key from a cstring

Parameters
configARC_Config to add keys to
typecstring of key type
lengthlength of cstring
keyReadfunction for reading/creating key from string
keyDeletefunction for deleting stored key

Definition at line 55 of file config.c.

55 {
56 ARC_ConfigKey *newKey = (ARC_ConfigKey *)malloc(sizeof(ARC_ConfigKey));
57 newKey->Read = keyRead;
58 newKey->Delete = keyDelete;
59
60 char *typeval = (char *)malloc(sizeof(char) * length);
61 strncpy(typeval, type, length);
62 ARC_Hashtable_Add(config->keys, (void *)typeval, length, newKey);
63}

References ARC_Hashtable_Add(), ARC_ConfigKey::Delete, ARC_Config::keys, and ARC_ConfigKey::Read.

Referenced by ARC_AudioConfig_Init(), ARC_GraphicsConfig_Init(), and ARC_MathConfig_Init().

◆ ARC_Config_Create()

void ARC_Config_Create ( ARC_Config ** config)

creates ARC_Config type

Parameters
configARC_Config to initialize

Definition at line 65 of file config.c.

65 {
66 *config = (ARC_Config *)malloc(sizeof(ARC_Config));
67 (*config)->currgroup = NULL;
68
69 ARC_Hashtable *groups;
71 (*config)->groups = groups;
72 ARC_Config_CreateGroup(*config, NULL);
73
74 ARC_Hashtable *keys;
76 (*config)->keys = keys;
77
78#ifdef ARC_DEFAULT_CONFIG
80#endif
81}
void ARC_Hashtable_Create(ARC_Hashtable **htable, uint32_t bucketsize, ARC_Hashtable_Hash hash, ARC_Hashtable_KeyCompare compare)
cteates ARC_Hashtable type
Definition hashtable.c:56
void ARC_Config_CreateGroup(ARC_Config *config, ARC_String *name)
Definition config.c:565
int8_t ARC_Config_KeyComp(void *key1, size_t *key1size, void *key2, size_t *key2size)
Definition config.c:557
#define ARC_KEY_BUCKET_SIZE
Definition config.h:12
#define ARC_GROUP_BUCKET_SIZE
Definition config.h:13
void ARC_Defaults_ConfigKey_Create(ARC_Config *config)
ARC_Hashtable * currgroup
Definition config.c:14

References ARC_Config_CreateGroup(), ARC_Config_KeyComp(), ARC_Defaults_ConfigKey_Create(), ARC_GROUP_BUCKET_SIZE, ARC_Hashtable_Create(), ARC_KEY_BUCKET_SIZE, and ARC_Config::currgroup.

◆ ARC_Config_CreateGroup()

void ARC_Config_CreateGroup ( ARC_Config * config,
ARC_String * name )

Definition at line 565 of file config.c.

565 {
566 ARC_Hashtable *data;
568
569 if(name){
570 char *nameval = (char *)malloc(sizeof(char) * name->length);
571 strncpy(nameval, name->data, name->length);
572 ARC_Hashtable_Add(config->groups, nameval, name->length, (void *)data);
573 return;
574 }
575
576 char *emptyGroup = (char *)malloc(sizeof(char));
577 emptyGroup[0] = ' ';
578 ARC_Hashtable_Add(config->groups, emptyGroup, 1, (void *)data);
579}
#define ARC_GROUP_DATA_BUCKET_SIZE
Definition config.h:14
ARC_Hashtable * groups
Definition config.c:16

References ARC_Config_KeyComp(), ARC_GROUP_DATA_BUCKET_SIZE, ARC_Hashtable_Add(), ARC_Hashtable_Create(), ARC_String::data, ARC_Config::groups, and ARC_String::length.

Referenced by ARC_Config_Create(), and ARC_Config_SetGroup().

◆ ARC_Config_Destroy()

void ARC_Config_Destroy ( ARC_Config * config)

destroys ARC_Config type

Definition at line 83 of file config.c.

83 {
84 ARC_ConfigDeleteKeyArgs keyArgs = {
85 .config = config,
86 .string = NULL,
87 };
88
89 ARC_Hashtable_Destroy(config->groups, ARC_Config_DestroyGroup, (void *)&keyArgs);
91 free(config);
92}
void ARC_Hashtable_Destroy(ARC_Hashtable *htable, ARC_HashtableNode_DestroyExternal external, void *userdata)
destroys ARC_Hashtable type
Definition hashtable.c:64
void ARC_Config_RemoveKey(ARC_HashtableNode *node, void *userdata)
Definition config.c:600
void ARC_Config_DestroyGroup(ARC_HashtableNode *group, void *userdata)
Definition config.c:581

References ARC_Config_DestroyGroup(), ARC_Config_RemoveKey(), ARC_Hashtable_Destroy(), ARC_Config::groups, and ARC_Config::keys.

◆ ARC_Config_DestroyGroup()

void ARC_Config_DestroyGroup ( ARC_HashtableNode * group,
void * userdata )

Definition at line 581 of file config.c.

581 {
582 free((char *)group->key);
584}
void ARC_Config_DestroyGroupNode(ARC_HashtableNode *node, void *userdata)
Definition config.c:586

References ARC_Config_DestroyGroupNode(), ARC_Hashtable_Destroy(), ARC_HashtableNode::data, and ARC_HashtableNode::key.

Referenced by ARC_Config_Destroy().

◆ ARC_Config_DestroyGroupNode()

void ARC_Config_DestroyGroupNode ( ARC_HashtableNode * node,
void * userdata )

Definition at line 586 of file config.c.

586 {
587 free((char *)node->key);
588
590 if(temp->Delete && temp->data && userdata){
592
593 temp->Delete(args->config, args->string, temp->data);
594 }
595
596 free(temp);
597 node->data = NULL;
598}
ARC_Config * config
Definition config.c:32
ARC_String * string
Definition config.c:33

References ARC_ConfigDeleteKeyArgs::config, ARC_ConfigTypeTemplate::data, ARC_HashtableNode::data, ARC_ConfigTypeTemplate::Delete, ARC_HashtableNode::key, and ARC_ConfigDeleteKeyArgs::string.

Referenced by ARC_Config_DestroyGroup(), and ARC_Config_UnloadFromKey().

◆ ARC_Config_FileIO()

void ARC_Config_FileIO ( ARC_Config * config,
ARC_String * path,
uint8_t command )

handles file io for ARC_Config Type

Parameters
configARC_Config where io operations will take place
pathfile path for io

Definition at line 528 of file config.c.

528 {
529 arc_errno = 0; //TODO: Remove this, just testing
530 ARC_String *data;
531 ARC_IO_FileToStr(path, &data);
532 if(arc_errno){
533 ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_IO_FileToStr(%s, &data, &size);\n", path->data);
534 return;
535 }
536
538
539 ARC_String *temp = data;
540 ARC_Config_RemoveComments(temp, &data);
541 ARC_String_Destroy(temp);
542
543 temp = data;
544 ARC_Config_RemoveAndRunCommands(config, temp, &data);
545 ARC_String_Destroy(temp);
546
547 temp = data;
549 ARC_String_Destroy(temp);
550
551 ARC_Config_Recurse(config, &data, NULL, &command);
552 if(data){
553 ARC_String_Destroy(data);
554 }
555}
int32_t arc_errno
Definition errno.c:5
#define ARC_DEBUG_LOG_ERROR_WITH_VARIABLES(STR,...)
Definition errno.h:40
void ARC_IO_FileToStr(ARC_String *path, ARC_String **data)
get string and size from file
Definition io.c:43
void ARC_Config_RemoveComments(ARC_String *original, ARC_String **commentRemoved)
Definition config.c:428
void ARC_Config_RemoveAndRunCommands(ARC_Config *config, ARC_String *original, ARC_String **commandRemoved)
Definition config.c:491
void ARC_Config_Recurse(ARC_Config *config, ARC_String **data, ARC_String *groupstr, uint8_t *command)
Definition config.c:271
void ARC_String_StripEndsWhitespace(ARC_String **stripped, ARC_String *original)
strips the whitespace from the ends of a string
Definition string.c:437
void ARC_String_AppendCStringWithStrlen(ARC_String **string, const char *cstring)
appends to an ARC_String with an ARC_String
Definition string.c:143
void ARC_String_Destroy(ARC_String *string)
destroys ARC_String type
Definition string.c:52
substring position within a string
Definition string.h:14

References ARC_Config_Recurse(), ARC_Config_RemoveAndRunCommands(), ARC_Config_RemoveComments(), ARC_DEBUG_LOG_ERROR_WITH_VARIABLES, arc_errno, ARC_IO_FileToStr(), ARC_String_AppendCStringWithStrlen(), ARC_String_Destroy(), ARC_String_StripEndsWhitespace(), and ARC_String::data.

Referenced by ARC_Config_RunCommand().

◆ ARC_Config_Get()

void ARC_Config_Get ( ARC_Config * config,
ARC_String * keyname,
void ** value )

get a value from a given keyname

Note
name may be prefaced with <group>:: to specify group
Parameters
configARC_Config to get value from
keynamename of key to get from config
valuedata retrieved from config

Definition at line 124 of file config.c.

124 {
125 ARC_ConfigTypeTemplate *temp = NULL;
126
127 uint64_t length = ARC_String_FindCString(keyname, "::", 2);
128 if(arc_errno){
129 //TODO: Debug info here
130 ARC_DEBUG_LOG_ERROR("in ARC_Config_Get(config, keyname, value); length threw error");
131 *value = NULL;
132 return;
133 }
134
135 if(length != ~((uint64_t)0)){
136 length--;
137 ARC_String *group = NULL;
138
139 if(length != 0){
140 ARC_String_CopySubstring(&group, keyname, 0, length);
141 }
142
143 ARC_Hashtable *currgroup = config->currgroup;
144 ARC_Config_SetGroup(config, group);
145 if(arc_errno){
146 ARC_DEBUG_LOG_ERROR("in ARC_Config_Get(config, keyname, value); setting group threw error");
147 ARC_String_Destroy(group);
148 *value = NULL;
149 return;
150 }
151
152 ARC_String *name;
153 ARC_String_CopySubstring(&name, keyname, length + 2, keyname->length - (length + 2));
154 ARC_Hashtable_Get(config->currgroup, (void *)name->data, name->length, (void **)&temp);
155 ARC_String_Destroy(name);
156
157 config->currgroup = currgroup;
158 if(group){
159 ARC_String_Destroy(group);
160 }
161
162 if(temp == NULL){
163 *value = NULL;
164 return;
165 }
166
167 *value = temp->data;
168 return;
169 }
170
171 if(!keyname){
172 *value = NULL;
173 return;
174 }
175
176 ARC_Hashtable_Get(config->currgroup, (void *)keyname->data, keyname->length, (void **)&temp);
177 if(arc_errno || temp == NULL){
178 *value = NULL;
179 return;
180 }
181
182 *value = temp->data;
183}
#define ARC_DEBUG_LOG_ERROR(STR)
Definition errno.h:39
void ARC_Hashtable_Get(ARC_Hashtable *htable, void *key, size_t keysize, void **data)
gets value from hashtable by key
Definition hashtable.c:103
void ARC_Config_SetGroup(ARC_Config *config, ARC_String *groupname)
sets current group in config
Definition config.c:95
void ARC_String_CopySubstring(ARC_String **substring, ARC_String *original, uint64_t start, uint64_t length)
copy a subtring from a givin ARC_String
Definition string.c:72
uint64_t ARC_String_FindCString(ARC_String *string, const char *cstring, uint64_t length)
takes given cstring and gives position of first matching
Definition string.c:252

References ARC_Config_SetGroup(), ARC_DEBUG_LOG_ERROR, arc_errno, ARC_Hashtable_Get(), ARC_String_CopySubstring(), ARC_String_Destroy(), ARC_String_FindCString(), ARC_Config::currgroup, ARC_ConfigTypeTemplate::data, ARC_String::data, and ARC_String::length.

Referenced by ARC_Audio_Read(), ARC_Point_Read(), ARC_Rect_Read(), ARC_RectArray_Read(), ARC_RectArray_ReadRect(), ARC_SDL_Texture_Read(), ARC_Sprite_Delete(), ARC_Sprite_Read(), ARC_Spritesheet_Delete(), ARC_Spritesheet_Read(), and ARC_Spritesheet_ReadTexture().

◆ ARC_Config_GetNameAndValue()

void ARC_Config_GetNameAndValue ( ARC_String * data,
ARC_String ** name,
ARC_String ** value )

Definition at line 251 of file config.c.

251 {
252 uint64_t index = ARC_String_FindCString(data, "=", 1);
253 if(arc_errno || index == ~(uint64_t)0){
254 *name = NULL;
255 *value = NULL;
256 return;
257 }
258
259 ARC_String_CopySubstring(name, data, 0, index - 1);
260 index++;
261
262 ARC_String *dataTemp = *name;
263 ARC_String_StripEndsWhitespace(name, dataTemp);
264 ARC_String_Destroy(dataTemp);
265
266 ARC_String_CopySubstring(&dataTemp, data, index, data->length - index);
267 ARC_String_StripEndsWhitespace(value, dataTemp);
268 ARC_String_Destroy(dataTemp);
269}

References arc_errno, ARC_String_CopySubstring(), ARC_String_Destroy(), ARC_String_FindCString(), ARC_String_StripEndsWhitespace(), and ARC_String::length.

Referenced by ARC_Config_Recurse().

◆ ARC_Config_KeyComp()

int8_t ARC_Config_KeyComp ( void * key1,
size_t * key1size,
void * key2,
size_t * key2size )

Definition at line 557 of file config.c.

557 {
558 if(*key1size - *key2size){
559 return -1;
560 }
561
562 return strncmp((const char *)key1, (const char *)key2, *key1size);
563}

Referenced by ARC_Config_Create(), and ARC_Config_CreateGroup().

◆ ARC_Config_LoadFromKey()

void ARC_Config_LoadFromKey ( ARC_Config * config,
ARC_String * keyType,
ARC_String * name,
ARC_String * value )

Definition at line 211 of file config.c.

211 {
212 ARC_ConfigKey *key;
213 ARC_Hashtable_Get(config->keys, keyType->data, keyType->length, (void **)&key);
214 if(key == NULL){
216 ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("in ARC_Config_LoadFromKey(config, string, value); no matching key: %s", keyType->data);
217 }
218
219 if(arc_errno){
220 return;
221 }
222
224 templateVal->Delete = NULL;
225 templateVal->data = NULL;
226
227 uint8_t reference = key->Read(config, value, &(templateVal->data));
228 if(!reference){
229 templateVal->Delete = key->Delete;
230 }
231
232 if(arc_errno){
233 return;
234 }
235
236 char *nameval = (char *)malloc(sizeof(char) * name->length + 1);
237 strncpy(nameval, name->data, name->length);
238 nameval[name->length] = '\0';
239 ARC_Hashtable_Add(config->currgroup, nameval, name->length, (void *)templateVal);
240}
#define ARC_ERRNO_DATA
Definition errno.h:7
ARC_ConfigKeyDelete Delete
Definition config.c:26

References ARC_DEBUG_LOG_ERROR_WITH_VARIABLES, arc_errno, ARC_ERRNO_DATA, ARC_Hashtable_Add(), ARC_Hashtable_Get(), ARC_Config::currgroup, ARC_ConfigTypeTemplate::data, ARC_String::data, ARC_ConfigKey::Delete, ARC_ConfigTypeTemplate::Delete, ARC_Config::keys, ARC_String::length, and ARC_ConfigKey::Read.

Referenced by ARC_Config_Recurse().

◆ ARC_Config_Recurse()

void ARC_Config_Recurse ( ARC_Config * config,
ARC_String ** data,
ARC_String * groupstr,
uint8_t * command )

Definition at line 271 of file config.c.

271 {
272 ARC_Config_SetGroup(config, groupstr);
273 if(arc_errno){
274 return;
275 }
276
277 ARC_Hashtable *group = config->currgroup;
278
279 while(*data && (*data)->length){
280 ARC_String *dataTemp = *data;
281 ARC_String_StripEndsWhitespace(data, dataTemp);
282 ARC_String_Destroy(dataTemp);
283
284 // break out of current group
285 if((*data)->data[0] == '}'){
286 config->currgroup = NULL;
287
288 dataTemp = *data;
289 ARC_String_CopySubstring(data, dataTemp, 1, dataTemp->length - 1);
290 ARC_String_Destroy(dataTemp);
291 return;
292 }
293
294 // set group
295 if(!(config->currgroup)){
296 config->currgroup = group;
297 }
298
299 // get keys type
300 uint64_t index = ARC_String_FindCString(*data, " ", 1);
301 if(arc_errno || index == ~(uint64_t)0){
302 return;
303 }
304
305 ARC_String *keyType, *keyTypeTemp;
306 ARC_String_CopySubstring(&keyTypeTemp, *data, 0, index);
307 ARC_String_StripEndsWhitespace(&keyType, keyTypeTemp);
308 ARC_String_Destroy(keyTypeTemp);
309
310 if(ARC_String_EqualsCString(keyType, "group", 5)){
311 ARC_Config_SetKeyGroup(config, data, command);
312 ARC_String_Destroy(keyType);
313 config->currgroup = group;
314 if(arc_errno){
315 return;
316 }
317
318 continue;
319 }
320
321 // get and copy up to the ;
322 ARC_String *nameAndValue;
323 uint64_t nextIndex = ARC_String_FindCString(*data, ";", 1);
324 if(nextIndex == ~(uint64_t)0){
326 }
327
328 if(arc_errno){
329 ARC_String_Destroy(keyType);
330 return;
331 }
332
333 ARC_String_CopySubstring(&nameAndValue, *data, index, nextIndex - (index + 1));
334 if(arc_errno){
335 ARC_String_Destroy(keyType);
336 return;
337 }
338
339 // remove up to the ; from data string
340 dataTemp = *data;
341 ARC_String_CopySubstring(data, dataTemp, nextIndex, (*data)->length - nextIndex);
342 ARC_String_Destroy(dataTemp);
343 if(arc_errno){
344 ARC_String_Destroy(keyType);
345 ARC_String_Destroy(nameAndValue);
346 return;
347 }
348
349 // get name and value of string
350 ARC_String *name, *value;
351 ARC_Config_GetNameAndValue(nameAndValue, &name, &value);
352 ARC_String_Destroy(nameAndValue);
353 if(arc_errno){
354 ARC_String_Destroy(keyType);
355 return;
356 }
357
358 // load from key
359 if(*command == ARC_CONFIG_FILE_IO_LOAD){
360 ARC_Config_LoadFromKey(config, keyType, name, value);
361
362 ARC_String_Destroy(keyType);
363 ARC_String_Destroy(name );
364 ARC_String_Destroy(value );
365
366 if(arc_errno){
367 return;
368 }
369
370 continue;
371 }
372
373 // unload from key
374 if(*command == ARC_CONFIG_FILE_IO_UNLOAD){
375 ARC_Config_UnloadFromKey(config, keyType, name, value);
376
377 ARC_String_Destroy(keyType);
378 ARC_String_Destroy(name );
379 ARC_String_Destroy(value );
380
381 if(arc_errno){
382 return;
383 }
384
385 continue;
386 }
387
388 // config file wasn't loaded correctly
389 ARC_String_Destroy(keyType);
390 ARC_String_Destroy(name );
391 ARC_String_Destroy(value );
393 return;
394 }
395
396 config->currgroup = group;
397}
void ARC_Config_UnloadFromKey(ARC_Config *config, ARC_String *keyType, ARC_String *name, ARC_String *value)
Definition config.c:242
void ARC_Config_GetNameAndValue(ARC_String *data, ARC_String **name, ARC_String **value)
Definition config.c:251
void ARC_Config_LoadFromKey(ARC_Config *config, ARC_String *keyType, ARC_String *name, ARC_String *value)
Definition config.c:211
void ARC_Config_SetKeyGroup(ARC_Config *config, ARC_String **data, uint8_t *command)
Definition config.c:187
#define ARC_CONFIG_FILE_IO_UNLOAD
Definition config.h:108
#define ARC_CONFIG_FILE_IO_LOAD
commands that can be used in ARC_Config_FileIO
Definition config.h:107
ARC_Bool ARC_String_EqualsCString(ARC_String *string, const char *cstring, uint64_t length)
check if ARC_String and cstring match
Definition string.c:159

References ARC_CONFIG_FILE_IO_LOAD, ARC_CONFIG_FILE_IO_UNLOAD, ARC_Config_GetNameAndValue(), ARC_Config_LoadFromKey(), ARC_Config_SetGroup(), ARC_Config_SetKeyGroup(), ARC_Config_UnloadFromKey(), arc_errno, ARC_ERRNO_DATA, ARC_String_CopySubstring(), ARC_String_Destroy(), ARC_String_EqualsCString(), ARC_String_FindCString(), ARC_String_StripEndsWhitespace(), ARC_Config::currgroup, and ARC_String::length.

Referenced by ARC_Config_FileIO(), and ARC_Config_SetKeyGroup().

◆ ARC_Config_RemoveAndRunCommands()

void ARC_Config_RemoveAndRunCommands ( ARC_Config * config,
ARC_String * original,
ARC_String ** commandRemoved )

Definition at line 491 of file config.c.

491 {
492 ARC_String *current;
493 ARC_String_Copy(&current, original);
494
495 ARC_String *lineStart, *lineEnd;
496 ARC_String_Create(&lineStart, "#" , 1);
497 ARC_String_Create(&lineEnd , "\n", 1);
498
499 uint64_t index = ARC_String_Find(current, lineStart);
500
501 while(index != ~(uint64_t)0){
502 uint64_t endIndex = ARC_String_Find(current, lineEnd);
503 if(endIndex == ~(uint64_t)0){
505 ARC_String_Destroy(current );
506 ARC_String_Destroy(lineStart);
507 ARC_String_Destroy(lineEnd );
508 *commandRemoved = NULL;
509 return;
510 }
511
512 ARC_String *command;
513 ARC_String_CopySubstring(&command, current, index + lineStart->length, endIndex - (index + lineStart->length));
514 ARC_Config_RunCommand(config, command);
515
516 ARC_String *currentTemp = current;
517 ARC_String_RemoveSubstring(&current, currentTemp, command);
518 ARC_String_Destroy(command);
519 ARC_String_Destroy(currentTemp);
520 }
521
522 ARC_String_Destroy(lineStart);
523 ARC_String_Destroy(lineEnd );
524
525 *commandRemoved = current;
526}
void ARC_Config_RunCommand(ARC_Config *config, ARC_String *command)
Definition config.c:457
void ARC_String_RemoveSubstring(ARC_String **newString, ARC_String *original, ARC_String *substring)
copy a subtring from a givin ARC_String
Definition string.c:116
void ARC_String_Create(ARC_String **string, char *data, uint64_t length)
creates ARC_String type
Definition string.c:9
void ARC_String_Copy(ARC_String **copy, ARC_String *original)
copy a ARC_String
Definition string.c:62
uint64_t ARC_String_Find(ARC_String *string, ARC_String *substring)
takes a given string, and assigns index and length for position of first matching substring
Definition string.c:231

References ARC_Config_RunCommand(), arc_errno, ARC_ERRNO_DATA, ARC_String_Copy(), ARC_String_CopySubstring(), ARC_String_Create(), ARC_String_Destroy(), ARC_String_Find(), ARC_String_RemoveSubstring(), and ARC_String::length.

Referenced by ARC_Config_FileIO().

◆ ARC_Config_RemoveComments()

void ARC_Config_RemoveComments ( ARC_String * original,
ARC_String ** commentRemoved )

Definition at line 428 of file config.c.

428 {
429 ARC_String *lineStart, *lineEnd;
430
431 //Single Line Comment
432 ARC_String_Create(&lineStart, "//", 2);
433 ARC_String_Create(&lineEnd , "\n", 1);
434
435 ARC_String *singleLineStripped;
436 ARC_Config_StripComment(original, &singleLineStripped, lineStart, lineEnd);
437
438 ARC_String_Destroy(lineStart);
439 ARC_String_Destroy(lineEnd );
440
441 if(arc_errno){
442 commentRemoved = NULL;
443 return;
444 }
445
446 //Multi Line Comment
447 ARC_String_Create(&lineStart, "/*", 2);
448 ARC_String_Create(&lineEnd , "*/", 2);
449
450 ARC_Config_StripComment(singleLineStripped, commentRemoved, lineStart, lineEnd);
451 ARC_String_Destroy(singleLineStripped);
452
453 ARC_String_Destroy(lineStart);
454 ARC_String_Destroy(lineEnd );
455}
void ARC_Config_StripComment(ARC_String *original, ARC_String **stripped, ARC_String *lineStart, ARC_String *lineEnd)
Definition config.c:399

References ARC_Config_StripComment(), arc_errno, ARC_String_Create(), and ARC_String_Destroy().

Referenced by ARC_Config_FileIO().

◆ ARC_Config_RemoveKey()

void ARC_Config_RemoveKey ( ARC_HashtableNode * node,
void * userdata )

Definition at line 600 of file config.c.

600 {
601 free((char *)node->key);
602
603 if(!node->data){
605 return;
606 }
607
608 free((ARC_ConfigKey *)node->data);
609}
#define ARC_ERRNO_NULL
Definition errno.h:6

References arc_errno, ARC_ERRNO_NULL, ARC_HashtableNode::data, and ARC_HashtableNode::key.

Referenced by ARC_Config_Destroy().

◆ ARC_Config_RunCommand()

void ARC_Config_RunCommand ( ARC_Config * config,
ARC_String * command )

Definition at line 457 of file config.c.

457 {
458 ARC_String *space;
459 ARC_String_Create(&space, " " , 1);
460
461 uint64_t index = ARC_String_Find(command, space);
462 if(index == ~(uint64_t)0){
464 ARC_String_Destroy(space);
465 return;
466 }
467
468 ARC_String *commandOpt;
469 ARC_String_CopySubstring(&commandOpt, command, 0, index);
470
471 ARC_String *commandArgTemp, *commandArg;
472 ARC_String_CopySubstring(&commandArgTemp, command, index + space->length, command->length - (index + space->length));
473 ARC_String_StripWhitespace(&commandArg, commandArgTemp);
474 ARC_String_Destroy(commandArgTemp);
475
476 if(ARC_String_EqualsCString(command, "load", 4)){
477 ARC_Config_FileIO(config, commandArg, ARC_CONFIG_FILE_IO_LOAD);
478 }
479 else if(ARC_String_EqualsCString(command, "unload", 6)){
480 ARC_Config_FileIO(config, commandArg, ARC_CONFIG_FILE_IO_UNLOAD);
481 }
482 else {
484 }
485
486 ARC_String_Destroy(commandOpt);
487 ARC_String_Destroy(commandArg);
488 ARC_String_Destroy(space );
489}
void ARC_Config_FileIO(ARC_Config *config, ARC_String *path, uint8_t command)
handles file io for ARC_Config Type
Definition config.c:528
void ARC_String_StripWhitespace(ARC_String **stripped, ARC_String *original)
strips whitespace from a ARC_String
Definition string.c:366

References ARC_CONFIG_FILE_IO_LOAD, ARC_CONFIG_FILE_IO_UNLOAD, ARC_Config_FileIO(), arc_errno, ARC_ERRNO_DATA, ARC_String_CopySubstring(), ARC_String_Create(), ARC_String_Destroy(), ARC_String_EqualsCString(), ARC_String_Find(), ARC_String_StripWhitespace(), and ARC_String::length.

Referenced by ARC_Config_RemoveAndRunCommands().

◆ ARC_Config_SetGroup()

void ARC_Config_SetGroup ( ARC_Config * config,
ARC_String * groupname )

sets current group in config

Note
ARC_Config_Get will use this set group
Parameters
configARC_Config we are setting current group in
groupnamename of group that will be set

Definition at line 95 of file config.c.

95 {
96 if(!config){
97 return;
98 }
99
100 if(groupname == NULL){
101 ARC_Hashtable_Get(config->groups, (void *)" ", 1, (void **)&(config->currgroup));
102 return;
103 }
104
105 ARC_Hashtable_Get(config->groups, (void *)groupname->data, groupname->length, (void **)&(config->currgroup));
106 arc_errno = 0;
107
108// if(arc_errno && arc_errno != ARC_ERRNO_NULL){
109// return;
110// }
111
112 if(config->currgroup){
113 return;
114 }
115
116 ARC_Config_CreateGroup(config, groupname);
117 if(arc_errno){
118 return;
119 }
120
121 ARC_Hashtable_Get(config->groups, (void *)groupname->data, groupname->length, (void **)&(config->currgroup));
122}

References ARC_Config_CreateGroup(), arc_errno, ARC_Hashtable_Get(), ARC_Config::currgroup, ARC_String::data, ARC_Config::groups, and ARC_String::length.

Referenced by ARC_Config_Get(), and ARC_Config_Recurse().

◆ ARC_Config_SetKeyGroup()

void ARC_Config_SetKeyGroup ( ARC_Config * config,
ARC_String ** data,
uint8_t * command )

Definition at line 187 of file config.c.

187 {
188 uint64_t index = ARC_String_FindCString(*data, " ", 1);
189 uint64_t nextIndex = ARC_String_FindCString(*data, "{", 1);
190 if(index == ~(uint64_t)0 || nextIndex == ~(uint64_t)0){
192 }
193
194 if(arc_errno){
195 return;
196 }
197
198 ARC_String *name, *temp;
199 ARC_String_CopySubstring(&temp, *data, index, nextIndex - index - 1);
201 ARC_String_Destroy(temp);
202
203 temp = *data;
204 ARC_String_CopySubstring(data, temp, nextIndex + 1, (*data)->length - (nextIndex + 1));
205 ARC_String_Destroy(temp);
206
207 ARC_Config_Recurse(config, data, name, command);
208 ARC_String_Destroy(name);
209}

References ARC_Config_Recurse(), arc_errno, ARC_ERRNO_DATA, ARC_String_CopySubstring(), ARC_String_Destroy(), ARC_String_FindCString(), ARC_String_StripEndsWhitespace(), and ARC_String::length.

Referenced by ARC_Config_Recurse().

◆ ARC_Config_StripComment()

void ARC_Config_StripComment ( ARC_String * original,
ARC_String ** stripped,
ARC_String * lineStart,
ARC_String * lineEnd )

Definition at line 399 of file config.c.

399 {
400 ARC_String *current = NULL;
401 ARC_String_Copy(&current, original);
402
403 uint64_t index = ARC_String_Find(original, lineStart);
404 while(index != ~(uint64_t)0){
405 ARC_String *commentString;
406 ARC_String_CopySubstring(&commentString, current, index + lineStart->length, current->length - (index + lineStart->length));
407
408 uint64_t endIndex = ARC_String_Find(commentString, lineEnd);
409 ARC_String_Destroy(commentString);
410 if(endIndex == ~(uint64_t)0){
411 ARC_DEBUG_LOG_ERROR("ARC_Config_RemoveComments(original, commentRemoved); No newline found when stripping single line comment");
413 ARC_String_Destroy(current);
414 *stripped = NULL;
415 break;
416 }
417
418 ARC_String *currentTemp = current;
419 ARC_String_RemoveSection(&current, currentTemp, index, endIndex + lineStart->length + lineEnd->length);
420 ARC_String_Destroy(currentTemp);
421
422 index = ARC_String_Find(current, lineStart);
423 }
424
425 *stripped = current;
426}
void ARC_String_RemoveSection(ARC_String **newString, ARC_String *original, uint64_t removeIndex, uint64_t removeLength)
copy a subtring from a givin ARC_String
Definition string.c:499

References ARC_DEBUG_LOG_ERROR, arc_errno, ARC_ERRNO_DATA, ARC_String_Copy(), ARC_String_CopySubstring(), ARC_String_Destroy(), ARC_String_Find(), ARC_String_RemoveSection(), and ARC_String::length.

Referenced by ARC_Config_RemoveComments().

◆ ARC_Config_UnloadFromKey()

void ARC_Config_UnloadFromKey ( ARC_Config * config,
ARC_String * keyType,
ARC_String * name,
ARC_String * value )

Definition at line 242 of file config.c.

242 {
243 ARC_ConfigDeleteKeyArgs keyArgs = {
244 .config = config,
245 .string = value,
246 };
247
248 ARC_Hashtable_Remove(config->currgroup, name->data, name->length, ARC_Config_DestroyGroupNode, &keyArgs);
249}
void ARC_Hashtable_Remove(ARC_Hashtable *htable, void *key, size_t keysize, ARC_HashtableNode_DestroyExternal external, void *userdata)
removes value from hashtable
Definition hashtable.c:131

References ARC_Config_DestroyGroupNode(), ARC_Hashtable_Remove(), ARC_Config::currgroup, ARC_String::data, and ARC_String::length.

Referenced by ARC_Config_Recurse().