ss[ss_x][yy]=z2; /* 將字符讀入編輯數組 */
y++; /* 屏幕光標後移一列 */
yy++; /* 後移一字節 */
ser++; /* 字序號增 1 */
if(qq) { /* 如為全角制表符 */
qq=0; /* 表格線標志變量置 0 */
cc.ch[0]=two; /* 暫存在two中的表格線第二字節放入cc.ch[0] */
goto AA; /* 返回 AA,進行排版,並寫入第二字節 */
}
if(vs(yy-1)) return; /* 如為前半字節,再讀入一字節 */
if(y>=ZS) { /* 如到本屏行尾 */
m++; /* 後移一屏 */
disp_t(); /* 顯示後一屏 */
}
else disp(ss_x,x); /* 否則重顯本行 */
}
}
int punc1(unsigned char z) /* 檢查是否是指定的半角標點或空格 */
{
if(z==33||z==41||z==44||z==46||z==58||z==59||z==63||z==93||z==32)
return 1; /* 如是指定標點,返回 1 */
else return 0; /* 否則返回 0 */
}
int punc2(unsigned char z1,unsigned char z2) /* 檢查是否是指定的全角標點 */
{
if((z1==161&&(z2==162||z2==163||z2==164||z2==175||z2==177||z2==179
||z2==181||z2==183||z2==185||z2==187||z2==189||z2==191||z2==195))
||(z1==163&&(z2==161||z2==169||z2==172||z2==174||z2==186||z2==187
||z2==191||z2==221))) return 1; /* 如是,返回 1 */
else return 0; /* 否則返回 0 */
}
make_tab() /* 形成表格線 */
{
if(tab && cc.ch[1]>70 && cc.ch[1]<82 && cc.ch[0]) {
/* 如為表格線狀態,並是小鍵盤的數字鍵 */
switch(cc.ch[0]) { /* 判斷按鍵低位碼 */
case 45: two=0xA5; /* 如為“-”鍵,定“━”的第二字節 */
break; /* 跳出開關語句 */
case 43: two=0xEF; /* 如為“+”鍵,定“╋”的第二字節 */
break; /* 跳出開關語句 */
case 49: two=0xBB; /* 如為“1”鍵,定“┗”的第二字節 */
break; /* 跳出開關語句 */
case 50: two=0xDF; /* 如為“2”鍵,定“┻”的第二字節 */
break; /* 跳出開關語句 */
case 51: two=0xBF; /* 如為“3”鍵,定“┛”的第二字節 */
break; /* 跳出開關語句 */
case 52: two=0xC7; /* 如為“4”鍵,定“┣”的第二字節 */
break; /* 跳出開關語句 */
case 53: two=0xA7; /* 如為“5”鍵,定“┃”的第二字節 */
break; /* 跳出開關語句 */
case 54: two=0xCF; /* 如為“6”鍵,定“┫”的第二字節 */
break; /* 跳出開關語句 */
case 55: two=0xB3; /* 如為“7”鍵,定“┏”的第二字節 */
break; /* 跳出開關語句 */
case 56: two=0xD7; /* 如為“8”鍵,定“┳”的第二字節 */
break; /* 跳出開關語句 */
case 57: two=0xB7; /* 如為“9”鍵,定“┓”的第二字節 */
break; /* 跳出開關語句 */
}
cc.ch[0]=0xA9; /* 定表格線第一字節 */
qq=1; /* 表格線字符標志置 1 */
}
}
intercept(int ky) /* 折斷字符串,換行,ky 為折斷處列號 */
{
if(xx<ksx) ksx++; /* 如在塊首行前,塊首行號加 1 */
else if(xx==ksx && ky<=ksy) { /* 否則,如為塊首行,當前列在塊首列前 */
ksx++; /* 塊首行號加 1 */
ksy-=ky; /* 計算塊首列號 */
}
if(xx<kwx) kwx++; /* 如當前行在塊尾行前,塊尾行號加 1 */
else if(xx==kwx && ky<=kwy) { /* 如在塊尾行的塊尾列前 */
kwx++; /* 塊尾行號增 1 */
kwy-=ky; /* 計算塊尾列號 */
}
xx++; /* 當前行至下行 */
ss_x++; /* 到下行 */
fp_rd++; /* fp已讀出行最大行號加 1 */
ttl_x++; /* 文末行行號加 1 */
ss_max++; /* 數組已用最大行號增 1 */
ser+=2; /* 字序數增回車換行符占用的 2 字節 */
if(ss_max>=QB-1) /* 如數組超過 QB 行 */
ss_x>Q1 ? wfp1() : wfp2(); /* 當前數組行在 Q1 後時,上部 Q3 行存入 fp1,
行數小於 Q1 時,下部 Q3 行存入 fp2 */
mov(ss_x,1); /* 緩沖區數組當前行以後順移一行 */
strcpy(ss[ss_x],ss[ss_x-1]+ky); /* 折斷處後字符放入新行 */
if(x<H3) x++; /* 如未到屏幕文本區底行,光標下移一行 */
m=0; /* 到 0 屏 */
}
PgUp() /* 上翻一屏 */
{
long a;
if(xx-x>0) { /* 如不在文首屏 */
a=(xx<=H3-2)?0:xx-H3+2; /* 定目標行號 */
upto(a); /* 上移至目標行 */
comp_disp(); /* 重顯一屏 */
}
}
PgDn() /* 向下翻屏 */
{
long a;
if(xx<ttl_x) { /* 如未到文末行 */
a=(ttl_x-xx>=H3-2)?xx+H3-2:ttl_x;
/* 定目標行號:到文末行數不到翻屏行數時取總行數 */
dnto(a); /* 下移至第 a 行 */
disp_t(); /* 重顯一屏 */
}
}
Right() /* 右移光標鍵 */
{
int g;
g=string_lingth(); /* 計算不包括回車換行符的行長 */
for(;;) { /* 為全角字符設立的循環 */
if(yy<g) { /* 如不在行末 */
y++; /* 屏幕光標右移一列 */
yy++; /* 文本列號加 1 */
ser++; /* 字序號增 1 */
if(y>ZS-1) comp_disp(); /* 如到屏幕最右側,計算顯示參數,重顯一屏 */
}
else { /* 如在行末 */
if(xx<ttl_x) { /* 如不在文末行 */
ss_x++; xx++; /* 至下一行 */
if(ss_x>=ss_max) tj(); /* 如超出緩沖區數組中已存最大行,補充數組行 */
yy=0; /* 至行首 */
ser+=2; /* 計算字序數 */
if(x==H3) { /* 如在屏幕文本區最底行 */
if(m==0) { /* 如原為 0 屏 */
roll_scr_up(0,H3); /* 向上滾屏 */
disp(ss_x,x); /* 下部補顯一行 */
}
else { /* 如原不為 0 屏 */
m=0;
disp_t(); /* 顯示 0 屏 */
}
}
else { /* 如不在屏底行 */
x++; /* 屏幕光標下移一行 */
if(m) { /* 如不是 0 屏 */
m=0;
disp_t(); /* 顯示 0 屏各行 */
}
}
}
else break; /* 如在文末行尾,退出循環 */
}
if(vs(yy-1)==0) break; /* 如不為全角前半字,退出循環 */
}
}
Left() /* 左移光標鍵 */
{
for(;;) { /* 為全角字符設的循環 */
if(yy>0) { /* 如不在行首 */
y--; yy--; /* 左移一字節 */
ser--; /* 字序號減 1 */
if(y<0) comp_disp(); /* 如移至前屏, 計算參數, 重顯一屏 */
}
else { /* 如在行首 */
if(xx) { /* 如在不文首行 */
xx--; /* 到上一行 */
ss_x--; /* 數組行號加 1 */
ser-=2; /* 字序數減少回車換行符占的 2 字節 */
yy=string_lingth(); /* 至行末 */
if(x>0) { /* 如不在本屏首行 */
x--; /* 到屏幕上一行 */
comput(); /* 計算參數 */
if(m) disp_t(); /* 如不為 0 屏,重顯一屏 */
}
else { /* 如在本屏首行 */
if(ss_x==0) st(); /* 如已到數組首行,從fp1補充Q3行至數組上部 */
comput(); /* 計算參數 */
if(!m) roll_scr_down(0,H3); /* 如上移行尾在 0 屏,下滾一屏 */
else disp_t(); /* 否則重顯所在屏 */
}
}
}
if(vs(yy-1)==0) break; /* 如不在全角前半字,退出循環 */
}
}
Up() /* 上移一行 */
{
int k;
if(xx) { /* 如不在文首行 */
if(!ss_x) st(); /* 如到編輯數組第一行,從 fp1 讀入 Q3 行 */
xx--; /* 上移一行 */
ss_x--; /* 編輯數組行號減 1 */
ser-=yy+2; /* 計算上行末字序數 */
k=m; /* 保存原屏號 */
if(x>0) { /* 如不在本屏起始行 */
x--; /* 屏幕光標上移一行 */
orien(); /* 判斷上移後光標是否在串尾後,如在串尾後,光標定於串尾 */
if(m!=k) disp_t(); /* 如不在原屏,重顯一屏 */
}
else { /* 如在本屏起始行 */
orien(); /* 判斷光標是否在串尾後,如在串尾後,定光標於串尾 */
if(m==k) roll_scr_down(0,H3);/* 如仍在原屏,向下滾屏 */
else disp_t(); /* 否則顯示串尾所在屏 */
}
ser-=string_lingth()-yy; /* 計算字序數 */
}
}
Down() /* 下移一行 */
{
int k,l;
l=string_lingth(); /* 計算行長(不包括回車換行符) */
if(xx<ttl_x) { /* 如不在文末行 */
ss_x++; xx++; /* 下移一行 */
ser+=l-yy+2; /* 計算下行首字序數 */
if(ss_x>=ss_max) tj(); /* 如超出編輯數組,從 fp2 或 fp 補充 */
k=m; /* 保存原屏號 */
if(x<H3) { /* 如不在屏幕文本區最下一行 */
x++; /* 屏幕光標下移一行 */
orien(); /* 判斷光標是否在串尾後,如在串尾後,定光標於串尾 */
if(m!=k) disp_t(); /* 如不在原屏,重顯一屏 */
}
else { /* 如光標在屏幕文本區最後一行 */
orien(); /* 重定列號 */
if(m==k) { /* 如在原屏 */
roll_scr_up(0,H3); /* 向上滾屏 */
disp(ss_x,x); /* 屏幕最下行補顯一行 */
}
else disp_t(); /* 如不在原屏,重顯一屏 */
}
ser+=yy; /* 計算字序數 */
}
}
Ins() /* 插入/非插入狀態切換 */
{
if(!ins) { /* 如 ins 為假 */
ins=1; /* 轉置 ins 為 1 */
write_string(H1,0,"插入",0x4E); /* 在信息行顯示“插入”二字 */
}
else { /* 如 ins 為真 */
ins=0; /* 轉置 ins 為 0 */
write_space(H1,0,4,0x0E); /* 用空格蓋掉“插入”二字 */
}
}
Home() /* 移至行首 */
{
ser-=yy; /* 計算字序數 */
yy=0; /* 到行首列 */
if(m) { /* 如不是 0 屏 */
m=0;
disp_t(); /* 顯示 0 屏各行 */
}
}
End() /* 到行末 */
{
int i,g;
i=m; /* 保存屏號 */
g=string_lingth(); /* 計算字符串長(不包括回車換行符) */
ser+=g-yy; /* 計算字序數 */
yy=g; /* 當前位置移至行末 */
comput(); /* 計算各參數 */
if(i!=m) disp_t(); /* 如不在原屏,重顯一屏 */
}
comp_disp() /* 計算參數,重顯一屏 */
{
comput(); /* 計算各參數 */
disp_t(); /* 顯示一屏 */
}
comput() /* 根據 yy 計算屏號 m、y 等參數 */
{
m=yy/BP; /* 計算屏號 */
if(m) m--; /* 如不為 0 屏,屏號減 1 */
y=yy-m*BP; /* 計算屏幕顯示列坐標 y */
if(xx-x<0) x=xx; /* 如 xx-x 小於屏幕行坐標,行坐標取內存數組當前行號 */
}
mvto(long a) /* 移到指定行 a */
{
yy=tyy; /* 恢復原列號 */
if(a<=xx) upto(a); /* 如目標行在當前行或之前,前移至目標行 */
else dnto(a); /* 如目標行在當前行後,後移至目標行 */
}
F1(int a) /* 文本存盤,a=1 退出,a=0 不退出 */
{
unsigned int i,j;
long b;
if(chg) { /* 如文件已修改過 */
write_prompt(0); /* 提示“請稍候...” */
if(!findfirst(bfile,pt,0)) /* 如有後備文件 */
remove(bfile); /* 刪除原後備文件 */
if(old) { /* 如原有老文件 */
b=ftell(fp); /* 測出老文件當前讀寫指針位置 */
fclose(fp); /* 關閉老文件 */
rename(mfile,bfile); /* 改為帶擴展名 BAK 的後備文件 */
}
fp3=fopen(bfile,"rb"); /* 打開後備文件,文件指針賦於 fp3 */
fp=fopen(mfile,"wb+"); /* 重建正文文件,文件指針仍放 fp 中 */
ddd=malloc(KK); /* 為 ddd 分配內存 */
i=0; /* i 置初值 0 */
while(i<oa) { /* fp1 中記錄並入 fp */
fseek(fp1,wra[i++],SEEK_SET);/* fp1 指針移到讀寫起始處 */
j=wra[i]-wra[i-1]; /* 計算讀入字節數 */
fread(ddd,sizeof(char),j,fp1); /* 從 fp1 讀入 j 字節至 ddd */
fwrite(ddd,sizeof(char),j,fp); /* 將 ddd 中內容寫入 fp */
}
write_to(0,ss_max+1,fp); /* 緩沖區數組的記錄寫入 fp */
write_prompt(0); /* 提示“請稍候...” */
i=ob; /* ob 為 fp2 中最後一次讀寫指針數組序號 */
while(i) { /* fp2 中記錄並入 fp */
fseek(fp2,wrb[--i],SEEK_SET);/* fp2 指針移到前一讀寫起始處 */
j=wrb[i+1]-wrb[i]; /* 計算讀入字節數 */
fread(ddd,sizeof(char),j,fp2); /* 從 fp2 讀入 j 字節至 ddd */
if(*(ddd+j-1)==0) j--; /* 消除 wfp2() 讀入文末部分時加的 '\0' */
fwrite(ddd,sizeof(char),j,fp); /* 將 ddd 中內容寫入 fp */
}
vw=ftell(fp); /* 保存 fp 指針位置 */
if(!fp_end) { /* 如原文件未全部讀完,剩余部分拷入 fp */
fseek(fp3,b,SEEK_SET); /* 移至原老文件當前讀寫位置 */
for(;;) {
j=fread(ddd,sizeof(char),KK,fp3); /* 每次從 fp3 讀入 KK 字節到 ddd */
fwrite(ddd,sizeof(char),j,fp); /* 將 ddd 中內容寫入 fp */
if(j<KK) break; /* 如讀出字節數不足 KK,文件已讀完,退出 */
}
}
else fputc(0x1A,fp); /* 否則加文件結束標志 */
fclose(fp3); /* 關閉 fp3 */
fclose(fp); /* 關閉 fp */
free(ddd); /* 釋放 ddd 占用的內存空間 */
}
if(a) bk(); /* 如 a 為真,退出運行 */
}
ss[ss_x][yy]=z2; /* 將字符讀入編輯數組 */
y++; /* 屏幕光標後移一列 */
yy++; /* 後移一字節 */
ser++; /* 字序號增 1 */
if(QQ) { /* 如為全角制表符 */
qq=0; /* 表格線標志變量置 0 */
cc.ch[0]=two; /* 暫存在two中的表格線第二字節放入cc.ch[0] */
goto AA; /* 返回 AA,進行排版,並寫入第二字節 */
}
if(vs(yy-1)) return; /* 如為前半字節,再讀入一字節 */
if(y>=ZS) { /* 如到本屏行尾 */
m++; /* 後移一屏 */
disp_t(); /* 顯示後一屏 */
}
else disp(ss_x,x); /* 否則重顯本行 */
}
} int punc1(unsigned char z) /* 檢查是否是指定的半角標點或空格 */
{
if(z==33z==41z==44z==46z==58z==59z==63z==93z==32)
return 1; /* 如是指定標點,返回 1 */
else return 0; /* 否則返回 0 */
} int punc2(unsigned char z1,unsigned char z2) /* 檢查是否是指定的全角標點 */
{
if((z1==161&&(z2==162z2==163z2==164z2==175z2==177z2==179
z2==181z2==183z2==185z2==187z2==189z2==191z2==195))
(z1==163&&(z2==161z2==169z2==172z2==174z2==186z2==187
z2==191z2==221))) return 1; /* 如是,返回 1 */
else return 0; /* 否則返回 0 */
}
make_tab() /* 形成表格線 */
{
if(tab && cc.ch[1]>70 && cc.ch[1]<82 && cc.ch[0]) {
/* 如為表格線狀態,並是小鍵盤的數字鍵 */
switch(cc.ch[0]) { /* 判定按鍵低位碼 */
case 45: two=0xA5; /* 如為“-”鍵,定“━”的第二字節 */
break; /* 跳出開關語句 */
case 43: two=0xEF; /* 如為“+”鍵,定“╋”的第二字節 */
break; /* 跳出開關語句 */
case 49: two=0xBB; /* 如為“1”鍵,定“┗”的第二字節 */
break; /* 跳出開關語句 */
case 50: two=0xDF; /* 如為“2”鍵,定“┻”的第二字節 */
break; /* 跳出開關語句 */
case 51: two=0xBF; /* 如為“3”鍵,定“┛”的第二字節 */
break; /* 跳出開關語句 */
case 52: two=0xC7; /* 如為“4”鍵,定“┣”的第二字節 */
break; /* 跳出開關語句 */
case 53: two=0xA7; /* 如為“5”鍵,定“┃”的第二字節 */
break; /* 跳出開關語句 */
case 54: two=0xCF; /* 如為“6”鍵,定“┫”的第二字節 */
break; /* 跳出開關語句 */
case 55: two=0xB3; /* 如為“7”鍵,定“┏”的第二字節 */
break; /* 跳出開關語句 */
case 56: two=0xD7; /* 如為“8”鍵,定“┳”的第二字節 */
break; /* 跳出開關語句 */
case 57: two=0xB7; /* 如為“9”鍵,定“┓”的第二字節 */
break; /* 跳出開關