Ticket 1551: Update GPL version from 2 to 3
[midnight-commander.git] / lib / search / normal.c
blob7be4c809e3e0acc193547bcc05688fa3bf2bd112
1 /*
2 Search text engine.
3 Plain search
5 Copyright (C) 2009, 2011
6 The Free Software Foundation, Inc.
8 Written by:
9 Slava Zanko <slavazanko@gmail.com>, 2009.
11 This file is part of the Midnight Commander.
13 The Midnight Commander is free software: you can redistribute it
14 and/or modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation, either version 3 of the License,
16 or (at your option) any later version.
18 The Midnight Commander is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program. If not, see <http://www.gnu.org/licenses/>.
27 #include <config.h>
29 #include "lib/global.h"
30 #include "lib/strutil.h"
31 #include "lib/search.h"
33 #include "lib/charsets.h"
35 #include "internal.h"
37 /*** global variables ****************************************************************************/
39 /*** file scope macro definitions ****************************************************************/
41 /*** file scope type declarations ****************************************************************/
43 /*** file scope variables ************************************************************************/
45 /*** file scope functions ************************************************************************/
47 static GString *
48 mc_search__normal_translate_to_regex (const GString * astr)
50 const char *str = astr->str;
51 GString *buff;
52 gsize loop;
54 buff = g_string_sized_new (32);
56 for (loop = 0; loop < astr->len; loop++)
57 switch (str[loop])
59 case '*':
60 case '?':
61 case ',':
62 case '{':
63 case '}':
64 case '[':
65 case ']':
66 case '\\':
67 case '+':
68 case '.':
69 case '$':
70 case '(':
71 case ')':
72 case '^':
73 case '-':
74 case '|':
75 g_string_append_c (buff, '\\');
76 /* fall through */
77 default:
78 g_string_append_c (buff, str[loop]);
79 break;
82 return buff;
85 /*** public functions ****************************************************************************/
87 void
88 mc_search__cond_struct_new_init_normal (const char *charset, mc_search_t * lc_mc_search,
89 mc_search_cond_t * mc_search_cond)
91 GString *tmp;
93 tmp = mc_search__normal_translate_to_regex (mc_search_cond->str);
94 g_string_free (mc_search_cond->str, TRUE);
96 if (lc_mc_search->whole_words)
98 /* NOTE: \b as word boundary doesn't allow search
99 * whole words with non-ASCII symbols */
100 g_string_prepend (tmp, "(^|[^\\p{L}\\p{N}_])(");
101 g_string_append (tmp, ")([^\\p{L}\\p{N}_]|$)");
104 mc_search_cond->str = tmp;
105 mc_search__cond_struct_new_init_regex (charset, lc_mc_search, mc_search_cond);
108 /* --------------------------------------------------------------------------------------------- */
110 gboolean
111 mc_search__run_normal (mc_search_t * lc_mc_search, const void *user_data,
112 gsize start_search, gsize end_search, gsize * found_len)
114 return mc_search__run_regex (lc_mc_search, user_data, start_search, end_search, found_len);
117 /* --------------------------------------------------------------------------------------------- */
118 GString *
119 mc_search_normal_prepare_replace_str (mc_search_t * lc_mc_search, GString * replace_str)
121 (void) lc_mc_search;
122 return g_string_new_len (replace_str->str, replace_str->len);