This source file includes following definitions.
- mc_search__hex_translate_to_regex
- mc_search__cond_struct_new_init_hex
- mc_search__run_hex
- mc_search_hex_prepare_replace_str
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #include <config.h>
28
29 #include <stdio.h>
30
31 #include "lib/global.h"
32 #include "lib/strutil.h"
33 #include "lib/search.h"
34
35 #include "internal.h"
36
37
38
39
40
41 typedef enum
42 {
43 MC_SEARCH_HEX_E_OK,
44 MC_SEARCH_HEX_E_NUM_OUT_OF_RANGE,
45 MC_SEARCH_HEX_E_INVALID_CHARACTER,
46 MC_SEARCH_HEX_E_UNMATCHED_QUOTES
47 } mc_search_hex_parse_error_t;
48
49
50
51
52
53
54
55
56
57
58
59 static GString *
60 mc_search__hex_translate_to_regex (const GString *astr, mc_search_hex_parse_error_t *error_ptr,
61 int *error_pos_ptr)
62 {
63 GString *buff;
64 const char *str;
65 gsize str_len;
66 gsize loop = 0;
67 mc_search_hex_parse_error_t error = MC_SEARCH_HEX_E_OK;
68
69 buff = g_string_sized_new (64);
70 str = astr->str;
71 str_len = astr->len;
72
73 while (loop < str_len && error == MC_SEARCH_HEX_E_OK)
74 {
75 unsigned int val;
76 int ptr;
77
78 if (g_ascii_isspace (str[loop]))
79 {
80
81 while (g_ascii_isspace (str[loop]))
82 loop++;
83 }
84
85 else if (sscanf (str + loop, "%x%n", &val, &ptr) == 1)
86 {
87 if (val > 255)
88 error = MC_SEARCH_HEX_E_NUM_OUT_OF_RANGE;
89 else
90 {
91 g_string_append_printf (buff, "\\x%02X", val);
92 loop += ptr;
93 }
94 }
95 else if (str[loop] == '"')
96 {
97 gsize loop2;
98
99 loop2 = loop + 1;
100
101 while (loop2 < str_len)
102 {
103 if (str[loop2] == '"')
104 break;
105 if (str[loop2] == '\\' && loop2 + 1 < str_len)
106 loop2++;
107 g_string_append_c (buff, str[loop2]);
108 loop2++;
109 }
110
111 if (str[loop2] == '\0')
112 error = MC_SEARCH_HEX_E_UNMATCHED_QUOTES;
113 else
114 loop = loop2 + 1;
115 }
116 else
117 error = MC_SEARCH_HEX_E_INVALID_CHARACTER;
118 }
119
120 if (error != MC_SEARCH_HEX_E_OK)
121 {
122 g_string_free (buff, TRUE);
123 if (error_ptr != NULL)
124 *error_ptr = error;
125 if (error_pos_ptr != NULL)
126 *error_pos_ptr = loop;
127 return NULL;
128 }
129
130 return buff;
131 }
132
133
134
135
136
137 void
138 mc_search__cond_struct_new_init_hex (const char *charset, mc_search_t *lc_mc_search,
139 mc_search_cond_t *mc_search_cond)
140 {
141 GString *tmp;
142 mc_search_hex_parse_error_t error = MC_SEARCH_HEX_E_OK;
143 int error_pos = 0;
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178 if (str_isutf8 (charset))
179 charset = "ASCII";
180
181 tmp = mc_search__hex_translate_to_regex (mc_search_cond->str, &error, &error_pos);
182 if (tmp != NULL)
183 {
184 g_string_free (mc_search_cond->str, TRUE);
185 mc_search_cond->str = tmp;
186 mc_search__cond_struct_new_init_regex (charset, lc_mc_search, mc_search_cond);
187 }
188 else
189 {
190 const char *desc;
191
192 switch (error)
193 {
194 case MC_SEARCH_HEX_E_NUM_OUT_OF_RANGE:
195 desc =
196 _
197 ("Number out of range (should be in byte range, 0 <= n <= 0xFF, expressed in hex)");
198 break;
199 case MC_SEARCH_HEX_E_INVALID_CHARACTER:
200 desc = _("Invalid character");
201 break;
202 case MC_SEARCH_HEX_E_UNMATCHED_QUOTES:
203 desc = _("Unmatched quotes character");
204 break;
205 default:
206 desc = "";
207 }
208
209 lc_mc_search->error = MC_SEARCH_E_INPUT;
210 lc_mc_search->error_str =
211 g_strdup_printf (_("Hex pattern error at position %d:\n%s."), error_pos + 1, desc);
212 }
213 }
214
215
216
217 gboolean
218 mc_search__run_hex (mc_search_t *lc_mc_search, const void *user_data,
219 gsize start_search, gsize end_search, gsize *found_len)
220 {
221 return mc_search__run_regex (lc_mc_search, user_data, start_search, end_search, found_len);
222 }
223
224
225
226 GString *
227 mc_search_hex_prepare_replace_str (mc_search_t *lc_mc_search, GString *replace_str)
228 {
229 (void) lc_mc_search;
230
231 return mc_g_string_dup (replace_str);
232 }
233
234