📄 全屏幕编辑软件的编写(c语言)03.txt
字号:
write_block(long v) /* 将 ddd 中内容拷至当前行指定位置 */
{ /* 参数 v 为拷贝后块尾行号 */
int i,g;
char *b;
b=malloc(HC); /* 为 b 分配内存空间 */
strcpy(b,ss[ss_x]+yy); /* 将当前行光标后字符串暂放入 b 中 */
if(ss_max-ss_x>Q3+H3) wfp2(); /* 如编辑数组当前行后较多,存一些到 fp2 */
for(;;) { /* 建一个无限循环 */
write_prompt(0); /* 提示“请稍候...” */
if((g=v-xx)<QB-1-ss_max) { /* 如块移入后编辑数组不会溢出 */
mov(ss_x+1,g); /* 将目标行后的编辑数组后移 */
ss_max+=g; /* 编辑数组已用最大行号增加 */
fp_rd+=g; /* fp 已读出最大行号增加 */
ttl_x+=g; /* 文末行行号增加 */
while(*ddd) { /* *ddd 为真则循环 */
ss[ss_x][yy]=*ddd++; /* ddd 中字符读入当前行 yy 处 */
ser++; /* 字序数加 1 */
if(ss[ss_x][yy++]==0x0A) { /* 如读到一换行符后 */
ss[ss_x][yy]=0; /* 串尾加 '\0' 定界 */
ss_x++; xx++; /* 下移一行 */
yy=0; /* 至行首列 */
}
}
strcpy(ss[ss_x]+yy,b); /* b 中字串接到行尾 */
break; /* 跳出 for 循环 */
}
else { /* 如编辑数组装不下 */
if(ss_x>Q1) wfp1(); /* 如当前行在后半数组,写一部分到 fp1 */
else { /* 如当前行在前半数组 */
mov(ss_x+1,(g=QB-1-ss_max)); /* 将当前行后的编辑数组后移 */
ss_max=QB-1; /* 定数组已用最大行行号 */
for(i=0;i<g;i++) { /* ddd 中字块读入编辑数组共 g 行 */
while(*ddd) { /* *ddd 为真则循环 */
ss[ss_x][yy]=*ddd++; /* ddd 中内容读入数组行当前列 */
ser++; /* 字序号加 1 */
if(ss[ss_x][yy++]==0x0A) { /* 如遇到换行符 */
ss[ss_x][yy]=0; /* 以'\0'结束本行 */
ss_x++; xx++; /* 行号增 1 */
yy=0; /* 至行首列 */
fp_rd++; /* fp 已读出最大行号增 1 */
ttl_x++; /* 文末行行号加 1 */
break; /* 填完一行,跳出 while 循环 */
}
}
}
}
}
}
free(b); /* 释放内存 */
clear_prompt(); /* 清提示区 */
}
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 下一页
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 下一页
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 */
}
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 下一页
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 下一页
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(key_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); /* 提示:请先定义块 */
}
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 下一页
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 下一页
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){ /* 如文件不存在 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -