diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-09-01 13:56:46 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2014-09-01 13:56:46 +0200 |
commit | 22f703cab05b7cd368f4de9e03991b7664dc5022 (patch) | |
tree | 6f4d50beaa42328e24b1c6b56b6ec059e4ef21a5 /spectro/aglob.c |
Initial import of argyll version 1.5.1-8debian/1.5.1-8
Diffstat (limited to 'spectro/aglob.c')
-rw-r--r-- | spectro/aglob.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/spectro/aglob.c b/spectro/aglob.c new file mode 100644 index 0000000..8d4c846 --- /dev/null +++ b/spectro/aglob.c @@ -0,0 +1,141 @@ + +/* Provide a system independent glob type function */ + +/************************************************************************* + Copyright 2011 Graeme W. Gill + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + *************************************************************************/ + +#if defined (NT) +# if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0501 +# if defined _WIN32_WINNT +# undef _WIN32_WINNT +# endif +# define _WIN32_WINNT 0x0501 +# endif +# define WIN32_LEAN_AND_MEAN +# include <windows.h> +# include <io.h> +#endif + +#if defined (UNIX) +# include <unistd.h> +# include <glob.h> +# include <pthread.h> +#endif + +#include <sys/types.h> +#include <sys/stat.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <time.h> + +#include "numsup.h" +#include "aglob.h" + +/* Create the aglob */ +/* Return nz on malloc error */ +int aglob_create(aglob *g, char *spath) { +#ifdef NT + char *pp; + int rlen; + /* Figure out where the filename starts */ + if ((pp = strrchr(spath, '/')) == NULL + && (pp = strrchr(spath, '\\')) == NULL) + rlen = 0; + else + rlen = pp - spath + 1; + + if ((g->base = malloc(rlen + 1)) == NULL) { + a1loge(g_log, 1, "aglob_create: malloc failed\n"); + return 1; + } + + memmove(g->base, spath, rlen); + g->base[rlen] = '\000'; + + g->first = 1; + g->ff = _findfirst(spath, &g->ffs); +#else /* UNIX */ + memset(&g->g, 0, sizeof(g->g)); + g->rv = glob(spath, GLOB_NOSORT, NULL, &g->g); +//a1loge(g_log, 0, "~1 glob '%s' returns %d and gl_pathc = %d\n",spath,g->rv,g->g.gl_pathc); + if (g->rv == GLOB_NOSPACE) { + a1loge(g_log, 1, "aglob_create: glob returned GLOB_NOSPACE\n"); + return 1; + } + g->ix = 0; +#endif + g->merr = 0; + return 0; +} + +/* Return an allocated string of the next match. */ +/* Return NULL if no more matches */ +char *aglob_next(aglob *g) { + char *fpath; + +#ifdef NT + if (g->ff == -1L) { + return NULL; + } + if (g->first == 0) { + if (_findnext(g->ff, &g->ffs) != 0) { + return NULL; + } + } + g->first = 0; + + /* Convert match filename to full path */ + if ((fpath = malloc(strlen(g->base) + strlen(g->ffs.name) + 1)) == NULL) { + a1loge(g_log, 1, "aglob_next: malloc failed\n"); + g->merr = 1; + return NULL; + } + strcpy(fpath, g->base); + strcat(fpath, g->ffs.name); + return fpath; +#else + if (g->rv != 0 || g->ix >= g->g.gl_pathc) + return NULL; + if ((fpath = strdup(g->g.gl_pathv[g->ix])) == NULL) { + a1loge(g_log, 1, "aglob_next: strdup failed\n"); + g->merr = 1; + return NULL; + } + g->ix++; + return fpath; +#endif +} + +void aglob_cleanup(aglob *g) { +#ifdef NT + if (g->ff != -1L) + _findclose(g->ff); + free(g->base); +#else /* UNIX */ + if (g->rv == 0) + globfree(&g->g); +#endif +} + |