emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master b53b1ca: Consolidate duplicated string matching cod


From: Dmitry Antipov
Subject: [Emacs-diffs] master b53b1ca: Consolidate duplicated string matching code.
Date: Tue, 13 Jan 2015 04:11:15 +0000

branch: master
commit b53b1ca422ff1925f631be511fbec9deb1e4cc33
Author: Dmitry Antipov <address@hidden>
Commit: Dmitry Antipov <address@hidden>

    Consolidate duplicated string matching code.
    
    * search.c (fast_string_match_internal): New function,
    consolidated from...
    (fast_string_match, fast_string_match_ignore_case): ...functions
    which are...
    * lisp.h (fast_string_match, fast_string_match_ignore_case):
    inlined from here now.
    (fast_string_match_internal): Add prototype.
    * dired.c (file_name_completion): Use fast_string_match_internal.
---
 src/ChangeLog |    9 +++++++++
 src/dired.c   |   21 ++++++---------------
 src/lisp.h    |   17 +++++++++++++++--
 src/search.c  |   31 ++++++-------------------------
 4 files changed, 36 insertions(+), 42 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index 792407e..48c7370 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -18,6 +18,15 @@
        * keyboard.c (Ftop_level, Fexit_recursive_edit)
        (Fabor_recursive_edit): Add noreturn attribute.
 
+       * search.c (fast_string_match_internal): New function,
+       consolidated from...
+       (fast_string_match, fast_string_match_ignore_case): ...functions
+       which are...
+       * lisp.h (fast_string_match, fast_string_match_ignore_case):
+       inlined from here now.
+       (fast_string_match_internal): Add prototype.
+       * dired.c (file_name_completion): Use fast_string_match_internal.
+
 2015-01-12  Paul Eggert  <address@hidden>
 
        Port to 32-bit MingGW --with-wide-int
diff --git a/src/dired.c b/src/dired.c
index 00f9a5b..9026c56 100644
--- a/src/dired.c
+++ b/src/dired.c
@@ -634,23 +634,14 @@ file_name_completion (Lisp_Object file, Lisp_Object 
dirname, bool all_flag,
       name = DECODE_FILE (name);
 
       {
-       Lisp_Object regexps;
+       Lisp_Object regexps, table = (completion_ignore_case
+                                     ? Vascii_canon_table : Qnil);
 
        /* Ignore this element if it fails to match all the regexps.  */
-       if (completion_ignore_case)
-         {
-           for (regexps = Vcompletion_regexp_list; CONSP (regexps);
-                regexps = XCDR (regexps))
-             if (fast_string_match_ignore_case (XCAR (regexps), name) < 0)
-               break;
-         }
-       else
-         {
-           for (regexps = Vcompletion_regexp_list; CONSP (regexps);
-                regexps = XCDR (regexps))
-             if (fast_string_match (XCAR (regexps), name) < 0)
-               break;
-         }
+       for (regexps = Vcompletion_regexp_list; CONSP (regexps);
+            regexps = XCDR (regexps))
+         if (fast_string_match_internal (XCAR (regexps), name, table) < 0)
+           break;
 
        if (CONSP (regexps))
          continue;
diff --git a/src/lisp.h b/src/lisp.h
index 6a39f08..a11e612 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4054,10 +4054,23 @@ struct re_registers;
 extern struct re_pattern_buffer *compile_pattern (Lisp_Object,
                                                  struct re_registers *,
                                                  Lisp_Object, bool, bool);
-extern ptrdiff_t fast_string_match (Lisp_Object, Lisp_Object);
+extern ptrdiff_t fast_string_match_internal (Lisp_Object, Lisp_Object,
+                                            Lisp_Object);
+
+INLINE ptrdiff_t
+fast_string_match (Lisp_Object regexp, Lisp_Object string)
+{
+  return fast_string_match_internal (regexp, string, Qnil);
+}
+
+INLINE ptrdiff_t
+fast_string_match_ignore_case (Lisp_Object regexp, Lisp_Object string)
+{
+  return fast_string_match_internal (regexp, string, Vascii_canon_table);
+}
+
 extern ptrdiff_t fast_c_string_match_ignore_case (Lisp_Object, const char *,
                                                  ptrdiff_t);
-extern ptrdiff_t fast_string_match_ignore_case (Lisp_Object, Lisp_Object);
 extern ptrdiff_t fast_looking_at (Lisp_Object, ptrdiff_t, ptrdiff_t,
                                   ptrdiff_t, ptrdiff_t, Lisp_Object);
 extern ptrdiff_t find_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
diff --git a/src/search.c b/src/search.c
index 0252542..e961798 100644
--- a/src/search.c
+++ b/src/search.c
@@ -459,17 +459,18 @@ matched by parenthesis constructs in the pattern.  */)
   return string_match_1 (regexp, string, start, 1);
 }
 
-/* Match REGEXP against STRING, searching all of STRING,
-   and return the index of the match, or negative on failure.
-   This does not clobber the match data.  */
+/* Match REGEXP against STRING using translation table TABLE,
+   searching all of STRING, and return the index of the match,
+   or negative on failure.  This does not clobber the match data.  */
 
 ptrdiff_t
-fast_string_match (Lisp_Object regexp, Lisp_Object string)
+fast_string_match_internal (Lisp_Object regexp, Lisp_Object string,
+                           Lisp_Object table)
 {
   ptrdiff_t val;
   struct re_pattern_buffer *bufp;
 
-  bufp = compile_pattern (regexp, 0, Qnil,
+  bufp = compile_pattern (regexp, 0, table,
                          0, STRING_MULTIBYTE (string));
   immediate_quit = 1;
   re_match_object = string;
@@ -504,26 +505,6 @@ fast_c_string_match_ignore_case (Lisp_Object regexp,
   return val;
 }
 
-/* Like fast_string_match but ignore case.  */
-
-ptrdiff_t
-fast_string_match_ignore_case (Lisp_Object regexp, Lisp_Object string)
-{
-  ptrdiff_t val;
-  struct re_pattern_buffer *bufp;
-
-  bufp = compile_pattern (regexp, 0, Vascii_canon_table,
-                         0, STRING_MULTIBYTE (string));
-  immediate_quit = 1;
-  re_match_object = string;
-
-  val = re_search (bufp, SSDATA (string),
-                  SBYTES (string), 0,
-                  SBYTES (string), 0);
-  immediate_quit = 0;
-  return val;
-}
-
 /* Match REGEXP against the characters after POS to LIMIT, and return
    the number of matched characters.  If STRING is non-nil, match
    against the characters in it.  In that case, POS and LIMIT are



reply via email to

[Prev in Thread] Current Thread [Next in Thread]