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)11auto 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)100auto 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)190auto 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)217auto 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