?? gmain.c
字號:
} /* 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 + -