aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2016-11-01 06:58:18 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2016-11-01 07:23:49 +0100
commit9f6cba5c0370aee2f9803abbc35ab7e67f57ee84 (patch)
treeb03485f177d6ff700aac7fc8ff1e7e9e23a61866 /src/parser.cpp
parentb5e6f4c61b7b8e220fb3faa071e30b3dfc559f2f (diff)
downloadsciteco-9f6cba5c0370aee2f9803abbc35ab7e67f57ee84.tar.gz
globbing supports character classes now and ^EN string building construct to escape glob patterns
* globbing is fnmatch(3) compatible, now on every supported platform. * which means that escaping of glob patterns is possible now. ^ENq has been introduced to ease this task. * This finally allows you to pass unmodified filenames to EB. Previously it was impossible to open file names containing glob wildcards. * this was achieved by moving from GPattern to GRegex as the underlying implementation. * The glob pattern is converted to a regular expression before being compiled to a GRegex. This turned out to be trickier than anticipated (~140 lines of code) and has a runtime penalty of course (complexity is O(2*n) over the pattern length). It is IMHO still better than the alternatives, like importing external code from libiberty, which is potentially non-cross-platform. * Using GRegex also opens the potential of supporting brace "expansions" later in the form of glob pattern constructs (they won't actually expand but match alternatives). * is_glob_pattern() has been simplified and moved to Globber::is_pattern(). It makes sense to reuse the Globber class namespace instead of using plain functions for functions working on glob patterns. * The documentation has a new subsection on glob patterns now. * Testsuite extended with glob pattern test cases
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index a9e9213..1936837 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -463,6 +463,10 @@ StateCtlE:
undo.push_obj(qregspec_machine) = new QRegSpecMachine;
set(&&StateCtlEQuote);
break;
+ case 'N':
+ undo.push_obj(qregspec_machine) = new QRegSpecMachine;
+ set(&&StateCtlEN);
+ break;
default:
result = (gchar *)g_malloc(3);
@@ -513,6 +517,17 @@ StateCtlEQuote:
g_free(str);
return true;
+StateCtlEN:
+ if (!qregspec_machine->input(chr, reg))
+ return false;
+
+ undo.push_obj(qregspec_machine) = NULL;
+ set(StateStart);
+ str = reg->get_string();
+ result = Globber::escape_pattern(str);
+ g_free(str);
+ return true;
+
StateEscaped:
set(StateStart);
result = String::chrdup(chr);