📄 editcmd.c
字号:
buf = mbuf;
if (replace_scanf) {
unsigned char e[MAX_REPL_LEN];
if (n >= NUM_REPL_ARGS)
return -3;
if (replace_case) {
for (p = start; p < last_byte && p < start + MAX_REPL_LEN; 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);
}
}
buf[(q = p - start)] = 0;
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)) {
if (*((int *) sargs[n])) {
*len = *((int *) sargs[n]);
return start;
}
}
if (once_only)
return -2;
if (q + start < last_byte) {
if (replace_case) {
buf[q] = (*get_byte) (data, q + start);
} else {
c = (*get_byte) (data, q + start);
buf[q] = my_lower_case (c);
}
q++;
}
buf[q] = 0;
start++;
buf++; /* move the window along */
if (buf == mbuf + MAX_REPL_LEN) { /* the window is about to go past the end of array, so... */
memmove (mbuf, buf, strlen ((char *) buf) + 1); /* reset it */
buf = mbuf;
}
q--;
}
} else { /* regexp matching */
long offset = 0;
int found_start, match_bol, move_win = 0;
while (start + offset < last_byte) {
match_bol = (offset == 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);
if (mbuf[q] == '\n')
break;
}
q++;
offset += q;
mbuf[q] = 0;
buf = mbuf;
while (q) {
found_start = string_regexp_search ((char *) exp, (char *) buf, q, match_normal, match_bol, !replace_case, len);
if (found_start <= -2) { /* regcomp/regexec error */
*len = 0;
return -3;
}
else if (found_start == -1) /* not found: try next line */
break;
else if (*len == 0) { /* null pattern: try again at next character */
q--;
buf++;
match_bol = 0;
continue;
}
else /* found */
return (start + offset - q + found_start);
}
if (once_only)
return -2;
if (buf[q - 1] != '\n') { /* incomplete line: try to recover */
buf = mbuf + MAX_REPL_LEN / 2;
q = strlen ((char *) buf);
memmove (mbuf, buf, q);
p = start + q;
move_win = 1;
}
else
move_win = 0;
}
}
} else {
*len = strlen ((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])
f = 1;
if (f == 0)
return p;
}
if (once_only)
return -2;
}
} else {
for (p = 0; exp[p] != 0; p++)
exp[p] = my_lower_case (exp[p]);
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])
f = 1;
if (f == 0)
return p;
}
if (once_only)
return -2;
}
}
}
return -2;
}
long edit_find_forwards (long search_start, unsigned char *exp, int *len, long last_byte, int (*get_byte) (void *, long), void *data, int once_only)
{ /*front end to find_string to check for
whole words */
long p;
p = search_start;
while ((p = edit_find_string (p, exp, len, last_byte, get_byte, data, once_only)) >= 0) {
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)))
return p;
if (once_only)
return -2;
} else
return p;
if (once_only)
break;
p++; /*not a whole word so continue search. */
}
return p;
}
long edit_find (long search_start, unsigned char *exp, int *len, long last_byte, int (*get_byte) (void *, long), void *data)
{
long p;
if (replace_backwards) {
while (search_start >= 0) {
p = edit_find_forwards (search_start, exp, len, last_byte, get_byte, data, 1);
if (p == search_start)
return p;
search_start--;
}
} else {
return edit_find_forwards (search_start, exp, len, last_byte, get_byte, data, 0);
}
return -2;
}
#define is_digit(x) ((x) >= '0' && (x) <= '9')
#define snprintf(v) { \
*p1++ = *p++; \
*p1++ = '%'; \
*p1++ = 'n'; \
*p1 = '\0'; \
sprintf(s,q1,v,&n); \
s += n; \
}
/* this function uses the sprintf command to do a vprintf */
/* it takes pointers to arguments instead of the arguments themselves */
int sprintf_p (char *str, const char *fmt,...)
{
va_list ap;
int n;
char *q, *p, *s = str;
char q1[32];
char *p1;
va_start (ap, fmt);
p = q = (char *) fmt;
while ((p = strchr (p, '%'))) {
n = (int) ((unsigned long) p - (unsigned long) q);
strncpy (s, q, n); /* copy stuff between format specifiers */
s += n;
*s = 0;
q = p;
p1 = q1;
*p1++ = *p++;
if (*p == '%') {
p++;
*s++ = '%';
q = p;
continue;
}
if (*p == 'n') {
p++;
/* do nothing */
q = p;
continue;
}
if (*p == '#')
*p1++ = *p++;
if (*p == '0')
*p1++ = *p++;
if (*p == '-')
*p1++ = *p++;
if (*p == '+')
*p1++ = *p++;
if (*p == '*') {
p++;
strcpy (p1, itoa (*va_arg (ap, int *))); /* replace field width with a number */
p1 += strlen (p1);
} else {
while (is_digit (*p))
*p1++ = *p++;
}
if (*p == '.')
*p1++ = *p++;
if (*p == '*') {
p++;
strcpy (p1, itoa (*va_arg (ap, int *))); /* replace precision with a number */
p1 += strlen (p1);
} else {
while (is_digit (*p))
*p1++ = *p++;
}
/* flags done, now get argument */
if (*p == 's') {
snprintf (va_arg (ap, char *));
} else if (*p == 'h') {
if (strchr ("diouxX", *p))
snprintf (*va_arg (ap, short *));
} else if (*p == 'l') {
*p1++ = *p++;
if (strchr ("diouxX", *p))
snprintf (*va_arg (ap, long *));
} else if (strchr ("cdiouxX", *p)) {
snprintf (*va_arg (ap, int *));
} else if (*p == 'L') {
*p1++ = *p++;
if (strchr ("EefgG", *p))
snprintf (*va_arg (ap, double *)); /* should be long double */
} else if (strchr ("EefgG", *p)) {
snprintf (*va_arg (ap, double *));
} else if (strchr ("DOU", *p)) {
snprintf (*va_arg (ap, long *));
} else if (*p == 'p') {
snprintf (*va_arg (ap, void **));
}
q = p;
}
va_end (ap);
sprintf (s, q); /* print trailing leftover */
return (unsigned long) s - (unsigned long) str + strlen (s);
}
static void regexp_error (WEdit *edit)
{
/* "Error: Syntax error in regular expression, or scanf expression contained too many %'s */
edit_error_dialog (_(" Error "), _(" Invalid regular expression, or scanf expression with to many conversions "));
}
/* call with edit = 0 before shutdown to close memory leaks */
void edit_replace_cmd (WEdit * edit, int again)
{
static char *old1 = NULL;
static char *old2 = NULL;
static char *old3 = NULL;
char *exp1 = "";
char *exp2 = "";
char *exp3 = "";
int replace_yes;
int replace_continue;
int i = 0;
long times_replaced = 0, last_search;
char fin_string[32];
int argord[NUM_REPL_ARGS];
if (!edit) {
if (old1) {
free (old1);
old1 = 0;
}
if (old2) {
free (old2);
old2 = 0;
}
if (old3) {
free (old3);
old3 = 0;
}
return;
}
last_search = edit->last_byte;
edit->force |= REDRAW_COMPLETELY;
exp1 = old1 ? old1 : exp1;
exp2 = old2 ? old2 : exp2;
exp3 = old3 ? old3 : exp3;
if (again) {
if (!old1 || !old2)
return;
exp1 = strdup (old1);
exp2 = strdup (old2);
exp3 = strdup (old3);
} else {
edit_push_action (edit, KEY_PRESS + edit->start_display);
edit_replace_dialog (edit, &exp1, &exp2, &exp3);
}
if (!exp1 || !*exp1) {
edit->force = REDRAW_COMPLETELY;
if (exp1) {
free (exp1);
free (exp2);
free (exp3);
}
return;
}
if (old1)
free (old1);
if (old2)
free (old2);
if (old3)
free (old3);
old1 = strdup (exp1);
old2 = strdup (exp2);
old3 = strdup (exp3);
{
char *s;
int ord;
while ((s = strchr (exp3, ' ')))
memmove (s, s + 1, strlen (s));
s = exp3;
for (i = 0; i < NUM_REPL_ARGS; i++) {
if ((unsigned long) s != 1 && s < exp3 + strlen (exp3)) {
if ((ord = atoi (s)))
argord[i] = ord - 1;
else
argord[i] = i;
s = strchr (s, ',') + 1;
} else
argord[i] = i;
}
}
replace_continue = replace_all;
if (edit->found_len && edit->search_start == edit->found_start + 1 && replace_backwards)
edit->search_start--;
if (edit->found_len && edit->search_start == edit->found_start - 1 && !replace_backwards)
edit->search_start++;
do {
int len = 0;
long new_start;
new_start = edit_find (edit->search_start, (unsigned char *) exp1, &len, last_search,
(int (*) (void *, long)) edit_get_byte, (void *) edit);
if (new_start == -3) {
regexp_error (edit);
break;
}
edit->search_start = new_start;
/*returns negative on not found or error in pattern */
if (edit->search_start >= 0) {
edit->found_start = edit->search_start;
i = edit->found_len = len;
edit_cursor_move (edit, edit->search_start - edit->curs1);
edit_scroll_screen_over_cursor (edit);
replace_yes = 1;
if (replace_prompt) {
int l;
l = edit->curs_row - edit->num_widget_lines / 3;
if (l > 0)
edit_scroll_downward (edit, l);
if (l < 0)
edit_scroll_upward (edit, -l);
edit_scroll_screen_over_cursor (edit);
edit->force |= REDRAW_PAGE;
edit_render_keypress (edit);
/*so that undo stops at each query */
edit_push_key_press (edit);
switch (edit_replace_prompt (edit, exp2, /*and prompt 2/3 down */
edit->num_widget_columns / 2 - 33, edit->num_widget_lines * 2 / 3)) {
case B_ENTER:
break;
case B_SKIP_REPLACE:
replace_yes = 0;
break;
case B_REPLACE_ALL:
replace_prompt = 0;
replace_continue = 1;
break;
case B_CANCEL:
replace_yes = 0;
replace_continue = 0;
break;
}
}
if (replace_yes) { /* delete then insert new */
if (replace_scanf) {
char repl_str[MAX_REPL_LEN + 2];
if (sprintf_p (repl_str, exp2, PRINTF_ARGS) >= 0) {
times_replaced++;
while (i--)
edit_delete (edit);
while (repl_str[++i])
edit_insert (edit, repl_str[i]);
} else {
edit_error_dialog (_(" Replace "),
/* "Invalid regexp string or scanf string" */
_(" Error in replacement format string. "));
replace_continue = 0;
}
} else {
times_replaced++;
while (i--)
edit_delete (edit);
while (exp2[++i])
edit_insert (edit, exp2[i]);
}
edit->found_len = i;
}
/* so that we don't find the same string again */
if (replace_backwards) {
last_search = edit->search_start;
edit->search_start--;
} else {
edit->search_start += i;
last_search = edit->last_byte;
}
edit_scroll_screen_over_cursor (edit);
} else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -