?? block.c
字號(hào):
#include "tdestr.h"
#include "common.h"
#include "tdefunc.h"
#include "define.h"
int mark_block( WINDOW *window )
{
int type;
int num;
long lnum;
register file_infos *file; /* 臨時(shí)文件 */
register WINDOW *win; /* 把當(dāng)前窗口指針?lè)诺揭粋€(gè)臨時(shí)寄存器里面 */
int rc;
win = window;
file = win->file_info;
if (win->rline > file->length || win->ll->len == EOF)
return( ERROR );
if (g_status.marked == FALSE) {
g_status.marked = TRUE;
g_status.marked_file = file;
}
if (g_status.command == MarkBox)
type = BOX;
else if (g_status.command == MarkLine)
type = LINE;
else if (g_status.command == MarkStream)
type = STREAM;
else
return( ERROR );
rc = OK;
/*
* 僅對(duì)于一個(gè)文件定義塊。用戶可以在這個(gè)文件的任何窗口進(jìn)行操作。
*/
if (file == g_status.marked_file) {
/*
* 不管塊的模式標(biāo)識(shí)塊的起始和中止位置
*/
if (file->block_type == NOTMARKED) {
file->block_ec = file->block_bc = win->rcol;
file->block_er = file->block_br = win->rline;
} else {
if (file->block_br > win->rline) {
file->block_br = win->rline;
if (file->block_bc < win->rcol && type != STREAM)
file->block_ec = win->rcol;
else
file->block_bc = win->rcol;
} else {
if (type != STREAM) {
file->block_ec = win->rcol;
file->block_er = win->rline;
} else {
if (win->rline == file->block_br &&
win->rline == file->block_er) {
if (win->rcol < file->block_bc)
file->block_bc = win->rcol;
else
file->block_ec = win->rcol;
} else if (win->rline == file->block_br)
file->block_bc = win->rcol;
else {
file->block_ec = win->rcol;
file->block_er = win->rline;
}
}
}
/*
* 如果用戶標(biāo)識(shí)的塊的終止位置在起始位置前,那么交換兩個(gè)位置。
*/
if (file->block_er < file->block_br) {
lnum = file->block_er;
file->block_er = file->block_br;
file->block_br = lnum;
}
/*
* 如果用戶標(biāo)識(shí)的塊的終止列在起始列前,那么交換兩個(gè)位置。
*/
if ((file->block_ec < file->block_bc) && (type != STREAM ||
(type == STREAM && file->block_br == file->block_er))) {
num = file->block_ec;
file->block_ec = file->block_bc;
file->block_bc = num;
}
}
/*
* 如果塊類型已經(jīng)被定義,但是如果用戶使用混和模式,那么塊的
* 類型被置為當(dāng)前塊的類型
*/
if (file->block_type != NOTMARKED) {
/*
* 如果塊的類型是矩形塊,那么要保證左上角小于右下腳
* 如果塊的類型是stream塊,那么保證起始列小于中止列
*/
if (type == BOX) {
if (file->block_ec < file->block_bc) {
num = file->block_ec;
file->block_ec = file->block_bc;
file->block_bc = num;
}
}
}
assert( file->block_er >= file->block_br );
file->block_type = type;
file->dirty = GLOBAL;
} else {
/*
* 已經(jīng)定義好塊
*/
error( WARNING, win->bottom_line, block1 );
rc = ERROR;
}
return( rc );
}
int unmark_block( WINDOW *arg_filler )
{
register file_infos *marked_file;
if (g_status.marked == TRUE) {
marked_file = g_status.marked_file;
g_status.marked = FALSE;
g_status.marked_file = NULL;
marked_file->block_start = NULL;
marked_file->block_end = NULL;
marked_file->block_bc = marked_file->block_ec = 0;
marked_file->block_br = marked_file->block_er = 0l;
if (marked_file->block_type)
marked_file->dirty = GLOBAL;
marked_file->block_type = NOTMARKED;
}
return( OK );
void restore_marked_block( WINDOW *window, int net_change )
{
long length;
register file_infos *marked_file;
if (g_status.marked == TRUE && net_change != 0) {
marked_file = g_status.marked_file;
length = marked_file->length;
if (marked_file == window->file_info) {
if (marked_file->block_br > window->rline) {
marked_file->block_br += net_change;
marked_file->block_er += net_change;
marked_file->dirty = GLOBAL;
} else if (marked_file->block_er >= window->rline)
marked_file->dirty = GLOBAL;
if (marked_file->block_br > length)
unmark_block( window );
else if (marked_file->block_er > length) {
marked_file->block_er = length;
marked_file->dirty = GLOBAL;
}
}
}
}
int prepare_block( WINDOW *window, line_list_ptr ll, int bc )
{
register int pad = 0;
register int len;
assert( bc >= 0 );
assert( bc < MAX_LINE_LENGTH );
assert( ll->len != EOF );
assert( g_status.copied == FALSE );
copy_line( ll );
detab_linebuff( );
len = g_status.line_buff_len;
pad = bc - len;
if (pad > 0) {
assert( pad >= 0 );
assert( pad < MAX_LINE_LENGTH );
memset( g_status.line_buff+len, ' ', pad );
g_status.line_buff_len += pad;
}
return( un_copy_line( ll, window, FALSE ) );
}
int pad_dest_line( WINDOW *window, file_infos *dest_file, line_list_ptr ll )
{
int rc;
text_ptr l;
line_list_ptr new_node;
rc = OK;
l = NULL;
new_node = (line_list_ptr)my_malloc( sizeof(line_list_struc), &rc );
if (rc == OK) {
new_node->len = 0;
new_node->dirty = FALSE;
new_node->line = l;
if (ll->next != NULL) {
ll->next->prev = new_node;
new_node->next = ll->next;
ll->next = new_node;
new_node->prev = ll;
} else {
new_node->next = ll;
if (ll->prev != NULL)
ll->prev->next = new_node;
new_node->prev = ll->prev;
ll->prev = new_node;
if (new_node->prev == NULL)
window->file_info->line_list = new_node;
}
++dest_file->length;
} else {
error( WARNING, window->bottom_line, block4 );
if (new_node != NULL)
my_free( new_node );
rc = ERROR;
}
return( rc );
}
int move_copy_delete_overlay_block( WINDOW *window )
{
int action;
WINDOW *source_window;
line_list_ptr source;
line_list_ptr dest;
long number;
int lens;
int lend;
int add;
int block_len;
line_list_ptr block_start;
line_list_ptr block_end;
int prompt_line;
int same;
int source_first;
file_infos *source_file;
file_infos *dest_file;
int rcol, bc, ec;
long rline;
long br, er;
long block_num;
long block_inc;
int block_just;
int block_type;
int fill_char;
int rc;
entab_linebuff( );
rc = un_copy_line( window->ll, window, TRUE );
if (g_status.marked == FALSE || rc == ERROR)
return( ERROR );
switch (g_status.command) {
case MoveBlock :
action = MOVE;
break;
case DeleteBlock :
action = DELETE;
break;
case CopyBlock :
action = COPY;
break;
case KopyBlock :
action = KOPY;
break;
case FillBlock :
action = FILL;
break;
case OverlayBlock :
action = OVERLAY;
break;
case NumberBlock :
action = NUMBER;
break;
case SwapBlock :
action = SWAP;
break;
default :
return( ERROR );
}
source_file = g_status.marked_file;
source_window = g_status.window_list;
for (; ptoul( source_window->file_info ) != ptoul( source_file );)
source_window = source_window->next;
prompt_line = window->bottom_line;
dest_file = window->file_info;
check_block( );
if (g_status.marked == FALSE)
return( ERROR );
block_start = source_file->block_start;
block_end = source_file->block_end;
if (block_start == NULL || block_end == NULL)
return( ERROR );
block_type = source_file->block_type;
if (block_type != LINE && block_type != STREAM && block_type != BOX)
return( ERROR );
dest = window->ll;
rline = window->rline;
if (dest->len == EOF)
return( ERROR );
rc = OK;
bc = source_file->block_bc;
ec = source_file->block_ec;
br = source_file->block_br;
er = source_file->block_er;
rcol = (action == FILL || action == NUMBER) ? bc : window->rcol;
source_first = same = FALSE;
if (action == FILL) {
if (block_type == BOX) {
if (get_block_fill_char( window, &fill_char ) == ERROR)
return( ERROR );
dest = block_start;
same = TRUE;
} else {
error( WARNING, prompt_line, block2 );
return( ERROR );
}
}
block_inc = 1;
if (action == NUMBER) {
if (block_type == BOX) {
if (get_block_numbers( window, &block_num, &block_inc, &block_just )
== ERROR)
return( ERROR );
dest = block_start;
same = TRUE;
} else {
error( WARNING, prompt_line, block3a );
return( ERROR );
}
}
if (action == SWAP) {
if (block_type != BOX) {
error( WARNING, prompt_line, block3b );
return( ERROR );
}
}
if (source_file == dest_file && action != DELETE && action != FILL) {
same = TRUE;
if (block_type == BOX && action == MOVE) {
if (rline == br && (rcol >= bc && rcol <= ec))
return( ERROR );
} else if (block_type == LINE || block_type == STREAM) {
if (rline >= br && rline <= er) {
if (block_type == LINE) {
if (action == COPY || action == KOPY)
dest = block_end;
else if (action == MOVE)
return( ERROR );
} else {
if ((rline > br && rline < er) ||
(br == er && rcol >= bc && rcol <= ec) ||
(br != er && ((rline == br && rcol >= bc) ||
(rline == er && rcol <= ec)))) {
if (action == COPY || action == KOPY) {
dest = block_end;
rcol = ec + 1;
rline = er;
} else if (action == MOVE)
return( ERROR );
}
}
}
}
}
if (br < rline)
source_first = TRUE;
block_len = (ec+1) - bc;
if (block_type == BOX) {
if (action != DELETE && action != FILL) {
if (rcol + block_len > MAX_LINE_LENGTH) {
error( WARNING, prompt_line, ltol );
return( ERROR );
}
}
} else if (block_type == LINE) {
block_len = 0;
if (action == OVERLAY) {
error( WARNING, prompt_line, block5 );
return( ERROR );
}
} else if (block_type == STREAM) {
if (action == OVERLAY) {
error( WARNING, prompt_line, block5 );
return( ERROR );
}
lend = block_end->len;
if (action == DELETE || action == MOVE) {
if (lend > ec)
lend -= ec;
else
lend = 0;
if (bc + lend > MAX_LINE_LENGTH) {
error( WARNING, prompt_line, ltol );
return( ERROR );
}
}
if (action != DELETE) {
lens = block_start->len;
if (dest->line == window->ll->line)
add = dest->len;
else
add = lens;
if (lens > bc)
lens -= bc;
else
lens = 0;
if (rcol + lens > MAX_LINE_LENGTH) {
error( WARNING, prompt_line, ltol );
return( ERROR );
}
if (add > bc)
add -= bc;
else
add = 0;
if (lend > ec)
lend -= ec;
else
lend = 0;
if (add + lend > MAX_LINE_LENGTH) {
error( WARNING, prompt_line, ltol );
return( ERROR );
}
}
if (ptoul( block_start ) == ptoul( block_end )) {
block_type = BOX;
block_len = (ec+1) - bc;
}
}
if (mode.do_backups == TRUE) {
switch (action) {
case MOVE :
case DELETE :
case COPY :
case KOPY :
case SWAP :
window->file_info->modified = TRUE;
rc = backup_file( window );
break;
}
switch (action) {
case MOVE :
case DELETE :
case FILL :
case NUMBER :
case SWAP :
source_window->file_info->modified = TRUE;
if (rc != ERROR)
rc = backup_file( source_window );
break;
}
}
source = block_start;
assert( block_start != NULL );
assert( block_start->len != EOF );
assert( block_end != NULL );
assert( block_end->len != EOF );
if (block_type == LINE)
do_line_block( window, source_window, action,
source_file, dest_file, block_start, block_end,
source, dest, br, er, &rc );
else if (block_type == STREAM)
do_stream_block( window, source_window, action,
source_file, dest_file, block_start, block_end,
source, dest, rline, br, er, bc, ec, rcol, &rc );
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -