wi_terminal_buffer_t * wi_terminal_buffer_init_with_terminal(wi_terminal_buffer_t *buffer, wi_terminal_t *terminal) { buffer->terminal = terminal; buffer->textbuffer = wi_string_init_with_capacity(wi_string_alloc(), _WI_TERMINAL_TEXTBUFFER_CAPACITY); buffer->linebuffer = wi_array_init_with_capacity(wi_array_alloc(), _WI_TERMINAL_LINEBUFFER_CAPACITY); return buffer; }
wi_array_t * wi_file_directory_contents_at_path(wi_string_t *path) { wi_array_t *contents; wi_string_t *name; DIR *dir; struct dirent de, *dep; dir = opendir(wi_string_cstring(path)); if(!dir) { wi_error_set_errno(errno); return NULL; } contents = wi_array_init_with_capacity(wi_array_alloc(), 100); while(readdir_r(dir, &de, &dep) == 0 && dep) { if(strcmp(dep->d_name, ".") != 0 && strcmp(dep->d_name, "..") != 0) { name = wi_string_init_with_cstring(wi_string_alloc(), dep->d_name); wi_array_add_data(contents, name); wi_release(name); } } closedir(dir); return wi_autorelease(contents); }
wi_terminal_t * wi_terminal_init_with_type(wi_terminal_t *terminal, wi_string_t *type) { char *env; int err, co, li; err = tgetent(NULL, wi_string_cstring(type)); if(err <= 0) { if(err == 0) wi_error_set_lib_error(WI_ERROR_TERMCAP_NOSUCHENTRY); else wi_error_set_lib_error(WI_ERROR_TERMCAP_TERMINFONOTFOUND); wi_release(terminal); return NULL; } env = getenv("COLUMNS"); co = env ? strtol(env, NULL, 10) : tgetnum("co"); terminal->co = (co <= 0) ? 80 : co; env = getenv("LINES"); li = env ? strtol(env, NULL, 10) : tgetnum("li"); terminal->li = (li <= 0) ? 24 : li; terminal->ce = (char *) tgetstr("ce", NULL); terminal->cl = (char *) tgetstr("cl", NULL); terminal->cm = (char *) tgetstr("cm", NULL); terminal->cs = (char *) tgetstr("cs", NULL); terminal->scroll = wi_make_range(0, terminal->li); terminal->buffers = wi_array_init_with_capacity(wi_array_alloc(), 10); return terminal; }
wi_array_t * wi_array_init_with_data_and_count(wi_array_t *array, void **data, wi_uinteger_t count) { wi_uinteger_t i; array = wi_array_init_with_capacity(array, count); for(i = 0; i < count; i++) wi_array_add_data(array, data[i]); return array; }
wi_array_t * wi_array_init_with_list(wi_array_t *array, wi_list_t *list) { wi_list_node_t *node; void *data; array = wi_array_init_with_capacity(array, wi_list_count(list)); WI_LIST_FOREACH(list, node, data) wi_array_add_data(array, data); return array; }
wi_array_t * wi_array_init_with_data(wi_array_t *array, ...) { void *data; va_list ap; array = wi_array_init_with_capacity(array, 0); va_start(ap, array); while((data = va_arg(ap, void *))) wi_array_add_data(array, data); va_end(ap); return array; }
wi_array_t * wi_array_subarray_with_range(wi_array_t *array, wi_range_t range) { wi_array_t *newarray; wi_uinteger_t i; _WI_ARRAY_INDEX_ASSERT(array, range.location); _WI_ARRAY_INDEX_ASSERT(array, range.location + range.length - 1); newarray = wi_array_init_with_capacity(wi_array_alloc(), range.length); for(i = range.location; i < range.location + range.length; i++) wi_array_add_data(newarray, WI_ARRAY(array, i)); return wi_autorelease(newarray); }
wi_array_t * wi_array_init_with_argv(wi_array_t *array, int argc, const char **argv) { wi_string_t *string; int i; array = wi_array_init_with_capacity(array, argc); for(i = 0; i < argc; i++) { string = wi_string_init_with_cstring(wi_string_alloc(), argv[i]); wi_array_add_data(array, string); wi_release(string); } return array; }
wi_array_t * wi_array_with_data(void *data0, ...) { wi_array_t *array; void *data; va_list ap; array = wi_array_init_with_capacity(wi_array_alloc(), 0); wi_array_add_data(array, data0); va_start(ap, data0); while((data = va_arg(ap, void *))) wi_array_add_data(array, data); va_end(ap); return wi_autorelease(array); }
wi_array_t * wi_backtrace(void) { #ifdef HAVE_BACKTRACE wi_mutable_array_t *array; void *callstack[128]; char **symbols; int i, frames; frames = backtrace(callstack, sizeof(callstack)); symbols = backtrace_symbols(callstack, frames); array = wi_array_init_with_capacity(wi_mutable_array_alloc(), frames); for(i = 0; i < frames; i++) wi_mutable_array_add_data(array, wi_string_with_utf8_string(symbols[i])); free(symbols); wi_runtime_make_immutable(array); return wi_autorelease(array); #else return NULL; #endif }
void wi_socket_initialize(void) { #ifdef HAVE_OPENSSL_SSL_H #ifdef WI_PTHREADS wi_lock_t *lock; wi_uinteger_t i, count; #endif SSL_library_init(); #ifdef WI_PTHREADS count = CRYPTO_num_locks(); _wi_socket_ssl_locks = wi_array_init_with_capacity(wi_array_alloc(), count); for(i = 0; i < count; i++) { lock = wi_lock_init(wi_lock_alloc()); wi_array_add_data(_wi_socket_ssl_locks, lock); wi_release(lock); } CRYPTO_set_id_callback(_wi_socket_ssl_id_function); CRYPTO_set_locking_callback(_wi_socket_ssl_locking_function); #endif #endif }
wi_array_t * wi_array_init_with_argument_string(wi_array_t *array, wi_string_t *string, wi_integer_t index) { wi_string_t *data; const char *cstring; char *buffer, *end; wi_uinteger_t count; wi_boolean_t squote, dquote, bsquote; array = wi_array_init_with_capacity(array, 0); cstring = wi_string_cstring(string); buffer = wi_malloc(strlen(cstring) + 1); count = 0; squote = dquote = bsquote = false; while(*cstring) { if(index < 0 || (index >= 0 && count != (wi_uinteger_t) index)) { while(isspace(*cstring)) cstring++; } end = buffer; while(*cstring) { if(index >= 0 && count == (wi_uinteger_t) index) { *end++ = *cstring++; continue; } if(isspace(*cstring) && !squote && !dquote && !bsquote) break; if(bsquote) { bsquote = false; *end++ = *cstring; } else if(squote) { if(*cstring == '\'') squote = false; else *end++ = *cstring; } else if(dquote) { if(*cstring == '"') dquote = false; else *end++ = *cstring; } else { if(*cstring == '\'') squote = true; else if(*cstring == '"') dquote = true; else if(*cstring == '\\') bsquote = true; else *end++ = *cstring; } cstring++; } *end = '\0'; data = wi_string_init_with_cstring(wi_string_alloc(), buffer); wi_array_add_data(array, data); wi_release(data); count++; while(isspace(*cstring)) cstring++; } wi_free(buffer); return array; }
wi_array_t * wi_array_init(wi_array_t *array) { return wi_array_init_with_capacity(array, 0); }