wi_data_t * wi_file_read_to_end_of_file(wi_file_t *file) { wi_mutable_data_t *data; char buffer[WI_FILE_BUFFER_SIZE]; wi_integer_t bytes; _WI_FILE_ASSERT_OPEN(file); data = wi_data_init_with_capacity(wi_mutable_data_alloc(), WI_FILE_BUFFER_SIZE); while(true) { bytes = wi_file_read_bytes(file, buffer, sizeof(buffer)); if(bytes <= 0) break; wi_mutable_data_append_bytes(data, buffer, bytes); } if(bytes < 0) { wi_release(data); data = NULL; } wi_runtime_make_immutable(data); return wi_autorelease(data); }
wi_data_t * wi_file_read(wi_file_t *file, wi_uinteger_t length) { wi_mutable_data_t *data; char buffer[WI_FILE_BUFFER_SIZE]; wi_integer_t bytes = -1; _WI_FILE_ASSERT_OPEN(file); data = wi_data_init_with_capacity(wi_mutable_data_alloc(), length); while(length > 0) { bytes = wi_file_read_bytes(file, buffer, WI_MIN(sizeof(buffer), length)); if(bytes <= 0) break; wi_mutable_data_append_bytes(data, buffer, bytes); length -= bytes; } if(bytes < 0) { wi_release(data); data = NULL; } wi_runtime_make_immutable(data); return wi_autorelease(data); }
wi_data_t * wi_data_by_appending_bytes(wi_data_t *data, const void *bytes, wi_uinteger_t length) { wi_mutable_data_t *newdata; newdata = wi_copy(data); wi_mutable_data_append_bytes(newdata, bytes, length); wi_runtime_make_immutable(data); return wi_autorelease(newdata); }
wi_data_t * wi_data_by_appending_data(wi_data_t *data, wi_data_t *append_data) { wi_mutable_data_t *newdata; newdata = wi_mutable_copy(data); wi_mutable_data_append_bytes(newdata, append_data->bytes, append_data->length); wi_runtime_make_immutable(data); return wi_autorelease(newdata); }