1 #include "wap_t_convert.hh"
2 #include "log.hh"
3 #include "src/lib/appletapi.h"
4 #include "toml/types.hpp"
5 
6 namespace wapanel::conv {
7 
8 // Another resolver with identical code was needed to fullfill vector requirements
9 // Please don't touch unless you know what you doing !_!
10 auto recurse_table(toml::table &table) -> std::vector<_wap_t_config_variable>;
resolve_array(toml::array & array)11 auto resolve_array(toml::array &array) -> std::vector<_wap_t_config_variable> {
12 	log_info("Resolving array...");
13 	std::vector<_wap_t_config_variable> _content;
14 
15 	unsigned int current_index = 0;
16 
17 	for (auto &&value : array) {
18 		_wap_t_config_variable variable = {};
19 		variable.key.number = current_index;
20 		variable.key.string = NULL;
21 
22 		// Match type and put good value into variable
23 		switch (value.type()) {
24 		case toml::value_t::string: {
25 			variable.type = WAP_CONF_VAR_TYPE_STRING;
26 
27 			char *temp_str = (char *)malloc(value.as_string().str.length() + 1);
28 			memcpy(temp_str, value.as_string().str.c_str(), value.as_string().str.length() + 1);
29 
30 			variable.content.value.string = temp_str;
31 			break;
32 		}
33 
34 		case toml::value_t::integer:
35 			variable.type = WAP_CONF_VAR_TYPE_INTEGER;
36 			variable.content.value.integer = value.as_integer();
37 			break;
38 
39 		case toml::value_t::floating:
40 			variable.type = WAP_CONF_VAR_TYPE_FLOAT;
41 			variable.content.value.floating = value.as_floating();
42 			break;
43 
44 		case toml::value_t::boolean:
45 			variable.type = WAP_CONF_VAR_TYPE_BOOLEAN;
46 			variable.content.value.boolean = value.as_boolean();
47 			break;
48 
49 		case toml::value_t::array: {
50 			variable.type = WAP_CONF_VAR_TYPE_ARRAY;
51 			toml::array tm_array = value.as_array();
52 
53 			std::vector<_wap_t_config_variable> var_list = resolve_array(value.as_array());
54 			if (var_list.size() > 0) {
55 				variable.content.array._content = reinterpret_cast<_wap_t_config_variable *>(
56 					malloc(var_list.size() * sizeof(_wap_t_config_variable)));
57 
58 				variable.content.array._size = var_list.size();
59 			}
60 
61 			size_t num_index = 0;
62 			for (auto &&_var : var_list) {
63 				variable.content.array._content[num_index] = _var;
64 				num_index++;
65 			}
66 
67 			break;
68 		}
69 
70 		case toml::value_t::table: {
71 			variable.type = WAP_CONF_VAR_TYPE_TABLE;
72 
73 			std::vector<_wap_t_config_variable> var_list = recurse_table(value.as_table());
74 			if (var_list.size() > 0) {
75 				variable.content.table._content = reinterpret_cast<_wap_t_config_variable *>(
76 					malloc(var_list.size() * sizeof(_wap_t_config_variable)));
77 
78 				variable.content.table._size = var_list.size();
79 			}
80 
81 			size_t num_index = 0;
82 			for (auto &&_var : var_list) {
83 				variable.content.table._content[num_index] = _var;
84 				num_index++;
85 			}
86 
87 			break;
88 		}
89 
90 		default:
91 			break;
92 		}
93 
94 		current_index++;
95 		_content.push_back(variable);
96 	}
97 
98 	return _content;
99 }
recurse_table(toml::table & table)100 auto recurse_table(toml::table &table) -> std::vector<_wap_t_config_variable> {
101 	log_info("Reccurenting table...");
102 	std::vector<_wap_t_config_variable> _content;
103 
104 	for (auto &&val_pair : table) {
105 		_wap_t_config_variable variable = {};
106 
107 		char *temp_str = (char *)malloc(val_pair.first.length() + 1);
108 		memcpy(temp_str, val_pair.first.c_str(), val_pair.first.length() + 1);
109 
110 		variable.key.string = temp_str;
111 
112 		// Match type and put good value into variable
113 		switch (val_pair.second.type()) {
114 		case toml::value_t::string: {
115 			variable.type = WAP_CONF_VAR_TYPE_STRING;
116 
117 			temp_str = (char *)malloc(val_pair.second.as_string().str.length() + 1);
118 			memcpy(temp_str, val_pair.second.as_string().str.c_str(), val_pair.second.as_string().str.length() + 1);
119 
120 			variable.content.value.string = temp_str;
121 			break;
122 		}
123 
124 		case toml::value_t::integer:
125 			variable.type = WAP_CONF_VAR_TYPE_INTEGER;
126 			variable.content.value.integer = val_pair.second.as_integer();
127 			break;
128 
129 		case toml::value_t::floating:
130 			variable.type = WAP_CONF_VAR_TYPE_FLOAT;
131 			variable.content.value.floating = val_pair.second.as_floating();
132 			break;
133 
134 		case toml::value_t::boolean:
135 			variable.type = WAP_CONF_VAR_TYPE_BOOLEAN;
136 			variable.content.value.boolean = val_pair.second.as_boolean();
137 			break;
138 
139 		case toml::value_t::array: {
140 			variable.type = WAP_CONF_VAR_TYPE_ARRAY;
141 			toml::array tm_array = val_pair.second.as_array();
142 
143 			std::vector<_wap_t_config_variable> var_list = resolve_array(val_pair.second.as_array());
144 			if (var_list.size() > 0) {
145 				variable.content.array._content = reinterpret_cast<_wap_t_config_variable *>(
146 					malloc(var_list.size() * sizeof(_wap_t_config_variable)));
147 
148 				variable.content.array._size = var_list.size();
149 			}
150 
151 			size_t num_index = 0;
152 			for (auto &&_var : var_list) {
153 				variable.content.array._content[num_index] = _var;
154 				num_index++;
155 			}
156 
157 			break;
158 		}
159 
160 		case toml::value_t::table: {
161 			variable.type = WAP_CONF_VAR_TYPE_TABLE;
162 
163 			std::vector<_wap_t_config_variable> var_list = recurse_table(val_pair.second.as_table());
164 			if (var_list.size() > 0) {
165 				variable.content.table._content = reinterpret_cast<_wap_t_config_variable *>(
166 					malloc(var_list.size() * sizeof(_wap_t_config_variable)));
167 
168 				variable.content.table._size = var_list.size();
169 			}
170 
171 			size_t num_index = 0;
172 			for (auto &&_var : var_list) {
173 				variable.content.table._content[num_index] = _var;
174 				num_index++;
175 			}
176 
177 			break;
178 		}
179 
180 		default:
181 			break;
182 		}
183 
184 		_content.push_back(variable);
185 	}
186 
187 	return _content;
188 }
189 
convert_toml_to_wap_t_config_variable(toml::value & value,unsigned int panel_height)190 auto convert_toml_to_wap_t_config_variable(toml::value &value, unsigned int panel_height) -> _wap_t_config_variable * {
191 	_wap_t_config_variable *config_variable
192 		= reinterpret_cast<_wap_t_config_variable *>(malloc(sizeof(_wap_t_config_variable)));
193 	toml::table tm_table;
194 
195 	tm_table = value.as_table();
196 	tm_table["__panel_height"] = toml::integer(panel_height);
197 
198 	config_variable->type = WAP_CONF_VAR_TYPE_TABLE;
199 
200 	std::vector<_wap_t_config_variable> var_list = recurse_table(tm_table);
201 	if (var_list.size() > 0) {
202 		config_variable->content.table._content
203 			= reinterpret_cast<_wap_t_config_variable *>(malloc(var_list.size() * sizeof(_wap_t_config_variable)));
204 
205 		config_variable->content.table._size = var_list.size();
206 	}
207 
208 	size_t num_index = 0;
209 	for (auto &&variable : var_list) {
210 		config_variable->content.table._content[num_index] = variable;
211 		num_index++;
212 	}
213 
214 	return config_variable;
215 }
216 
free_wap_t_config_variable(_wap_t_config_variable variable)217 auto free_wap_t_config_variable(_wap_t_config_variable variable) -> void {
218 	switch (variable.type) {
219 	case WAP_CONF_VAR_TYPE_ARRAY:
220 		for (size_t i = 0; i < variable.content.array._size; i++) {
221 			free_wap_t_config_variable(variable.content.array._content[i]);
222 
223 			free(variable.content.array._content);
224 			variable.content.array._content = NULL;
225 			variable.content.array._size = 0;
226 		}
227 
228 		break;
229 
230 	case WAP_CONF_VAR_TYPE_TABLE:
231 		for (size_t i = 0; i < variable.content.table._size; i++) {
232 			free_wap_t_config_variable(variable.content.table._content[i]);
233 
234 			free(variable.content.table._content);
235 			variable.content.table._content = NULL;
236 			variable.content.table._size = 0;
237 		}
238 
239 		break;
240 
241 	case WAP_CONF_VAR_TYPE_STRING:
242 		free((void *)variable.content.value.string);
243 		variable.content.value.string = NULL;
244 
245 		break;
246 
247 	default:
248 		break;
249 	}
250 
251 	// SEGFAULT if (variable.key.string != NULL) { free((void *)variable.key.string); }
252 }
253 
254 }
255