1/*
2 * Copyright (C) 1984-2023  Mark Nudelman
3 *
4 * You may distribute under the terms of either the GNU General Public
5 * License or the Less License, as specified in the README file.
6 *
7 * For more information, see the README file.
8 */
9
10
11/*
12 * Macros to define the method of doing filename "globbing".
13 * There are three possible mechanisms:
14 *   1. GLOB_LIST
15 *      This defines a function that returns a list of matching filenames.
16 *   2. GLOB_NAME
17 *      This defines a function that steps thru the list of matching
18 *      filenames, returning one name each time it is called.
19 *   3. GLOB_STRING
20 *      This defines a function that returns the complete list of
21 *      matching filenames as a single space-separated string.
22 */
23
24#if OS2
25
26#define DECL_GLOB_LIST(list)            char **list;  char **pp;
27#define GLOB_LIST(filename,list)        list = _fnexplode(filename)
28#define GLOB_LIST_FAILED(list)          list == NULL
29#define SCAN_GLOB_LIST(list,p)          pp = list;  *pp != NULL;  pp++
30#define INIT_GLOB_LIST(list,p)          p = *pp
31#define GLOB_LIST_DONE(list)            _fnexplodefree(list)
32
33#else
34#if MSDOS_COMPILER==DJGPPC
35
36#define DECL_GLOB_LIST(list)            glob_t list;  int i;
37#define GLOB_LIST(filename,list)        glob(filename,GLOB_NOCHECK,0,&list)
38#define GLOB_LIST_FAILED(list)          0
39#define SCAN_GLOB_LIST(list,p)          i = 0;  i < list.gl_pathc;  i++
40#define INIT_GLOB_LIST(list,p)          p = list.gl_pathv[i]
41#define GLOB_LIST_DONE(list)            globfree(&list)
42
43#else
44#if MSDOS_COMPILER==MSOFTC || MSDOS_COMPILER==BORLANDC
45
46#define GLOB_FIRST_NAME(filename,fndp,h) h = _dos_findfirst(filename, ~_A_VOLID, fndp)
47#define GLOB_FIRST_FAILED(handle)       ((handle) != 0)
48#define GLOB_NEXT_NAME(handle,fndp)             _dos_findnext(fndp)
49#define GLOB_NAME_DONE(handle)
50#define GLOB_NAME                       name
51#define DECL_GLOB_NAME(fnd,drive,dir,fname,ext,handle) \
52                                        struct find_t fnd;      \
53                                        char drive[_MAX_DRIVE]; \
54                                        char dir[_MAX_DIR];     \
55                                        char fname[_MAX_FNAME]; \
56                                        char ext[_MAX_EXT];     \
57                                        int handle;
58#else
59#if MSDOS_COMPILER==WIN32C && (defined(_MSC_VER) || defined(MINGW))
60
61#define GLOB_FIRST_NAME(filename,fndp,h) h = _findfirst(filename, fndp)
62#define GLOB_FIRST_FAILED(handle)       ((handle) == -1)
63#define GLOB_NEXT_NAME(handle,fndp)     _findnext(handle, fndp)
64#define GLOB_NAME_DONE(handle)          _findclose(handle)
65#define GLOB_NAME                       name
66#define DECL_GLOB_NAME(fnd,drive,dir,fname,ext,handle) \
67                                        struct _finddata_t fnd; \
68                                        char drive[_MAX_DRIVE]; \
69                                        char dir[_MAX_DIR];     \
70                                        char fname[_MAX_FNAME]; \
71                                        char ext[_MAX_EXT];     \
72                                        intptr_t handle;
73
74#else
75#if MSDOS_COMPILER==WIN32C && !defined(_MSC_VER) /* Borland C for Windows */
76
77#define GLOB_FIRST_NAME(filename,fndp,h) h = findfirst(filename, fndp, ~FA_LABEL)
78#define GLOB_FIRST_FAILED(handle)       ((handle) != 0)
79#define GLOB_NEXT_NAME(handle,fndp)     findnext(fndp)
80#define GLOB_NAME_DONE(handle)
81#define GLOB_NAME                       ff_name
82#define DECL_GLOB_NAME(fnd,drive,dir,fname,ext,handle) \
83                                        struct ffblk fnd;       \
84                                        char drive[MAXDRIVE];   \
85                                        char dir[MAXDIR];       \
86                                        char fname[MAXFILE];    \
87                                        char ext[MAXEXT];       \
88                                        int handle;
89
90#endif
91#endif
92#endif
93#endif
94#endif
95