Archeus 0.0.0
A C library and game engine that focuses on documentation
Loading...
Searching...
No Matches
config.c File Reference
#include "arc/math/config.h"
#include <stdio.h>
#include <stdlib.h>
#include "arc/std/array.h"
#include "arc/std/string.h"
#include "arc/std/errno.h"
#include "arc/std/config.h"
#include "arc/math/point.h"
#include "arc/math/rectangle.h"
#include "arc/std/defaults/config.h"

Go to the source code of this file.

Functions

void ARC_MathConfig_Init (ARC_Config *config)
 
uint64_t ARC_MathConfig_GetIndexAndErrorCheck (ARC_String *string, char *search, uint64_t searchLength)
 
uint8_t ARC_Point_Read (ARC_Config *config, ARC_String *string, void **value)
 
uint8_t ARC_Rect_Read (ARC_Config *config, ARC_String *string, void **value)
 
void ARC_RectArray_ReadRect (ARC_Config *config, ARC_String *stripped, uint64_t index, uint64_t length, uint64_t *arrayIndex, void **value)
 
uint8_t ARC_RectArray_Read (ARC_Config *config, ARC_String *string, void **value)
 
void ARC_Point_Delete (ARC_Config *config, ARC_String *string, void *value)
 
void ARC_Rect_Delete (ARC_Config *config, ARC_String *string, void *value)
 
void ARC_RectArray_Delete (ARC_Config *config, ARC_String *string, void *value)
 

Function Documentation

◆ ARC_MathConfig_GetIndexAndErrorCheck()

uint64_t ARC_MathConfig_GetIndexAndErrorCheck ( ARC_String * string,
char * search,
uint64_t searchLength )

Definition at line 20 of file config.c.

20 {
21 uint64_t separator = ARC_String_FindCString(string, ",", 1);
22
23 if(separator == ~(uint64_t)0){
25 }
26
27 return separator;
28}
int32_t arc_errno
Definition errno.c:5
#define ARC_ERRNO_DATA
Definition errno.h:7
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_errno, ARC_ERRNO_DATA, and ARC_String_FindCString().

Referenced by ARC_Point_Read(), and ARC_Rect_Read().

◆ ARC_MathConfig_Init()

void ARC_MathConfig_Init ( ARC_Config * config)

Definition at line 14 of file config.c.

14 {
15 ARC_Config_AddKeyCString(config, (char *)"ARC_Point" , 9, ARC_Point_Read , ARC_Point_Delete );
16 ARC_Config_AddKeyCString(config, (char *)"ARC_Rect" , 8, ARC_Rect_Read , ARC_Rect_Delete );
17 ARC_Config_AddKeyCString(config, (char *)"ARC_Rect[]", 10, ARC_RectArray_Read, ARC_RectArray_Delete);
18}
uint8_t ARC_RectArray_Read(ARC_Config *config, ARC_String *string, void **value)
Definition config.c:183
uint8_t ARC_Point_Read(ARC_Config *config, ARC_String *string, void **value)
Definition config.c:30
void ARC_RectArray_Delete(ARC_Config *config, ARC_String *string, void *value)
Definition config.c:273
void ARC_Rect_Delete(ARC_Config *config, ARC_String *string, void *value)
Definition config.c:269
void ARC_Point_Delete(ARC_Config *config, ARC_String *string, void *value)
Definition config.c:265
uint8_t ARC_Rect_Read(ARC_Config *config, ARC_String *string, void **value)
Definition config.c:62
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
Definition config.c:55

References ARC_Config_AddKeyCString(), ARC_Point_Delete(), ARC_Point_Read(), ARC_Rect_Delete(), ARC_Rect_Read(), ARC_RectArray_Delete(), and ARC_RectArray_Read().

◆ ARC_Point_Delete()

void ARC_Point_Delete ( ARC_Config * config,
ARC_String * string,
void * value )

Definition at line 265 of file config.c.

265 {
266 free((ARC_Point *)value);
267}

Referenced by ARC_MathConfig_Init().

◆ ARC_Point_Read()

uint8_t ARC_Point_Read ( ARC_Config * config,
ARC_String * string,
void ** value )

Definition at line 30 of file config.c.

30 {
31 ARC_Config_Get(config, string, value);
32 if(*value){
33 return 1;
34 }
35
36 if(string->data[0] != '{' || string->data[string->length - 1] != '}'){
37 ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("in ARC_Point_Read(config, string, value); no matching curly braces: %s", string->data);
39 return 0;
40 }
41
42 uint64_t separator = ARC_MathConfig_GetIndexAndErrorCheck(string, ",", 1);
43 if(arc_errno){
44 return 0;
45 }
46
47 ARC_String *xString, *yString;
48 ARC_String_CopySubstring(&xString, string, 1 , separator - 1 );
49 ARC_String_CopySubstring(&yString, string, separator + 1, string->length - (separator + 2));
50
51 ARC_Point *point = (ARC_Point *)malloc(sizeof(ARC_Point));
52 point->x = (int32_t)ARC_String_ToInt64_t(xString);
53 point->y = (int32_t)ARC_String_ToInt64_t(yString);
54
55 ARC_String_Destroy(xString);
56 ARC_String_Destroy(yString);
57
58 *value = point;
59 return 0;
60}
#define ARC_DEBUG_LOG_ERROR_WITH_VARIABLES(STR,...)
Definition errno.h:40
uint64_t ARC_MathConfig_GetIndexAndErrorCheck(ARC_String *string, char *search, uint64_t searchLength)
Definition config.c:20
void ARC_Config_Get(ARC_Config *config, ARC_String *keyname, void **value)
get a value from a given keyname
Definition config.c:124
int64_t ARC_String_ToInt64_t(ARC_String *string)
converst substring from string to int64_t
Definition string.c:222
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
void ARC_String_Destroy(ARC_String *string)
destroys ARC_String type
Definition string.c:52
int32_t y
Definition point.h:12
int32_t x
Definition point.h:11
substring position within a string
Definition string.h:14
uint64_t length
Definition string.h:16
char * data
Definition string.h:15

References ARC_Config_Get(), ARC_DEBUG_LOG_ERROR_WITH_VARIABLES, arc_errno, ARC_ERRNO_DATA, ARC_MathConfig_GetIndexAndErrorCheck(), ARC_String_CopySubstring(), ARC_String_Destroy(), ARC_String_ToInt64_t(), ARC_String::data, ARC_String::length, ARC_Point::x, and ARC_Point::y.

Referenced by ARC_MathConfig_Init().

◆ ARC_Rect_Delete()

void ARC_Rect_Delete ( ARC_Config * config,
ARC_String * string,
void * value )

Definition at line 269 of file config.c.

269 {
270 free((ARC_Rect *)value);
271}

Referenced by ARC_MathConfig_Init(), and ARC_RectArray_ReadRect().

◆ ARC_Rect_Read()

uint8_t ARC_Rect_Read ( ARC_Config * config,
ARC_String * string,
void ** value )

Definition at line 62 of file config.c.

62 {
63 ARC_Config_Get(config, string, value);
64 if(*value){
65 return 1;
66 }
67
68 if(string->data[0] != '{' || string->data[string->length - 1] != '}'){
70 ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("in ARC_Rect_Read(config, string, value); no matching curly braces: %s", string->data);
71 return 0;
72 }
73
74 ARC_String *current;
75 ARC_String_CopySubstring(&current, string, 1, string->length - 2);
76
77 ARC_String *temp, *tempStripped;
78 int32_t x, y, w, h;
79 int64_t separator;
80
81 //x
82 separator = ARC_MathConfig_GetIndexAndErrorCheck(current, ",", 1);
83 if(arc_errno){
84 return 0;
85 }
86
87 ARC_String_CopySubstring(&temp, current, 0, separator - 1);
88 ARC_String_StripEndsWhitespace(&tempStripped, temp);
89 x = ARC_String_ToInt64_t(tempStripped);
91 ARC_String_Destroy(tempStripped);
92
93 temp = current;
94 ARC_String_CopySubstring(&current, temp, separator + 1, temp->length - (separator + 1));
96
97 //y
98 separator = ARC_MathConfig_GetIndexAndErrorCheck(current, ",", 1);
99 if(arc_errno){
100 return 0;
101 }
102
103 ARC_String_CopySubstring(&temp, current, 0, separator - 1);
104 ARC_String_StripEndsWhitespace(&tempStripped, temp);
105 y = ARC_String_ToInt64_t(tempStripped);
106 ARC_String_Destroy(temp);
107 ARC_String_Destroy(tempStripped);
108
109 temp = current;
110 ARC_String_CopySubstring(&current, temp, separator + 1, temp->length - (separator + 1));
111 ARC_String_Destroy(temp);
112
113 //w
114 separator = ARC_MathConfig_GetIndexAndErrorCheck(current, ",", 1);
115 if(arc_errno){
116 return 0;
117 }
118
119 ARC_String_CopySubstring(&temp, current, 0, separator - 1);
120 ARC_String_StripEndsWhitespace(&tempStripped, temp);
121 w = ARC_String_ToInt64_t(tempStripped);
122 ARC_String_Destroy(temp);
123 ARC_String_Destroy(tempStripped);
124
125 temp = current;
126 ARC_String_CopySubstring(&current, temp, separator + 1, temp->length - (separator + 1));
127 ARC_String_Destroy(temp);
128
129 //h
130 separator = current->length;
131 if(arc_errno){
132 return 0;
133 }
134
135 ARC_String_CopySubstring(&temp, current, 0, separator);
136 ARC_String_StripEndsWhitespace(&tempStripped, temp);
137 h = ARC_String_ToInt64_t(tempStripped);
138 ARC_String_Destroy(temp);
139 ARC_String_Destroy(tempStripped);
140 ARC_String_Destroy(current);
141
142 *value = malloc(sizeof(ARC_Rect));
143 ((ARC_Rect *) *value)->x = x;
144 ((ARC_Rect *) *value)->y = y;
145 ((ARC_Rect *) *value)->w = w;
146 ((ARC_Rect *) *value)->h = h;
147 return 0;
148}
void ARC_String_StripEndsWhitespace(ARC_String **stripped, ARC_String *original)
strips the whitespace from the ends of a string
Definition string.c:437

References ARC_Config_Get(), ARC_DEBUG_LOG_ERROR_WITH_VARIABLES, arc_errno, ARC_ERRNO_DATA, ARC_MathConfig_GetIndexAndErrorCheck(), ARC_String_CopySubstring(), ARC_String_Destroy(), ARC_String_StripEndsWhitespace(), ARC_String_ToInt64_t(), ARC_String::data, and ARC_String::length.

Referenced by ARC_MathConfig_Init(), and ARC_RectArray_ReadRect().

◆ ARC_RectArray_Delete()

void ARC_RectArray_Delete ( ARC_Config * config,
ARC_String * string,
void * value )

Definition at line 273 of file config.c.

273 {
274 //TODO free value->data
275 free((ARC_Array *)value);
276}
a type that holds an array of data and its size
Definition array.h:13

Referenced by ARC_MathConfig_Init().

◆ ARC_RectArray_Read()

uint8_t ARC_RectArray_Read ( ARC_Config * config,
ARC_String * string,
void ** value )

Definition at line 183 of file config.c.

183 {
184 ARC_Config_Get(config, string, value);
185 if(*value){
186 return 1;
187 }
188
189 if(string->data[0] != '{' || string->data[string->length - 1] != '}'){
191 ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("in ARC_RectArray_Read(config, string, value); no matching curly braces: %s", string->data);
192 return 0;
193 }
194
195 ARC_String *temp, *stripped;
196 ARC_String_CopySubstring(&temp, string, 1, string->length - 2);
197 ARC_String_StripEndsWhitespace(&stripped, temp);
198 ARC_String_Destroy(temp);
199
200 uint64_t arraySize = 1;
201 int64_t encapsulated = 0;
202 for(uint64_t i = 0; i < stripped->length; i++){
203 if(stripped->data[i] == '{'){
204 encapsulated++;
205 continue;
206 }
207
208 if(stripped->data[i] == '}'){
209 encapsulated--;
210 continue;
211 }
212
213 if(!encapsulated && stripped->data[i] == ','){
214 arraySize++;
215 }
216 }
217
218 if(encapsulated){
220 //TODO: Fix this for windows SMFH
221 // ARC_DEBUG_LOG(arc_errno, "in ARC_RectArray_Read(config, data, subdata, value); after looping encapsulated was %ld", encapsulated);
222 ARC_String_Destroy(stripped);
223 return 0;
224 }
225
226 *value = malloc(sizeof(ARC_Array));
227 ((ARC_Array *) *value)->data = malloc(sizeof(ARC_Rect) * arraySize);
228 ((ARC_Array *) *value)->size = arraySize;
229
230 uint64_t index = 0;
231 arraySize = 0;
232 encapsulated = 0;
233 for(uint64_t i = 0; i < stripped->length; i++){
234 if(stripped->data[i] == '{'){
235 encapsulated++;
236 continue;
237 }
238
239 if(stripped->data[i] == '}'){
240 encapsulated--;
241 continue;
242 }
243
244 if(!encapsulated && stripped->data[i] == ','){
245 ARC_RectArray_ReadRect(config, stripped, index, i - index, &arraySize, value);
246 if(arc_errno){
247 return 0;
248 }
249
250 index = i + 1;
251
252 if(arraySize == ((ARC_Array *) *value)->size){
253 break;
254 }
255 }
256 }
257
258 if(arraySize != ((ARC_Array *) *value)->size){
259 ARC_RectArray_ReadRect(config, stripped, index, stripped->length - index, &arraySize, value);
260 }
261 ARC_String_Destroy(stripped);
262 return 0;
263}
void ARC_RectArray_ReadRect(ARC_Config *config, ARC_String *stripped, uint64_t index, uint64_t length, uint64_t *arrayIndex, void **value)
Definition config.c:150

References ARC_Config_Get(), ARC_DEBUG_LOG_ERROR_WITH_VARIABLES, arc_errno, ARC_ERRNO_DATA, ARC_RectArray_ReadRect(), ARC_String_CopySubstring(), ARC_String_Destroy(), ARC_String_StripEndsWhitespace(), ARC_String::data, and ARC_String::length.

Referenced by ARC_MathConfig_Init(), and ARC_Sprite_Read().

◆ ARC_RectArray_ReadRect()

void ARC_RectArray_ReadRect ( ARC_Config * config,
ARC_String * stripped,
uint64_t index,
uint64_t length,
uint64_t * arrayIndex,
void ** value )

Definition at line 150 of file config.c.

150 {
151 ARC_String *substr, *temp;
152 ARC_String_CopySubstring(&temp, stripped, index, length);
153 ARC_String_StripEndsWhitespace(&substr, temp);
154 ARC_String_Destroy(temp);
155
156 // reading in reference
157 ARC_Rect *tempRect;
158 ARC_Config_Get(config, substr, (void **) &tempRect);
159 if(tempRect){
160 ARC_String_Destroy(substr);
161
162 ((ARC_Rect *)((ARC_Array *) *value)->data)[*arrayIndex] = *tempRect;
163 ++*arrayIndex;
164
165 return;
166 }
167
168 //reading in value
169 ARC_Rect_Read(config, substr, (void **) &tempRect);
170 if(arc_errno){
171 ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("in ARC_RectArray_ReadRect(config, string, index, length, arrayIndex, value); failed to read rect: %s", substr->data);
172 ARC_String_Destroy(substr);
173 return;
174 }
175
176 ((ARC_Rect *)((ARC_Array *) *value)->data)[*arrayIndex] = *tempRect;
177 ++*arrayIndex;
178
179 ARC_Rect_Delete(config, substr, (void *)tempRect);
180 ARC_String_Destroy(substr);
181}

References ARC_Config_Get(), ARC_DEBUG_LOG_ERROR_WITH_VARIABLES, arc_errno, ARC_Rect_Delete(), ARC_Rect_Read(), ARC_String_CopySubstring(), ARC_String_Destroy(), ARC_String_StripEndsWhitespace(), and ARC_String::data.

Referenced by ARC_RectArray_Read().