void wi_test_string_numeric_conversions(void) { WI_TEST_ASSERT_EQUALS(wi_string_bool(WI_STR("yes")), true, ""); WI_TEST_ASSERT_EQUALS(wi_string_bool(WI_STR("no")), false, ""); WI_TEST_ASSERT_EQUALS(wi_string_int32(WI_STR("2147483647")), 2147483647, ""); WI_TEST_ASSERT_EQUALS(wi_string_int32(WI_STR("2147483648")), 0, ""); WI_TEST_ASSERT_EQUALS(wi_string_uint32(WI_STR("4294967295")), 4294967295U, ""); WI_TEST_ASSERT_EQUALS(wi_string_uint32(WI_STR("4294967296")), 0U, ""); WI_TEST_ASSERT_EQUALS(wi_string_int64(WI_STR("9223372036854775807")), 9223372036854775807LL, ""); WI_TEST_ASSERT_EQUALS(wi_string_int64(WI_STR("9223372036854775808")), 0LL, ""); WI_TEST_ASSERT_EQUALS(wi_string_uint64(WI_STR("18446744073709551615")), 18446744073709551615ULL, ""); WI_TEST_ASSERT_EQUALS(wi_string_uint64(WI_STR("18446744073709551616")), 0ULL, ""); #ifdef WI_32 WI_TEST_ASSERT_EQUALS(wi_string_integer(WI_STR("2147483647")), 2147483647, ""); WI_TEST_ASSERT_EQUALS(wi_string_integer(WI_STR("2147483648")), 0, ""); WI_TEST_ASSERT_EQUALS(wi_string_uinteger(WI_STR("4294967295")), 4294967295U, ""); WI_TEST_ASSERT_EQUALS(wi_string_uinteger(WI_STR("4294967296")), 0U, ""); #else WI_TEST_ASSERT_EQUALS(wi_string_integer(WI_STR("9223372036854775807")), 9223372036854775807LL, ""); WI_TEST_ASSERT_EQUALS(wi_string_integer(WI_STR("9223372036854775808")), 0LL, ""); WI_TEST_ASSERT_EQUALS(wi_string_uinteger(WI_STR("18446744073709551615")), 18446744073709551615ULL, ""); WI_TEST_ASSERT_EQUALS(wi_string_uinteger(WI_STR("18446744073709551616")), 0ULL, ""); #endif WI_TEST_ASSERT_EQUALS_WITH_ACCURACY(wi_string_float(WI_STR("3.40282346e38")), 3.40282346e38F, 0.0001, ""); WI_TEST_ASSERT_EQUALS_WITH_ACCURACY(wi_string_float(WI_STR("3.40282347e38")), 0.0F, 0.0001, ""); WI_TEST_ASSERT_EQUALS_WITH_ACCURACY(wi_string_double(WI_STR("1.7976931348623155e308")), 1.7976931348623155e308, 0.0001, ""); WI_TEST_ASSERT_EQUALS_WITH_ACCURACY(wi_string_double(WI_STR("1.7976931348623160e308")), 0.0, 0.0001, ""); }
wi_size_t wi_terminal_lookup_size(wi_terminal_t *terminal) { wi_string_t *width, *height; struct winsize win; if(ioctl(STDOUT_FILENO, TIOCGWINSZ, &win) >= 0) return wi_make_size(win.ws_col, win.ws_row); width = wi_getenv(WI_STR("COLUMNS")); height = wi_getenv(WI_STR("LINES")); if(width && height) return wi_make_size(wi_string_integer(width), wi_string_integer(height)); return wi_make_size(0, 0); }
static wi_boolean_t _wi_plist_read_node_to_instance(xmlNodePtr content_node, wi_runtime_instance_t *collection) { xmlNodePtr node; wi_string_t *key = NULL; wi_runtime_instance_t *instance = NULL; wi_boolean_t dictionary; dictionary = (wi_runtime_id(collection) == wi_dictionary_runtime_id()); for(node = content_node->children; node != NULL; node = node->next) { if(node->type == XML_ELEMENT_NODE) { if(strcmp((const char *) node->name, "key") == 0) key = wi_xml_node_content(node); else if(strcmp((const char *) node->name, "string") == 0) instance = wi_xml_node_content(node); else if(strcmp((const char *) node->name, "integer") == 0) instance = wi_number_with_integer(wi_string_integer(wi_xml_node_content(node))); else if(strcmp((const char *) node->name, "real") == 0) instance = wi_number_with_double(wi_string_double(wi_xml_node_content(node))); else if(strcmp((const char *) node->name, "true") == 0) instance = wi_number_with_bool(true); else if(strcmp((const char *) node->name, "false") == 0) instance = wi_number_with_bool(false); else if(strcmp((const char *) node->name, "date") == 0) instance = wi_date_with_rfc3339_string(wi_xml_node_content(node)); else if(strcmp((const char *) node->name, "data") == 0) instance = wi_data_with_base64(wi_xml_node_content(node)); else if(strcmp((const char *) node->name, "dict") == 0) { instance = wi_mutable_dictionary(); if(!_wi_plist_read_node_to_instance(node, instance)) return false; } else if(strcmp((const char *) node->name, "array") == 0) { instance = wi_mutable_array(); if(!_wi_plist_read_node_to_instance(node, instance)) return false; } else { wi_error_set_libwired_error_with_format(WI_ERROR_PLIST_READFAILED, WI_STR("Unhandled node \"%s\""), node->name); return false; } } if(instance) { if(dictionary) wi_mutable_dictionary_set_data_for_key(collection, instance, key); else wi_mutable_array_add_data(collection, instance); instance = NULL; key = NULL; } } return true; }
static wi_runtime_instance_t * _wi_config_instance_for_setting(wi_config_t *config, wi_string_t *name, wi_string_t *value, wi_config_type_t *type) { struct passwd *user; struct group *group; struct servent *servent; wi_uinteger_t port; uint32_t uid, gid; if(!wi_dictionary_contains_key(config->types, name)) { wi_error_set_libwired_error(WI_ERROR_SETTINGS_UNKNOWNSETTING); return NULL; } *type = wi_number_int32(wi_dictionary_data_for_key(config->types, name)); switch(*type) { case WI_CONFIG_INTEGER: return wi_number_with_integer(wi_string_integer(value)); break; case WI_CONFIG_BOOL: return wi_number_with_bool(wi_string_bool(value)); break; case WI_CONFIG_STRING: case WI_CONFIG_STRINGLIST: case WI_CONFIG_PATH: return value; break; case WI_CONFIG_USER: user = getpwnam(wi_string_cstring(value)); if(!user) { uid = wi_string_uint32(value); if(uid != 0 || wi_is_equal(value, WI_STR("0"))) user = getpwuid(uid); } if(!user) { wi_error_set_libwired_error(WI_ERROR_SETTINGS_NOSUCHUSER); return NULL; } return wi_number_with_int32(user->pw_uid); break; case WI_CONFIG_GROUP: group = getgrnam(wi_string_cstring(value)); if(!group) { gid = wi_string_uint32(value); if(gid != 0 || wi_is_equal(value, WI_STR("0"))) group = getgrgid(gid); } if(!group) { wi_error_set_libwired_error(WI_ERROR_SETTINGS_NOSUCHGROUP); return NULL; } return wi_number_with_int32(group->gr_gid); break; case WI_CONFIG_PORT: port = wi_string_uinteger(value); if(port > 65535) { wi_error_set_libwired_error(WI_ERROR_SETTINGS_INVALIDPORT); return NULL; } if(port == 0) { servent = getservbyname(wi_string_cstring(value), "tcp"); if(!servent) { wi_error_set_libwired_error(WI_ERROR_SETTINGS_NOSUCHSERVICE); return NULL; } port = servent->s_port; } return wi_number_with_int32(port); break; case WI_CONFIG_REGEXP: return wi_autorelease(wi_regexp_init_with_string(wi_regexp_alloc(), value)); break; case WI_CONFIG_TIME_INTERVAL: return wi_number_with_double(wi_string_double(value)); break; } return NULL; }