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, ""); }
static void wr_msg_304(wi_array_t *arguments) { wi_string_t *nick; wr_user_t *user; wr_uid_t uid; uid = wi_string_uint32(WI_ARRAY(arguments, 0)); user = wr_chat_user_with_uid(wr_public_chat, uid); if(user) { nick = WI_ARRAY(arguments, 4); if(!wi_is_equal(wr_user_nick(user), nick)) { wr_wprintf_prefix(wr_console_window, WI_STR("%@ is now known as %@"), wr_user_nick(user), nick); wr_user_set_nick(user, nick); } wr_user_set_idle(user, wi_string_bool(WI_ARRAY(arguments, 1))); wr_user_set_admin(user, wi_string_bool(WI_ARRAY(arguments, 2))); wr_user_set_status(user, WI_ARRAY(arguments, 5)); } }
wi_boolean_t wi_p7_message_get_bool_for_name(wi_p7_message_t *p7_message, wi_p7_boolean_t *value, wi_string_t *field_name) { wi_string_t *string; unsigned char *binary; if(p7_message->serialization == WI_P7_BINARY) { if(!_wi_p7_message_get_binary_buffer_for_reading_for_name(p7_message, field_name, &binary, NULL)) return false; *value = (binary[0] == 1) ? true : false; } else { string = _wi_p7_message_xml_value_for_name(p7_message, field_name); if(!string) return false; *value = wi_string_bool(string); } return true; }
void wi_p7_message_deserialize(wi_p7_message_t *p7_message, wi_p7_serialization_t serialization) { xmlDocPtr doc; xmlNodePtr root_node, field_node; wi_string_t *field_name, *field_value; wi_p7_spec_message_t *message; wi_p7_spec_field_t *field; wi_uuid_t *uuid; wi_date_t *date; wi_data_t *data; if(serialization == WI_P7_BINARY) { p7_message->binary_id = wi_read_swap_big_to_host_int32(p7_message->binary_buffer, 0); message = wi_p7_spec_message_with_id(p7_message->spec, p7_message->binary_id); if(message) p7_message->name = wi_retain(wi_p7_spec_message_name(message)); } else { p7_message->binary_capacity = _WI_P7_MESSAGE_BINARY_BUFFER_INITIAL_SIZE; p7_message->binary_buffer = wi_malloc(p7_message->binary_capacity); p7_message->binary_size = WI_P7_MESSAGE_BINARY_HEADER_SIZE; doc = xmlParseDoc((xmlChar *) wi_string_cstring(p7_message->xml_string)); root_node = xmlDocGetRootElement(doc); if(root_node) { wi_p7_message_set_name(p7_message, wi_xml_node_attribute_with_name(root_node, WI_STR("name"))); for(field_node = root_node->children; field_node != NULL; field_node = field_node->next) { if(field_node->type == XML_ELEMENT_NODE) { if(wi_is_equal(wi_xml_node_name(field_node), WI_STR("field"))) { field_name = wi_xml_node_attribute_with_name(field_node, WI_STR("name")); field_value = wi_xml_node_content(field_node); field = wi_p7_spec_field_with_name(p7_message->spec, field_name); if(!field_name || !field_value || !field) continue; switch(wi_p7_spec_type_id(wi_p7_spec_field_type(field))) { case WI_P7_BOOL: wi_p7_message_set_bool_for_name(p7_message, wi_string_bool(field_value), field_name); break; case WI_P7_ENUM: wi_p7_message_set_enum_for_name(p7_message, wi_string_uint32(field_value), field_name); break; case WI_P7_INT32: wi_p7_message_set_int32_for_name(p7_message, wi_string_int32(field_value), field_name); break; case WI_P7_UINT32: wi_p7_message_set_uint32_for_name(p7_message, wi_string_uint32(field_value), field_name); break; case WI_P7_INT64: wi_p7_message_set_int64_for_name(p7_message, wi_string_int64(field_value), field_name); break; case WI_P7_UINT64: wi_p7_message_set_uint64_for_name(p7_message, wi_string_uint64(field_value), field_name); break; case WI_P7_DOUBLE: wi_p7_message_set_double_for_name(p7_message, wi_string_double(field_value), field_name); break; case WI_P7_STRING: wi_p7_message_set_string_for_name(p7_message, field_value, field_name); break; case WI_P7_UUID: uuid = wi_uuid_with_string(field_value); if(uuid) wi_p7_message_set_uuid_for_name(p7_message, uuid, field_name); break; case WI_P7_DATE: date = wi_date_with_rfc3339_string(field_value); if(date) wi_p7_message_set_date_for_name(p7_message, date, field_name); break; case WI_P7_DATA: data = wi_autorelease(wi_data_init_with_base64(wi_data_alloc(), field_value)); if(data) wi_p7_message_set_data_for_name(p7_message, data, field_name); break; case WI_P7_OOBDATA: wi_p7_message_set_oobdata_for_name(p7_message, wi_string_uint64(field_value), field_name); break; case WI_P7_LIST: WI_ASSERT(0, "Can't deserialize XML with lists at the moment"); break; } } } } } xmlFreeDoc(doc); } }
wi_boolean_t _wi_settings_set_bool(wi_settings_t *settings, uint32_t index, wi_string_t *name, wi_string_t *value) { *(wi_boolean_t *) settings->spec[index].setting = wi_string_bool(value); 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; }