⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gmain.c

📁 Linux的蓝牙操作工具。配合bluez-lib使用
💻 C
📖 第 1 页 / 共 2 页
字号:
	}			/* Never reached */	return FALSE;}void g_spawn_close_pid(GPid pid){	return;}guint g_child_watch_add(GPid pid, GChildWatchFunc func, gpointer user_data){	struct child_watch *w;	GMainContext *context = g_main_context_default();	if (child_watch_pipe[0] < 0)		init_child_pipe();	w = g_new(struct child_watch, 1);	w->id = context->next_id++;	w->pid = pid;	w->function = func;	w->user_data = user_data;	if (context->child_lock)		context->proc_child_watches =			watch_list_add(context->proc_child_watches, w);	else		context->child_watches =			watch_list_add(context->child_watches, w);	return w->id;}gboolean g_source_remove(guint tag){	GMainContext *context = g_main_context_default();	if (g_io_remove_watch(context, tag))		return TRUE;	if (g_timeout_remove(context, tag))		return TRUE;	if (child_watch_remove(context, tag))		return TRUE;	return FALSE;}/* UTF-8 Validation: approximate copy/paste from glib2. */#define UNICODE_VALID(c)			\	((c) < 0x110000 &&			\	(((c) & 0xFFFFF800) != 0xD800) &&	\	((c) < 0xFDD0 || (c) > 0xFDEF) &&	\	((c) & 0xFFFE) != 0xFFFE)#define CONTINUATION_CHAR(c, val)				\	do {							\  		if (((c) & 0xc0) != 0x80) /* 10xxxxxx */	\  			goto failed;				\  		(val) <<= 6;					\  		(val) |= (c) & 0x3f;				\	} while (0)#define INCREMENT_AND_CHECK_MAX(p, i, max_len)					\	do {									\		(i)++;								\		if ((p)[(i)] == '\0' || ((max_len) >= 0 && (i) >= (max_len)))	\			goto failed;						\	} while (0)				gboolean g_utf8_validate(const gchar *str, gssize max_len, const gchar **end){	unsigned long val, min, i;	const unsigned char *p, *last;	min = val = 0;	for (p = (unsigned char *) str, i = 0; p[i]; i++) {		if (max_len >= 0 && i >= max_len)			break;		if (p[i] < 128)			continue;		last = &p[i];		if ((p[i] & 0xe0) == 0xc0) { /* 110xxxxx */			if ((p[i] & 0x1e) == 0)				goto failed;			INCREMENT_AND_CHECK_MAX(p, i, max_len);			if ((p[i] & 0xc0) != 0x80)				goto failed; /* 10xxxxxx */		} else {			if ((p[i] & 0xf0) == 0xe0) {				/* 1110xxxx */				min = (1 << 11);				val = p[i] & 0x0f;				goto two_remaining;			} else if ((p[i] & 0xf8) == 0xf0) {				/* 11110xxx */				min = (1 << 16);				val = p[i] & 0x07;			} else				goto failed;			INCREMENT_AND_CHECK_MAX(p, i, max_len);			CONTINUATION_CHAR(p[i], val);two_remaining:			INCREMENT_AND_CHECK_MAX(p, i, max_len);			CONTINUATION_CHAR(p[i], val);			INCREMENT_AND_CHECK_MAX(p, i, max_len);			CONTINUATION_CHAR(p[i], val);			if (val < min || !UNICODE_VALID(val))				goto failed;		} 	}	if (end)		*end = (const gchar *) &p[i];	return TRUE;failed:	if (end)		*end = (const gchar *) last;	return FALSE;}/* GSList functions */GSList *g_slist_append(GSList *list, void *data){	GSList *entry, *tail;	entry = g_new(GSList, 1);	entry->data = data;	entry->next = NULL;	if (!list)		return entry;	/* Find the end of the list */	for (tail = list; tail->next; tail = tail->next);	tail->next = entry;	return list;}GSList *g_slist_prepend(GSList *list, void *data){	GSList *entry;	entry = g_new(GSList, 1);	entry->data = data;	entry->next = list;	return entry;}GSList *g_slist_insert_sorted(GSList *list, void *data, GCompareFunc cmp_func){	GSList *tmp, *prev, *entry;	int cmp;	entry = g_new(GSList, 1);	entry->data = data;	entry->next = NULL;	if (!list)		return entry;	prev = NULL;	tmp = list;	cmp = cmp_func(data, tmp->data);	while (tmp->next && cmp > 0) {		prev = tmp;		tmp = tmp->next;		cmp = cmp_func(data, tmp->data);	}	if (!tmp->next && cmp > 0) {		tmp->next = entry;		return list;	}	if (prev) {		prev->next = entry;		entry->next = tmp;		return list;	} else {		entry->next = list;		return entry;	}}GSList *g_slist_remove(GSList *list, void *data){	GSList *l, *next, *prev = NULL, *match = NULL;	if (!list)		return NULL;	for (l = list; l != NULL; l = l->next) {		if (l->data == data) {			match = l;			break;		}		prev = l;	}	if (!match)		return list;	next = match->next;	g_free(match);	/* If the head was removed, return the next element */	if (!prev)		return next;	prev->next = next;	return list;}GSList *g_slist_find(GSList *list, gconstpointer data){	GSList *l;	for (l = list; l != NULL; l = l->next) {		if (l->data == data)			return l;	}	return NULL;}GSList *g_slist_find_custom(GSList *list, const void *data,			GCompareFunc cmp_func){	GSList *l;	for (l = list; l != NULL; l = l->next) {		if (!cmp_func(l->data, data))			return l;	}	return NULL;}static GSList *g_slist_sort_merge(GSList *l1, GSList *l2,					GCompareFunc cmp_func){	GSList list, *l;	int cmp;	l = &list;	while (l1 && l2) {		cmp = cmp_func(l1->data, l2->data);		if (cmp <= 0) {			l = l->next = l1;			l1 = l1->next;		} else {			l = l->next = l2;			l2 = l2->next;		}	}	l->next = l1 ? l1 : l2;	return list.next;}GSList *g_slist_sort(GSList *list, GCompareFunc cmp_func){	GSList *l1, *l2;	if (!list || !list->next) 		return list;	l1 = list; 	l2 = list->next;	while ((l2 = l2->next) != NULL) {		if ((l2 = l2->next) == NULL) 			break;		l1 = l1->next;	}	l2 = l1->next; 	l1->next = NULL;	return g_slist_sort_merge(g_slist_sort(list, cmp_func),				g_slist_sort(l2, cmp_func), cmp_func);}int g_slist_length(GSList *list){	int len;	for (len = 0; list != NULL; list = list->next)		len++;	return len;}void g_slist_foreach(GSList *list, GFunc func, void *user_data){	while (list) {		GSList *next = list->next;		func(list->data, user_data);		list = next;	}}void g_slist_free(GSList *list){	GSList *l, *next;	for (l = list; l != NULL; l = next) {		next = l->next;		g_free(l);	}}GSList *g_slist_nth(GSList *list, guint n){	while (n-- > 0 && list)		list = list->next;	return list;}gpointer g_slist_nth_data(GSList *list, guint n){	while (n-- > 0 && list)		list = list->next;	return list ? list->data : NULL;}gint g_slist_position(GSList *list, GSList *link){	gint i;	for (i = 0; list; list = list->next, i++) {		if (list == link)			return i;	}	return -1;}GSList* g_slist_last(GSList *list){	if (list)		while (list->next)			list = list->next;	return list;}static inline GSList* _g_slist_remove_link(GSList *list, GSList *link){	GSList *tmp;	GSList *prev;	prev = NULL;	tmp = list;	while (tmp) {		if (tmp == link) {			if (prev)				prev->next = tmp->next;			if (list == tmp)				list = list->next;			tmp->next = NULL;			break;		}		prev = tmp;		tmp = tmp->next;	}	return list;}GSList* g_slist_delete_link(GSList *list, GSList *link){	list = _g_slist_remove_link(list, link);	g_free(link);	return list;}/* Memory allocation functions */gpointer g_malloc(gulong n_bytes){	gpointer mem;	if (!n_bytes)		return NULL;	mem = malloc((size_t) n_bytes);	if (!mem) {		fprintf(stderr, "g_malloc: failed to allocate %lu bytes",				n_bytes);		abort();	}	return mem;}gpointer g_malloc0(gulong n_bytes){	gpointer mem;	if (!n_bytes)		return NULL;	mem = g_malloc(n_bytes);	memset(mem, 0, (size_t) n_bytes);	return mem;}gpointer g_try_malloc(gulong n_bytes){	if (!n_bytes)		return NULL;	return malloc((size_t) n_bytes);}gpointer g_try_malloc0(gulong n_bytes){	gpointer mem;	mem = g_try_malloc(n_bytes);	if (mem)		memset(mem, 0, (size_t) n_bytes);	return mem;}gpointer g_realloc(gpointer mem, gulong n_bytes){	mem = realloc(mem, n_bytes);	if (!mem) {		fprintf(stderr, "g_realloc: failed to allocate %lu bytes",				n_bytes);		abort();	}	return mem;}void g_free(gpointer mem){	if (mem)		free(mem);}gchar *g_strdup(const gchar *str){	gchar *s;	if (!str)		return NULL;	s = strdup(str);	if (!s) {		fprintf(stderr, "strdup: failed to allocate new string");		abort();	}	return s;}gchar *g_strdup_printf(const gchar *format, ...){	va_list args;	gchar buffer[1024];	gint length;	va_start(args, format);	length = vsnprintf(buffer, sizeof(buffer) - 1, format, args);	va_end(args);	return g_strdup(buffer);}gchar *g_strdelimit(gchar *string, const gchar *delimiters, gchar new_delim){	register gchar *c;	if (!string)		return NULL;	for (c = string; *c; c++)		if (strchr(delimiters, *c))			*c = new_delim;	return string;}/* GKeyFile */struct _GKeyFile {	gchar *filename;};GKeyFile *g_key_file_new(void){	return g_new0(GKeyFile, 1);}void g_key_file_free(GKeyFile *key_file){	g_free(key_file->filename);	g_free(key_file);}gboolean g_key_file_load_from_file(GKeyFile *key_file,				const gchar *file,				GKeyFileFlags flags,				GError **error){	key_file->filename = g_strdup(file);	return TRUE;}static char *next_line(const char *ptr){	char *nl;	nl = strchr(ptr, '\n');	if (!nl)		return NULL;	if (nl[1] == '\0')		return NULL;	return nl + 1;}gchar *g_key_file_get_string(GKeyFile *key_file,				const gchar *group_name,				const gchar *key,				GError **error){	struct stat st;	char *map, *line, *group = NULL, *value = NULL;	off_t size;	size_t key_len, group_len; 	int fd, err = 0;	fd = open(key_file->filename, O_RDONLY);	if (fd < 0) {		g_set_error(error, 0, 0, "%s: %s", key_file->filename,				strerror(errno));		return NULL;	}	if (flock(fd, LOCK_SH) < 0) {		err = errno;		goto close;	}	if (fstat(fd, &st) < 0) {		err = errno;		goto unlock;	}	size = st.st_size;	map = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);	if (!map || map == MAP_FAILED) {		err = errno;		goto unlock;	}	group_len = strlen(group_name);	key_len = strlen(key);	for (line = map; line != NULL; line = next_line(line)) {		int i;		size_t to_copy, value_len;		char tmp[1024], *nl;		if (*line == '#')			continue;		if (!group) {			if (line[0] != '[' || strncmp(line + 1, group_name, group_len))				continue;			if (line[group_len + 1] == ']')				group = line + 1;			continue;		}		if (strncmp(line, key, key_len))			continue;		for (i = key_len; line[i] != '\n'; i++) {			if (line[i] == '=')				break;			if (!isspace(line[i]))				break;		}		if (line[i] != '=')			continue;		nl = strchr(line, '\n');		if (!nl)			continue;		value_len = nl - (line + i + 1);		to_copy = value_len > (sizeof(tmp) - 1) ? sizeof(tmp) - 1 : value_len;		memset(tmp, 0, sizeof(tmp));		strncpy(tmp, line + i + 1, to_copy);		value = g_strdup(tmp);		break;	}	munmap(map, size);unlock:	flock(fd, LOCK_UN);close:	close(fd);	if (err)		g_set_error(error, 0, 0, "%s: %s", key_file->filename,				strerror(err));	else if (!group)		g_set_error(error, 0, 0, "%s: group %s not found",				key_file->filename, group_name);	else if (!value)		g_set_error(error, 0, 0, "%s: key %s not found",				key_file->filename, key);	return value;}gboolean g_key_file_get_boolean(GKeyFile *key_file,				const gchar *group_name,				const gchar *key,				GError **error){	gboolean ret;	gchar *str;	str = g_key_file_get_string(key_file, group_name, key, error);	if (!str)		return FALSE;	if (strcmp(str, "true") == 0 || strcmp(str, "1") == 0)		ret = TRUE;	else		ret = FALSE;	g_free(str);	return ret;}/* GString */#define MY_MAXSIZE ((gsize)-1)static gsize nearest_power(gsize base, gsize num){	gsize n = base;	if (num > MY_MAXSIZE / 2)		return MY_MAXSIZE;	while (n < num)		n <<= 1;	return n;}static void g_string_maybe_expand(GString *string, gsize len){	if (string->len + len < string->allocated_len)		return;	string->allocated_len = nearest_power(1, string->len + len + 1);	string->str = g_realloc(string->str, string->allocated_len);}static GString *g_string_sized_new(gsize dfl_size){	GString *string;	string = g_new0(GString, 1);		g_string_maybe_expand(string, dfl_size);	string->str[0] = '\0';	return string;}static GString *g_string_append_len(GString *string, const gchar *val, gssize len){	g_string_maybe_expand(string, len);	if (len == 1)		string->str[string->len] = *val;	else		memcpy(string->str + string->len, val, len);	string->len += len;	string->str[string->len] = '\0';	return string;}GString *g_string_new(const gchar *init){	GString *string;	gint len;	if (init == NULL || *init == '\0')		return g_string_sized_new(2);	len = strlen(init);	string = g_string_sized_new(len + 2);	g_string_append_len(string, init, len);	return string;}void g_string_append_printf(GString *string, const gchar *format, ...){	gchar buffer[1024];	gint length;	va_list args;	va_start(args, format);	length = vsnprintf(buffer, sizeof(buffer) - 1, format, args);	va_end(args);	g_string_append_len(string, buffer, length);}gchar *g_string_free(GString *string, gboolean free_segment){	gchar *segment;	if (free_segment) {		g_free(string->str);		segment = NULL;	}	else		segment = string->str;	g_free(string);	return segment;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -