#ifndef INCL_PHYSFSEXT_GLOBBING_H #define INCL_PHYSFSEXT_GLOBBING_H /** \file globbing.h */ #include "physfs.h" /** * \mainpage PhysicsFS globbing * * This is an extension to PhysicsFS to let you search for files with basic * wildcard matching, regardless of what sort of filesystem or archive they * reside in. It does this by enumerating directories as needed and manually * locating matching entries. * * Usage: Set up PhysicsFS as you normally would, then use * PHYSFSEXT_enumerateFilesWildcard() when enumerating files. This is just * like PHYSFS_enumerateFiles(), but it returns a subset that matches your * wildcard pattern. You must call PHYSFSEXT_freeEnumeration() on the results, * just PHYSFS_enumerateFiles() would do with PHYSFS_freeList(). * * License: this code is public domain. I make no warranty that it is useful, * correct, harmless, or environmentally safe. * * This particular file may be used however you like, including copying it * verbatim into a closed-source project, exploiting it commercially, and * removing any trace of my name from the source (although I hope you won't * do that). I welcome enhancements and corrections to this file, but I do * not require you to send me patches if you make changes. This code has * NO WARRANTY. * * Unless otherwise stated, the rest of PhysicsFS falls under the zlib license. * Please see LICENSE.txt in the source's "docs" directory. * * \author Ryan C. Gordon. */ #ifdef __cplusplus extern "C" { #endif /** * \fn char **PHYSFS_enumerateFilesWildcard(const char *dir, const char *wildcard, int caseSensitive) * \brief Get a file listing of a search path's directory, filtered with a wildcard pattern. * * Matching directories are interpolated. That is, if "C:\mydir" is in the * search path and contains a directory "savegames" that contains "x.sav", * "y.Sav", and "z.txt", and there is also a "C:\userdir" in the search path * that has a "savegames" subdirectory with "w.sav", then the following code: * * \code * char **rc = PHYSFS_enumerateFilesWildcard("savegames", "*.sav", 0); * char **i; * * for (i = rc; *i != NULL; i++) * printf(" * We've got [%s].\n", *i); * * PHYSFS_freeList(rc); * \endcode * * ...will print: * * \verbatim * We've got [x.sav]. * We've got [y.Sav]. * We've got [w.sav].\endverbatim * * Feel free to sort the list however you like. We only promise there will * be no duplicates, but not what order the final list will come back in. * * Wildcard strings can use the '*' and '?' characters, currently. * Matches can be case-insensitive if you pass a zero for argument 3. * * Don't forget to call PHYSFSEXT_freeEnumerator() with the return value from * this function when you are done with it. As we use PhysicsFS's allocator * for this list, you must free it before calling PHYSFS_deinit(). * Do not use PHYSFS_freeList() on the returned value! * * \param dir directory in platform-independent notation to enumerate. * \param wildcard Wildcard pattern to use for filtering. * \param caseSensitive Zero for case-insensitive matching, * non-zero for case-sensitive. * \return Null-terminated array of null-terminated strings. * * \sa PHYSFSEXT_freeEnumeration */ PHYSFS_DECL char **PHYSFSEXT_enumerateFilesWildcard(const char *dir, const char *wildcard, int caseSensitive); /** * \fn void PHYSFSEXT_freeEnumeration(char **list) * \brief Free data returned by PHYSFSEXT_enumerateFilesWildcard * * Conceptually, this works like PHYSFS_freeList(), but is used with data * returned by PHYSFSEXT_enumerateFilesWildcard() only. Be sure to call this * on any returned data from that function before * * \param list Pointer previously returned by * PHYSFSEXT_enumerateFilesWildcard(). It is safe to pass a * NULL here. * * \sa PHYSFSEXT_enumerateFilesWildcard */ PHYSFS_DECL void PHYSFSEXT_freeEnumeration(char **list); /** * \fn void PHYSFSEXT_enumerateFilesCallbackWildcard(const char *dir, const char *wildcard, int caseSensitive, PHYSFS_EnumFilesCallback c, void *d); * \brief Get a file listing of a search path's directory, filtered with a wildcard pattern, using an application-defined callback. * * This function is equivalent to PHYSFSEXT_enumerateFilesWildcard(). It * reports file listings, filtered by a wildcard pattern. * * Unlike PHYSFS_enumerateFiles(), this function does not return an array. * Rather, it calls a function specified by the application once per * element of the search path: * * \code * * static void printDir(void *data, const char *origdir, const char *fname) * { * printf(" * We've got [%s] in [%s].\n", fname, origdir); * } * * // ... * PHYSFS_enumerateFilesCallbackWildcard("savegames","*.sav",0,printDir,NULL); * \endcode * * Items sent to the callback are not guaranteed to be in any order whatsoever. * There is no sorting done at this level, and if you need that, you should * probably use PHYSFS_enumerateFilesWildcard() instead, which guarantees * alphabetical sorting. This form reports whatever is discovered in each * archive before moving on to the next. Even within one archive, we can't * guarantee what order it will discover data. Any sorting you find in * these callbacks is just pure luck. Do not rely on it. As this walks * the entire list of archives, you may receive duplicate filenames. * * Wildcard strings can use the '*' and '?' characters, currently. * Matches can be case-insensitive if you pass a zero for argument 3. * * \param dir Directory, in platform-independent notation, to enumerate. * \param wildcard Wildcard pattern to use for filtering. * \param caseSensitive Zero for case-insensitive matching, * non-zero for case-sensitive. * \param c Callback function to notify about search path elements. * \param d Application-defined data passed to callback. Can be NULL. * * \sa PHYSFS_EnumFilesCallback * \sa PHYSFS_enumerateFiles */ PHYSFS_DECL void PHYSFSEXT_enumerateFilesCallbackWildcard(const char *dir, const char *wildcard, int caseSensitive, PHYSFS_EnumFilesCallback c, void *d); #ifdef __cplusplus } #endif #endif /* include-once blocker. */ /* end of globbing.h ... */