Temporary commit. Half-fix searching.

Not fixed search by regexp.
This commit is contained in:
Slava Zanko 2009-04-17 11:46:06 +03:00
parent 408e75c1fa
commit 1e5a201abd
4 changed files with 131 additions and 38 deletions

View File

@ -130,6 +130,7 @@ int edit_raw_key_query (const char *heading, const char *query, int cancel);
int edit_file (const char *_file, int line);
int edit_translate_key (WEdit *edit, long x_key, int *cmd, int *ch);
int edit_get_byte (WEdit * edit, long byte_index);
char *edit_get_byte_ptr (WEdit *, long);
int edit_count_lines (WEdit * edit, long current, int upto);
long edit_move_forward (WEdit * edit, long current, int lines, long upto);
long edit_move_forward3 (WEdit * edit, long current, int cols, long upto);

View File

@ -88,17 +88,44 @@ static int edit_save_cmd (WEdit *edit);
static unsigned char *edit_get_block (WEdit *edit, long start,
long finish, int *l);
static inline int my_lower_case (int c)
static gchar *
my_lower_case (char *ch)
{
return g_ascii_tolower ((gchar)c & 0xFF);
gchar *tmp, *tmp1;
size_t size = 7;
tmp = ch;
tmp1 = tmp = g_malloc0(sizeof(gchar)*7);
str_tolower (ch, &tmp, &size);
return tmp1;
}
static gchar *
my_lower_case_static (char *ch)
{
static gchar tmp[7];
gchar *tmp2 = tmp;
size_t size=7;
memset(tmp,0,7);
str_tolower (ch, &tmp2, &size);
return tmp;
}
static const char *
strcasechr (const char *s, int c)
strcasechr (const char *s, char *c)
{
for (c = my_lower_case (c); my_lower_case ((int) *s) != c; ++s)
if (*s == '\0')
return 0;
gchar *tmp_c=NULL;
tmp_c = my_lower_case (c);
while ( strcmp(tmp_c, my_lower_case_static((char *)s))){
if (*s == '\0'){
g_free(tmp_c);
return NULL;
}
s++;
}
g_free(tmp_c);
return s;
}
@ -1435,14 +1462,18 @@ string_regexp_search (char *pattern, char *string, int match_type,
/* thanks to Liviu Daia <daia@stoilow.imar.ro> for getting this
(and the above) routines to work properly - paul */
typedef int (*edit_getbyte_fn) (WEdit *, long);
typedef char * (*edit_getbyte_fn) (WEdit *, long);
static long
edit_find_string (long start, unsigned char *exp, int *len, long last_byte, edit_getbyte_fn get_byte, void *data, int once_only, void *d)
{
long p, q = 0;
long l = str_term_width1 ((char *) exp), f = 0;
long l = strlen ((char *) exp), f = 0;
size_t tmp_len;
int n = 0;
gchar *tmp_exp1, *tmp_exp2;
unsigned char *tmp_exp3;
gchar *c;
for (p = 0; p < l; p++) /* count conversions... */
if (exp[p] == '%')
@ -1450,14 +1481,12 @@ edit_find_string (long start, unsigned char *exp, int *len, long last_byte, edit
n++;
if (replace_scanf || replace_regexp) {
int c;
unsigned char *buf;
unsigned char mbuf[MAX_REPL_LEN * 2 + 3];
replace_scanf = (!replace_regexp); /* can't have both */
buf = mbuf;
if (replace_scanf) {
unsigned char e[MAX_REPL_LEN];
if (n >= NUM_REPL_ARGS)
@ -1465,13 +1494,25 @@ edit_find_string (long start, unsigned char *exp, int *len, long last_byte, edit
if (replace_case) {
for (p = start; p < last_byte && p < start + MAX_REPL_LEN; p++)
buf[p - start] = (*get_byte) (data, p);
buf[p - start] = *(*get_byte) (data, p);
} else {
for (p = 0; exp[p] != 0; p++)
exp[p] = my_lower_case (exp[p]);
for (p = start; p < last_byte && p < start + MAX_REPL_LEN; p++) {
c = (*get_byte) (data, p);
buf[p - start] = my_lower_case (c);
tmp_exp3 = exp;
tmp_exp1 = tmp_exp2 = g_strdup((gchar *)exp);
tmp_len = str_length((char *)exp);
while (str_tolower(tmp_exp1, &tmp_exp3, &tmp_len))
tmp_exp1+=str_length_char(tmp_exp1);
g_free(tmp_exp2);
p = start;
while(p < last_byte && p < start + MAX_REPL_LEN)
{
c = tmp_exp2 = (*get_byte) (data, p);
tmp_exp1 = (gchar *) &buf[p - start];
tmp_len=7;
str_tolower(tmp_exp2, &tmp_exp1, &tmp_len);
p+= str_length_char(c);
}
}
@ -1479,7 +1520,6 @@ edit_find_string (long start, unsigned char *exp, int *len, long last_byte, edit
strcpy ((char *) e, (char *) exp);
strcat ((char *) e, "%n");
exp = e;
while (q) {
*((int *) sargs[n]) = 0; /* --> here was the problem - now fixed: good */
if (n == sscanf ((char *) buf, (char *) exp, SCANF_ARGS)) {
@ -1492,10 +1532,12 @@ edit_find_string (long start, unsigned char *exp, int *len, long last_byte, edit
return -2;
if (q + start < last_byte) {
if (replace_case) {
buf[q] = (*get_byte) (data, q + start);
buf[q] = *(*get_byte) (data, q + start);
} else {
c = (*get_byte) (data, q + start);
buf[q] = my_lower_case (c);
tmp_exp1 = (gchar *) &buf[q];
tmp_len=7;
str_tolower(c, &tmp_exp1, &tmp_len);
}
q++;
}
@ -1513,13 +1555,13 @@ edit_find_string (long start, unsigned char *exp, int *len, long last_byte, edit
int found_start, match_bol, move_win = 0;
while (start + offset < last_byte) {
match_bol = (start == 0 || (*get_byte) (data, start + offset - 1) == '\n');
match_bol = (start == 0 || *(*get_byte) (data, start + offset - 1) == '\n');
if (!move_win) {
p = start + offset;
q = 0;
}
for (; p < last_byte && q < MAX_REPL_LEN; p++, q++) {
mbuf[q] = (*get_byte) (data, p);
mbuf[q] = *(*get_byte) (data, p);
if (mbuf[q] == '\n') {
q++;
break;
@ -1564,31 +1606,70 @@ edit_find_string (long start, unsigned char *exp, int *len, long last_byte, edit
} else {
*len = str_term_width1 ((const char *) exp);
if (replace_case) {
for (p = start; p <= last_byte - l; p++) {
if ((*get_byte) (data, p) == (unsigned char)exp[0]) { /* check if first char matches */
for (f = 0, q = 0; q < l && f < 1; q++)
if ((*get_byte) (data, q + p) != (unsigned char)exp[q])
p = start;
while ( p <= last_byte - l)
{
c = (*get_byte) (data, p);
if ( !strncmp(c, exp, str_length_char(c)) )
{ /* check if first char matches */
f = 0;
q = 0;
while ( q < l && f < 1)
{
tmp_exp1 = (*get_byte) (data, q + p);
tmp_len = str_length_char(tmp_exp1);
if ( strncmp(tmp_exp1, &exp[q], (tmp_len==0)?1:tmp_len ) )
{
f = 1;
}
if (tmp_len)
q += tmp_len;
else
q++;
}
if (f == 0)
return p;
}
if (once_only)
return -2;
p+= str_length_char(c);
}
} else {
for (p = 0; exp[p] != 0; p++)
exp[p] = my_lower_case (exp[p]);
tmp_exp3 = exp;
tmp_exp1 = tmp_exp2 = g_strdup((gchar *)exp);
tmp_len = strlen((char *) exp);
while (str_tolower(tmp_exp1, &tmp_exp3, &tmp_len))
tmp_exp1+=str_length_char(tmp_exp1);
for (p = start; p <= last_byte - l; p++) {
if (my_lower_case ((*get_byte) (data, p)) == (unsigned char)exp[0]) {
for (f = 0, q = 0; q < l && f < 1; q++)
if (my_lower_case ((*get_byte) (data, q + p)) != (unsigned char)exp[q])
g_free(tmp_exp2);
p = start;
while(p < last_byte -l)
{
c = (*get_byte) (data, p);
tmp_exp1 = my_lower_case_static(c);
if (! strncmp((const char *)tmp_exp1, (const char *)&exp[0], strlen( (const char *) tmp_exp1)))
{
f = 0;
q = 0;
while (q < l && f < 1)
{
tmp_exp1 = my_lower_case_static((*get_byte) (data, q + p));
if ( strncmp((const char *)tmp_exp1, (const char *)&exp[q], strlen((const char *)tmp_exp1)))
f = 1;
if (f == 0)
if (strlen(tmp_exp1))
q += strlen(tmp_exp1);
else
q++;
}
if (f == 0){
return p;
}
}
if (once_only)
return -2;
p+= str_length_char(c);
}
}
}
@ -1607,8 +1688,9 @@ edit_find_forwards (long search_start, unsigned char *exp, int *len, long last_b
if (replace_whole) {
/*If the bordering chars are not in option_whole_chars_search then word is whole */
if (!strcasechr (option_whole_chars_search, (*get_byte) (data, p - 1))
&& !strcasechr (option_whole_chars_search, (*get_byte) (data, p + *len)))
&& !strcasechr (option_whole_chars_search, (*get_byte) (data, p + *len))){
return p;
}
if (once_only)
return -2;
} else
@ -1870,7 +1952,7 @@ edit_replace_cmd (WEdit *edit, int again)
long new_start;
new_start =
edit_find (edit->search_start, (unsigned char *) input1, &len,
last_search, edit_get_byte, (void *) edit, pmatch);
last_search, edit_get_byte_ptr, (void *) edit, pmatch);
if (new_start == -3) {
regexp_error (edit);
break;
@ -2059,7 +2141,6 @@ void edit_search_cmd (WEdit * edit, int again)
if (exp && *exp)
convert_from_input (exp);
#endif /* HAVE_CHARSET */
edit_push_action (edit, KEY_PRESS + edit->start_display);
}
@ -2075,7 +2156,7 @@ void edit_search_cmd (WEdit * edit, int again)
long p, q = 0;
for (;;) {
p = edit_find (q, (unsigned char *) exp, &len, edit->last_byte,
edit_get_byte, (void *) edit, 0);
edit_get_byte_ptr, (void *) edit, 0);
if (p < 0)
break;
found++;
@ -2102,7 +2183,7 @@ void edit_search_cmd (WEdit * edit, int again)
edit->search_start++;
edit->search_start = edit_find (edit->search_start, (unsigned char *) exp, &len, edit->last_byte,
edit_get_byte, (void *) edit, 0);
edit_get_byte_ptr, (void *) edit, 0);
if (edit->search_start >= 0) {
edit->found_start = edit->search_start;
@ -2760,7 +2841,7 @@ edit_collect_completions (WEdit *edit, long start, int word_len,
/* get next match */
start =
edit_find (start - 1, (unsigned char *) match_expr, &len,
edit->last_byte, edit_get_byte, (void *) edit, 0);
edit->last_byte, edit_get_byte_ptr, (void *) edit, 0);
/* not matched */
if (start < 0)

View File

@ -573,6 +573,12 @@ str_length (const char *text)
return used_class.length (text);
}
int
str_length_char (const char *text)
{
return str_cget_next_char_safe (text)-text;
}
int
str_length2 (const char *text, int size)
{

View File

@ -327,6 +327,11 @@ int str_length (const char* text);
*/
int str_length2 (const char* text, int size);
/* return length of one char
* I
*/
int str_length_char (const char *);
/* return length of text in characters, count only noncombining characters
* I
*/