2016-05-04 06:18:24 +08:00
|
|
|
// My own globbing implementation. Needed to implement this instead of using libs globbing to
|
|
|
|
// support tab-expansion of globbed paramaters.
|
2005-10-04 23:11:39 +08:00
|
|
|
#ifndef FISH_WILDCARD_H
|
|
|
|
#define FISH_WILDCARD_H
|
|
|
|
|
2016-05-04 06:18:24 +08:00
|
|
|
#include <vector>
|
2005-10-04 23:11:39 +08:00
|
|
|
|
2011-12-27 11:18:46 +08:00
|
|
|
#include "common.h"
|
2013-05-26 06:41:18 +08:00
|
|
|
#include "complete.h"
|
2016-05-04 06:18:24 +08:00
|
|
|
#include "expand.h"
|
2005-10-04 23:11:39 +08:00
|
|
|
|
2016-05-04 06:18:24 +08:00
|
|
|
// Enumeration of all wildcard types.
|
|
|
|
enum {
|
2018-05-06 10:11:57 +08:00
|
|
|
/// Character representing any character except '/' (slash).
|
|
|
|
ANY_CHAR = WILDCARD_RESERVED_BASE,
|
2016-05-04 06:18:24 +08:00
|
|
|
/// Character representing any character string not containing '/' (slash).
|
2018-05-06 10:11:57 +08:00
|
|
|
ANY_STRING,
|
2016-05-04 06:18:24 +08:00
|
|
|
/// Character representing any character string.
|
2012-11-19 08:30:30 +08:00
|
|
|
ANY_STRING_RECURSIVE,
|
2016-05-04 06:18:24 +08:00
|
|
|
/// This is a special psuedo-char that is not used other than to mark the
|
|
|
|
/// end of the the special characters so we can sanity check the enum range.
|
2016-01-22 11:56:39 +08:00
|
|
|
ANY_SENTINAL
|
|
|
|
};
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2016-05-04 06:18:24 +08:00
|
|
|
/// Expand the wildcard by matching against the filesystem.
|
|
|
|
///
|
|
|
|
/// New strings are allocated using malloc and should be freed by the caller.
|
|
|
|
///
|
|
|
|
/// wildcard_expand works by dividing the wildcard into segments at each directory boundary. Each
|
|
|
|
/// segment is processed separatly. All except the last segment are handled by matching the wildcard
|
|
|
|
/// segment against all subdirectories of matching directories, and recursively calling
|
|
|
|
/// wildcard_expand for matches. On the last segment, matching is made to any file, and all matches
|
|
|
|
/// are inserted to the list.
|
|
|
|
///
|
|
|
|
/// If wildcard_expand encounters any errors (such as insufficient priviliges) during matching, no
|
|
|
|
/// error messages will be printed and wildcard_expand will continue the matching process.
|
|
|
|
///
|
|
|
|
/// \param wc The wildcard string
|
|
|
|
/// \param working_directory The working directory
|
|
|
|
/// \param flags flags for the search. Can be any combination of EXPAND_FOR_COMPLETIONS and
|
|
|
|
/// EXECUTABLES_ONLY
|
|
|
|
/// \param out The list in which to put the output
|
|
|
|
///
|
|
|
|
/// \return 1 if matches where found, 0 otherwise. Return -1 on abort (I.e. ^C was pressed).
|
|
|
|
int wildcard_expand_string(const wcstring &wc, const wcstring &working_directory,
|
|
|
|
expand_flags_t flags, std::vector<completion_t> *out);
|
|
|
|
|
|
|
|
/// Test whether the given wildcard matches the string. Does not perform any I/O.
|
|
|
|
///
|
|
|
|
/// \param str The string to test
|
|
|
|
/// \param wc The wildcard to test against
|
|
|
|
/// \param leading_dots_fail_to_match if set, strings with leading dots are assumed to be hidden
|
|
|
|
/// files and are not matched
|
|
|
|
///
|
|
|
|
/// \return true if the wildcard matched
|
|
|
|
bool wildcard_match(const wcstring &str, const wcstring &wc,
|
|
|
|
bool leading_dots_fail_to_match = false);
|
|
|
|
|
|
|
|
/// Check if the specified string contains wildcards.
|
2014-08-25 05:28:31 +08:00
|
|
|
bool wildcard_has(const wcstring &, bool internal);
|
|
|
|
bool wildcard_has(const wchar_t *, bool internal);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2016-05-04 06:18:24 +08:00
|
|
|
/// Test wildcard completion.
|
2018-10-16 13:30:13 +08:00
|
|
|
bool wildcard_complete(const wcstring &str, const wchar_t *wc, const description_func_t &desc_func,
|
|
|
|
std::vector<completion_t> *out, expand_flags_t expand_flags,
|
|
|
|
complete_flags_t flags);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2005-10-04 23:11:39 +08:00
|
|
|
#endif
|