static int cache_glob_lookup_file_name (const char *file_name, const char *mime_types[], int n_mime_types) { int n; MimeWeight mimes[10]; int n_mimes = 10; int i; int len; char *lower_case; assert (file_name != NULL && n_mime_types > 0); /* First, check the literals */ lower_case = ascii_tolower (file_name); n = cache_glob_lookup_literal (lower_case, mime_types, n_mime_types, FALSE); if (n > 0) { free (lower_case); return n; } n = cache_glob_lookup_literal (file_name, mime_types, n_mime_types, TRUE); if (n > 0) { free (lower_case); return n; } len = strlen (file_name); n = cache_glob_lookup_suffix (lower_case, len, FALSE, mimes, n_mimes); if (n < 2) n += cache_glob_lookup_suffix (file_name, len, TRUE, mimes + n, n_mimes - n); free (lower_case); /* Last, try fnmatch */ if (n < 2) n += cache_glob_lookup_fnmatch (file_name, mimes + n, n_mimes - n); n = filter_out_dupes (mimes, n); qsort (mimes, n, sizeof (MimeWeight), compare_mime_weight); if (n_mime_types < n) n = n_mime_types; for (i = 0; i < n; i++) mime_types[i] = mimes[i].mime; return n; }
int _xdg_glob_hash_lookup_file_name (XdgGlobHash *glob_hash, const char *file_name, const char *mime_types[], int n_mime_types) { XdgGlobList *list; int i, n; MimeWeight mimes[10]; int n_mimes = 10; int len; char *lower_case; /* First, check the literals */ assert (file_name != NULL && n_mime_types > 0); n = 0; lower_case = ascii_tolower (file_name); for (list = glob_hash->literal_list; list; list = list->next) { if (strcmp ((const char *)list->data, file_name) == 0) { mime_types[0] = list->mime_type; free (lower_case); return 1; } } for (list = glob_hash->literal_list; list; list = list->next) { if (!list->case_sensitive && strcmp ((const char *)list->data, lower_case) == 0) { mime_types[0] = list->mime_type; free (lower_case); return 1; } } len = strlen (file_name); n = _xdg_glob_hash_node_lookup_file_name (glob_hash->simple_node, lower_case, len, FALSE, mimes, n_mimes); if (n < 2) n += _xdg_glob_hash_node_lookup_file_name (glob_hash->simple_node, file_name, len, TRUE, mimes + n, n_mimes - n); if (n < 2) { for (list = glob_hash->full_list; list && n < n_mime_types; list = list->next) { if (fnmatch ((const char *)list->data, file_name, 0) == 0) { mimes[n].mime = list->mime_type; mimes[n].weight = list->weight; n++; } } } free (lower_case); n = filter_out_dupes (mimes, n); qsort (mimes, n, sizeof (MimeWeight), compare_mime_weight); if (n_mime_types < n) n = n_mime_types; for (i = 0; i < n; i++) mime_types[i] = mimes[i].mime; return n; }