?? findrep.c
字號:
#include "tdestr.h"
#include "common.h"
#include "tdefunc.h"
#include "define.h"
int get_replacement_flags( int line )
{
char line_buff[(MAX_COLS+1)*2]; /* buffer for char and attribute */
register int c;
int func;
int rc;
save_screen_line( 0, line, line_buff );
eol_clear( 0, line, g_display.text_color );
s_output( find1, line, 0, g_display.message_color );
xygoto( strlen( find1 ) + 2, line );
do {
c = getkey( );
func = getfunc( c );
} while (c != 'P' && c != 'p' && c != 'N' && c != 'n' &&
c != RTURN && c != ESC && func != AbortCommand);
restore_screen_line( 0, line, line_buff );
switch (c) {
case 'P' :
case 'p' :
case RTURN :
g_status.replace_flag = PROMPT;
rc = OK;
break;
case 'N' :
case 'n' :
g_status.replace_flag = NOPROMPT;
rc = OK;
break;
default :
rc = ERROR;
}
bm.search_defined = rc;
return( rc );
}
int ask_replace( WINDOW *window, int *finished )
{
char line_buff[(MAX_COLS+1)*2]; /* buffer for char and attribute */
register int c;
int func;
int prompt_line;
int rc;
prompt_line = window->cline - 1;
c = 39 - (strlen( find2 ) >> 1);
save_screen_line( 0, prompt_line, line_buff );
s_output( find2, prompt_line, c, g_display.message_color );
do {
c = getkey( );
func = getfunc( c );
} while (c != 'R' && c != 'r' && c != 'S' && c != 's' && c != 'E' && c != 'e'
&& c != ESC && func != AbortCommand);
restore_screen_line( 0, prompt_line, line_buff );
switch (c) {
case 'R' :
case 'r' :
rc = OK;
break;
case 'E' :
case 'e' :
*finished = TRUE;
case 'S' :
case 's' :
rc = ERROR;
break;
default :
*finished = TRUE;
rc = ERROR;
break;
}
return( rc );
}
int ask_wrap_replace( WINDOW *window, int *finished )
{
char line_buff[(MAX_COLS+1)*2];
register int c;
int func;
int prompt_line;
int rc;
prompt_line = window->bottom_line;
save_screen_line( 0, prompt_line, line_buff );
set_prompt( find3, prompt_line );
do {
c = getkey( );
func = getfunc( c );
} while (c != 'Q' && c != 'q' && c != 'C' && c != 'c' &&
c != ESC && func != AbortCommand);
restore_screen_line( 0, prompt_line, line_buff );
switch (c) {
case 'C' :
case 'c' :
rc = OK;
break;
case 'Q' :
case 'q' :
default :
*finished = TRUE;
rc = ERROR;
break;
}
return( rc );
}
void do_replace( WINDOW *window, int direction )
{
int old_len;
int new_len;
int rcol;
register int net_change;
char *source;
char *dest;
old_len = strlen( g_status.pattern );
new_len = strlen( g_status.subst );
net_change = new_len - old_len;
rcol = window->rcol;
g_status.copied = FALSE;
copy_line( window->ll );
detab_linebuff( );
if (net_change != 0) {
assert( rcol + old_len >= 0);
assert( net_change <= rcol + old_len );
source = g_status.line_buff + rcol + old_len;
dest = source + net_change;
assert( g_status.line_buff_len - rcol - old_len >= 0 );
assert( g_status.line_buff_len - rcol - old_len < MAX_LINE_LENGTH );
memmove( dest, source, g_status.line_buff_len - rcol - old_len );
g_status.line_buff_len += net_change;
}
assert( rcol >= 0 );
assert( rcol < MAX_LINE_LENGTH );
assert( g_status.line_buff_len >= 0 );
assert( g_status.line_buff_len >= rcol );
for (dest=g_status.line_buff+rcol, source=g_status.subst; *source;)
*dest++ = *source++;
entab_linebuff( );
window->file_info->modified = TRUE;
un_copy_line( window->ll, window, TRUE );
window->ll->dirty = TRUE;
if (direction == FORWARD)
window->rcol += (new_len - 1);
assert( window->rcol >= 0 );
show_avail_mem( );
}
/*
* 作用: 建立并且執(zhí)行查找操作
* 參數(shù): window: 當前窗口的指針
*/
int find_string( WINDOW *window )
{
int direction;
int new_string;
char pattern[MAX_COLS];
long found_line;
long bin_offset;
line_list_ptr ll;
register WINDOW *win;
int rc;
int old_rcol;
int rcol;
switch (g_status.command) {
case FindForward :
direction = FORWARD;
new_string = TRUE;
break;
case FindBackward :
direction = BACKWARD;
new_string = TRUE;
break;
case RepeatFindForward1 :
case RepeatFindForward2 :
direction = FORWARD;
new_string = bm.search_defined != OK ? TRUE : FALSE;
break;
case RepeatFindBackward1 :
case RepeatFindBackward2 :
direction = BACKWARD;
new_string = bm.search_defined != OK ? TRUE : FALSE;
break;
default :
direction = 0;
new_string = 0;
assert( FALSE );
break;
}
win = window;
entab_linebuff( );
if (un_copy_line( win->ll, win, TRUE ) == ERROR)
return( ERROR );
/*
* 得到搜索文本,上次的搜索文本做為缺省值
*/
if (new_string == TRUE) {
*pattern = '\0';
if (bm.search_defined == OK) {
assert( strlen( (char *)bm.pattern ) < MAX_COLS );
strcpy( pattern, (char *)bm.pattern );
}
/*
* 查找
*/
if (get_name( find4, win->bottom_line, pattern,
g_display.message_color ) != OK || *pattern == '\0')
return( ERROR );
bm.search_defined = OK;
assert( strlen( pattern ) < MAX_COLS );
strcpy( (char *)bm.pattern, pattern );
build_boyer_array( );
}
rc = OK;
if (bm.search_defined == OK) {
old_rcol = win->rcol;
if (mode.inflate_tabs)
win->rcol = entab_adjust_rcol( win->ll->line, win->ll->len, win->rcol);
update_line( win );
show_search_message( SEARCHING, g_display.diag_color );
bin_offset = win->bin_offset;
if (direction == FORWARD) {
if ((ll = forward_boyer_moore_search( win, &found_line, &rcol )) != NULL) {
if (g_status.wrapped && g_status.macro_executing)
rc = ask_wrap_replace( win, &new_string );
if (rc == OK)
find_adjust( win, ll, found_line, rcol );
else
win->bin_offset = bin_offset;
}
} else {
if ((ll = backward_boyer_moore_search( win, &found_line, &rcol )) != NULL) {
if (g_status.wrapped && g_status.macro_executing)
rc = ask_wrap_replace( win, &new_string );
if (rc == OK)
find_adjust( win, ll, found_line, rcol );
else
win->bin_offset = bin_offset;
}
}
if (g_status.wrapped)
show_search_message( WRAPPED, g_display.diag_color );
else
show_search_message( CLR_SEARCH, g_display.mode_color );
if (ll == NULL) {
/*
* 沒有找到
*/
if (mode.inflate_tabs)
win->rcol = old_rcol;
combine_strings( pattern, find5a, (char *)bm.pattern, find5b );
error( WARNING, win->bottom_line, pattern );
rc = ERROR;
}
show_curl_line( win );
make_ruler( win );
show_ruler( win );
} else {
/*
* 沒有定義查找模式
*/
error( WARNING, win->bottom_line, find6 );
rc = ERROR;
}
return( rc );
}
void build_boyer_array( void )
{
if (g_status.command == DefineGrep || g_status.command == RepeatGrep) {
assert( strlen( (char *)sas_bm.pattern ) + 1 < MAX_COLS );
memcpy( bm.pattern, sas_bm.pattern, strlen( (char *)sas_bm.pattern ) +1 );
bm.search_defined = OK;
}
if (bm.search_defined == OK) {
build_forward_skip( &bm );
bm.forward_md2 = calculate_forward_md2( (char *)bm.pattern,
bm.pattern_length );
build_backward_skip( &bm );
bm.backward_md2 = calculate_backward_md2( (char *)bm.pattern,
bm.pattern_length );
}
if (sas_bm.search_defined == OK) {
build_forward_skip( &sas_bm );
sas_bm.forward_md2 = calculate_forward_md2( (char *)sas_bm.pattern,
sas_bm.pattern_length );
build_backward_skip( &sas_bm );
sas_bm.backward_md2 = calculate_backward_md2( (char *)sas_bm.pattern,
sas_bm.pattern_length );
}
}
void build_forward_skip( boyer_moore_type *bmp )
{
register unsigned char *p;
register int i;
assert( strlen( (char *)bmp->pattern ) < MAX_COLS );
i = bmp->pattern_length = (int)strlen( (char *)bmp->pattern );
memset( bmp->skip_forward, i, 256 );
i--;
for (p=bmp->pattern; i>=0; i--, p++) {
assert( (char)i < bmp->skip_forward[*p] );
bmp->skip_forward[*p] = (char)i;
if (mode.search_case == IGNORE) {
if (*p >= 'A' && *p <= 'Z') {
assert( (char)i < bmp->skip_forward[*p+32] );
bmp->skip_forward[*p+32] = (char)i;
} else if (*p >= 'a' && *p <= 'z') {
assert( (char)i < bmp->skip_forward[*p-32] );
bmp->skip_forward[*p-32] = (char)i;
}
}
}
}
void build_backward_skip( boyer_moore_type *bmp )
{
register unsigned char *p;
register int i;
i = -bmp->pattern_length;
memset( bmp->skip_backward, i, 256 );
i++;
for (p=bmp->pattern + bmp->pattern_length - 1; i<=0; i++, p--) {
assert( (char)i > bmp->skip_backward[*p] );
bmp->skip_backward[*p] = (char)i;
if (mode.search_case == IGNORE) {
if (*p >= 'A' && *p <= 'Z') {
assert( (char)i > bmp->skip_backward[*p+32] );
bmp->skip_backward[*p+32] = (char)i;
} else if (*p >= 'a' && *p <= 'z') {
assert( (char)i > bmp->skip_backward[*p-32] );
bmp->skip_backward[*p-32] = (char)i;
}
}
}
}
int calculate_forward_md2( char *p, int len )
{
int last_c;
register int i;
register int md2;
md2 = 1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -