#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <ctype.h> // for isdigit()
// this really should be replaced by a function pair .. one to
// start a new search and one to go to next, bailing when done. Maybe
// func with a callback. Whatever.
+// will be set to 0xFFFF for no limit currently set, or a smaller number
+// if that is the depth limit
+unsigned int pathiter_depthlimit;
+
+
#if 1 // globbing is performed
+// only iterates actual existing paths; if you want to return
+// non-matching paths, see below
+
#define SEARCHPATH_PRE \
char *end, *colon; \
char *head = searchpath; \
char chunk [ FILENAME_MAX ]; \
+ char *lt; \
\
/*fprintf ( stderr, "sp %s\n", searchpath );*/ \
\
strncpy ( chunk, head, FILENAME_MAX - 1 ); \
} \
\
- /*fprintf ( stderr, "-> %s\n", chunk ); */ \
+ pathiter_depthlimit = 0xFFFF; \
+ \
+ if ( ( lt = strchr ( chunk, '<' ) ) ) { \
+ if ( isdigit ( *(lt+1) ) ) { \
+ pathiter_depthlimit = atoi ( lt + 1 ); \
+ } \
+ *lt = '\0'; \
+ } \
+ \
+ /*fprintf ( stderr, "-> chunk %s limit %d\n", chunk, pathiter_depthlimit );*/ \
\
struct stat statbuf; \
wordexp_t _p; \
\
} // while
+
+// the following will return even non-matching chunks, but is not doing wordexp() expansion on it
+
+#define SEARCHCHUNK_PRE \
+ char *end, *colon; \
+ char *head = searchpath; \
+ char chunk [ FILENAME_MAX ]; \
+ \
+ /*fprintf ( stderr, "sp %s\n", searchpath );*/ \
+ \
+ while ( 1 ) { \
+ colon = strchr ( head, ':' ); \
+ end = strchr ( head, '\0' ); \
+ \
+ if ( colon && colon < end ) { \
+ memset ( chunk, '\0', FILENAME_MAX ); \
+ strncpy ( chunk, head, colon - head ); \
+ } else { \
+ strncpy ( chunk, head, FILENAME_MAX - 1 ); \
+ } \
+ \
+ /*fprintf ( stderr, "-> %s\n", chunk ); */ \
+ \
+ char buffer [ FILENAME_MAX ]; \
+ \
+ strcpy ( buffer, chunk ); \
+ /*fprintf ( stderr, "glob %s\n", buffer );*/ \
+ { /* user code */
+
+#define SEARCHCHUNK_POST \
+ } /* user code */ \
+ /* next search path */ \
+ if ( colon && colon < end ) { \
+ head = colon + 1; \
+ } else { \
+ break; /* done! */ \
+ } \
+ \
+ } // while
+
+
#endif // globbing is done