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 "Number out of range (should be in byte range, 0 <= n <= 0xFF, expressed in hex)");
197 break;
198 case MC_SEARCH_HEX_E_INVALID_CHARACTER:
199 desc = _ ("Invalid character");
200 break;
201 case MC_SEARCH_HEX_E_UNMATCHED_QUOTES:
202 desc = _ ("Unmatched quotes character");
203 break;
204 default:
205 desc = "";
206 }
207
208 lc_mc_search->error = MC_SEARCH_E_INPUT;
209 lc_mc_search->error_str =
210 g_strdup_printf (_ ("Hex pattern error at position %d:\n%s."), error_pos + 1, desc);
211 }
212 }
213
214
215
216 gboolean
217 mc_search__run_hex (mc_search_t *lc_mc_search, const void *user_data, off_t start_search,
218 off_t end_search, gsize *found_len)
219 {
220 return mc_search__run_regex (lc_mc_search, user_data, start_search, end_search, found_len);
221 }
222
223
224
225 GString *
226 mc_search_hex_prepare_replace_str (mc_search_t *lc_mc_search, GString *replace_str)
227 {
228 (void) lc_mc_search;
229
230 return mc_g_string_dup (replace_str);
231 }
232
233