del_block() /* 删除块 */
{
int j;
write_prompt(0); /* 提示“请稍候...” */
/* 以下计算删除原块后,原光标位置的变化 */
if(!(txx<ksx||(txx==ksx && tyy<=ksy))) {
if(txx>kwx) txx-=kwx-ksx;
else {
if(txx==kwx && tyy>kwy) tyy-=kwy-ksy;
else tyy=ksy;
txx=ksx;
}
}
Ctrl_F(0); /* 移到块首,不显示 */
if(ksx==kwx) strcpy(ss[ss_x]+yy,ss[ss_x]+kwy);
/* 如块首块尾在同一行,将块尾后的字符串拷至块首起 */
else { /* 如块首块尾不在同一行 */
Ctrl_T(0); /* 块首行删至行末,不显示 */
ser+=2; /* 计算字序数 */
xx++; ss_x++; /* 至下行 */
y=0; yy=0; /* 至行首 */
while(xx<kwx) Ctrl_Y(0); /* 逐行删除,不显示 */
yy=kwy; /* 当前行已移至块尾行,列号定为块尾列号 */
ser+=yy; /* 计算块尾列的字序号 */
Ctrl_E(0); /* 删至行首,不显示 */
delc(); /* 本行剩余部分接至块前 */
}
ser+=tyy-yy; /* 计算字序数 */
if((j=ss_x+H3-x)>ss_max && j<ttl_x) tj();
/* 屏幕文本区底行超出数组,且未到文末,从 fp 或 fp2 读入 */
mvto(txx); /* 重返原坐标 */
clear_prompt(); /* 清提示区 */
}
int read_block() /* 字块读入缓冲区 ddd */
{
int i,j;
write_prompt(0); /* 提示“请稍候...” */
txx=xx; /* 保存原文本行号 */
tyy=yy; /* 保存原文本列号 */
Ctrl_F(0); /* 移到块首,不显示 */
if(ksx==kwx) { /* 如块首块尾在同一行 */
j=kwy-ksy; /* 计算块串长 */
ddd=malloc(j+2); /* 给 ddd 分配内存空间 */
dd=ddd; /* 保存 ddd 指针首址 */
for(i=0;i<j;i++) *ddd++=ss[ss_x][ksy+i]; /* 块读入 ddd */
*ddd++=0; /* ddd 以 '\0' 结尾 */
vv=i; /* 统计块长字节数 */
yy+=i; /* 移至块尾 */
}
else { /* 如块首块尾不在同一行 */
ddd=malloc(KK); /* 给 ddd 分配内存空间 */
dd=ddd; /* 保存 ddd 首指针 */
first=strlen(ss[ss_x])-ksy; /* 计算块首行中块串长 */
vv=first; /* 计算读入字节数 */
for(i=0;i<first;i++) *ddd++=ss[ss_x][ksy+i]; /* 首行中块串读入 ddd */
xx++; ss_x++; /* 至下行 */
yy=0; /* 至行首 */
for(;;) { /* 为读入字块建的循环 */
tj(); /* 如当前行在数组后半部,写 Q3 行到 fp1,
数组行数不足数组一半,从 fp1 或 fp2 补充之 */
if(kwx-xx<=ss_max-ss_x) { /* 如块尾在当前编辑数组中 */
while(xx<kwx) /* 当前行在块尾行前则循环 */
if(hb()) return 1; /* 读入 ddd 中,如块太大返回 1 */
break; /* 退出 for 循环 */
}
else /* 如块尾不在编辑数组中 */
while(ss_x<ss_max) /* 数组中的字块部分读入ddd */
if(hb()) return 1; /* 计算字节数,读入 ddd,如块太大返回 1 */
}
for(i=0;i<kwy;i++) *ddd++=ss[ss_x][i]; /* 读入块末行的块串 */
vv+=i; /* 计算读入的字节数 */
yy=kwy; /* 到块尾 */
*ddd=0; /* ddd 以 '\0' 结尾 */
}
ser+=vv; /* 计算字序数 */
ddd=dd; /* 返回指针头 */
clear_prompt(); /* 清提示区 */
return 0; /* 正常读完,返回 0 */
}
int hb() /* 计算块的字节数,读入 ddd 中 */
{
int i=0;
vv+=strlen(ss[ss_x]); /* 计算读入的字节数 */
if(vv>=KK-255) { /* 如字节数超出 ddd 最大空间 */
mvto(txx); /* 重返原坐标 */
comp_disp(); /* 重显原屏幕 */
write_prompt(2); /* 提示“块太大!” */
clear_ques(); /* 清提问区 */
ddd=dd; /* 返回首指针 */
free(ddd); /* 释放 ddd 占用内存空间 */
return 1; /* 返回 1 */
}
while(ss[ss_x][i]) *ddd++=ss[ss_x][i++]; /* 读一行至 ddd */
ss_x++; xx++; /* 至下一行 */
return 0; /* 返回 0 */
}
int over(int g) /* 行超优点理,g 为当前行长度 */
{
if((kwx==ksx && vv+g>HC-4)||
(kwx!=ksx &&(tyy+first>HC-4 || g-tyy+kwy>HC-4))) {
mvto(txx); /* 重返原坐标 */
comp_disp(); /* 重显原屏幕 */
ddd=dd; /* 返回指针头 */
free(ddd); /* 释放 ddd 占用的内存空间 */
write_prompt(3); /* 提示:行超长 */
return 1; /* 发生超长返回 1 */
}
return 0; /* 未发生行超长返回 0 */
}
Ctrl_W() /* 字块存盘 */
{
long g;
if(blck==2) { /* 如已定义块 */
g=ser; /* 保存字序号 */
write_ques(1); /* 提问存盘文件名 */
if(ke
y_string(HH,25,hsz,PROM_COLOR)<=0) { /* 如为空串或按 ESC */
clear_ques(); /* 清提问区 */
return; /* 退出本功能 */
}
if(findfirst(hsz,pt,0)==0){ /* 如当前目录中已有此文件 */
write_ques(2); /* 提问是否复盖 */
if(key_yn(30)<1) { /* 输入 Y 或 N,如按 ESC 键或输入 N */
clear_ques(); /* 清提问区 */
return; /* 退出本功能 */
}
}
fp3=fopen(hsz,"wb+"); /* 以写方式打开文件 hsz,文件指针放入 fp3 */
if(read_block()) { /* 读块到 ddd ,如失败,跳出开关语句 */
ser=g; /* 恢复原参数 */
return; /* 退出本功能 */
}
write_prompt(0); /* 提示“请稍候...” */
fwrite(ddd,sizeof(char),vv,fp3); /* ddd 中内容写入文件 fp3 */
fputc(0x1A,fp3); /* 加文件结束符 */
fclose(fp3); /* 关闭文件 fp3 */
free(ddd); /* 释放 ddd 占用的内存 */
mvto(txx); /* 重返原坐标 */
ser=g; /* 恢复原参数 */
comp_disp(); /* 重显屏幕 */
clear_prompt(); /* 清提示区 */
clear_ques(); /* 清提问区 */
}
else write_prompt(1); /* 提示:请先定义块 */
}
Ctrl_R() /* 外部文件读入光标处 */
{
int i,j,g,v;
write_ques(3); /* 提问外部文件名 */
if(key_string(HH,23,hsz,PROM_COLOR)<=0) { /* 输入字符串,如为空串或按 ESC */
clear_ques(); /* 清提问区 */
return; /* 退出本功能 */
}
if((fp3=fopen(hsz,"rb"))==NULL){ /* 如文件不存在 */
clear_ques(); /* 清提问区 */
write_prompt(6); /* 提示文件未找到 */
return; /* 退出本功能 */
}
chg=1; /* 文件已修改标志置为真 */
txx=xx; /* 保存文本行号 */
tyy=yy; /* 保存文本列号 */
*hsz=0; /* 字符串置为空串 */
g=0; /* 累计读入行数置初值 0 */
for(;;) { /* 分批读入的循环 */
ddd=malloc(KK+1); /* 给 ddd 分配内存 */
dd=ddd; /* 保存 ddd 首指针 */
j=fread(ddd,sizeof(char),KK,fp3); /* 读文件KK字节至ddd */
v=0; /* 本次读入行数置初值 0 */
while(*ddd) { /* *ddd 为真则循环 */
if(*ddd==0x1A) { /* 以 '\0' 代替文件结束符 */
*ddd=0;
break; /* 退出循环 */
}
if(*ddd++==0x0A) { /* 计算读入行数 */
++v; /* 本次循环读入行数加 1 */
++g; /* 累计读入行数加 1 */
}
}
ddd=dd; /* 恢复指针到指针头 */
v+=xx; /* 计算本次拷入后光标行号 */
write_block(v); /* ddd 中内容拷入当前位置 */
ddd=dd; /* 恢复 ddd 指针到指针头 */
free(ddd);
if(j<KK) break; /* 读入字节数小于 KK 时,文件已读完 */
}
if(txx<ksx) ksx+=g; /* 如当前行在块首行前,块首行号增加读入文件行数 */
else { /* 如当前行不在块首行前 */
if(txx==ksx && tyy<=ksy) { /* 如当前行为块首行,当前列在块首列前 */
ksx+=g; /* 块首行行号增加 g */
ksy+=yy-tyy; /* 计算块首列列号 */
}
}
if(txx<kwx) kwx+=g; /* 如当前行在块尾行后,块尾行行号增加 g */
else { /* 如当前行不在块尾行后 */
if(txx==kwx && tyy<=kwy) { /* 如当前行在块尾行,并在块尾列前 */
kwx+=g; /* 块尾行行号加 g */
kwy+=yy-tyy; /* 计算块尾列列号 */
}
}
comp_disp(); /* 计算显示参数,重显当前屏幕 */
fclose(fp3); /* 关闭外部文件 */
clear_ques(); /* 清提问区 */
}
Ctrl_P() /* 当前编辑文本的打印 */
{
FILE *fpw,*fpr;
unsigned char prt[255];
int i,j,k,a,b=0,pg;
write_ques(8); /* 提问每页打印行数 */
if((j=key_digit(22))<=0) { /* 输入行数,如为空串或按 ESC 键 */
clear_ques(); /* 清提问区 */
return; /* 退出本功能 */
}
write_ques(12); /* 提问页号位置 */
if((k=key_digit(20))<=0) { /* 输入起始列号,如为空串或按 ESC 键 */
clear_ques(); /* 清提问区 */
return; /* 退出本功能 */
}
write_ques(13); /* 提问起始页号 */
if((pg=key_digit(16))<=0) { /* 输入起始页号,如为空串或按 ESC 键 */
clear_ques(); /* 清提问区 */
return; /* 退出本功能 */
}
Shift_F1(); /* 存盘不退出 */
if((fpr=fopen(mfile,"rb"))==NULL) { /* 打开主文件,指针赋于 fpr,如失败返回 */
clear_ques(); /* 清提问区 */
return; /* 退出本功能 */
}
fpw=fopen("PRN","w"); /* 打开设备文件(打印机),指针赋于 fpw */
while(1) { /* 为分页打印设的循环 */
write_ques(10); /* 提示:调整好打印机,按一键开始打印 */
if(gett()==-1||tpt()==-1) { /* 测打印机,如按 Esc 键 */
fclose(fpr); /* 关闭 fpr */
clear_ques(); /* 清提问区 */
return; /* 返回 */
}
for(i=0;i<j;i++) { /* 为一页内分行打印设的循环 */
if(fgets(prt,255,fpr)==NULL) { /* 从 fpr 读入一行至 prt, 如失败 */
while(i++<j) { /* 未打满一页则循环 */
fprintf(fpw,"\n"); /* 打印一空行 */
b=1; /* 文件结束标志置 1 */
}
break; /* 跳出 for 循环 */
}
for(a=0;prt[a];a++) { /* 去除字符串中的回车换行符 */
if(prt[a]==0x0D || prt[a]==0x8D) break;
}
prt[a]=0; /* 字符串以 '\0' 定界 */
fprintf(fpw,"%s\n",prt); /* 打印一行 */
}
fprintf(fpw,"\n"); /* 走纸一行 */
for(a=0;a<k;a++) fprintf(fpw," "); /* 打印页号前空格 */
fprintf(fpw,"·%d·\n",pg++); /* 打印页号 */
if(b) break; /* 如打印完全文,退出循环 */
}
clear_ques(); /* 清提问区 */
fclose(fpr); /* 关闭打印的文本文件 */
fclose(fpw); /* 关闭打印机文件 */
}
int tpt() /* 打印机状态测试 */
{
while(1) { /* 为重复测试建的循环 */
if(inp(0x379)==0xDF) break; /* 取 0x379 端口值,如等于 0xDF, 跳出循环 */
else write_ques(9); /* 否则提示打印机未预备好 */
if(gett()==-1) { /* 等待按键,Esc 键返回 -1,否则继续循环 */
clear_ques(); /* 清提问区 */
return -1; /* 返回 -1 */
}
}
write_ques(11); /* 提示“正在打印....” */
return 0; /* 返回 0 */
}
Esc() /* 放弃存盘,退出编辑 */
{
if(chg) { /* 如文本已修改过 */
write_ques(0); /* 提问:是否放弃并退出编辑 */
if(key_yn(26)<1) { /* 如输入 N */
clear_ques(); /* 清提问区 */
return; /* 返回,继续编辑 */
}
}
bk(); /* 退出程序,至 DOS 下 */
}
Chr() /* 输入字符 */
{
static bb=0; /* 定义一个静态变量作为全角一、三
区字符标志 */
int j,g,k;
if(cc.ch[0]==0xF0 && cc.ch[1]==76) return; /* 屏蔽小键盘中间键 */
if(cc.ch[0]>31) { /* 屏蔽控制键 */
chg=1; /* 文件已修改标志置为真 */
qq=0; /* 全角制表符标志变量初始化 */
make_tab(); /* 如表线开关为开,产生表格线 */
AA: z2=cc.ch[0]; /* 将字符放入 z2 */
if(yy>=enq) { /* 如在排版宽度以后 */
if(vs(enq-1)==0) { /* 如排版长度处不为全角后半部 */
if(yy==enq) { /* 如写在排版长度处 */
if(z2<160) { /* 如为半角字符 */
if(punc1(z2)) goto BB; /* 如为指定标点符号,转写入字符串 */
else k=enq; /* 如不是,在此处折断 */
}
else { /* 如为全角字符 */
if(z2==161 || z2==163) { /* 如第一字节在一、三区 */
z1=z2; /* 输入字符从 z2 移入 z1 暂存 */
bb=1; /* 全角一、三区标志置 1 */
goto BB; /* 先写入字符串 */
}
else k=enq; /* 否则在此处折断 */
}
}
else { /* 如在排版长度之后 */
if(bb && punc2(z1,z2)) goto BB;
/* 如为指定全角标点符号,写入字符串 */
else { /* 否则检查排版优点字符 */
bb=0; /* 全角一、三区标志 bb 恢复初值 */
a1=ss[ss_x][enq]; /* 排版优点取一字节,放入 a1 */
if(a1<160) { /* 如为半角字符 */
if(punc1(a1)) k=enq+1; /* 如为指定半角标点,折断处后移一字节 */
else k=enq; /* 否则原处折断 */
}
else { /* 如为全角字符 */
a2=ss[ss_x][enq+1]; /* 再取一字节放入 a2 */
if(punc2(a1,a2)) /* 如为指定全角标点*/
k=enq+2; /* 折断处后移二字节 */
else k=enq; /* 否则原处折断 */
}
}
}
}
else { /* 排版长度处为全角字符后半部 */
z1=ss[ss_x][enq-1]; /* 读出全角前半部 */
if(yy==enq) { /* 如写入处在排版长度处 */
if(punc2(z1,z2)) goto BB; /* 如为指定全角标点, 转写入字符串 */
else k=enq-1; /* 否则折断处前移一字节 */
}
else { /* 如写入在排版长之后 */
a2=ss[ss_x][enq]; /* 检查应折断处字符 */
if(punc2(z1,a2)) /* 如为指定全角标点 */
k=enq+1; /* 折断处后移一字符 */
else k=enq-1; /* 否则,折断处前移一字节 */
}
}
intercept(k); /* 折断字符串换行 */
strcpy(ss[ss_x-1]+k,ra); /* 折断处加软回车符 0x8D0A */
yy-=k; /* 计算列号 */
comp_disp(); /* 计算参数,重显当前屏幕 */
}
BB: g=string_lingth(); /* 计算行长(不包括回车换行符) */
if(ins || yy==g) { /* 如为插入状态或写在行末 */
if(g>HC-4) { /* 如行超长退回 */
write_prompt(3); /* 提示:行超长 */
return; /* 退出 */
}
if(xx==ksx && yy<ksy) ksy++; /* 计算块坐标变化 */
if(xx==kwx && yy<kwy) kwy++;
for(j=g+3;j>yy;j--) ss[ss_x][j]=ss[ss_x][j-1];
} /* 插入字符后的字符依次后移 */
else { /* 如为非插入状态 */
if(cc.ch[0]<127 && ss[ss_x][yy]>0xA0) ss[ss_x][yy+1]=32;
/* 如为半角复盖全角,全角后半字填空格 */
if(vs(yy)==0 && cc.ch[0]>0xA0 && ss[ss_x][yy]<127
&& ss[ss_x][yy+1]>0xA0){ /* 如为全角复盖一个半角和一个全角的前半部 */
ss[ss_x][yy+2]=32; /* 全角后半字节填空格 */
}
}
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |