From 6e54618d5d1597827a18cd980feb447a84ada32b Mon Sep 17 00:00:00 2001
From: Marco Biasini <marco.biasini@unibas.ch>
Date: Thu, 16 Jun 2011 11:55:16 +0200
Subject: [PATCH] properly escape special characters in glob pattern

---
 modules/mol/base/src/impl/query_ast.cc  | 15 ++++++++++-----
 modules/mol/base/src/impl/query_impl.cc |  5 +++--
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/modules/mol/base/src/impl/query_ast.cc b/modules/mol/base/src/impl/query_ast.cc
index 697ff173f..ea96a4858 100644
--- a/modules/mol/base/src/impl/query_ast.cc
+++ b/modules/mol/base/src/impl/query_ast.cc
@@ -120,6 +120,7 @@ StringOrRegexParam::StringOrRegexParam():
 StringOrRegexParam::StringOrRegexParam(const String& s):
   is_regex_(false),r_(),s_(s)
 {
+  String special("[]{}()");
   for(String::const_iterator it=s.begin();it!=s.end();++it) {
     if((*it)=='?' || (*it)=='*') {
       is_regex_=true;
@@ -130,12 +131,16 @@ StringOrRegexParam::StringOrRegexParam(const String& s):
   if(is_regex_) {
     std::ostringstream e;
     for(String::const_iterator it=s.begin();it!=s.end();++it) {
-      if((*it)=='?') {
-	e << ".";
-      } else if((*it)=='*') {
-	e << ".*";
+      
+      if((*it)=='?' && (it==s.begin() || (*(it-1))!='\\')) {
+        e << ".";
+      } else if((*it)=='*' && (it==s.begin() || (*(it-1))!='\\')) {
+        e << ".*";
       } else {
-	e << *it;
+        if (special.find(*it)!=String::npos) {
+          e << '\\';
+        }
+        e << *it;
       }
     }
     //std::cerr << "assembling regex [" << e.str() << "]... ";
diff --git a/modules/mol/base/src/impl/query_impl.cc b/modules/mol/base/src/impl/query_impl.cc
index cc5f80240..a70cfa813 100644
--- a/modules/mol/base/src/impl/query_impl.cc
+++ b/modules/mol/base/src/impl/query_impl.cc
@@ -148,7 +148,7 @@ QueryToken QueryLexer::LexNumericToken() {
 }
 
 bool is_ident_or_str(char c) {
-  static String allowed_chars("_*?");
+  static String allowed_chars("_*?\\");
   return isalnum(c) || allowed_chars.find_first_of(c)!=String::npos;
 }
 
@@ -158,7 +158,8 @@ QueryToken QueryLexer::LexIdentOrStringToken() {
   bool force_string=false;
   while (current_<query_string_.length() && 
          is_ident_or_str(query_string_[current_])) {
-    if (query_string_[current_]=='*' || query_string_[current_]=='?') {
+    if (query_string_[current_]=='*' || query_string_[current_]=='?' ||
+        query_string_[current_]=='\\') {
       force_string=true;
     }
     current_++;
-- 
GitLab