{
int i,j;
if(chg) { /* 如果文件已修改过 */
F1(0); /* 存盘 */
old=1; /* 有老文件标志置 1 */
fp=fopen(mfile,"rb"); /* 重新打开正文文件 */
fseek(fp,vw,SEEK_SET); /* fp 读写指针复原 */
}
clear_prompt(); /* 清提示区 */
chg=0; /* 文件已修改标志置 0 */
}
F2() /* 移动当前行至指定行 */
{
long i;
write_ques(6); /* 提问要移到的行号 */
if((i=key_digit(19))=0) { /* 输入行号,如为空串或按 ESC 键 */
clear_ques(); /* 清提问区 */
return; /* 退出本功能 */
}
i--; /* 输入行号转换为数组行号 */
if(fp_end && ittl_x) i=ttl_x;
/* 如 fp 已读完,目标行大于文末行号,移到文末行 */
tyy=yy; /* 保存列号 */
mvto(i); /* 移到目标行 */
comp_disp(); /* 重显一屏 */
clear_ques(); /* 清提问区 */
}
F3() /* 输入排版行宽 */
{
int i;
write_ques(4); /* 提问排版行宽 */
if((i=key_digit(16))=0) { /* 在提问行输入行宽,如为空串或按 ESC 键 */
clear_ques(); /* 清提问区 */
return; /* 退出本功能 */
}
enq=i; /* 行宽值赋给全局变量 enq */
if(enqHC-4) { /* 行宽值如超过允许字节数 */
enq=HC-4; /* 取最大允许字节数为排版行宽 */
itoa(enq,hsz,10); /* 变数值为字符串 */
write_prompt(7); /* 提示:排版超宽 */
write_space(HH,16,30,PROM_COLOR); /* 清输入区 */
write_string(HH,16,hsz,PROM_COLOR); /* 重显行宽 */
}
}
F4() /* 排版至段末 */
{
if(enqHC-4) { /* 如已设置排版宽度 */
chg=1; /* 文件已修改标志置为真 */
reform(); /* 排版至段末 */
comp_disp(); /* 计算参数并重显一页 */
}
else write_prompt(8); /* 否则,提示:未设置排版宽度 */
}
Shift_F4() /* 连续排版至文末 */
{
if(enqHC-4) { /* 如已设置排版宽度 */
chg=1; /* 文件已修改标志置为真 */
while(reform()); /* 从当前光标行排版至文末 */
comp_disp(); /* 计算参数并重显一页 */
}
else write_prompt(8); /* 否则,提示:未设置排版宽度 */
}
int reform() /* 从当前位置排版至本段末 */
{
int k,g;
write_prompt(0); /* 提示请稍候... */
for(;;) { /* 为段排版设置的循环 */
g=string_lingth(); /* 计算字符串长(不包括回车换行符) */
if(genq) { /* 如串尾在排版宽后 */
if(vs(enq-1)==0) { /* 如排版宽度处不为全角字符前半字 */
if(ss[ss_x][enq]0xA0) { /* 如排版宽度后一字节为半角字符 */
if(punc1(ss[ss_x][enq])) /* 如为指定半角标点 */
k=enq+1; /* 折断处后移 1 字节 */
else k=enq; /* 否则原处折断 */
}
else { /* 如排版宽度处字符为全角 */
if(punc2(ss[ss_x][enq],ss[ss_x][enq+1])) /* 如为指定全角标点 */
k=enq+2; /* 折断处后移 2 字节 */
else k=enq; /* 否则原处折断 */
}
}
else { /* 如排版宽度处为全角字符前半字 */
if(punc2(ss[ss_x][enq-1],ss[ss_x][enq])) /* 如为指定的全角标点 */
k=enq+1; /* 折断处后移一字节 */
else k=enq-1; /* 否则, 折断处前移一字节 */
}
ser+=k-yy; /* 计算字序数 */
if(ss[ss_x][k]!=0x0D) { /* 如折断处不在段末 */
intercept(k); /* 在 k 处折断行 */
strcpy(ss[ss_x-1]+k,ra); /* 折断处加软回车 */
}
else { /* 如折断处已到串尾 */
xx++; ss_x++; /* 到下一行 */
ser+=2; /* 计算字序数 */
yy=0; /* 到行首 */
break; /* 退出循环 */
}
yy=0; /* 到行首 */
}
else { /* 如串尾在排版宽前 */
if(xxttl_x) { /* 如未到文末 */
ser+=g-yy+2; /* 计算字序数 */
ss_x++; xx++; /* 到下行 */
yy=0; y=0; /* 到行首 */
if(ss_xss_max) tj(); /* 如超出缓冲区数组,读入一部分 */
if(ss[ss_x-1][g]==0x8D) { /* 如上行末为软回车 */
if(delc()==-1) return 0; /* 本行接至上行末,行超长返回 */
}
else break; /* 否则退出 */
}
else { /* 如已到文末行 */
clear_prompt(); /* 清提示区 */
return 0; /* 返回 0 */
}
}
}
clear_prompt(); /* 清提示区 */
return 1; /* 返回 1 */
}
F5() /* 搜索字符串 */
{
write_ques(5); /* 提问要找的字符串 */
*fnd=0; /* fnd 清为空串 */
if(key_string(HH,19,fnd,PROM_COLOR)=0) {
/* 输入字符串,如为空串或按 ESC 键 */
clear_ques(); /* 清提问区 */
return; /* 退出本功能 */
}
Shift_F5(); /* 进行搜索 */
}
Shift_F5() /* 进行搜索 */
{
if(*fnd) { /* 如搜索字符串不为空串 */
if(find(fnd)) *fnd=0; /* 搜索,如到文末,字符串 fnd 清为空串 */
comp_disp(); /* 计算参数并重显一屏 */
}
}
int find(char *a) /* 寻找字符串 */
{
int i,j,b;
j=strlen(a); /* 计算要找的字符串长 */
while(xx=ttl_x) { /* 在总行数范围内找 */
if(ss_x+H3-x=ss_max) tj(); /* 本屏最下行如超出缓冲区最大行,数组
上部存 Q3 行到 fp1,下部读入 Q3 行 */
b=string_lingth(); /* 计算本行除行末回车换行符外的字符数 */
for(i=0;ij;i++) { /* 对比 j 个字符 */
if(b-yy+1j) { /* 如本串剩下已不足要找的串长 */
if(xxttl_x) { /* 如未到文末行 */
ss_x++; xx++; /* 下移一行 */
ser+=b-yy+2; /* 计算字序数 */
yy=0; /* 至行首 */
break; /* 退出 for 循环 */
}
else { /* 如到文末行 */
ser+=b-yy; /* 计算字序数 */
yy=b; /* 至行末列 */
clear_ques(); /* 清提问区 */
return 1; /* 返回 1 */
}
}
if(ss[ss_x][yy+i]!=*(a+i)) { /* 如有一个字符对不上 */
yy++; ser++; /* 后移一字符 */
i=-1; /* i 加步长进入循环后变为初值 1,重新对比 */
}
else if(i==j-1) { /* 如 j 个字符都对上 */
if(!vs(yy+j-1)) { /* 如找到的串尾不在前半个汉字 */
yy+=j; /* 当前位置移至对上的最后一字符后 */
ser+=j; /* 计算字序数 */
return 0; /* 返回 0 */
}
else { /* 否则后移一字节 */
yy++; ser++;
i=-1; /* i 加步长进入循环后变为初值 1,重新对比 */
}
}
}
}
}
F6() /* 字符串替代 */
{
int i,j,g,k;
write_ques(7); /* 提问搜索和替代的字符串 */
if(key_string(HH,6,hsz,PROM_COLOR)=0) {
/* 输入要找的字符串,如为空串或按 ESC 键 */
clear_ques(); /* 清提问区 */
return; /* 退出本功能 */
}
ddd=malloc(HC); /* 给 ddd 分配内存 */
dd=ddd; /* 保存 ddd 的首指针 */
if(key_string(HH,32,ddd,PROM_COLOR)=0) {
/* 输入替代的字符串,如为空串或按 ESC 键 */
free(ddd); /* 释放 ddd 占用的内存空间 */
clear_ques(); /* 清提问区 */
return; /* 退出本功能 */
}
g=strlen(hsz); /* 计算搜索的字符串长 */
k=strlen(ddd); /* 计算替代的字符串长 */
while(1) { /* 为连续找设的循环 */
if(find(hsz)) { /* 如到文末 */
comp_disp(); /* 计算参数,显示一屏 */
break; /* 退出本功能 */
}
xh(); /* 在 H1 行重显当前行、列、序号 */
comp_disp(); /* 计算参数,显示一屏 */
if((j=key_yn(59))==-1) { /* 回答是否替换,如按 ESC */
clear_ques(); /* 清提问区 */
break; /* 退出本功能 */
}
if(j) { /* 如按 Y,进行替换操作 */
chg=1; /* 文件已修改标志置为真 */
i=yy-g; /* 删除原字符串后光标处列号 */
while(yyi) delc(); /* 删除原字符串 */
if(xx==ksx && yyksy) ksy+=k; /* 计算字块坐标变化 */
if(xx==kwx && yykwy) kwy+=k;
write_block(xx); /* ddd 中字符串拷入 */
ddd=dd; /* ddd 返回指针头 */
}
}
free(ddd); /* 释放 ddd 占用的内存空间 */
}
F7() /* 定义块首行、列号 */
{
ksx=xx; /* 块首标志行号等于当前光标行号 */
ksy=yy; /* 块首标志列号等于当前光标列号 */
if(blck==0) { /* 如尚未定义块 */
blck=1; /* 块标志置 1 */
kwx=ksx; /* 块尾标志同块首重合 */
kwy=ksy;
disp(ss_x,x); /* 重显当前行 */
return; /* 返回 */
}
if(kwxksx||(kwx==ksx && kwy=ksy)) { /* 如当前光标在原块尾后 */
kwx=ksx; /* 块尾行号移至块首行 */
kwy=ksy; /* 块尾列号移至块首列 */
blck=1; /* 块标志置 1 */
}
else blck=2;
disp_t(); /* 重显一屏 */
}
Shift_F7() /* 清除块定义 */
{
blck=0; /* 块标志置 0 */
ksx=kwx=-1; /* 块标行号置初值 */
ksy=kwy=-1; /* 块标列号置初值 */
comp_disp(); /* 重显一屏 */
}
F8() /* 定义块尾 */
{
kwx=xx; /* 定块尾行号 */
kwy=yy; /* 定块尾列号 */
if(blck=1) { /* 如块标志为 1 或 2 */
if(kwxksx||(kwx==ksx && kwy=ksy)){ /* 如在块首前 */
ksx=kwx; /* 块首行号同块尾 */
ksy=kwy; /* 块首列号同块尾 */
blck=1; /* 块标志置 1 */
}
else blck=2; /* 否则,块标志置 2 */
disp_t(); /* 重显一屏 */
}
else F7(); /* 如未定义块,设块首 */
}
F9() /* 移到文首 */
{
upto(0x0L); /* 移至 0 行 */
Home(); /* 移至行首 */
comp_disp(); /* 计算显示参数,显示文首屏幕 */
}
Shift_F9() /* 移至文末 */
{
if(xxttl_x) dnto(ttl_x); /* 如不在文末行,下翻到文末行 */
End(); /* 移至行末 */
comp_disp(); /* 计算参数,重显一屏 */
}
F10() /* 表格线状态转换开关 */
{
if(tab) { /* 如 tab 为真 */
tab=0; /* 转置 tab 为 0 */
write_space(H1,4,4,TEXT_COLOR); /* 盖掉屏幕信息行表线提示 */
}
else { /* 如 tab 为假 */
tab=1; /* 转置 tab 为 1 */
write_string(H1,4,"表线",0x1E); /* 在屏幕信息行显示表线二字 */
}
}
upto(long a) /* 上移到 a 行 */
{
ser-=yy; /* 计算当前行首字序数 */
while(oa && a=xx-ss_x+x) {
/* fp1 中尚有记录,目标行小于数组 x 行,则循环 */
while((ss_x-1)x) { /* 数组当前行号大于屏幕行坐标,则循环 */
--xx; --ss_x; /* 上移一行 */
ser-=string_lingth()+2; /* 计算字序数 */
}
st(); /* 如编辑数组当前行号不足屏幕行坐标,从 fp1 读入 */
}
while((xx-1)=a) { /* 目标行在当前行前,则循环 */
--xx; --ss_x; /* 上移一行 */
ser-=string_lingth()+2; /* 计算字序数 */
}
orien(); /* 确定列号 */
ser+=yy; /* 计算字序数 */
}
dnto(long a) /* 下移到第 a 行 */
{
int i;
ser+=string_lingth()-yy+2; /* 计算下行首字序数 */
ss_x++; xx++; /* 当前行下移一行 */
while(a=xx-ss_x+(i=ss_max+x-H3) && (ob||!fp_end)) {
/* 目标行超出,屏幕最下行超出数组,fp2 或 fp 中尚有记录则循环 */
while(ss_xi) { /* 当前行下移不会引起屏底超出数组则循环 */
ser+=string_lingth()+2; /* 计算下行首字序数 */
ss_x++; xx++; /* 当前行移至下行 */
}
tj(); /* 屏底要超出数组时,从 fp2 或 fp 读入 */
if(fp_end && attl_x) a=ttl_x; /* 如目标行大于文末行时,目标行取文末行 */
}
while(xxa) { /* 目标行在当前行后则循环 */
ser+=string_lingth()+2; /* 计算下行首字序数 */
ss_x++; xx++; /* 当前行移至下行 */
}
orien(); /* 定光标位置 */
ser+=yy; /* 计算字序数 */
}
wfp1() /* 将编辑数组上部 Q3 行写入 fp1 */
{
fseek(fp1,wra[oa],SEEK_SET); /* 指针移到写入起始位置 */
write_to(0,Q3,fp1); /* 写 Q3 行到 fp1 */
wra[++oa]=ftell(fp1); /* 记录下一次写入起始位置 */
movbk(0,Q3); /* 剩下的数组前移 Q3 行 */
ss_x-=Q3; /* 计算编辑数组当前行行号 */
ss_max-=Q3; /* 计算数组行实用最大行号 */
}
movbk(int s,int a) /* 编辑数组 s+a 行起前移 a 行 */
{
int i;
for(i=s;iQB-a;i++)
strcpy(ss[i],ss[i+a]); /* 前移 a 行,复盖原行 */
while(iQB) *ss[i++]=0; /* 移走各行清 0 */
}
mov(int s,int a) /* 编辑数组 s 行起后移 a 行 */
{
int i;
for(i=QB-1;i=s+a;i--) strcpy(ss[i],ss[i-a]);
}
tj() /* 当前行大于 Q1 时,上部 Q3 行存入 fp1,从 fp2 或 fp 再读入 Q3 行 */
{
int j=0;
if(ss_xQ1-H3) wfp1(); /* 当前行大于 Q1 时,上部 Q3 行存入 fp1 */
if(ss_max=Q1) { /* 如编辑数组实用最大行在数组前半部 */
if(ob) { /* 如 fp2 中有记录 */
fseek(fp2,wrb[--ob],SEEK_SET); /* 指针前移至读起始位置 */
j=read_from(ss_max+1,Q3,fp2); /* 从 fp2 读 Q3 行写入编辑数组最大行后,
j 为实际读写数 */
ss_max+=j; /* 数组扩大 j 行 */
}
else if(!fp_end) { /* 如 fp2 已无记录,如 fp 中未读完 */
j=read_from(ss_max+1,Q3,fp); /* 从 fp 读 Q3 行写入数组最大行后,
j 为实际读写数 */
if(jQ3) { /* 如读写数不足 Q3 行 */
fp_rd+=j; /* fp 已读出最大行行号增加 j */
ttl_x=fp_rd; /* 确定文末行行号 */
fp_end=1; /* fp 已读完标志置 1 */
}
else fp_rd+=Q3; /* 否则,fp已读出行最大行号加 Q3 */
ss_max+=j; /* 数组扩大 j 行 */
}
}
}