1、 本 科 毕 业 论 文 基于 C 语言的 文本编辑器 部分编辑功能模块和菜单功能模块 A Text Editor Based On C Programming Language Editing Module and MenuActions Module 姓 名: 学 号: 学 院:软件学院 系:软件工程 专 业:软件 工程 年 级: 指导教师: 年 月 摘 要 文本编辑器 , 是一种可见于任何操作系统的 常用 工具 : Unix 或者 Unix家族的操作系统有 vi 编辑器, Windows 操作系统有 notepad 编辑器, Mac 操作系统也有 SimpleText 编辑器。 而接下来
2、我 们 要论述的文本编辑器 是一个具有不同思维模式的文本编辑器, 它 同样 被设计用于 16 位机器,但是针对 16 位机器 内存使用 受 限制 这一 约束 , 提出了 逻辑 文件页 的 概念 ,使这一问题能妥善得到解决 。 逻辑 文 件页这样的概念的提出使得内存使用 得到了优化。 因为我们 在编辑 文本 的某一个时刻 只会集中在文件的某个区域,也就是说其他部分 的 文本此时其实是可以保存在磁盘上。 如果我们能够保证在操作这个特定区域的时候 ,相应部分的文本处于内存中那么它就可以正常的工作而不会发生错误 ,从而内存得到很大节省。 这也就意味着我们在加载文件的时候没有必要一次性加载了,这些全都得
3、益于逻辑文件页的出现以及由它而定义的文件存储格式。 本文 结合文本编辑器的各个功能的实现,阐述了逻辑文件页的概念,相信大家可以从中感受到逻辑文件页的巧妙使用,也会体会到使用逻 辑文件页的必要性。 关键词 : 文本编辑器;逻辑文件页 ; 内存优化 Abstract Text editor, as a common tool, is available on any operating system: Unix and Unix-like operating systems have the vi editor, Windows operating systems come with the no
4、tepad editor, and on Mac operating system there is the SimpleText editor. In the following, the editor which will be discussed has a unique thought behind which there is a totally different ideology. It is designed to be used on 16-bit machine, but in order to break through the limitation of limited
5、 memory of 16-bit machine; logical file page is brought up, which indeed can solve the problem appropriately. Since our focus on the file will be limited to a specific area while editing, that is to say, other parts can actually remain on the disk. If we can guarantee that the part being operated on
6、 resides in memory, errors would not arise due to the memory reasons. As a result, the memory use has been minimized in a sense. At the same time, it also means that we do not have to load the whole file and all of these accredit from that concept. This paper explicates the concept of logical file p
7、age based on the realizations of all kinds of functionalities of an editor, through which I believe you can feel the magic power of logical file page, as well as the necessity of logical file page. Key words: text editor; logical file page; memory optimization.目录 第一章 引言 . 1 1.1 背景 . 1 1.2 本文的章节安排 .
8、1 第二章 编辑功能 . 3 2.1 几个基础函数的介绍 . 3 2.2 backspace 键的功能实现 . 4 2.3 delete 键的功能实现 . 10 2.4 home 键和 end 键的功能实现 .11 第三章 菜单功能 . 13 3.1 查找功能 . 13 3.1.1 查找功能简介 . 13 3.1.2 KMP 算法 . 13 3.1.3 highlight、 storehighlightinfo 和 resethighlightinfo 函数 . 14 3.1.4 onfind 实现查找功能 . 14 3.1.5 查找功能演示 . 15 3.2 替换功能 . 16 3.2.1
9、替换功能简介 . 16 3.2.2 Replace 子功能 . 17 3.2.3 ReplaceAll 子功能 . 17 3.2.4 替换功能演示 . 18 3.3 行跳转功能 . 20 3.3.1 行跳转功能简介 . 20 3.3.2 getpagenodewithindex 函数 . 20 3.3.3 ongotoline 实现行跳转功能 . 21 3.3.4 行跳转功能演示 . 21 第四章 面向对象的体现 . 24 4.1 面向 “接口 ”编程 . 24 4.1.1 面向对象编程语言的面向接口编程 . 24 4.1.2 本系统的面向“接口”编程 . 24 4.2 泛型编程思想 . 25
10、 4.2.1 关于泛型编程 . 25 4.2.2 本系统的泛型编程 . 26 第五章 系统的测试 . 28 5.1 TurboC 下进行单元测试 . 28 5.2 借助 VC 进行集成测试 . 29 5.3 界面的测试 . 29 第六章 结束语 . 30 参考文献 . 32 致谢语 . 31 Contents Chapter 1 Introduction . 1 1.1 Background . 1 1.2 Organization of This Article . 1 Chapter 2 Edit Functionality . 3 2.1 Introduction of Some Bas
11、ic Functions . 3 2.2 Realization of Key Backspace. 4 2.3 Realization of Key Delete . 10 2.4 Realization of Key Home and Key End .11 Chapter 3 Menu Functionality . 13 3.1 Finding Functionality . 13 3.1.1 Introduction of Finding Functionality. 13 3.1.2 KMP Algorithm. 13 3.1.3 Highligh、 Storehighlighti
12、nfo and Resethighlightinfo Functions . 14 3.1.4 Finding Functionality through Onfind Function . 14 3.1.5 Demonstration of Finding Functionality. 15 3.2 Replacing Functionality . 16 3.2.1 Introduction of Replacing Functionality . 16 3.2.2 Replace Subfunctionality . 17 3.2.3 ReplaceAll Subfunctionalit
13、y . 17 3.2.4 Demonstration of Replacing Functionality . 18 3.3 Line Jumping Functionality . 20 3.3.1 Introduction of Line Jumping Functionality . 20 3.3.2 Getpagenodewithindex Function . 20 3.3.3 Line Jumping Functionality through Ongotoline Function . 21 3.3.4 Demonstration of Line Jumping Function
14、ality . 21 Chapter 4 Embodiments of Object-Oriented Programming . 24 4.1 Interface-Oriented Programming . 24 4.1.1 Interface-Oriented Programming on Object-Oriented Language . 24 4.1.2 Interface-Oriented Programming of This System . 24 4.2 Generic Programming. 24 4.2.1 About Generic Programming . 24
15、 4.2.2 Generic Programming of This System . 25 Chapter 5 Testing of This System . 27 5.1 Unit Testing under TurboC . 27 5.2 Integrated Testing through VC . 28 5.3 Testing of User Interface . 28 Chapter 6 Summary. 29 References . 32 Acknowledgements . 31 基于 C 语言的简单文本编辑器 1 第一章 引言 1.1 背景 也许很多人会对 本论文的宗旨
16、有许多不解和疑问,为什么要实现编辑器这样一个如此普通的,而且还是基于 16 位机平台的软件? 相比于现有的如此之多的而且极具实用价值的编辑器, 它的 实用 价值在哪里 ? 在诸如 C+、 Java、 C#等面向对象的语言如此盛行的今天,为什么选择 C 这种面向过程的语言来实现我们的编辑器? 当然,所有这些来自他人的不解和疑问,我们也曾不止一次地问过我们自己。在经过多次地自我否定与自我肯定之后, 现在,我们 对这些问题有着自己独特的一些想法,也得出了自己的解释。首先 , 我们必须向 大家说明,研究一些“底层”的东西 或者说在一些人看来稀松平常的东西,一直以来都是我们的兴趣。 而编辑器这样一个集成
17、在任何操作系统之中的、大家都习以为常的东西,也正是我们的兴趣所在。其次,对于我们的编辑器的实用性,我们也必须承认,是没有什么太大的实用性可言的。但是,作为仍然在校的大学生的我们,实用性或许显得不那么重要,能够做一些带点理论研究性的东西或许也是适合我们的。 最后,关于语言的选择问题,事实上,面向过程的 C 语言不是我们不能设计出 好的程序的理由。 作为程序员 ,我们都深深知道: 糟糕的设计能够使 面向对象的语言设 计出面向过程的程序 ,而好的设计 也 能够使面向过程的语言设计出面向对象的程序,而这一点在我们的程序中也很好地得到了实现,本文也会对此加以论述。 1.2 本文的章节安排 本文以相关功能
18、的实现和运用的技术为线索 ,比较详细地阐述了编辑器实现过程中的一些细节。从结构上看,本文分为 六 章: 第一章概述,就是我们刚刚讨论的部分,主要介绍课题背景。 第 二 章编辑功能的介绍,主要讨论的是与编辑相关的一些功能,主要涉及键盘的 backspace、 delete、 home 以及 end 操作的实现。 基于 C 语言的简单文本编辑器 2 第 三 章菜单功能的介绍,主要讨论的是与菜单相 关的一些功能,主要包括查找、替换以及跳转到文档的特定行。 第 四 章面向对象的体现,就如前面所述,我们采用的是面向过程的 C 语言,但是我们能够设计出面向对象的程序 ,这一章介绍体现面向对象的地方 。 第
19、 五 章测试的讨论,测试是开发过程必不可少的环节,这一章会对测试在我们开发过程中的运用进行论述。 本文最后对论文工作进行了总结。基于 C 语言的简单文本编辑器 3 第二章 编辑功能 本文的编辑功能涉及 到 backspace 键的功能实现、 delete 键的功能实现以及home 键和 end 键的功能实现,下面 将 逐一进行介绍。 这部分功能的实现 函数主要位于 edit.c 文 件和 updatev.c 文件,分别对应逻辑上的操作和视图上的 更新 。 2.1 几个基础函数的介绍 在 对所有这些编辑功能进行介绍之前, 本文 觉得有必要 先讲解 一下几个基本的函数,它们 在 实现这些编辑功能
20、的过程中 起到了至关重要的作用;同时, 本文也认为, 先介绍它们也有助于大家对源代码的理解。 这些函数在 TextLine.c 文件中都有完整的定义,不过大家并不需要确切地知道它们是如何实现的 。实际上,大家可以在 TextLine.h 头文件中找到这些函数的函数原型 1: extern void mergetextline( TextLine*, TextLine* ); extern int deletebackwardtab( TextLine*, int ); extern int deleteforwardtab( TextLine*, int ); extern int ishom
21、etab( TextLine* ); extern int istabindicated( TextLine *, int ); 而在 实际 编程过程中,如果需要调用这些函数,只需要包含 TextLine.h 头文件即可 这也正是编辑器 在 实现过程中所采用的 方式 。 ( 1) Mergetextline 函数 函数原型: void mergetextline( TextLine *line1, TextLine *line2 ); 函数功能: 合并两个 TextLine,将 line2 合并到 line1 里面去 ; 函数返回值: void 注意事项:由于函数体的实现时采用 memmvoe 函数,所以 line2 的地址空间没有被释放。 ( 2) Deletebackwardtab 函数