?? file.c
字號:
_fmemcpy( l, residue, res );
if (len - res > 0)
_fmemcpy( l + res, g_status.line_buff, len - res );
res = 0;
} else
if (len > 0)
_fmemcpy( l, residue, len );
++line_count;
temp_ll->line = l;
temp_ll->dirty = FALSE;
temp_ll->len = len;
insert_node( fp, ll, temp_ll );
ll = temp_ll;
/*
* 重新設置io緩存的指針和計數器
*/
len = 1;
if (t1 == 0)
residue = g_status.tabout_buff;
else {
t1--;
residue = t1 == 0 ? g_status.tabout_buff : ++e;
}
} else
rc = show_file_2big( name, prompt_line, temp_ll, l );
} else if (len < READ_LENGTH ) {
if (!feof( stream ))
res = len - 1;
} else {
error( WARNING, prompt_line, "FRANK: error reading file!" );
rc = ERROR;
}
}
}
if (rc != OK)
break;
/*
* 我們已經讀入了所有的以'\n'結尾的行,但是'\n'之后可能還有
* 一些其他的字符,比如^Z。
*/
if (feof( stream )) {
if (len > 1) {
--len;
if (t1 == 0)
--e;
assert( len >= 0 );
assert( len < MAX_LINE_LENGTH );
/*
* 為剛剛讀入的行分配內存。
*/
l = (text_ptr)my_malloc( len * sizeof(char), &rc );
temp_ll =
(line_list_ptr)my_malloc( sizeof(line_list_struc), &rc );
if (rc != ERROR) {
/*
* 如果一切正常,把io緩存中的內容拷貝到內存中去
* "residue" 跟蹤io緩存中的行首
*/
if (res > 0) {
assert( res >= 0 );
assert( res < MAX_LINE_LENGTH);
assert( len - res >= 0 );
assert( len - res < MAX_LINE_LENGTH);
if (res > 0 )
_fmemcpy( l, residue, res );
if (len - res > 0)
_fmemcpy( l + res, g_status.line_buff, len - res );
} else
if (len > 0)
_fmemcpy( l, residue, len );
++line_count;
temp_ll->line = l;
temp_ll->dirty = FALSE;
temp_ll->len = len;
insert_node( fp, ll, temp_ll );
} else
rc = show_file_2big( name, prompt_line, temp_ll, l );
}
break;
}
t2 = fread( g_status.tabout_buff, sizeof(char), READ_LENGTH, stream );
if (ferror( stream ) || ceh.flag == ERROR) {
combine_strings( buff, "error reading file '", name, "'" );
error( WARNING, prompt_line, buff );
rc = ERROR;
} else if (rc == OK) {
e = g_status.tabout_buff;
while (t2 && rc == OK) {
for (; t2 && len < READ_LENGTH && *e != '\n'; len++, e++, t2--);
if (t2 || len >= READ_LENGTH) {
if (len > 1 && *e == '\n') {
if (len - res == 1) {
if (*(residue + res - 1) == '\r') {
--len;
--res;
crlf = CRLF;
}
} else {
if (*(e - 1) == '\r') {
--len;
crlf = CRLF;
}
}
}
if (len > 0)
--len;
assert( len >= 0 );
assert( len < MAX_LINE_LENGTH );
l = (text_ptr)my_malloc( len * sizeof(char), &rc );
temp_ll =
(line_list_ptr)my_malloc( sizeof(line_list_struc), &rc );
if (rc != ERROR) {
if (res > 0) {
assert( res >= 0 );
assert( res < MAX_LINE_LENGTH);
assert( len - res >= 0 );
assert( len - res < MAX_LINE_LENGTH);
if (res > 0)
_fmemcpy( l, residue, res );
if (len - res > 0)
_fmemcpy( l+res, g_status.tabout_buff, len - res );
res = 0;
} else
if (len > 0)
_fmemcpy( l, residue, len );
++line_count;
temp_ll->line = l;
temp_ll->dirty = FALSE;
temp_ll->len = len;
insert_node( fp, ll, temp_ll );
ll = temp_ll;
len = 1;
if (t2 == 0)
residue = g_status.line_buff;
else {
t2--;
residue = t2 == 0 ? g_status.line_buff : ++e;
}
} else
rc = show_file_2big( name, prompt_line, temp_ll, l );
} else if (len < READ_LENGTH) {
if (!feof( stream ))
res = len - 1;
} else {
error( WARNING, prompt_line, "FRANK: error reading file!" );
rc = ERROR;
}
}
}
if (rc != ERROR && feof( stream )) {
if (len > 1) {
--len;
if (t2 == 0)
--e;
assert( len >= 0 );
assert( len < MAX_LINE_LENGTH );
l = (text_ptr)my_malloc( len * sizeof(char), &rc );
temp_ll =
(line_list_ptr)my_malloc( sizeof(line_list_struc), &rc );
if (rc != ERROR) {
if (res > 0) {
assert( res >= 0 );
assert( res < MAX_LINE_LENGTH);
assert( len - res >= 0 );
assert( len - res < MAX_LINE_LENGTH);
if (res > 0)
_fmemcpy( l, residue, res );
if (len - res > 0)
_fmemcpy( l+res, g_status.tabout_buff, len - res );
} else
if (len > 0)
_fmemcpy( l, residue, len );
++line_count;
temp_ll->line = l;
temp_ll->dirty = FALSE;
temp_ll->len = len;
insert_node( fp, ll, temp_ll );
} else
rc = show_file_2big( name, prompt_line, temp_ll, l );
}
break;
}
}
*file_mode = crlf;
}
/*關閉文件close the file
*/
fp->length = line_count;
}
if (stream != NULL)
fclose( stream );
return( rc );
}
void insert_node( file_infos *fp, line_list_ptr current, line_list_ptr new )
{
if (current->next != NULL) {
current->next->prev = new;
new->next = current->next;
current->next = new;
new->prev = current;
} else {
new->next = current;
if (current->prev != NULL)
current->prev->next = new;
new->prev = current->prev;
current->prev = new;
if (new->prev == NULL)
fp->line_list = new;
}
}
int show_file_2big( char *name, int prompt_line, line_list_ptr ll, text_ptr t )
{
char buff[MAX_COLS+2];
combine_strings( buff, main10a, name, main10b );
error( WARNING, prompt_line, buff );
if (t != NULL)
my_free( t );
if (ll != NULL)
my_free( ll );
return( WARNING );
}
int backup_file( WINDOW *window )
{
char *old_line_buff;
char *old_tabout_buff;
int old_line_buff_len;
int old_tabout_buff_len;
int old_copied;
int rc;
file_infos *file;
rc = OK;
file = window->file_info;
if (file->backed_up == FALSE && file->modified == TRUE) {
old_copied = g_status.copied;
old_line_buff_len = g_status.line_buff_len;
old_line_buff = calloc( MAX_LINE_LENGTH, sizeof(char) );
old_tabout_buff_len = g_status.tabout_buff_len;
old_tabout_buff = calloc( MAX_LINE_LENGTH, sizeof(char) );
if (old_line_buff != NULL && old_tabout_buff != NULL) {
memcpy( old_line_buff, g_status.line_buff, MAX_LINE_LENGTH );
memcpy( old_tabout_buff, g_status.tabout_buff, MAX_LINE_LENGTH );
if ((rc = save_backup( window )) != ERROR)
file->backed_up = TRUE;
else
rc = ERROR;
memcpy( g_status.line_buff, old_line_buff, MAX_LINE_LENGTH );
memcpy( g_status.tabout_buff, old_tabout_buff, MAX_LINE_LENGTH );
g_status.line_buff_len = old_line_buff_len;
g_status.tabout_buff_len = old_tabout_buff_len;
g_status.copied = old_copied;
} else {
error( WARNING, window->bottom_line, main4 );
rc = ERROR;
}
if (old_line_buff != NULL)
free( old_line_buff );
if (old_tabout_buff != NULL)
free( old_tabout_buff );
}
return( rc );
}
int edit_file( char *name, int file_mode, int bin_length )
{
int rc;
int existing;
int line;
int rcol;
register file_infos *file;
file_infos *fp;
long found_line;
line_list_ptr ll;
line_list_ptr temp_ll;
line = g_display.nlines;
rc = OK;
file = (file_infos *)calloc( 1, sizeof(file_infos) );
if (file == NULL) {
error( WARNING, line, main4 );
rc = ERROR;
}
existing = FALSE;
if (rc == OK && hw_fattrib( name ) == OK) {
existing = TRUE;
if (g_status.command != DefineGrep &&
g_status.command != DefineRegXGrep &&
g_status.command != RepeatGrep)
rc = load_file( name, file, &file_mode, bin_length );
else {
if (g_status.sas_defined) {
rc = load_file( name, file, &file_mode, bin_length );
if (rc != ERROR) {
found_line = 1L;
rcol = 0;
if (g_status.sas_search_type == BOYER_MOORE)
ll = search_forward( file->line_list, &found_line,
(size_t *)&rcol );
else
ll = regx_search_forward( file->line_list, &found_line,
&rcol );
if (ll == NULL)
rc = ERROR;
else {
g_status.sas_rline = found_line;
g_status.sas_rcol = rcol;
g_status.sas_ll = ll;
}
}
} else
rc = ERROR;
}
} else {
if (ceh.flag == ERROR)
rc = ERROR;
else {
existing = FALSE;
file->length = 0l;
file->undo_top = file->undo_bot = NULL;
file->line_list_end = file->line_list = NULL;
file->undo_count = 0;
ll = (line_list_ptr)my_malloc( sizeof(line_list_struc), &rc );
if (ll != NULL) {
ll->line = NULL;
ll->next = ll->prev = NULL;
ll->dirty = FALSE;
ll->len = EOF;
file->undo_top = file->undo_bot = ll;
} else
rc = ERROR;
ll = (line_list_ptr)my_malloc( sizeof(line_list_struc), &rc );
if (ll != NULL) {
ll->line = NULL;
ll->next = ll->prev = NULL;
ll->dirty = FALSE;
ll->len = EOF;
file->line_list_end = file->line_list = ll;
} else
rc = ERROR;
if (rc == ERROR) {
if (file->undo_top != NULL)
my_free( file->undo_top );
if (file->line_list != NULL)
my_free( file->line_list );
} else
if (file_mode == TEXT)
file_mode = CRLF;
}
}
if (rc != ERROR) {
file->prev = NULL;
file->next = NULL;
if (g_status.file_list == NULL)
g_status.file_list = file;
else {
fp = g_status.current_file;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -