예제 #1
0
파일: server.c 프로젝트: asvitkine/phxd
void wd_broadcast(wd_chat_t *chat, uint32_t n, wi_string_t *fmt, ...) {
	wi_enumerator_t	*enumerator;
	wi_string_t		*string;
	wi_array_t		*users;
	wd_user_t		*user;
	va_list			ap;

	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);
	
	users = wd_chat_users(chat);
	
	wi_array_rdlock(users);

	enumerator = wi_array_data_enumerator(users);
	
	while((user = wi_enumerator_next_data(enumerator))) {
		if(wd_user_state(user) == WD_USER_LOGGED_IN) {
			wd_user_lock_socket(user);
			wi_socket_write_format(wd_user_socket(user), 0.0, WI_STR("%u %@%c"), n, string, WD_MESSAGE_SEPARATOR);
			wd_user_unlock_socket(user);
		}
	}
	
	wi_array_unlock(users);

	wi_release(string);
}
예제 #2
0
파일: wi-log.c 프로젝트: ProfDrLuigi/zanka
static void _wi_log_vlog(int priority, wi_string_t *fmt, va_list ap) {
	wi_string_t		*string;
	FILE			*fp;
	const char		*cstring, *name, *path;
	char			date[_WI_LOG_DATE_SIZE];
	
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	cstring = wi_string_cstring(string);

	wi_lock_lock(_wi_log_lock);
	
	name = wi_string_cstring(wi_process_name(wi_process()));
	
	_wi_log_date(date);

	if(wi_log_stdout || wi_log_stderr)
		fprintf(wi_log_stdout ? stdout : stderr, "%s %s[%d]: %s\n", date, name, getpid(), cstring);
	else if(wi_log_startup && priority < LOG_INFO)
		fprintf(stderr, "%s: %s\n", name, cstring);
	else if(wi_log_tool)
		fprintf((priority < LOG_INFO) ? stderr : stdout, "%s: %s\n", name, cstring);

	if(wi_log_syslog)
		syslog(priority, "%s", cstring);

	if(wi_log_file && wi_log_path) {
		path = wi_string_cstring(wi_full_path(wi_log_path));

		fp = fopen(path, "a");

		if(fp) {
			fprintf(fp, "%s %s[%d]: %s\n", date, name, getpid(), cstring);
			fclose(fp);
			
			if(_wi_log_lines > 0 && wi_log_limit > 0) {
				if(_wi_log_lines % (int) ((float) wi_log_limit / 10.0f) == 0) {
					_wi_log_truncate(path);
					
					_wi_log_lines = wi_log_limit;
				}
			}
			
			_wi_log_lines++;
		} else {
			fprintf(stderr, "%s: %s: %s\n", name, path, strerror(errno));
		}
	}

	if(wi_log_callback)
		(*wi_log_callback)(string);

	if(wi_log_startup && priority == LOG_ERR)
		exit(1);

	wi_lock_unlock(_wi_log_lock);
	
	wi_release(string);
}
예제 #3
0
wi_string_t * wi_string_init_with_format(wi_string_t *string, wi_string_t *fmt, ...) {
	va_list		ap;
	
	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(string, fmt, ap);
	va_end(ap);
	
	return string;
}
예제 #4
0
wi_mutable_string_t * wi_mutable_string_with_format(wi_string_t *fmt, ...) {
	wi_mutable_string_t		*string;
	va_list					ap;
	
	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_mutable_string_alloc(), fmt, ap);
	va_end(ap);
	
	return wi_autorelease(string);
}
예제 #5
0
파일: server.c 프로젝트: asvitkine/phxd
void wd_sreply(wi_socket_t *socket, uint32_t n, wi_string_t *fmt, ...) {
	wi_string_t		*string;
	va_list			ap;
	
	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);
	
	wi_socket_write_format(socket, 0.0, WI_STR("%u %@%c"), n, string, WD_MESSAGE_SEPARATOR);
	
	wi_release(string);	
}
예제 #6
0
파일: windows.c 프로젝트: ProfDrLuigi/zanka
void wr_wprintf(wr_window_t *window, wi_string_t *fmt, ...) {
	wi_string_t		*string;
	va_list			ap;

	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);

	wr_wprint(window, string);
	
	wi_release(string);
}
예제 #7
0
파일: windows.c 프로젝트: ProfDrLuigi/zanka
void wr_printf_block(wi_string_t *fmt, ...) {
	wi_string_t		*string;
	va_list			ap;

	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);

	wr_wprintf_block(wr_current_window, WI_STR("%@"), string);
	
	wi_release(string);
}
예제 #8
0
void wi_terminal_printf(wi_terminal_t *terminal, wi_string_t *fmt, ...) {
	wi_string_t		*string;
	va_list			ap;
	
	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);
	
	_wi_terminal_puts(terminal, string);
	
	wi_release(string);
}
예제 #9
0
static void wi_assert_default_handler(const char *file, unsigned int line, wi_string_t *fmt, ...) {
	wi_string_t		*string;
	va_list			ap;
	
	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);
	
	wi_log_warn(WI_STR("Assertion failed at %s:%u: %@"), file, line, string);
	
	wi_release(string);
	
	wi_crash();
}
예제 #10
0
파일: server.c 프로젝트: asvitkine/phxd
void wd_reply(uint32_t n, wi_string_t *fmt, ...) {
	wd_user_t		*user = wd_users_user_for_thread();
	wi_string_t		*string;
	va_list			ap;
	
	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);
	
	wd_user_lock_socket(user);
	wi_socket_write_format(wd_user_socket(user), 0.0, WI_STR("%u %@%c"), n, string, WD_MESSAGE_SEPARATOR);
	wd_user_unlock_socket(user);
	
	wi_release(string);
}
예제 #11
0
wi_integer_t wi_socket_write_format(wi_socket_t *socket, wi_time_interval_t timeout, wi_string_t *fmt, ...) {
	wi_string_t		*string;
	wi_integer_t	bytes;
	va_list			ap;

	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);
	
	bytes = wi_socket_write_buffer(socket, timeout, wi_string_cstring(string), wi_string_length(string));
	
	wi_release(string);

	return bytes;
}
예제 #12
0
int32_t wi_socket_sendto(wi_socket_t *socket, wi_socket_context_t *context, wi_string_t *fmt, ...) {
	wi_string_t		*string;
	int				bytes;
	va_list			ap;

	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);

	bytes = wi_socket_sendto_buffer(socket, context, wi_string_cstring(string), wi_string_length(string));
	
	wi_release(string);

	return bytes;
}
예제 #13
0
파일: wi-test.c 프로젝트: Patater/libwired
static void _wi_tests_assert_handler(const char *file, unsigned int line, wi_string_t *fmt, ...) {
	wi_string_t		*string;
	va_list			ap;
	
	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);
	
	wi_log_warn(WI_STR("%@:%u: %@"), wi_string_last_path_component(wi_string_with_cstring(file)), line, string);
	
	wi_release(string);
	
	_wi_tests_current_test->passed = false;
	
	longjmp(_wi_tests_jmp_buf, 1);
}
예제 #14
0
파일: windows.c 프로젝트: ProfDrLuigi/zanka
void wr_wprintf_block(wr_window_t *window, wi_string_t *fmt, ...) {
	wi_enumerator_t	*enumerator;
	wi_string_t		*string, *line;
	va_list			ap;

	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);

	enumerator = wi_array_data_enumerator(wi_string_components_separated_by_string(string, WI_STR("\n")));
	
	while((line = wi_enumerator_next_data(enumerator)))
		wr_wprintf(window, WI_STR("   %@"), line);

	wi_release(string);
}
예제 #15
0
파일: windows.c 프로젝트: ProfDrLuigi/zanka
void wr_wprintf_prefix(wr_window_t *window, wi_string_t *fmt, ...) {
	wi_string_t		*string;
	va_list			ap;

	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);

	wr_wprintf(window, WI_STR("%s%s%s%@"),
		WR_PREFIX_COLOR,
		WR_PREFIX,
		WR_TERMINATE_COLOR,
		string);

	wi_release(string);
}
예제 #16
0
파일: wi-file.c 프로젝트: ProfDrLuigi/zanka
int32_t wi_file_write(wi_file_t *file, wi_string_t *fmt, ...) {
	wi_string_t		*string;
	int				bytes;
	va_list			ap;
	
	_WI_FILE_ASSERT_OPEN(file);
	
	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);
	
	bytes = wi_file_write_buffer(file, wi_string_cstring(string), wi_string_length(string));
	
	wi_release(string);
	
	return bytes;
}
예제 #17
0
wi_boolean_t wi_terminal_buffer_printf(wi_terminal_buffer_t *buffer, wi_string_t *fmt, ...) {
	wi_enumerator_t	*enumerator;
	wi_array_t		*array;
	wi_string_t		*string, *line;
	wi_point_t		location;
	va_list			ap;
	wi_boolean_t	result = false;
	
	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);
	
	array = _wi_terminal_buffer_lines_for_string(buffer, string);

	if(buffer->terminal->active_buffer == buffer) {
		if(buffer->line == wi_array_count(buffer->linebuffer)) {
			location = wi_terminal_location(buffer->terminal);
			wi_terminal_move(buffer->terminal, wi_make_point(0, wi_terminal_scroll(buffer->terminal).length));
			
			enumerator = wi_array_data_enumerator(array);
			
			while((line = wi_enumerator_next_data(enumerator))) {
				_wi_terminal_puts(buffer->terminal, WI_STR("\n"));
				_wi_terminal_puts(buffer->terminal, line);
				
				buffer->line++;
			}
			
			wi_terminal_move(buffer->terminal, location);
			
			result = true;
		}
	}
	
	if(wi_string_length(buffer->textbuffer) > 0)
		wi_mutable_string_append_string(buffer->textbuffer, WI_STR("\n"));

	wi_mutable_string_append_string(buffer->textbuffer, string);
	
	wi_mutable_array_add_data_from_array(buffer->linebuffer, array);
	
	wi_release(string);
	
	return result;
}
예제 #18
0
wi_boolean_t wi_terminal_buffer_printf(wi_terminal_buffer_t *buffer, wi_string_t *fmt, ...) {
	wi_array_t		*array;
	wi_string_t		*string;
	wi_point_t		location;
	va_list			ap;
	uint32_t		i, count;
	wi_boolean_t	result = false;
	
	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);
	
	array = _wi_terminal_buffer_lines_for_string(buffer, string);

	if(buffer == buffer->terminal->active_buffer &&
	   buffer->line == wi_array_count(buffer->linebuffer)) {
		location = wi_terminal_location(buffer->terminal);
		wi_terminal_move(buffer->terminal, wi_make_point(0, wi_terminal_scroll(buffer->terminal).length));
		
		count = wi_array_count(array);
		
		for(i = 0; i < count; i++) {
			_wi_terminal_puts(buffer->terminal, WI_STR("\n"));
			_wi_terminal_puts(buffer->terminal, WI_ARRAY(array, i));
			
			buffer->line++;
		}
		
		wi_terminal_move(buffer->terminal, location);
		
		result = true;
	}
	
	if(wi_string_length(buffer->textbuffer) > 0)
		wi_string_append_string(buffer->textbuffer, WI_STR("\n"));

	wi_string_append_string(buffer->textbuffer, string);
	
	wi_array_add_data_from_array(buffer->linebuffer, array);
	
	wi_release(array);
	wi_release(string);
	
	return result;
}
예제 #19
0
파일: client.c 프로젝트: ProfDrLuigi/zanka
wi_boolean_t wr_send_command(wi_string_t *fmt, ...) {
	wi_string_t		*string;
	wi_integer_t	result;
	va_list			ap;

	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);
	
	result = wr_send_command_on_socket(wr_socket, WI_STR("%@"), string);

	if(result > 0)
		wr_transferred_bytes += wi_string_length(string);
	
	wi_release(string);

	return (result > 0);
}
예제 #20
0
파일: windows.c 프로젝트: ProfDrLuigi/zanka
void wr_wprintf_block(wr_window_t *window, wi_string_t *fmt, ...) {
	wi_array_t		*array;
	wi_string_t		*string;
	va_list			ap;
	unsigned int	i, count;

	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);

	array = wi_string_components_separated_by_string(string, WI_STR("\n"));
	count = wi_array_count(array);
	
	for(i = 0; i < count; i++)
		wr_wprintf(window, WI_STR("   %@"), WI_ARRAY(array, i));

	wi_release(string);
}
예제 #21
0
파일: client.c 프로젝트: ProfDrLuigi/zanka
wi_boolean_t wr_send_command_on_socket(wi_socket_t *socket, wi_string_t *fmt, ...) {
	wi_mutable_string_t		*string;
	wi_integer_t			result;
	va_list					ap;

	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_mutable_string_alloc(), fmt, ap);
	va_end(ap);
	
	wi_mutable_string_convert_encoding(string, wr_client_string_encoding, wr_server_string_encoding);

	result = wi_socket_write_format(socket, 15.0, WI_STR("%@%c"), string, WR_MESSAGE_SEPARATOR);

	if(result <= 0)
		wr_printf_prefix(WI_STR("Could not write to server: %m"));
	
	wi_release(string);

	return (result > 0);
}
예제 #22
0
static wi_boolean_t wd_tracker_write(wd_tracker_t *tracker, wi_string_t *fmt, ...) {
	wi_string_t		*string;
	wi_integer_t	bytes;
	va_list			ap;

	va_start(ap, fmt);
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	va_end(ap);
	
	bytes = wi_socket_write_format(tracker->socket, 30.0, WI_STR("%@%c"), string, WD_MESSAGE_SEPARATOR);

	if(bytes <= 0) {
		wi_log_err(WI_STR("Could not write to tracker %@: %m"),
			tracker->host);
	}
	
	wi_release(string);

	return (bytes > 0);
}
예제 #23
0
파일: wi-log.c 프로젝트: ProfDrLuigi/zanka
static void _wi_log_vlog(wi_log_level_t level, wi_string_t *fmt, va_list ap) {
	wi_string_t		*string;
	FILE			*fp = NULL;
	const char		*cstring, *name, *path, *prefix;
	char			date[_WI_LOG_DATE_SIZE];
	int				priority;
	
	if(_wi_log_in_callback)
		return;
	
	string = wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap);
	cstring = wi_string_cstring(string);
	name = wi_string_cstring(wi_process_name(wi_process()));
	
	_wi_log_date(date);
	
	switch(level) {
		default:
		case WI_LOG_INFO:
			priority = LOG_INFO;
			prefix = "Info";
			break;
			
		case WI_LOG_WARN:
			priority = LOG_WARNING;
			prefix = "Warning";
			break;
			
		case WI_LOG_ERR:
			priority = LOG_ERR;
			prefix = "Error";
			break;
			
		case WI_LOG_DEBUG:
			priority = LOG_DEBUG;
			prefix = "Debug";
			break;
	}

	if(wi_log_stdout || wi_log_stderr) {
		fp = wi_log_stdout ? stdout : stderr;

		fprintf(fp, "%s %s[%u]: %s: %s\n", date, name, (uint32_t) getpid(), prefix, cstring);
	}
	else if(wi_log_startup && level < WI_LOG_INFO) {
		fp = stderr;

		fprintf(fp, "%s: %s\n", name, cstring);
	}
	else if(wi_log_tool) {
		fp = (level < WI_LOG_INFO) ? stderr : stdout;

		fprintf(fp, "%s: %s\n", name, cstring);
	}
	else if(wi_log_plain) {
		fp = (level < WI_LOG_INFO) ? stderr : stdout;

		fprintf(fp, "%s\n", cstring);
	}

	if(fp)
		fflush(fp);

	if(wi_log_syslog)
		syslog(priority, "%s", cstring);

	if(wi_log_file && wi_log_path) {
		wi_recursive_lock_lock(_wi_log_lock);

		path = wi_string_cstring(wi_log_path);

		fp = fopen(path, "a");

		if(fp) {
			fprintf(fp, "%s %s[%u]: %s: %s\n", date, name, (uint32_t) getpid(), prefix, cstring);
			fclose(fp);
			
			if(_wi_log_lines > 0 && wi_log_limit > 0) {
				if(_wi_log_lines % (int) ((float) wi_log_limit / 10.0f) == 0) {
					_wi_log_truncate(path);
					
					_wi_log_lines = wi_log_limit;
				}
			}
			
			_wi_log_lines++;
		} else {
			fprintf(stderr, "%s: %s: %s\n", name, path, strerror(errno));
		}

		wi_recursive_lock_unlock(_wi_log_lock);
	}

	if(wi_log_callback) {
		_wi_log_in_callback = true;
		(*wi_log_callback)(level, string);
		_wi_log_in_callback = false;
	}

	if((wi_log_startup || wi_log_tool) && level == WI_LOG_ERR)
		exit(1);

	wi_release(string);
}
예제 #24
0
wi_string_t * wi_string_with_format_and_arguments(wi_string_t *fmt, va_list ap) {
	return wi_autorelease(wi_string_init_with_format_and_arguments(wi_string_alloc(), fmt, ap));
}