?? main.c
字號:
char *greatest_composer_ever = "EDITOR";
#include "tdestr.h"
#include "common.h"
#include "define.h"
#include "help.h"
#include "tdefunc.h"
#include <dos.h> /* 對文件重命名需要調用這個庫 */
#include <bios.h> /* 直接取得鍵盤的輸入要需要調用這個庫 */
#include <io.h> /* 取得文件的屬性值需要調用這個庫 */
#include <fcntl.h> /* 打開文件的時候標志 */
#if defined( __MSC__ )
#include <errno.h>
#include <sys\types.h> /* 定義了常量和諸如時間格式的數據類型 */
#endif
#include <sys\stat.h> /* 定義了文件狀態位等常量和全局數據 */
#if defined( __MSC__ )
void (interrupt far *old_control_c)( ); /* 為老的ctrl-c設置變量 */
void (interrupt far *old_int1b)( ); /* 為老的中斷int 1b設置變量 */
#endif
/*
* 原來的檢查control-break標志位
*/
static int s_cbrk;
/*
* 函數作用: 處理系統命令行調用主要的編輯函數。
* 參數: argc: 命令行參數的個數
* argv: 命令行參數
*/
void main( int argc, char *argv[] )
{
#if defined( __MSC__ )
union REGS inregs, outregs;
#endif
g_status.found_first = FALSE;
g_status.arg = 1;
g_status.argc = argc;
g_status.argv = argv;
/*
* control-break的中斷對于我們程序沒有破壞,所以我們把對它的檢查關閉。
*/
#if defined( __MSC__ )
inregs.h.ah = 0x33;
inregs.h.al = 0;
intdos( &inregs, &outregs );
s_cbrk = outregs.h.dl;
old_control_c = _dos_getvect( (unsigned)0x23 );
_dos_setvect( 0x23, harmless );
old_int1b = _dos_getvect( (unsigned)0x1b );
_dos_setvect( 0x1b, ctrl_break );
inregs.h.ah = 0x33;
inregs.h.al = 1;
inregs.h.dl = 0;
intdos( &inregs, &outregs );
#else
s_cbrk = getcbrk( );
ctrlbrk( harmless );
setcbrk( 0 );
#endif
/*
* 為程序建立一個簡單的關鍵錯誤處理器
*/
install_ceh( &ceh );
ceh.flag = OK;
initialize( );
editor( );
terminate( );
}
void error( int kind, int line, char *message )
{
char buff[MAX_COLS+2];
char line_buff[(MAX_COLS+2)*2];
switch (kind) {
case FATAL:
assert( strlen( main1 ) < MAX_COLS );
strcpy( buff, main1 );
break;
case WARNING:
default:
assert( strlen( main2 ) < MAX_COLS );
strcpy( buff, main2 );
break;
}
strcat( buff, message );
if (kind == WARNING)
strcat( buff, main3 );
save_screen_line( 0, line, line_buff );
set_prompt( buff, line );
if (kind == FATAL) {
terminate( );
exit( 1 );
}
getkey( );
restore_screen_line( 0, line, line_buff );
if (g_status.wrapped) {
g_status.wrapped = FALSE;
show_search_message( CLR_SEARCH, g_display.mode_color );
}
}
#if defined( __MSC__ )
void interrupt far harmless( void )
#else
static int harmless( void )
#endif
{
}
void interrupt far ctrl_break( void )
{
g_status.control_break = TRUE;
}
void terminate( void )
{
union REGS inregs, outregs;
register WINDOW *wp;
WINDOW *w;
register file_infos *fp;
file_infos *f;
int i;
/*
* 重建control-break檢測
*/
#if defined( __MSC__ )
_dos_setvect( 0x1b, old_int1b );
_dos_setvect( 0x23, old_control_c );
inregs.h.ah = 0x33;
inregs.h.al = 1;
inregs.h.dl = (char)s_cbrk;
intdos( &inregs, &outregs );
#else
setcbrk( s_cbrk );
#endif
/*
* 如果還有沒有釋放的文件結構,那么釋放他們。
*/
fp = g_status.file_list;
while (fp != NULL) {
f = fp;
fp = fp->next;
free( f );
}
/*
* 如果還有沒有釋放的窗口結構,那么釋放他們。
*/
wp = g_status.window_list;
while (wp != NULL) {
w = wp;
wp = wp->next;
free( w );
}
/*
* 釋放在nfa中的字符類
*/
for (i=0; i < REGX_SIZE; i++) {
if (sas_nfa.class[i] == nfa.class[i] && nfa.class[i] != NULL)
free( nfa.class[i] );
else if (sas_nfa.class[i] != NULL)
free( sas_nfa.class[i] );
else if (nfa.class[i] != NULL)
free( nfa.class[i] );
}
/*
* 重新設置光標的大小并且卸載83/84鍵盤工具集
*/
set_cursor_size( mode.cursor_size == SMALL_INS ? g_display.insert_cursor :
g_display.overw_cursor );
if (mode.enh_kbd == FALSE)
simulate_enh_kbd( 0 );
/*
* 重建掃描顏色
*/
if (g_display.adapter != MDA)
set_overscan_color( g_display.old_overscan );
}
/*
* 作用: 初始化不依賴硬件的屏幕狀態信息
* 并且調用硬件出世戶程序來獲得和硬件相關的信息
* 返回: [g_status and g_display]
* 注意: 這個函數假定g_status和g_display開始時儲存的都是\0。
*/
void initialize( void )
{
int i;
/*
* 首先做硬件初始化
*/
hw_initialize( );
/*
* 初始化編輯器的模式,指針和計數器
*/
bm.search_defined = ERROR;
sas_bm.search_defined = ERROR;
g_status.sas_defined = ERROR;
g_status.sas_search_type = ERROR;
regx.search_defined = ERROR;
sas_regx.search_defined = ERROR;
if (mode.undo_max < 2)
mode.undo_max = 2;
g_status.marked_file = NULL;
g_status.current_window = NULL;
g_status.current_file = NULL;
g_status.window_list = NULL;
g_status.file_list = NULL;
g_status.buff_node = NULL;
g_status.window_count = 0;
g_status.file_count = 0;
g_status.line_buff_len = 0;
g_status.tabout_buff_len = 0;
g_status.command = 0;
g_status.key_pressed = 0;
g_status.sas_rcol = 0;
g_status.sas_rline = 0;
g_status.recording_key = 0;
g_status.key_pending = FALSE;
g_status.found_first = FALSE;
g_status.sas_found_first = FALSE;
g_status.copied = FALSE;
g_status.wrapped = FALSE;
g_status.marked = FALSE;
g_status.macro_executing = FALSE;
g_status.replace_defined = FALSE;
g_status.screen_display = TRUE;
g_status.file_chunk = DEFAULT_BIN_LENGTH;
g_status.sas_tokens[0] = '\0';
g_status.path[0] = '\0';
g_status.sas_path[0] = '\0';
g_status.rw_name[0] = '\0';
g_status.pattern[0] = '\0';
g_status.subst[0] = '\0';
/*
* 設置翻頁后依然要顯示出的當前的頁中的行號。
*/
g_status.overlap = 1;
/*
* 初始化nfa中的節點。
*/
for (i=0; i < REGX_SIZE; i++) {
sas_nfa.node_type[i] = nfa.node_type[i] = 0;
sas_nfa.term_type[i] = nfa.term_type[i] = 0;
sas_nfa.c[i] = nfa.c[i] = 0;
sas_nfa.next1[i] = nfa.next1[i] = 0;
sas_nfa.next2[i] = nfa.next2[i] = 0;
sas_nfa.class[i] = nfa.class[i] = NULL;
}
/*
* 沒有在執行宏
*/
connect_macros( );
/*
* 清屏
*/
cls( );
show_credits( );
}
void hw_initialize( void )
{
struct vcfg cfg;
register int *clr;
g_display.ncols = MAX_COLS;
g_display.nlines = MAX_LINES - 1;
g_display.mode_line = MAX_LINES;
g_display.line_length = MAX_LINE_LENGTH;
video_config( &cfg );
g_display.display_address = (char far *)cfg.videomem;
clr = cfg.color == FALSE ? &colour.clr[0][0] : &colour.clr[1][0];
g_display.head_color = *clr++;
g_display.text_color = *clr++;
g_display.dirty_color = *clr++;
g_display.mode_color = *clr++;
g_display.block_color = *clr++;
g_display.message_color = *clr++;
g_display.help_color = *clr++;
g_display.diag_color = *clr++;
g_display.eof_color = *clr++;
g_display.curl_color = *clr++;
g_display.ruler_color = *clr++;
g_display.ruler_pointer = *clr++;
g_display.hilited_file = *clr++;
g_display.overscan = *clr;
if (g_display.adapter != MDA)
set_overscan_color( g_display.overscan );
}
int get_help( WINDOW *window )
{
register char *help;
register int line;
xygoto( -1, -1 );
help = help_screen[1];
for (line=0; help != NULL; line++) {
s_output( help, line, 0, g_display.help_color );
help = help_screen[line+2];
}
line = getkey( );
redraw_screen( window );
return( OK );
}
void show_credits( void )
{
register char *credit;
int line;
xygoto( -1, -1 );
credit = credit_screen[0];
for (line=0; credit != NULL; ) {
s_output( credit, line+2, 11, g_display.text_color );
credit = credit_screen[++line];
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -