(edit_complete_word_cmd): don't get bytes directly from editor buffer.

(edit_get_match_keyword_cmd): likewise.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
Andrew Borodin 2013-03-28 09:40:48 +04:00
parent fa9c933ce0
commit 4b9e5f50b1

View File

@ -3292,8 +3292,7 @@ edit_complete_word_cmd (WEdit * edit)
{ {
gsize i, max_len, word_len = 0, num_compl = 0; gsize i, max_len, word_len = 0, num_compl = 0;
off_t word_start = 0; off_t word_start = 0;
unsigned char *bufpos; GString *match_expr;
char *match_expr;
GString *compl[MAX_WORD_COMPLETIONS]; /* completions */ GString *compl[MAX_WORD_COMPLETIONS]; /* completions */
/* search start of word to be completed */ /* search start of word to be completed */
@ -3301,18 +3300,16 @@ edit_complete_word_cmd (WEdit * edit)
return; return;
/* prepare match expression */ /* prepare match expression */
bufpos = &edit->buffers1[word_start >> S_EDIT_BUF_SIZE][word_start & M_EDIT_BUF_SIZE];
/* match_expr = g_strdup_printf ("\\b%.*s[a-zA-Z_0-9]+", word_len, bufpos); */ /* match_expr = g_strdup_printf ("\\b%.*s[a-zA-Z_0-9]+", word_len, bufpos); */
match_expr = match_expr = g_string_new ("(^|\\s+|\\b)");
g_strdup_printf for (i = 0; i < word_len; i++)
("(^|\\s+|\\b)%.*s[^\\s\\.=\\+\\[\\]\\(\\)\\,\\;\\:\\\"\\'\\-\\?\\/\\|\\\\\\{\\}\\*\\&\\^\\%%\\$#@\\!]+", g_string_append_c (match_expr, edit_get_byte (edit, word_start + i));
(int) word_len, bufpos); g_string_append (match_expr, "[^\\s\\.=\\+\\[\\]\\(\\)\\,\\;\\:\\\"\\'\\-\\?\\/\\|\\\\\\{\\}\\*\\&\\^\\%%\\$#@\\!]+");
/* collect the possible completions */ /* collect the possible completions */
/* start search from begin to end of file */ /* start search from begin to end of file */
max_len = max_len =
edit_collect_completions (edit, word_start, word_len, match_expr, (GString **) & compl, edit_collect_completions (edit, word_start, word_len, match_expr->str, (GString **) & compl,
&num_compl); &num_compl);
if (num_compl > 0) if (num_compl > 0)
@ -3342,7 +3339,7 @@ edit_complete_word_cmd (WEdit * edit)
} }
} }
g_free (match_expr); g_string_free (match_expr, TRUE);
/* release memory before return */ /* release memory before return */
for (i = 0; i < num_compl; i++) for (i = 0; i < num_compl; i++)
g_string_free (compl[i], TRUE); g_string_free (compl[i], TRUE);
@ -3463,10 +3460,9 @@ edit_get_match_keyword_cmd (WEdit * edit)
{ {
gsize word_len = 0, max_len = 0; gsize word_len = 0, max_len = 0;
int num_def = 0; int num_def = 0;
int i; gsize i;
off_t word_start = 0; off_t word_start = 0;
unsigned char *bufpos; GString *match_expr;
char *match_expr;
char *path = NULL; char *path = NULL;
char *ptr = NULL; char *ptr = NULL;
char *tagfile = NULL; char *tagfile = NULL;
@ -3483,8 +3479,9 @@ edit_get_match_keyword_cmd (WEdit * edit)
return; return;
/* prepare match expression */ /* prepare match expression */
bufpos = &edit->buffers1[word_start >> S_EDIT_BUF_SIZE][word_start & M_EDIT_BUF_SIZE]; match_expr = g_string_sized_new (word_len);
match_expr = g_strdup_printf ("%.*s", (int) word_len, bufpos); for (i = 0; i < word_len; i++)
g_string_append_c (match_expr, edit_get_byte (edit, word_start + i));
ptr = g_get_current_dir (); ptr = g_get_current_dir ();
path = g_strconcat (ptr, G_DIR_SEPARATOR_S, (char *) NULL); path = g_strconcat (ptr, G_DIR_SEPARATOR_S, (char *) NULL);
@ -3506,7 +3503,7 @@ edit_get_match_keyword_cmd (WEdit * edit)
if (tagfile) if (tagfile)
{ {
num_def = num_def =
etags_set_definition_hash (tagfile, path, match_expr, (etags_hash_t *) & def_hash); etags_set_definition_hash (tagfile, path, match_expr->str, (etags_hash_t *) & def_hash);
g_free (tagfile); g_free (tagfile);
} }
g_free (path); g_free (path);
@ -3515,10 +3512,10 @@ edit_get_match_keyword_cmd (WEdit * edit)
word_len = 0; word_len = 0;
if (num_def > 0) if (num_def > 0)
{ {
editcmd_dialog_select_definition_show (edit, match_expr, max_len, word_len, editcmd_dialog_select_definition_show (edit, match_expr->str, max_len, word_len,
(etags_hash_t *) & def_hash, num_def); (etags_hash_t *) & def_hash, num_def);
} }
g_free (match_expr); g_string_free (match_expr, TRUE);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */