wi_url_t * wi_url_init_with_string(wi_url_t *url, wi_string_t *string) { wi_string_t *userpassword; wi_range_t range; range = wi_string_range_of_string(string, WI_STR("://"), 0); if(range.location != WI_NOT_FOUND) { url->scheme = wi_retain(wi_string_substring_to_index(string, range.location)); if(range.location + range.length >= wi_string_length(string)) goto end; else string = wi_string_substring_from_index(string, range.location + 3); } range = wi_string_range_of_string(string, WI_STR("/"), 0); if(range.location != WI_NOT_FOUND) { url->path = wi_retain(wi_string_substring_from_index(string, range.location)); string = wi_string_substring_to_index(string, range.location); } range = wi_string_range_of_string(string, WI_STR("@"), 0); if(range.location != WI_NOT_FOUND) { userpassword = wi_string_substring_to_index(string, range.location); string = wi_string_substring_from_index(string, range.location + 1); range = wi_string_range_of_string(userpassword, WI_STR(":"), 0); if(range.location != WI_NOT_FOUND && range.location != wi_string_length(userpassword) - 1) { url->user = wi_retain(wi_string_substring_to_index(userpassword, range.location)); url->password = wi_retain(wi_string_substring_from_index(userpassword, range.location + 1)); } else { url->user = wi_retain(userpassword); } } range = wi_string_range_of_string(string, WI_STR(":"), 0); if(range.location == WI_NOT_FOUND || range.location + range.length >= wi_string_length(string) || wi_string_contains_string(wi_string_substring_from_index(string, range.location + 1), WI_STR(":"), 0)) { url->host = wi_copy(string); } else { url->host = wi_retain(wi_string_substring_to_index(string, range.location)); url->port = wi_string_uint32(wi_string_substring_from_index(string, range.location + 1)); } end: _wi_url_regenerate_string(url); return url; }
void wr_wprint_me(wr_window_t *window, wi_string_t *nick, wi_string_t *chat) { wi_string_t *prefix; const char *color; wi_uinteger_t length; length = wi_string_length(wr_nick); if(length > 4) length = 4; prefix = wi_string_substring_to_index(wr_nick, length); if(wi_string_has_prefix(chat, prefix)) { color = WR_HIGHLIGHT_COLOR; if(window->status < WR_WINDOW_STATUS_HIGHLIGHT) window->status = WR_WINDOW_STATUS_HIGHLIGHT; } else { color = NULL; if(window->status < WR_WINDOW_STATUS_CHAT) window->status = WR_WINDOW_STATUS_CHAT; } wr_wprintf(window, WI_STR("%s*%s %s%@%s %@"), WR_ME_COLOR, WR_TERMINATE_COLOR, color ? color : "", nick, color ? WR_TERMINATE_COLOR : "", chat); }
static wi_array_t * _wi_terminal_buffer_lines_for_string(wi_terminal_buffer_t *buffer, wi_string_t *string) { wi_array_t *array, *linearray; wi_string_t *string_copy, *line, *subline; wi_size_t size; uint32_t i, count, index; array = wi_array_init(wi_array_alloc()); size = wi_terminal_size(buffer->terminal); linearray = wi_string_components_separated_by_string(string, WI_STR("\n")); count = wi_array_count(linearray); for(i = 0; i < count; i++) { line = WI_ARRAY(linearray, i); if(wi_terminal_width_of_string(buffer->terminal, line) < size.width) { wi_array_add_data(array, line); } else { string_copy = wi_copy(line); do { index = wi_terminal_index_of_string_for_width(buffer->terminal, string_copy, size.width); subline = wi_string_substring_to_index(string_copy, index); wi_array_add_data(array, subline); wi_string_delete_characters_to_index(string_copy, wi_string_length(subline)); } while(wi_terminal_width_of_string(buffer->terminal, string_copy) >= size.width); wi_array_add_data(array, string_copy); wi_release(string_copy); } } return array; }
wi_string_t * wi_file_read_to_string(wi_file_t *file, wi_string_t *separator) { wi_mutable_string_t *totalstring = NULL; wi_string_t *string; wi_uinteger_t index, length; _WI_FILE_ASSERT_OPEN(file); while((string = wi_file_read(file, WI_FILE_BUFFER_SIZE))) { if(!totalstring) totalstring = wi_string_init(wi_mutable_string_alloc()); index = wi_string_index_of_string(string, separator, 0); if(index == WI_NOT_FOUND) { wi_mutable_string_append_string(totalstring, string); } else { length = wi_string_length(string); wi_mutable_string_append_string(totalstring, wi_string_substring_to_index(string, index)); wi_file_seek(file, wi_file_offset(file) - length + index + 1); break; } } wi_runtime_make_immutable(string); return wi_autorelease(totalstring); }
static wi_mutable_array_t * _wi_terminal_buffer_lines_for_string(wi_terminal_buffer_t *buffer, wi_string_t *string) { wi_enumerator_t *enumerator; wi_mutable_array_t *array; wi_mutable_string_t *newstring; wi_string_t *line, *subline; wi_size_t size; wi_uinteger_t index; array = wi_array_init(wi_mutable_array_alloc()); size = wi_terminal_size(buffer->terminal); enumerator = wi_array_data_enumerator(wi_string_components_separated_by_string(string, WI_STR("\n"))); while((line = wi_enumerator_next_data(enumerator))) { if(wi_terminal_width_of_string(buffer->terminal, line) < size.width) { wi_mutable_array_add_data(array, line); } else { newstring = wi_mutable_copy(line); do { index = wi_terminal_index_of_string_for_width(buffer->terminal, newstring, size.width); subline = wi_string_substring_to_index(newstring, index); wi_mutable_array_add_data(array, subline); wi_mutable_string_delete_characters_to_index(newstring, wi_string_length(subline)); } while(wi_terminal_width_of_string(buffer->terminal, newstring) >= size.width); wi_mutable_array_add_data(array, newstring); wi_release(newstring); } } return wi_autorelease(array); }
void wr_wprint_say(wr_window_t *window, wi_string_t *nick, wi_string_t *chat) { wi_string_t *prefix; const char *color; unsigned int length; length = wi_string_length(wr_nick); if(length > 4) length = 4; prefix = wi_string_substring_to_index(wr_nick, length); if(wi_string_has_prefix(chat, prefix)) { color = WR_HIGHLIGHT_COLOR; if(window->status < WR_WINDOW_STATUS_HIGHLIGHT) window->status = WR_WINDOW_STATUS_HIGHLIGHT; } else { color = WR_NICK_COLOR; if(window->status < WR_WINDOW_STATUS_CHAT) window->status = WR_WINDOW_STATUS_CHAT; } wr_wprintf(window, WI_STR("%s<%s%s%@%s%s>%s %@"), WR_SAY_COLOR, WR_END_COLOR, color, nick, WR_END_COLOR, WR_SAY_COLOR, WR_END_COLOR, chat); }
wi_string_t * wi_socket_read_to_string(wi_socket_t *socket, wi_time_interval_t timeout, wi_string_t *separator) { wi_string_t *string, *substring; wi_uinteger_t index; index = wi_string_index_of_string(socket->buffer, separator, 0); if(index != WI_NOT_FOUND) { substring = wi_string_substring_to_index(socket->buffer, index + wi_string_length(separator)); wi_string_delete_characters_in_range(socket->buffer, wi_make_range(0, wi_string_length(substring))); return substring; } while((string = wi_socket_read(socket, timeout, WI_SOCKET_BUFFER_SIZE))) { if(wi_string_length(string) == 0) return string; wi_string_append_string(socket->buffer, string); index = wi_string_index_of_string(socket->buffer, separator, 0); if(index == WI_NOT_FOUND) { if(wi_string_length(socket->buffer) > _WI_SOCKET_BUFFER_MAX_SIZE) { substring = wi_string_substring_to_index(socket->buffer, _WI_SOCKET_BUFFER_MAX_SIZE); wi_string_delete_characters_in_range(socket->buffer, wi_make_range(0, wi_string_length(substring))); return substring; } } else { substring = wi_string_substring_to_index(socket->buffer, index + wi_string_length(separator)); wi_string_delete_characters_in_range(socket->buffer, wi_make_range(0, wi_string_length(substring))); return substring; } } return NULL; }
wi_string_t * wi_socket_read_to_string(wi_socket_t *socket, wi_time_interval_t timeout, wi_string_t *separator) { wi_string_t *string, *substring; wi_uinteger_t index; index = wi_string_index_of_string(socket->buffer, separator, 0); if(index != WI_NOT_FOUND) { substring = wi_string_substring_to_index(socket->buffer, index + wi_string_length(separator)); wi_mutable_string_delete_characters_in_range(socket->buffer, wi_make_range(0, wi_string_length(substring))); return substring; } while((string = wi_socket_read_string(socket, timeout))) { if(wi_string_length(string) == 0) return string; wi_mutable_string_append_string(socket->buffer, string); index = wi_string_index_of_string(socket->buffer, separator, 0); if(index == WI_NOT_FOUND) { if(wi_string_length(socket->buffer) > _WI_SOCKET_BUFFER_MAX_SIZE) { wi_error_set_libwired_error_with_format(WI_ERROR_SOCKET_OVERFLOW, WI_STR("Buffer is %u bytes"), wi_string_length(socket->buffer)); wi_mutable_string_set_string(socket->buffer, WI_STR("")); return NULL; } } else { substring = wi_string_substring_to_index(socket->buffer, index + wi_string_length(separator)); wi_mutable_string_delete_characters_in_range(socket->buffer, wi_make_range(0, wi_string_length(substring))); return substring; } } return NULL; }
void wi_parse_wire_command(wi_string_t *buffer, wi_string_t **out_command, wi_string_t **out_arguments) { wi_uinteger_t index; index = wi_string_index_of_string(buffer, WI_STR(" "), 0); if(index != WI_NOT_FOUND) { *out_command = wi_string_substring_to_index(buffer, index); *out_arguments = wi_string_substring_from_index(buffer, index + 1); } else { *out_command = wi_autorelease(wi_copy(buffer)); *out_arguments = wi_string(); } if(wi_string_has_prefix(*out_command, WI_STR("/"))) *out_command = wi_string_by_deleting_characters_to_index(*out_command, 1); }
void wi_parse_wired_command(wi_string_t *buffer, wi_string_t **out_command, wi_array_t **out_arguments) { wi_string_t *string, *substring; wi_uinteger_t index; index = wi_string_index_of_string(buffer, WI_STR(_WI_WIRED_MESSAGE_SEPARATOR), WI_STRING_BACKWARDS); if(index != WI_NOT_FOUND) string = wi_string_by_deleting_characters_from_index(buffer, index); else string = wi_autorelease(wi_copy(buffer)); index = wi_string_index_of_string(string, WI_STR(" "), 0); if(index != WI_NOT_FOUND) { *out_command = wi_string_substring_to_index(string, index); substring = wi_string_substring_from_index(string, index + 1); *out_arguments = wi_string_components_separated_by_string(substring, WI_STR(_WI_WIRED_FIELD_SEPARATOR)); } else { *out_command = string; *out_arguments = wi_array(); } }