Skip to content

Commit 1f1f6ff

Browse files
committed
Refactor the parts of Chaos.h related to complex elements and add getListLength(), getDictLength() and getDictKeyByIndex() functions
1 parent e947979 commit 1f1f6ff

File tree

5 files changed

+64
-40
lines changed

5 files changed

+64
-40
lines changed

Chaos.c

Lines changed: 35 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -46,92 +46,87 @@ char* getVariableString(char *name) {
4646
return getSymbolValueString(symbol_name);
4747
}
4848

49+
unsigned long getListLength(char *name) {
50+
Symbol* symbol = getSymbol(name);
51+
return symbol->children_count;
52+
}
53+
4954
bool getListElementBool(char *name, long long i) {
50-
char *symbol_name = malloc(strlen(name) + 1);
51-
strcpy(symbol_name, name);
52-
Symbol* symbol = getListElement(getSymbol(symbol_name), i);
55+
Symbol* symbol = getListElement(getSymbol(name), i);
5356
if (symbol->value_type != V_BOOL) {
5457
throw_error(E_UNEXPECTED_VALUE_TYPE, getValueTypeName(symbol->value_type), symbol->name);
5558
}
56-
return symbol->value.b;
59+
return _getSymbolValueBool(symbol);
5760
}
5861

5962
long long getListElementInt(char *name, long long i) {
60-
char *symbol_name = malloc(strlen(name) + 1);
61-
strcpy(symbol_name, name);
62-
Symbol* symbol = getListElement(getSymbol(symbol_name), i);
63+
Symbol* symbol = getListElement(getSymbol(name), i);
6364
if (symbol->value_type != V_INT) {
6465
throw_error(E_UNEXPECTED_VALUE_TYPE, getValueTypeName(symbol->value_type), symbol->name);
6566
}
66-
return symbol->value.i;
67+
return _getSymbolValueInt(symbol);
6768
}
6869

6970
long double getListElementFloat(char *name, long long i) {
70-
char *symbol_name = malloc(strlen(name) + 1);
71-
strcpy(symbol_name, name);
72-
Symbol* symbol = getListElement(getSymbol(symbol_name), i);
73-
free(symbol_name);
71+
Symbol* symbol = getListElement(getSymbol(name), i);
7472
if (symbol->value_type != V_FLOAT) {
7573
throw_error(E_UNEXPECTED_VALUE_TYPE, getValueTypeName(symbol->value_type), symbol->name);
7674
}
77-
return symbol->value.f;
75+
return _getSymbolValueFloat(symbol);
7876
}
7977

8078
char* getListElementString(char *name, long long i) {
81-
char *symbol_name = malloc(strlen(name) + 1);
82-
strcpy(symbol_name, name);
83-
Symbol* symbol = getListElement(getSymbol(symbol_name), i);
79+
Symbol* symbol = getListElement(getSymbol(name), i);
8480
if (symbol->value_type != V_STRING) {
8581
throw_error(E_UNEXPECTED_VALUE_TYPE, getValueTypeName(symbol->value_type), symbol->name);
8682
}
87-
char* value;
88-
value = malloc(1 + strlen(symbol->value.s));
89-
strcpy(value, symbol->value.s);
90-
return value;
83+
return _getSymbolValueString(symbol);
84+
}
85+
86+
unsigned long getDictLength(char *name) {
87+
Symbol* symbol = getSymbol(name);
88+
return symbol->children_count;
89+
}
90+
91+
char* getDictKeyByIndex(char *name, long long i) {
92+
Symbol* symbol = getSymbol(name);
93+
Symbol* child = symbol->children[i];
94+
char* key;
95+
key = malloc(1 + strlen(child->key));
96+
strcpy(key, child->key);
97+
return key;
9198
}
9299

93100
bool getDictElementBool(char *name, char *key) {
94-
char *symbol_name = malloc(strlen(name) + 1);
95-
strcpy(symbol_name, name);
96-
Symbol* symbol = getDictElement(getSymbol(symbol_name), key);
101+
Symbol* symbol = getDictElement(getSymbol(name), key);
97102
if (symbol->value_type != V_BOOL) {
98103
throw_error(E_UNEXPECTED_VALUE_TYPE, getValueTypeName(symbol->value_type), symbol->name);
99104
}
100-
return symbol->value.b;
105+
return _getSymbolValueBool(symbol);
101106
}
102107

103108
long long getDictElementInt(char *name, char *key) {
104-
char *symbol_name = malloc(strlen(name) + 1);
105-
strcpy(symbol_name, name);
106-
Symbol* symbol = getDictElement(getSymbol(symbol_name), key);
109+
Symbol* symbol = getDictElement(getSymbol(name), key);
107110
if (symbol->value_type != V_INT) {
108111
throw_error(E_UNEXPECTED_VALUE_TYPE, getValueTypeName(symbol->value_type), symbol->name);
109112
}
110-
return symbol->value.i;
113+
return _getSymbolValueInt(symbol);
111114
}
112115

113116
long double getDictElementFloat(char *name, char *key) {
114-
char *symbol_name = malloc(strlen(name) + 1);
115-
strcpy(symbol_name, name);
116-
Symbol* symbol = getDictElement(getSymbol(symbol_name), key);
117+
Symbol* symbol = getDictElement(getSymbol(name), key);
117118
if (symbol->value_type != V_FLOAT) {
118119
throw_error(E_UNEXPECTED_VALUE_TYPE, getValueTypeName(symbol->value_type), symbol->name);
119120
}
120-
return symbol->value.f;
121+
return _getSymbolValueFloat(symbol);
121122
}
122123

123124
char* getDictElementString(char *name, char *key) {
124-
char *symbol_name = malloc(strlen(name) + 1);
125-
strcpy(symbol_name, name);
126-
Symbol* symbol = getDictElement(getSymbol(symbol_name), key);
127-
free(symbol_name);
125+
Symbol* symbol = getDictElement(getSymbol(name), key);
128126
if (symbol->value_type != V_STRING) {
129127
throw_error(E_UNEXPECTED_VALUE_TYPE, getValueTypeName(symbol->value_type), symbol->name);
130128
}
131-
char* value;
132-
value = malloc(1 + strlen(symbol->value.s));
133-
strcpy(value, symbol->value.s);
134-
return value;
129+
return _getSymbolValueString(symbol);
135130
}
136131

137132
void returnVariableBool(bool b) {

Chaos.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@ bool getVariableBool(char *name);
1616
long long getVariableInt(char *name);
1717
long double getVariableFloat(char *name);
1818
char* getVariableString(char *name);
19+
unsigned long getListLength(char *name);
1920
bool getListElementBool(char *name, long long i);
2021
long long getListElementInt(char *name, long long i);
2122
long double getListElementFloat(char *name, long long i);
2223
char* getListElementString(char *name, long long i);
24+
unsigned long getDictLength(char *name);
25+
char* getDictKeyByIndex(char *name, long long i);
2326
bool getDictElementBool(char *name, char *key);
2427
long long getDictElementInt(char *name, char *key);
2528
long double getDictElementFloat(char *name, char *key);
@@ -44,10 +47,13 @@ struct Kaos {
4447
long long (*getVariableInt)(char *name);
4548
long double (*getVariableFloat)(char *name);
4649
char* (*getVariableString)(char *name);
50+
unsigned long (*getListLength)(char *name);
4751
bool (*getListElementBool)(char *name, long long i);
4852
long long (*getListElementInt)(char *name, long long i);
4953
long double (*getListElementFloat)(char *name, long long i);
5054
char* (*getListElementString)(char *name, long long i);
55+
unsigned long (*getDictLength)(char *name);
56+
char* (*getDictKeyByIndex)(char *name, long long i);
5157
bool (*getDictElementBool)(char *name, char *key);
5258
long long (*getDictElementInt)(char *name, char *key);
5359
long double (*getDictElementFloat)(char *name, char *key);

modules/extension.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@ void initKaosApi() {
66
kaos.getVariableInt = getVariableInt;
77
kaos.getVariableFloat = getVariableFloat;
88
kaos.getVariableString = getVariableString;
9+
kaos.getListLength = getListLength;
910
kaos.getListElementBool = getListElementBool;
1011
kaos.getListElementInt = getListElementInt;
1112
kaos.getListElementFloat = getListElementFloat;
1213
kaos.getListElementString = getListElementString;
14+
kaos.getDictLength = getDictLength;
15+
kaos.getDictKeyByIndex = getDictKeyByIndex;
1316
kaos.getDictElementBool = getDictElementBool;
1417
kaos.getDictElementInt = getDictElementInt;
1518
kaos.getDictElementFloat = getDictElementFloat;

symbol.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,10 @@ Symbol* deepCopyComplex(char *name, Symbol* symbol) {
208208
char* getSymbolValueString(char *name) {
209209
Symbol* symbol = getSymbol(name);
210210
free(name);
211+
return _getSymbolValueString(symbol);
212+
}
213+
214+
char* _getSymbolValueString(Symbol* symbol) {
211215
char* value;
212216
if (symbol->value_type == V_STRING) {
213217
value = malloc(1 + strlen(symbol->value.s));
@@ -222,6 +226,10 @@ char* getSymbolValueString(char *name) {
222226
long double getSymbolValueFloat(char *name) {
223227
Symbol* symbol = getSymbol(name);
224228
free(name);
229+
return _getSymbolValueFloat(symbol);
230+
}
231+
232+
long double _getSymbolValueFloat(Symbol* symbol) {
225233
long double value;
226234
switch (symbol->value_type)
227235
{
@@ -247,6 +255,10 @@ long double getSymbolValueFloat(char *name) {
247255
bool getSymbolValueBool(char *name) {
248256
Symbol* symbol = getSymbol(name);
249257
free(name);
258+
return _getSymbolValueBool(symbol);
259+
}
260+
261+
bool _getSymbolValueBool(Symbol* symbol) {
250262
bool value;
251263
switch (symbol->value_type)
252264
{
@@ -273,6 +285,10 @@ bool getSymbolValueBool(char *name) {
273285
long long getSymbolValueInt(char *name) {
274286
Symbol* symbol = getSymbol(name);
275287
free(name);
288+
return _getSymbolValueInt(symbol);
289+
}
290+
291+
long long _getSymbolValueInt(Symbol* symbol) {
276292
long long value;
277293
switch (symbol->value_type)
278294
{

symbol.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,13 @@ Symbol* getSymbolById(unsigned long long id);
7474
Symbol* deepCopySymbol(Symbol* symbol, enum Type type, char *key);
7575
Symbol* deepCopyComplex(char *name, Symbol* symbol);
7676
char* getSymbolValueString(char *name);
77+
char* _getSymbolValueString(Symbol* symbol);
7778
long double getSymbolValueFloat(char *name);
79+
long double _getSymbolValueFloat(Symbol* symbol);
7880
bool getSymbolValueBool(char *name);
81+
bool _getSymbolValueBool(Symbol* symbol);
7982
long long getSymbolValueInt(char *name);
83+
long long _getSymbolValueInt(Symbol* symbol);
8084
char* getSymbolValueString_NullIfNotString(Symbol* symbol);
8185
long long getSymbolValueInt_ZeroIfNotInt(Symbol* symbol);
8286
void printSymbolValue(Symbol* symbol, bool is_complex, bool pretty, bool escaped, unsigned long iter);

0 commit comments

Comments
 (0)