1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) 1995-2010 Index Data
3 * See the file LICENSE for details.
7 \brief File globbing (ala POSIX glob, but simpler)
13 #include <sys/types.h>
18 #include <yaz/wrbuf.h>
19 #include <yaz/tpath.h>
23 #include <yaz/file_glob.h>
24 #include <yaz/match_glob.h>
27 struct res_entry *next;
33 size_t number_of_entries;
34 struct res_entry **last_entry;
35 struct res_entry *entries;
38 static void glob_r(yaz_glob_res_t res, const char *pattern, size_t off,
41 size_t prefix_len = strlen(prefix);
44 while (pattern[i] && !strchr("/\\", pattern[i]))
46 if (strchr("?*", pattern[i]))
51 if (!is_pattern && pattern[i]) /* no pattern and directory part */
53 i++; /* skip dir sep */
54 memcpy(prefix + prefix_len, pattern + off, i - off);
55 prefix[prefix_len + i - off] = '\0';
56 glob_r(res, pattern, i, prefix);
57 prefix[prefix_len] = '\0';
61 DIR * dir = opendir(*prefix ? prefix : "." );
67 while ((ent = readdir(dir)))
70 memcpy(prefix + prefix_len, pattern + off, i - off);
71 prefix[prefix_len + i - off] = '\0';
72 r = yaz_match_glob(prefix + prefix_len, ent->d_name);
73 prefix[prefix_len] = '\0';
77 strcpy(prefix + prefix_len, ent->d_name);
80 glob_r(res, pattern, i, prefix);
84 struct res_entry *ent =
85 nmem_malloc(res->nmem, sizeof(*ent));
86 ent->file = nmem_strdup(res->nmem, prefix);
88 *res->last_entry = ent;
89 res->last_entry = &ent->next;
90 res->number_of_entries++;
92 prefix[prefix_len] = '\0';
100 int yaz_file_glob(const char *pattern, yaz_glob_res_t *res)
102 char prefix[FILENAME_MAX+1];
103 NMEM nmem = nmem_create();
106 *res = nmem_malloc(nmem, sizeof(**res));
107 (*res)->number_of_entries = 0;
110 (*res)->last_entry = &(*res)->entries;
111 glob_r(*res, pattern, 0, prefix);
115 void yaz_file_globfree(yaz_glob_res_t *res)
119 /* must free entries as well */
120 nmem_destroy((*res)->nmem);
125 const char *yaz_file_glob_get_file(yaz_glob_res_t res, size_t idx)
127 struct res_entry *ent = res->entries;
138 size_t yaz_file_glob_get_num(yaz_glob_res_t res)
140 return res->number_of_entries;
146 * c-file-style: "Stroustrup"
147 * indent-tabs-mode: nil
149 * vim: shiftwidth=4 tabstop=8 expandtab