📄 全屏幕编辑软件的编写(c语言)01.txt
字号:
这是一个DOS下的全屏幕编辑软件,整个程序功能齐全,但代码并不多,可以制表格,打印、搜索、块复制,有点类似DOS下的WPS。这个程序作为学习C语言编程的参考是很好的,如果能够仔细阅读该程序,并加以理解,那么你的编程能力会有很大提高。
/* BJ.C 全屏幕编辑软件 (Turbo_C 2.0) */
/* 用 tcc -mc bj 编译 */
#include <stdio.h>
#include <dir.h>
#include <dos.h>
#include <ctype.h>
#include <alloc.h>
#define BLCK_COLOR 0x1E /* 字块色彩 */
#define TEXT_COLOR 0x02 /* 文本字符色彩 */
#define PROM_COLOR 0x5F /* 提示及提问行色彩 */
#define CHAR_COLOR 0x03 /* 行末示意符色彩 */
#define HH 24 /* 屏幕最大行坐标 */
#define H1 (HH-1) /* 序号、文件名信息行行坐标 */
#define H2 (HH-2) /* 标尺行行坐标 */
#define H3 (HH-3) /* 编辑文本显示最下行行坐标 */
#define ZS 76 /* 每行显示文本的字数 */
#define BP (ZS/2) /* 每次移屏字节数 */
#define FH (ZS+3) /* 行末示意符列坐标 */
#define QB 400 /* 编辑数组可容纳的总行数 */
#define Q1 (QB/2) /* 编辑数组中间值 */
#define Q2 (QB*3/5) /* 第一次读入编辑数组的行数 */
#define Q3 (QB*2/5) /* 每次读写临时文件的行数 */
#define SZ 1000 /* 临时文件每次读写地址数组最大下标 */
#define HC 255 /* 编辑数组每行最大字节数控制值 */
#define KK 32000 /* 字块允许的最大字节数 */
#define PG ((HH-16)*6) /* 显示文件目录时,每页可显示目录数 */
long xx=0; /* 当前行在文本中的绝对行号 */
int yy=0; /* 当前列的文本列号,也是编辑数组列号 */
int ss_max=0; /* 编辑数组实用最大行号 */
int x=0,y=0; /* 当前行在显示屏幕上的行、列坐标 */
int ss_x=0; /* 当前行在编辑数组中的行号 */
int m=0; /* 左右移屏屏号,首屏为 0 */
int fp_end=0; /* 老文件是否读完的标志变量 */
int old=1; /* 区别新、老文件的标志变量 */
int ins=0; /* 是否为插入状态的标志变量 */
int vid=0; /* 区别图形和字符显示方式的标志变量 */
int tab=0; /* 中文表格线开关变量 */
int blck=0; /* 是否已定义字块的标志变量 */
int enq=HC-4; /* 排版行宽,初值设为 HC-4 */
long ksx=-1; /* 块首行号,未定义块时置 -1 */
int ksy=-1; /* 块首列号,未定义块时置 -1 */
long kwx=-1; /* 块尾行号,未定义块时置 -1 */
int kwy=-1; /* 块尾列号,未定义块时置 -1 */
long txx,tyy; /* 字块操作时保存原 xx,yy 坐标的变量 */
int chg=0; /* 文件是否已修改过的标志变量 */
int first=0; /* 字块中首行长度字节数 */
int oa=0,ob=0; /* 数组 wra[ ] 和 wrb[ ] 的标号变量 */
long wra[SZ],wrb[SZ]; /* 记录临时文件读写地址的数组 */
long fp_rd; /* fp_rd 为 fp 已读出行的最大行号 */
long ttl_x=0xFFFFFFFL; /* 文末行行号,先设一大数,fp 全部读完后,
用已读出行最大行号 fp_rd 代替 */
long ser=0; /* 当前光标处的字序数 */
long vw=0; /* 临时存盘时,保存正文文件读指针的变量 */
long vv=0; /* 读块时,存放读入块的字节数 */
unsigned char z1,z2,a1,a2; /* 为判断标点符号设置的变量 */
unsigned char *ss[QB]; /* 编辑缓冲区数组(简称编辑数组) */
char *mfile,*bfile; /* 分别存放源文件名和后备文件名 */
char *file1,*file2; /* 分别存放临时文件 1、2 的文件名 */
char far *mem, far *mmm; /* 长城字符方式显存基本区和扩展区地址指针 */
char *ddd,*dd; /* ddd 为读入块的指针变量,dd 为保存ddd串首的指针 */
char *hsz; /* 提问时输入字符串的指针变量 */
char *fnd; /* 存放要搜索的字符串 */
char two; /* 存放全角制表符第二字节的字符变量 */
char qq; /* 全角制表符第二字节的标志变量 */
char da[]={0x0D,0x0A,0}; /* 只有硬回车换行符的字符串 */
char ra[]={0x8D,0x0A,0}; /* 只有软回车换行符的字符串 */
struct ffblk pt[1]; /* 读文件目录用的结构 */
union REGS r; /* 中断调用函数用的联合 */
union inkey { /* 存放按键值的联合 */
unsigned char ch[2]; /* ch[0] 为高位字节, ch[1] 为低位字节 */
int ii;
} cc;
FILE *fp,*fopen(); /* fp 为老文件 mfile 的文件指针 */
FILE *fp1,*fp2; /* 临时文件 1、2 的文件指针 */
FILE *fp3; /* 读入的外部文件和字块写盘的文件指针 */
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] 下一页
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] 下一页
main(int argc,char *argv[]) /* 主控函数 */
{
int i;
clss(0,HH); /* 清全部屏幕 */
mod(); /* 测显示模式 */
for(i=0;i<QB;i++) { /* 为给编辑数组分配内存建的循环 */
ss[i]=malloc(HC); /* 逐行分配内存空间 */
*ss[i]=0; /* 数组行清为空串 */
}
mfile=malloc(16); /* 为编辑文件名字符串分配内存空间 */
*mfile=0; /* 字符串清为空串 */
if(argc>1) mfile=argv[1]; /* 如进入 BJ 时带命令行参数,放入 mfile */
filename(); /* 输入文件名,建临时文件名,老文件读入 */
hsz=malloc(HC); /* 为指针变量 hsz 分配内存空间 */
fnd=malloc(HC); /* 为搜索字符串变量分配内存空间 */
disp_t(); /* 显示编辑屏幕 */
Ins(); /* 置初始状态为“插入”状态 */
while(1) { /* 编辑主循环 */
xh(); /* 在信息行显示当前行、列、序号 */
coord(); /* 在标尺行显示标尺 */
goto_xy(x,y); /* 定屏幕文本光标位置 */
cc.ii=bioskey(0); /* 将按键值读入一联合中 */
clear_prompt(); /* 清提示区 */
if(cc.ch[0]) { /* 如果低位字节不为 0 */
switch(cc.ch[0]) { /* 判断低位字节 */
case 13: Enter(); /* 如为回车键,输入回车键操作 */
break; /* 跳出开关语句 */
case 8: Del(); /* 如为退格键,删字操作 */
break; /* 跳出开关语句 */
case 14: Ctrl_N(); /* Ctrl+N 在当前行前插入一空行 */
break; /* 跳出开关语句 */
case 25: Ctrl_Y(1); /* Ctrl+Y 删除当前行 */
break; /* 跳出开关语句 */
case 20: Ctrl_T(1); /* Ctrl+T 删至行尾 */
break; /* 跳出开关语句 */
case 5: Ctrl_E(1); /* Ctrl+E 删至行首 */
break; /* 跳出开关语句 */
case 6: Ctrl_F(1); /* Ctrl+F 移至块首 */
break; /* 跳出开关语句 */
case 22: Ctrl_V(); /* Ctrl+V 字块移动 */
break; /* 跳出开关语句 */
case 11: Ctrl_K(); /* Ctrl+K 字块拷贝 */
break; /* 跳出开关语句 */
case 23: Ctrl_W(); /* Ctrl+W 字块存盘 */
break; /* 跳出开关语句 */
case 4: Ctrl_D(); /* Ctrl+D 删除字块 */
break; /* 跳出开关语句 */
case 16: Ctrl_P(); /* Ctrl+P 打印当前编辑的文本文件 */
break; /* 跳出开关语句 */
case 18: Ctrl_R(); /* Ctrl+R 外部文件插入当前位置 */
break; /* 跳出开关语句 */
case 27: Esc(); /* Esc 键 不存盘退出 */
break; /* 跳出开关语句 */
case 3: bk(); /* Ctrl+C 退回 DOS 系统 */
default: Chr(); /* 如为字符键,输入字符 */
}
}
else { /* 如果低位字节为 0 */
switch(cc.ch[1]) { /* 判断高位字节 */
case 81: PgDn(); /* PgDn 键,向下翻屏 */
break; /* 跳出开关语句 */
case 73: PgUp(); /* PgUp 键,向上翻屏 */
break; /* 跳出开关语句 */
case 59: F1(1); /* F1 存盘并退出 */
break; /* 跳出开关语句 */
case 84: Shift_F1(); /* Shift+F1,存盘,不退出 */
break; /* 跳出开关语句 */
case 60: F2(); /* F2 移到指定行 */
break; /* 跳出开关语句 */
case 61: F3(); /* F3 输入格式文件排版行宽 */
break; /* 跳出开关语句 */
case 62: F4(); /* F4 段排版 */
break; /* 跳出开关语句 */
case 87: Shift_F4(); /* Shift+F4 从当前光标行排版至文末 */
break; /* 跳出开关语句 */
case 63: F5(); /* F5 搜索字符串 */
break; /* 跳出开关语句 */
case 88: Shift_F5(); /* Shift+F5 继续搜索 */
break; /* 跳出开关语句 */
case 64: F6(); /* F6 字符串的替代 */
break; /* 跳出开关语句 */
case 65: F7(); /* F7 定义块首 */
break; /* 跳出开关语句 */
case 66: F8(); /* F8 定义块尾 */
break; /* 跳出开关语句 */
case 90: /* Shift+F7 */
case 91: Shift_F7(); /* Shift+F8 取消块定义 */
break; /* 跳出开关语句 */
case 67: F9(); /* F9 光标移到文首 */
break; /* 跳出开关语句 */
case 92: Shift_F9(); /* Shift+F9 光标移到文末 */
break; /* 跳出开关语句 */
case 68: F10(); /* F10 表格线功能开关 */
break; /* 跳出开关语句 */
case 77: Right(); /* → 键 右移光标 */
break; /* 跳出开关语句 */
case 75: Left(); /* ← 键 左移光标 */
break; /* 跳出开关语句 */
case 72: Up(); /* ↑ 键 上移一行 */
break; /* 跳出开关语句 */
case 80: Down(); /* ↓ 键 下移一行 */
break; /* 跳出开关语句 */
case 82: Ins(); /* Ins 插入状态转换 */
break; /* 跳出开关语句 */
case 83: Del(); /* Del 同退格键 */
break; /* 跳出开关语句 */
case 71: Home(); /* Home 光标移到行首 */
break; /* 跳出开关语句 */
case 79: End(); /* End 光标移到行末 */
break; /* 跳出开关语句 */
}
}
}
}
mark() /* 软件标志 */
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -