{
int i,j,k,g;
g=m*BP; /* 本屏行首列号 */
y=yy-g; /* 计算 y */
k=(enq-gZS+1)?ZS+1:enq-g; /* 排版宽度处列坐标 */
for(i=1;i=ZS+1;i++) { /* 自左至右显示标尺 */
j=(i=k)?0x04:0x01; /* 排版行宽度内用红色,否则用蓝色 */
((i+g)%5==0)?write_char(H2,i-1,'|',j):write_char(H2,i-1,'-',j);
/* 逢 5 显示|,其余显示- */
}
g=(yk) ? 0x50 : 0x30; /* 确定标尺光标色彩 */
((yy+1)%5==0)?write_char(H2,y,'|',g):write_char(H2,y,'-',g);
/* 显示标尺光标 */
}
coord() /* 显示标尺行 */
{
int i,j,k,g;
g=m*BP; /* 本屏行首列号 */
y=yy-g; /* 计算 y */
k=(enq-gZS+1)?ZS+1:enq-g; /* 排版宽度处列坐标 */
for(i=1;i=ZS+1;i++) { /* 自左至右显示标尺 */
j=(i=k)?0x04:0x01; /* 排版行宽度内用红色,否则用蓝色 */
((i+g)%5==0)?write_char(H2,i-1,'|',j):write_char(H2,i-1,'-',j);
/* 逢 5 显示|,其余显示- */
}
g=(yk) ? 0x50 : 0x30; /* 确定标尺光标色彩 */
((yy+1)%5==0)?write_char(H2,y,'|',g):write_char(H2,y,'-',g);
/* 显示标尺光标 */
}
xh() /* 在信息行显示当前行序、列、行数值 */
{
char sl[8],sh[8],sz[8];
itoa(yy+1,sl,10); /* 变列号数值为字符串 */
ltoa(xx+1,sh,10); /* 变行号数值为字符串 */
ltoa(ser+1,sz,10); /* 变字序号数值为字符串 */
write_string(H1,8,"序: 行: 列: ",0x05);
write_string(H1,12,sz,0x07); /* 显示字序号 */
write_string(H1,24,sh,0x07); /* 显示行号 */
write_string(H1,35,sl,0x07); /* 显示列号 */
}
int string_lingth() /* 计算除回车换行符外的当前行长 */
{
int g;
g=strlen(ss[ss_x]); /* 测当前行字符串总长 */
if(ss[ss_x][g-1]==0x0A) g-=2; /* 去除回车换行符的长度 */
return g; /* 返回计算值 */
}
Enter() /* 输入回车 */
{
int g,k;
chg=1; /* 文件已修改标志置为真 */
if(!ins) { /* 如为非插入状态 */
g=string_lingth(); /* 计算当前行长(不包括回车换行符) */
strcpy(ss[ss_x]+g,da); /* 字符串以硬回车换行符结尾 */
if(xx==ttl_x) { /* 如是文末行,下移一行 */
fp_rd++; /* fp 已读出行最大行号加 1 */
ttl_x++; /* 文末行行号加 1 */
ss_max++; /* 编辑数组实用最大行号加 1 */
}
if(m==0 && gZS) write_char(x,FH,'',CHAR_COLOR);
/* 如行尾在 0 屏,显示硬回车标志 */
ss_x++; xx++; /* 数组行号和文本行号均加 1 */
ser+=g-yy+2; /* 计算字序数 */
if(ss_xss_max) tj(); /* 如下行超出编辑数组最大行号,
从 fp2 或 fp 读入一部分 */
if(xH3) { /* 如不是屏幕底行 */
if(m) { /* 如不是 0 屏 */
m=0;
disp_t(); /* 显示 0 屏各行 */
}
x++; /* 屏幕光标下移一行 */
}
else { /* 如是屏幕最下行 */
if(!m) { /* 如原在 0 屏,则滚屏 */
roll_scr_up(0,H3); /* 向上滚屏 */
disp(ss_x,x); /* 当前坐标补显一行 */
}
else { /* 如原不在 0 屏 */
m=0; /* 显示 0 屏 */
disp_t();
}
}
}
else { /* 如为插入状态 */
g=m; /* 保存原屏号 */
k=x; /* 保存原屏幕行坐标 */
intercept(yy); /* 从当前光标处折断字符串 */
strcpy(ss[ss_x-1]+yy,da); /* 折断处加硬回车换行符 */
if(!g) { /* 如原在 0 屏 */
if(kH3) roll_scr_down(x,H3); /* 不在屏底行,本行起下滚 */
else roll_scr_up(0,H3); /* 在屏底行,全屏上滚 */
disp(ss_x-1,x-1); /* 重显原行(上一行) */
disp(ss_x,x); /* 显示当前行 */
}
else disp_t(); /* 如原不在 0 屏,重显一屏 */
}
yy=0; /* 光标至行首 */
}
Del() /* 退格键、删字键处理 */
{
int i,k;
k=x; /* 保存原行坐标 */
chg=1; /* 文件已修改标志置为真 */
switch(delc()) { /* 删字,根据返回值判断 */
case 0: /* 如返回 0 */
disp(ss_x,x); /* 重显当前行 */
break; /* 跳出开关语句 */
case 1: /* 如返回 1 */
disp_t(); /* 重显一屏 */
break; /* 跳出开关语句 */
case 2: /* 如返回 2 */
if(x0) --x; /* 如不在屏幕最上行,光标上移一行 */
comput(); /* 计算参数 */
if(m) disp_t(); /* 如不在 0 屏,重显一屏 */
else { /* 如在 0 屏 */
if(k) { /* 如原不在屏顶行 */
roll_scr_up(k,H3); /* 自当前行起滚屏 */
i=H3-x; /* 屏幕最下行与当前行间行数 */
if(xx+i=ttl_x) /* 如最下行还有,显示此行 */
disp(ss_x+i,H3);
}
disp(ss_x,x); /* 显示当前行 */
}
break; /* 跳出开关语句 */
}
}
int delc() /* 删字,如在行首,将本行接在上行尾 */
{
int i,g,k=0;
for(;;) { /* 为全角字符设的循环 */
if(y0) { /* 如不在本屏行首 */
if(xx==ksx && yy=ksy) ksy--; /* 如在块首行,并在块首前,计算块首列号 */
if(xx==kwx && yy=kwy) kwy--; /* 如在块尾行,并在块尾前,计算块尾列号 */
dks(); /* 如块首、块尾重合, 块标志置 1 */
strcpy(ss[ss_x]+yy-1,ss[ss_x]+yy);
/* 光标处起字符串前移一格,覆盖光标前一字符 */
y--; yy--; /* 前移一字节 */
ser--; /* 字序号减 1 */
if(vs(yy-1)==0) { /* 如不在全角前半字 */
if(!k) return 0; /* 如在屏幕最左列,返回 0 */
else return 1; /* 否则返回 1 */
}
}
else { /* 如在屏幕最左列 */
if(m) { /* 如不为 0 屏 */
m--; /* 退到前一屏 */
y=yy-m*BP; /* 光标到屏中,并前移一字 */
k=1; /* 标志置 1 */
}
else { /* 如为 0 屏 */
if(ss_x+(i=H3-x)=ss_max && xx+ittl_x)
tj(); /* 如屏幕最下行超出数组,但未到文末,从fp2或fp读入Q3行 */
if(xx) { /* 如不在文首行 */
g=strlen(ss[ss_x]); /* 测行长 */
ss_x--; /* 至上一行 */
yy=string_lingth(); /* 定光标于上行尾处 */
if(g+yyHC-4) { /* 如两行相接后超长 */
write_prompt(3); /* 提示超长 */
yy=0; /* 恢复原行列号 */
ss_x++; /* 回原行 */
return -1; /* 退出,返回 -1 */
}
if(xx=ksx) { /* 如在块首行或之前 */
if(xx==ksx) ksy+=yy; /* 如在块首行 */
ksx--; /* 块首行行号减 1 */
}
if(xx=kwx) { /* 如在块尾行或之前 */
if(xx==kwx) kwy+=yy; /* 如在块尾行 */
kwx--; /* 块尾行行号减 1 */
}
dks(); /* 如块首、块尾重合, 块标志置 1 */
xx--; /* 文本当前行改为上行 */
strcpy(ss[ss_x]+yy,ss[ss_x+1]); /* 将下行拷至本行尾回车符前 */
ser-=2; /* 字序数减少回车符的两位 */
movbk(ss_x+1,1); /* 数组后续各行前移,覆盖原行 */
ttl_x--; /* 文末行行号减 1 */
fp_rd--; /* fp 已读出行最大行号减 1 */
ss_max--; /* 数组实用最大行号减 1 */
return 2; /* 返回 2 */
}
else return 0; /* 如在文首行,返回 0 */
}
}
}
}
int vs(int a) /* 计算行首至 a 列全角字节数,返回奇偶值 */
{
int i,j;
j=0; /* 全角字节数,初值为 0 */
for(i=0;i=a;i++)
if(ss[ss_x][i]0xA0) j++; /* 统计全角字节数 */
return(j%2); /* 返回奇偶值 */
}
orien() /* 重定光标列号 */
{
int g;
g=string_lingth(); /* 测当前列长(不包括回车换行符) */
if(yyg) yy=g; /* 如光标在字符串尾后,定光标于串尾 */
if(vs(yy-1)) yy--; /* 如光标在后半汉字,前移一字节 */
y=yy-m*BP; /* 计算屏幕 y 坐标 */
if(y0) comput(); /* 如 y 为负数,重算各参数 */
}
Ctrl_N() /* 插入一空行 */
{
chg=1; /* 文件已修改标志置为真 */
fp_rd++; /* fp 已读出最大行号加 1 */
ttl_x++; /* 文末行行号加 1 */
if(xx=ksx) { /* 如插入行在块首行或之前 */
ksx++; kwx++; /* 块首、块尾行号加 1 */
}
else { /* 如插入行在块首行后 */
if(xxksx && xx=kwx) kwx++; /* 如插入行在字块中,块尾行号加 1 */
}
ser-=yy; /* 计算字序数 */
if(ss_max=QB-1) { /* 如超出缓冲区数组可容行数 */
ss_xQ1 ? wfp1() : wfp2(); /* 数组行数在 Q1 后时,上部 Q3 行存入 fp1,
行数小于 Q1 时,下部 Q3 行存入 fp2 */
}
ss_max++; /* 编辑数组实用最大行号加 1 */
mov(ss_x,1); /* 当前行起各行后移 */
strcpy(ss[ss_x],da); /* 插入行加硬回车换行符 */
if(m) { /* 如不在 0 屏,显示 0 屏 */
m=0;
disp_t();
}
else roll_scr_down(x,H3); /* 如在 0 屏,当前行以下各行下滚 */
yy=0; /* 光标至行首 */
}
Ctrl_E(int a) /* 删至行首,a=1 显示,a=0 不显示 */
{
int g;
chg=1; /* 文件已修改标志置为真 */
g=m; /* 保存原屏号 */
if(xx==ksx) { /* 如在块首行 */
if(yy=ksy) ksy-=yy; /* 如在块首前, 计算块首列号 */
else ksy=0; /* 如在块首后,块首列号置 0 */
}
if(xx==kwx) { /* 如在块尾行 */
if(yy=kwy) kwy-=yy; /* 如在块尾前,计算块尾列号 */
else kwy=0; /* 如在块尾后,块尾列号置 0 */
}
dks(); /* 如块首、块尾重合, 块标志置 1 */
strcpy(ss[ss_x],ss[ss_x]+yy); /* 光标后字符前移至行首起 */
ser-=yy; /* 计算字序数 */
m=0; /* 至 0 屏 */
yy=0; /* 至行首 */
if(a) { /* 如为按 Ctrl+E 键时,重显屏幕 */
if(!g) disp(ss_x,x); /* 如原在 0 屏,重显当前行 */
else disp_t(); /* 否则显示 0 屏 */
}
}
Ctrl_Y(int a) /* 删行,a=1 显示,a=0 不显示 */
{
int g,i;
chg=1; /* 文件已修改标志置为真 */
g=m; /* 保存原屏号 */
if((ss_x+(i=H3-x))=ss_max && xx+ittl_x) tj();
/* 如屏幕最下行超出数组,但在总行数内,从fp2或fp读入Q3行 */
if(xxksx) ksx--; /* 如被删行在块首行前,块首行号减 1 */
else if(xx==ksx) ksy=0; /* 如被删行为块首行,块首列号置 0 */
if(xxkwx) kwx--; /* 如被删行在块尾行前,块尾行号减 1 */
else if(xx==kwx) kwy=0; /* 如被删行为块尾行,块尾列号置 0 */
dks(); /* 如块首、块尾重合,块标志 blck 置 1 */
ser-=yy; /* 计算字序数 */
if(xxttl_x) { /* 当删除最后一行时 */
fp_rd--; /* fp 已读出最大行行号减 1 */
ttl_x--; /* 文末行行号减 1 */
ss_max--; /* 编辑数组实用最大行号减 1 */
}
movbk(ss_x,1); /* ss_x 后各行前移一行 */
m=0; /* 至 0 屏 */
yy=0; /* 至行首 */
if(a) { /* 如参数 a 为真 */
if(!g) { /* 如原在 0 屏 */
roll_scr_up(x,H3); /* 自当前行起滚屏 */
if(xx+i=ttl_x) disp(ss_x+i,H3); /* 如最下行还有,显示此行 */
}
else disp_t(); /* 如原不在 0 屏,则显示 0 屏 */
}
}
Ctrl_T(int a) /* 删至行尾,a=1 显示,a=0 不显示 */
{
int g;
chg=1; /* 置文件已修改标志为真 */
g=string_lingth(); /* 测行长 */
if(xx==ksx && yy=ksy) ksy=yy; /* 如在块首行,并在块首列前,计算块首列号 */
if(xx==kwx && yy=kwy) kwy=yy; /* 如在块尾行,并在块尾列前,计算块尾列号 */
dks(); /* 如块首、块尾重合, 块标志置 1 */
strcpy(ss[ss_x]+yy,ss[ss_x]+g); /* 原行尾回车换行符前移至当前光标处 */
if(a) disp(ss_x,x); /* 在按 Ctrl+T 时,重显本行 */
}
Ctrl_F(int a) /* 光标移至块首,a=1 显示,a=0 不显示 */
{
if(blck) { /* 如块标志为真,移至块首 */
if(ksx=xx) upto(ksx); /* 如目标行在当前行或之前,上移至目标行 */
else dnto(ksx); /* 如目标行在当前行后,下移至目标行 */
ser-=yy-ksy; /* 计算字序数 */
yy=ksy; /* 至块首列 */
if(a) comp_disp(); /* 如 a 为真,计算参数,重显当前屏幕 */
}
else write_prompt(1); /* 否则,提示:请先定义块 */
}
Ctrl_D() /* 删除块 */
{
if(blck==2) { /* 如已建立块 */
chg=1; /* 文件已修改标志置为真 */
txx=xx; /* 保存行号 */
tyy=yy; /* 保存列号 */
del_block(); /* 删块操作 */
Shift_F7(); /* 清除块定义,重显当前屏幕 */
}
else write_prompt(1); /* 否则,提示: 请先定义块 */
}
dks() /* 如块首、块尾重合, 块标志置 1 */
{
if(ksx==kwx && ksy==kwy) blck=1;
}
Ctrl_K() /* 拷贝块 */
{
int j,g;
long i;
if(blck==2) { /* 如已定义块 */
i=ser; /* 保存原字序号 */
if(read_block() || over(string_lingth())) {
/* 读块到ddd,并检查拷贝块后与移入处串相加行是否超长,如失败退回 */
ser=i; /* 恢复原字序号 */
return; /* 返回 */
}
i=kwx-ksx; /* 保存原块标记有用参数 */
j=kwy;
g=kwy-ksy;
ser+=tyy-yy; /* 计算字序数 */
mvto(txx); /* 重返原坐标,即块拷贝目的位置 */
kwy=(i==0)?yy+g:j; /* 计算块坐标变化 */
ksx=xx;
ksy=yy;
kwx=ksx+i;
write_block(kwx); /* 将 ddd 中的内容拷到目的位置 */
chg=1; /* 文件已修改标志置为真 */
comp_disp(); /* 计算有关参数,显示当前屏幕 */
ddd=dd; /* 指针返回缓冲区头 */
free(ddd); /* 释放 ddd 占用的内存空间 */
}
else write_prompt(1); /* 否则,提示:请先定义块 */
}
Ctrl_V() /* 移动块 */
{
int k,g;
long j;
if(blck==2) { /* 如已定义块 */
j=ser; /* 保存原字序数 */
if(read_block() || over(string_lingth())) {
/* 读块到ddd,并检查拷贝块后与移入处串相加行是否超长,如溢出退回 */
ser=j; /* 恢复原参数 */
return; /* 返回 */
}
j=kwx-ksx; /* 保存原块标记有用参数 */
k=kwy;
g=kwy-ksy;
del_block(); /* 删除原块 */
kwy=(j==0)?yy+g:k; /* 计算新位置块标记 */
ksx=xx;
ksy=yy;
kwx=ksx+j;
write_block(kwx); /* ddd 中块拷至当前光标处 */
blck=2; /* 置为:已定义块 */
chg=1; /* 文件已修改标志置为真 */
comp_disp(); /* 计算显示参数, 显示本屏 */
ddd=dd; /* 指针返回缓冲区头 */
free(ddd); /* 释放 ddd 占用的内存空间 */
}
else write_prompt(1); /* 否则,提示请先定义块! */
}