static void gstring_overwrite_int (GString *gstring, guint pos, guint32 vuint) { vuint = g_htonl (vuint); g_string_overwrite_len (gstring, pos, (const gchar*) &vuint, 4); }
static DirPattern* dir_pattern_new (const gchar *pattern, gboolean reverse) { DirPattern *pat = NULL; GString *str = g_string_new (NULL); const char *ptr = pattern; pat = g_slice_new0(DirPattern); /* Check if it is a reverse pattern */ if (*ptr == '!') { pat->match = reverse ? TRUE : FALSE; ptr++; } else { pat->match = reverse ? FALSE : TRUE; } /* Check if the pattern is local */ if (*ptr == '/') { pat->local = TRUE; ptr++; } else { pat->local = FALSE; } pat->names = NULL; while (*ptr != '\0') { const gchar *next = strchr (ptr, '/'); if (next == NULL) { pat->names = g_list_prepend (pat->names, g_pattern_spec_new (ptr)); break; } else { if (next != ptr) { g_string_overwrite_len (str, 0, ptr, next - ptr); pat->names = g_list_prepend (pat->names, g_pattern_spec_new (str->str)); } ptr = next + 1; } } g_string_free (str, TRUE); /* Check if the pattern has to match a directory */ pat->directory = (ptr != pattern) && (*(ptr-1) == '/'); return pat; }