2024年4月13日发(作者:)

Source_Insight

作为一个开放源代码的操作系统,

完整使用教程

Linux附带的源代码库

使得广大爱好者有了一个广泛学习、和深入钻研的机会,特

别是 Linux内核的组织极为复杂,同时,又不能像windows

平台的程序一样,可以使用集成开发环境通过察看变量和函

数,甚至设置断点、单步运行、调试等等 手段来弄清楚整

个程序的组织结构,使得Linux内核源代码的阅读变得尤为

困难。

当然了Linux下的vim和emacs编辑程序并不是没有提

供 变量、函数搜索,彩色显示程序语句等功能。它们的功

能是非常强大的。比如,vim和emacs就各自内嵌了一个标

也记程序,分别叫做ctag和etag,通 过配置这两个程序,

可以实现功能强大的函数变量搜索功能,

杂,linux

但是由于其配置复

附带的有关资料也不是很详细,而且,即使建立

好标记库,要实现 代码彩色显示功能,仍然需要进一步的

配置(在另一片文章,我将会讲述如何配置这些功能),同

时,对于大多数爱好者来说,可能还不能熟练使用

emacs那些功能比较强大的命令和快捷键。

为了方便的学习

vim和

Linux源程序,我们不妨回到我们熟悉的

制夷”吧。但是在

效果也不是

window环境下,也算是“师以长夷以

Window平台上,使用一些常见的集成开发环境,

很理想,比如难以将所有的文件加进去,查找速度缓慢,对

于非Windows 平台的函数不能彩色显示。于是笔者通过在互

联网上搜索,终于找到了一个强大的源代码编辑器,它的卓

越性能使得学习Linux内核源代码的难度大大降低,这 便

是Source Insight3.0,它是一个Windows平台下的共享软

是一个Windows平台的应用软件,

Linux系统上的程序源代码弄到

linux平台上将

件,由于Source Insight

所以首先要通过相应手段把

Windows平台下,这一点可以通过在

/usr/src目录下的文件拷贝到Windows平台的分区上,或者

Windows平台的分区来实现。

,考虑到阅读源程序

从网上光盘直接拷贝文件到

下面主要讲解如何使用Source Insight

的爱好者都有相当的软件使用水平,本文对于一些琐碎、人

所共知的细节略过不提,仅介绍一些主要内容,以便大家能

够很快熟练使用本软件,减少摸索的过程。

安 装Source Insight

1界面。在并启动程序,可以进入图

工具条上有几个值得注意的地方,如图所示,图中内凹左边

的是工程按钮,用于显示工程窗口的情况;右边的那

钮按下去将会显示一个窗口,

对其他函数的调用图,

入该函数所在的地方。

个按

里边提供光标所在的函数体内

通过点击该窗体里那些函数就可以进

图1 Source Insight界面图

由于Source Insight

言(java,c ,c++

的实质上是一个支持多种开发语

等等)的编辑器,只不过由于其查找、定

位、彩色显示等功能的强大,而被我们当成源代码阅读工具

使用。所以,为了有效的阅读源程序,首先必须选择功 能

菜单上的 “Project”选项的子菜单“New Project”新建

一个项目,项目名称可以自由选定,当然也可以选择删除

(Remove)一个项目。当删除一个项目的时候,并不删除原

有的源代码文件, 只是将该软件生成的那些工程辅助文件

删除。设定之后,将会弹出一个对话框如图2,接受默认选

择,如果,硬盘空间足够,可以将第一个复选框选上,该选

项将会 需要与源代码大致同等的空间来建立一个本地数据

库以加快查找的速度。

图2 工程设置

点击“OK”按钮,接受选择后,将会有一个新的对话框

弹出,在这个对话框里,可以选择将要阅读的文件加入工程,

一种方式是通过在File Name中输入要阅读源代码文件的名

称,点击“Add”按钮将其加入,也可以通过其中“Add All”

和“Add Tree”两个按钮可以将选中目录的所有文件加入到

工程中,其中“Add All”选项会提示加入顶层文件和递归

加入所有文件两种方式,而“Add Tree”相当于“Add All”

选项的递归加入所有文件,可以根据需要使用,就我来说,

更喜欢“Add Tree”一些。由于该程序采用了部分打开文件

的方式,没有用到的文件不会打开,所以,加入数千个文件

也不用担心加入的文件超出程序的所能容忍的最大值,

就是采用“Add Tree”的方式将

九十一个文件加入的。

图3 添加文件

Linux2.4

内核的四千五百

加入文件后,点击一个文件,可以出现使用界面,如图

所示,其中,右边的那个窗口(Linux Project,即工程窗

4

口)缺省按照字母顺序列出当前工程中所有的文件。

图4 工作窗口

点击一个文件就可以打开该文件,显示如图

入到右边的那个窗口分别可以以文件列表的方式,

的文件,每个窗体下边有一排按钮,

5所示,进

列出所有

左边的窗口 (21142.c)

从左至右分别为:按字母顺序排列所有标记、按照文件中行

数顺序排列标记、按照类型排列标记、浏览本地文件标记、

标记窗口属性。右边的窗 口(Linux Project)从左至右分

别为:按字母顺序文件列表、显示文件夹、按照文件类型归

类文件、全部文件的所有标记列表、按照标记类型归类标记、

跳转到定义 处、显示标记信息、浏览工程标记、查找函数

调用、工程属性,其中全部文件的所有标记列表选项可能要

一段时间抽取标记,同步到数据库去,如果开始选择了建立

标记数据库,将会在今后节省同步时间,最有用的莫过于浏

览标记信息和查找函数调用,

不同的地方查找同样的标志,

前者可以通过“Jump”按钮在

还可以通过 “Reference”按

钮结合后者进行全局的标记查找。

Reference 功能是Source Insight的特色之一,它可以

并且在该行程

6是一个

在速度极快的在整个工程中找到所有的标记,

序的前边加上红色箭头的小按钮链接上。图

Reference搜索后的结果,它可以有两种模式,一种集中显

示结果,图6显示的就是这种模式,在这种模式下,可以通

过前边的红色箭头小按钮进入另外一 种模式,该标记的具

体的所在处,也可以通过标记的具体所在处点击红色箭头小

按钮进入警种模式,还可以通过工具条上的两个红色小箭头

直接在第二种模式下前后

强大的功能使得阅读

移动,察看相应信息。它的这个

Linux源程序有如神助。但是要注意的

如果

是,当进行了第二次“Reference”时,它会提示你将结果

集附加在第一个结果集的后边还是取代第一个结果集。

选择前者,不能对结果集根据前后两次搜索结果进行分类,

然后在其子类里进行移动,只能在整个结果集 里移动;如

果,选择后者,结果集将会被替换为第二次搜索的结果,略

微有些不方便。

图6 Reference的搜索结果

当然,Source Insight 还提供了一些其他常见的便利。

比如:右键菜单几乎包含了程序的所有功能,可以在编辑窗

口为程序加上行号,还可以统计整个工程的程序行数

还有功能强大 却用不上自动完成功能,

,当然

似乎连它的30天试

用期也是别有用心――可以迫使你尽可能快速的阅读源程

序,其他一些技巧大家可以在使用过程中慢慢摸索。怎么

样? 爱好读源代码的朋友,不妨马上去下载一个,去开始

我们的Linux内核探险之旅吧!

SourceInsight

2008/05/19 16:44

1、缩进与tab

(1)Options

掉下面两项∶

使用技巧

[学习研究 ]

菜单PreferencesTyping卡,勾

Typing tab indents line

selection

,regardless of

,空行按tab无法前进

,选定部Typing tab replaces current selection

分内容、再按tab时会清除所选

菜单Document Options(2)Options(针对不

同文件类型,分别进行设置)

合适类型(c源文件)

width=2

下拉左上文件类型框、选择

框中,tab Editing Options

Editing Options框中,勾选Expand

2个空格)

选择合

钮在弹出

Indent

tabs(这样,按tab键、等价于输入

(3)Options

适的文件类型

菜单Document Options

点击右边中间的Auto Indent

Smart的框中,左边一定要点

Open Brace

,右边有两个复选框

和Indent Close Brace,具体效果可以

看SIS的HELP。按照部门里的编程风格要求,最方便的

就是把两个复选框都取消掉,然后点

OK。

勾选Auto Indent之SMART的效果∶在C程序里,

如果遇到行末没有分号的语句,如IF, WHILE, SWITCH

等, 写到该行末按回车,则新行自动相对上一行缩进两列。

勾掉Indent Open Brace和Indent Close Brace

, 如果输入"}", 则自的效果∶继上一段,在相对缩进行里

动和上一行列对齐(好像勾不勾都会有这个功能);而输入

"{"时,不会与下面的行对齐(这是勾上

时的效果)。

Indent Open

Brace

2、向项目中添加文件时,只添加特定类型的文件(文件类

型过滤器)

有个同事比较生猛,得整汇编代码,但在

PROJECT并ADD TREE

SIS里建立

的时候,根据默认设置并不会把

.inc该TREE里面所有汇编文件都包含进来,只加了

和.asm后缀的,.s后缀的没有。而且用SIS打开.s的文

件,一片黑白没有色彩,感觉回到DOS的EDIT时代了??

解决方法是在Options->Document Options

下拉菜单,选择

File filter

里面,

x86 Asm

点左上的Document Type

Source File

*.inc

,然后在右边的里*.asm

;的后面加上*.s;接着CLOSE就可以了。上面两

*.s后还需要重新ADD TREE个问题解决了,但注意加入

一遍才能把这些汇编加到PROJECT里面。

3、去掉功能强大但是无用的自动完成功能

Options

Completion

菜单Preferences Typing卡Auto

框,勾掉Use automatic symbol

(这里是SIS的全局设置)

Document OptionsEditing

(局部设

completion window

Options

Options

置)

菜单

框中,勾掉Allow auto-complete

上面两项必须全部勾选,才能启用

功能

Auto Completion

4、恢复小键盘的"+,-,*,/"功能

Options

Scroll

菜单Key assignments,通过关键词

,取消小键盘/;通过

取消小键

,取消小

,取

找到Scroll Half Page Up

关键词Scroll 找到Scroll Half Page Down

Function找到Function Up

找到Function down

盘*;通过关键词

键盘-,通过关键词Function

消小键盘+。

5、恢复ctrl+a的全选功能

通过关键词save

ctrl+shift+a

改为ctrl +a

找到save all,更改为

找到select all, 更,通过关键词select

6、解决字符等宽对齐问题。

SIS默认字体是VERDANA

是用的VERDANA

,很漂亮。这网页上应该也

字体。但由于美观的缘故,VERDANA

字体是不等宽的。比如下面两行

llllllllll

MMMMMMMMMM

同样10个字符,长度差多了.用VERDANA来看程序,

有些本应该对齐的就歪了。解放方法是使用等宽的字体,但

肯定比较丑。可以用

体sysfixed

Courier New

SourceInsight

DOS字体,也就是记事本里的默认字

很丑,要有心理准备。比较推荐的是用

提供的功能

Source Link 1、解析日志信息时非常有用的

总地说来,SourceLink根据特定的搜索模式,把当前

"和

文件中满足模式的行、链接到由该行指定的其他源文件中。

所谓特定的搜索模式,共有两种

"Line, then file

"File, then line

",其中前后两部分依靠正则表达式的组

比如"Error 的概念来予以分割。如果当前文件具有匹配行,

d:tcsrcq5.c 18: Lvalue required in function

jsSort",那么SourceInsight在该行创建

SourceLink

d:tcsrcq5.c

、把该行链接到由该行指定的文件中(即

,第18行)。

1.1 创建SourceLink

运行Search菜单的Parse Source Links…命令,

在弹出的框中、选择搜索模式、并填入相应的正则表达式串,

点OK,SIS就会解析当前文件,如果有匹配,就创建

SourceLink。

SourceLink

命令,

1.2 在解析日志信息时,使用

可以打开日志信息,运行

日志中能够匹配模式的每一行

就会被设置上一个

Parse Source Links

(通常是含有错误信息的行)

SourceLink

SourceLink

1.3在解析自定义命令输出时,使用

首先勾选Custom Command

in Output

中的"Parse Links

",然后选择特定的搜索模式,最后填入合适的

Source Insight把输出信息作为当正则表达式。这样,

前搜索用文件;并且,如果有匹配行(通常即编译错误信息

行),SIS为 该行创建SourceLink

息中给定的文件(和行号)作为

修改源代码错误非常有帮助。

link

、并把每一个错误信

目的地,这对于我们

2、替换(Replace) VS 上下文敏感的智能重命名

(Context-Sensitive Smart Rename

2.1 替换(Replace)

ctrl+H,足以已

目前来说,普通的替换命令、快捷键为

满足工作要求。

在弹出的替换窗口中,

来只在所选文本区域中替换

再按ctrl+H

在Search框中勾选Selection

(当然这时你要先选定区域然后

来在整个当前文件内替)、勾选WholeFile

换、两者都不勾选来从当前光标处替换至文件末尾;点右边

的Files…按钮,可选择替换多个文件的内容。

2.2上下文敏感的智能重命名(

Smart Rename

Smart Rename

命令、快捷键是Ctrl+',是上下文敏

Context-Sensitive

感的全局搜索替换。它可以智能地重命名全部项目文件中的

一个标示符。SourceInsight

index

的搜索索引(search

Smart

窗口

)使得搜索过程进行地非常快。而且,使用

所做的替换会被记录在Search ResultsRename

中,每一条替换记录旁有一个

生地文件。

Smart Rename

SourceLink链接到替换发

可以用来重命名标记(symbol)。

如果勾选了Smart Reference Matching

Rename

选项,Smart

就只在正确的上下文范围内进行重命名。它可以

它可以重命名

智能地重命名全部项目文件中的一个标示符;

函数本地变量,类或结构体成员、函数。

在弹出的Smart Rename

Name

窗口中有下面几项∶

填旧名称。光标下的词会被自动加载;光标的位置非

会根据本地上下文背常重要,这是因为Source Insight

景、准确地确定你想要重命名哪一个标记。

只填单个词、而不是字符串。

Old Name

你在命名成员变量、或本地变量(),

完全标记名、即上层容器名

"truc

paintStruc

New Name

arch Results

框中会显示

+标记名。例如,框中的

"代表DocDraw

是函数名,

是函数的本地成员变量。

填新名称。只填标记名,不填上层容器名。

如果勾选,搜索替换结果日志会被输出到

窗口中。可以通过Windows菜单来Search Results

切换,或ctrl+tab

SourceLink

切换察看。并且每一条记录旁会有

链接到替换发生地文件。

Confirm Each Replacement

Skip Comments

【使用心得列表】

每次替换询问。

不重名注释部分。

(1)如何用Smart Rename

如果只选取数组名,会报错!

(2)如果勾掉

重命名数组的数组名?

Smart Reference Matching

Old Name

,会

搜索全部项目文件,并且

名;如果勾选

框中不显示完全限定

,无法重命

Smart Reference Matching

名数组名,而且鼠标位置不正确时会报错。应该如何应对?

3、在SourceInsight

中提供的正则表达式

3.1在SourceInsight中提供的正则表达式

正则表达式,是用来匹配复杂模式的特殊搜索用字符串。

正则表达式串中,许多字符具有特殊的含义。例如,有个特

殊的字符代表 "行首"。

下面是SourceInsight提供的所有可用特殊字符∶

Table 4.3: Regular Expression Characters

Character

^ (at the

beginning of line

beginning)

.

[abc]

any single character

any single character that

belongs to the set abc

any single character that

[^abc]

does not belong to the set abc

zero or more occurrences of

* the preceding character

+

s

w

a tab character

a space character

white space (a tab or a

space character)

匹配Hello在句首。

。如^Hello

Matches

$

the end of the line

匹配TRUE在句尾。

。如TRUE$,

转义字符。如果在它后面有元字符,

可利用 "("和 ")"、把正则表达式分割成不同的组;模

式中的每个组自左向右指定为

组的概念在替换时很有用。

例如∶

abc(xyz)

group#1

可匹配abcxyz

,替换结果为xyzabc

tc

,其中xyz被认为是

Group #n,n=1,2,…;

取消其特殊含义。

利用21来替换(abc)(xyz)

3.2 正则表达式在配置tc编译器中的应用∶

正则表达式格式与源代码文件路径相对应,这里我的

安装目录为d:tc,tc源文件放在d:tcsrc

qn.c或qtn.c(其中n=1,2,…)。

下,并命名为

观察Tc编译器某一次输出错误信息的格式∶

Error d:tcsrcq5.c 18: Lvalue required in

function jsSort

则我们要匹配"d:tcsrcq5.c 18"

SourceInsight

部分,进一步地,按照

要以组的捕捉输出并加以解析时的要求,

形式、分别匹配"d:tcsrcq5.c 18"

分∶

行号([1-9][0-9]*)

空格行号s([1-9][0-9]*)

中的文件部分和行号部

文件名(d:tcsrc[qQ][tT][1-9][0-9]*.[cC])

全部加起来为∶

(d:tcsrc[qQ][tT]*[1-9][0-9]*.[cC])s([1-9][0-

9]*)

3.3 正则表达式在配置

我的JAVA_HOME

d:javasrc

n=1,2,

javac编译器中的应用∶

,我的java

是c:jdk

源文件放于

(其中中,并命名为

…)。

观察JDK编译器某一次输出错误信息的格式∶

D::3: ';' expected

正则表达式为∶

([dD]:javasrc[qQ][tT]*[1-9][0-9]*.java):([1-

9][0-9]*)

4、自定义命令

自定义命令与项目相关,在一个项目中定义的所有自定义

命令属于该项目、只对该项目有效(包括快捷键等)。

自定义命令类似于命令行批处理文件。SIS允许自定义

命令在后台运行;并可以捕捉自定义命令的输出、放置于文

件中、或粘贴入当前光标插入点。

分别利用上面SIS对输出信息的处理方式,自定义命令

对集成编译器相当有用,可以捕捉编译器输出并创建

SourceLink寻错;自定义命令对于文本过滤也相当有用,

可选中待过滤区块、运行Sort自定义命令、粘贴回选定区

块、即完成文本过滤。

请按下面步骤创建自定义命令∶

Options菜单Custom Command

点右边Add钮、填入新自定义命令名称,或下拉左边

Commands、选择命令进行修改

Run框、填入待执行命令行,可含有特殊元字符,见

后面的元字符表

Dir框、执行命令行时应处的目录,如不填,以源代码

文件所在目录为命令执行目录

勾选Output框的Capture Output、输出被捕捉,

如果勾选Paste Output,输出被粘贴

勾选Control Group框中的Save Files First、

SIS会在运行命令前先检查文件是否保存

勾选Control Group框中的Pause When Done

SIS会在命令结束后暂停、方便检查

勾选Source Links in Output

Source Links

source insight

自:/Jupin/archive/2005/

02/04/

说明:

该宏文件实现一些编码程中能会到的功能

头、函数说明和宏定义等

名和当前日期.

使用说明:

1. Project->

工程一般在"我的文档Source

InsightProjectsBase"中);

,?/p>

常用宏

框中的Parse

, 如添加文件

, 使用时能自动添加文件名、函数

打开Base工程(该

2. Project->Add and Remove

加入宏文件(即);

3. Options->Menu Assignments

Assignments窗口, 在Command

.

打开Menu

中输入Macro, 选

中要使用的宏, 添加到合适的菜单中

/*附上宏定义文件*/

/* - a small collection of useful

editing macros */

/***********************************

************************************

*******

* InsFileHeader -- insert the information of

file

*

* modification history

* --------------------

* 01a, 23mar2003, added DESCRIPTION by

t357

* 01a, 05mar2003, t357 written

* --------------------

************************************

************************************

******/

/*---------------------------------------------------

----------------------

I N S E R T H E A D E R

Inserts a comment header block at the top of

the current function.

This actually works font-size: 12px;"> To use

this, define an environment variable

"szMyName" and set it

to your email name.

szMyName=raygr

------------------------------------------------------

-------------------*/

macro InsFileHeader()

{

/*############################

#############################

############################

#############################

#######

name

Set szMyName variable to your

eg. set

########

for example

########

szMyName = #######

"t357"

############################

#############################

############################

#############################*

/

szMyName = ""

// Get current time

szTime = GetSysTime(1)

Day =

Month =

Year =

if (Day < 10)

szDay = "

else

szDay = Day

szMonth = NumToName(Month)

hBuf = GetCurrentBuf()

szpathName = GetBufName(hBuf)

szfileName = GetFileName(szpathName)

nlength = StrLen(szfileName)

szInf = Ask("Enter the information of file:")

szDescription = Ask("Enter the description

of file:")

0@Day@"

hbuf = GetCurrentBuf()

// begin assembling the title string

InsBufLine(hbuf, 0,

"/**********************************

************************************

********")

InsBufLine(hbuf, 1, " * @szfileName@ -

@szInf@")

InsBufLine(hbuf, 2, " * ")

InsBufLine(hbuf, 3, " * Copyright 1998-2003

Guangzhou Gaoke Communication Technology

Co.,Ltd.")

InsBufLine(hbuf, 4, " * ")

InsBufLine(hbuf, 5, " * DESCRIPTION: - ")

InsBufLine(hbuf, 6, " * @szDescription@")

InsBufLine(hbuf, 7, " * modification history")

InsBufLine(hbuf, 8, " * --------------------")

InsBufLine(hbuf, 9, " * 01a,

@szDay@@szMonth@@Year@, @szMyName@

written")

InsBufLine(hbuf, 10, " * --------------------")

InsBufLine(hbuf, 11, "

************************************

************************************

******/")

// put the insertion point inside the header

comment

SetBufIns(hbuf, 1, nlength + strlen(szInf) + 8)

}

/***********************************

************************************

*******

* InsFunHeader -- insert function's

information

*

* modification history

* --------------------

* 01a, 23mar2003, added DESCRIPTION by

t357

* 01a, 05mar2003, t357 written

* --------------------

************************************

************************************

******/

macro InsFunHeader()

{

// Get the owner's name from the

environment variable: szMyName.

// If the variable doesn't exist, then the

owner field is skipped.

/*############################

#############################

############################

#############################

#######

name

Set szMyName variable to your

########

for example

########

szMyName = #######

"t357"

############################

#############################

############################

#############################*

/

szMyName = ""

// Get a handle to the current file buffer and

the name

// and location of the current symbol where

the cursor is.

hbuf = GetCurrentBuf()

szFunc = GetCurSymbol()

ln = GetSymbolLine(szFunc)

// Get current time

szTime = GetSysTime(1)

Day =

Month =

Year =

if (Day < 10)

szDay = "

else

szDay = Day

szMonth = NumToName(Month)

szInf = Ask("Enter the information of

function:")

szDescription = Ask("Enter the description of

function:")

0@Day@"

// begin assembling the title string

sz =

"/**********************************

************************************

********"

InsBufLine(hbuf, ln, sz)

InsBufLine(hbuf, ln + 1, " * @szFunc@ -

@szInf@")

InsBufLine(hbuf, ln + 2, " * DESCRIPTION: - ")

InsBufLine(hbuf, ln + 3, "

* @szDescription@ ")

// remove by t357. CutWord(szDescription)

InsBufLine(hbuf, ln + 4, " * Input: ")

InsBufLine(hbuf, ln + 5, " * Output: ")

InsBufLine(hbuf, ln + 6, " * Returns: ")

InsBufLine(hbuf, ln + 7, " * ")

InsBufLine(hbuf, ln + 8, " * modification

history")

InsBufLine(hbuf, ln + 9, " * --------------------")

InsBufLine(hbuf, ln + 10, " * 01a,

@szDay@@szMonth@@Year@, @szMyName@

written")

InsBufLine(hbuf, ln + 11, " *

--------------------")

InsBufLine(hbuf, ln + 12, "

************************************

************************************

******/")

// put the insertion point inside the header

comment

SetBufIns(hbuf, ln + 1, strlen(szFunc) +

strlen(szInf) + 8)

}

/***********************************

************************************

*******

* NumToName -- change the month number

to name

*

* modification history

* --------------------

* 01a, 05mar2003, t357 written

* --------------------

************************************

************************************

******/

macro NumToName(Month)

{

if (Month == 1)

return "jan"

if (Month == 2)

return "feb"

if (Month == 3)

return "mar"

if (Month == 4)

return "apr"

if (Month == 5)

return "may"

if (Month == 6)

return "jun"

if (Month == 7)

return "jul"

if (Month == 8)

return "aug"

if (Month == 9)

return "sep"

if (Month == 10)

return "oct"

if (Month == 11)

return "nov"

if (Month == 12)

return "dec"

}

/***********************************

************************************

*******

* CutWord -- auto newline

*

* modification history

* --------------------

* 01a, 24mar2003, t357 fix some bug

* 01a, 05mar2003, t357 written

* --------------------

************************************

************************************

******/

macro CutWord(ncurLine, szInf)

{

LENGTH = 63

nlength = StrLen(szInf)

i = 0 /* loop control */

begin = 0 /* first character's index of current

line */

pre = 0 /* preceding word's index */

hbuf = GetCurrentBuf()

// nline = GetBufLnCur()

while (i < nlength)

{

/* remove by t357

nrow = 0

sz = ""

while (nrow < 80)

{

if (nlength < 0)

break

sz = Cat(sz, szInf[nrow])

nrow = nrow + 1

nlength = nlength - 1

}

InsBufLine(hbuf, nline, sz)

szInf = szInf[nrow]

}

*/

c = szInf[i]

if (" " == @c@ && (i - b < LENGTH))

{

}

else if (" " == @c@)

{

}

pre = i

szOutput = ""

k = begin /* loop control */

while (k < pre)

{

szOutput = Cat(szOutput, szInf[k])

k = k + 1

}

InsBufLine(hbuf, ncurLine, sz)

ncurLine = ncurLine + 1

begin = pre

i = i + 1

}

if (h != i - 1)

{

szOutput = ""

k = begin /* loop control */

while (k < pre)

{

}

InsBufLine(hbuf, ncurLine, sz)

ncurLine = ncurLine + 1

}

}

/***********************************

************************************

*******

* GetFileName -- get the filename font-size:

12px;"> return name

}

szOutput = Cat(szOutput, szInf[k])

k = k + 1

/***********************************

************************************

*******

* ReturnTrueOrFalse -- Inserts "Returns True

or False" at the current line

*

* modification history

* --------------------

* 01a, 05mar2003, t357 written

* --------------------

************************************

************************************

******/

macro ReturnTrueOrFalse()

{

szReturns = "return True if successful or False

if errors."

hbuf = GetCurrentBuf()

ln = GetBufLnCur(hbuf)

szCurLine = GetBufLine(hbuf, ln)

DelBufLine(hbuf, ln)

InsBufLine(hbuf, ln,

"@szCurLine@@szReturns@")

SetBufIns(hbuf, ln, StrLen(szReturns) +

StrLen(szCurLine) + 3)

}

/***********************************

************************************

*******

* InsHeaderDef -- Inserts the header define in

the headerfile

*

* modification history

* --------------------

* 01a, 05mar2003, t357 written

* --------------------

************************************

************************************

******/

macro InsHeaderDef()

{

hBuf = GetCurrentBuf()

szpathName = GetBufName(hBuf)

szfileName = GetFileName(szpathName)

szfileName = toupper(szfileName)

nlength = StrLen(szfileName)

i = 0 /* loop control */

szdefineName = ""

while (i < nlength)

{

if (szfileName[i] == ".")

szdefineName = Cat(szdefineName, "_")

else

szdefineName = Cat(szdefineName,

szfileName[i])

i = i + 1

}

szdefineName = Cat("_", szdefineName)

IfdefineSz(szdefineName)

}

/***********************************

************************************

*******

* PrintDate - print date

mailto:0@Day">0@Day@"

else

szDay = Day

szMonth = NumToName(Month)

hbuf = GetCurrentBuf()

ln = GetBufLnCur(hbuf)

szCurLine = GetBufLine(hbuf, ln)

DelBufLine(hbuf, ln)

InsBufLine(hbuf, ln, "@szCurLine@

@szDay@@szMonth@@Year@")

SetBufIns(hbuf, ln, StrLen(szCurLine) + 10)

}

// Ask user for ifdef condition and wrap it

around current

// selection.

// 28mar2003, modified by t357.

// 26mar2003, modified by t357.

macro InsIfdef()

{

sz = Ask("Enter ifdef condition:")

if (sz != "")

{

// IfdefSz(sz);

hwnd = GetCurrentWnd()

sel = GetWndSel(hwnd)

hbuf = GetWndBuf(hwnd)

// get line the selection (insertion point) is

font-size: 12px;"> InsBufLine(hbuf,

t, "")

InsBufLine(hbuf, t + 1,

"@ich@#ifdef @sz@")

InsBufLine(hbuf, t + 2, "@ich@" #

chTab)

InsBufLine(hbuf, t + 3,

"@ich@#endif /* @sz@ */")

SetBufIns(hbuf, t + 2, StrLen(ich)

+ StrLen(chTab))

}

}

// Wrap ifdeinef .. endif around the

current selection

macro IfdefineSz(sz)

{

hwnd = GetCurrentWnd()

lnFirst = GetWndSelLnFirst(hwnd)

lnLast = GetWndSelLnLast(hwnd)

hbuf = GetCurrentBuf()

InsBufLine(hbuf, lnFirst, "#ifndef @sz@")

InsBufLine(hbuf, lnFirst + 1, "#define @sz@")

InsBufLine(hbuf, lnLast + 3, "#endif

@sz@ */")

SetBufIns(hbuf, lnFirst + 2, 0)

}

/* A U T O E X P A N D */

/*---------------------------------------------------

----------------------

Automatically expands C statements like if,

for, while, switch, etc..

To use this macro,

1. Add this file to your project or your Base

project.

2. Run the Options->Key Assignments

command and assign a

/*

convenient keystroke to the "AutoExpand"

command.

3. After typing a keyword, press the

AutoExpand keystroke to have the

statement expanded. The expanded

statement will contain a ### string

which represents a field where you are

supposed to type more.

The ### string is also loaded in to the search

pattern so you can

use "Search Forward" to select the next ###

field.

For example:

1. you type "for" + AutoExpand key

2. this is inserted:

for (###; ###; ###)

{

###

}

3. and the first ### field is selected.

------------------------------------------------------

-------------------*/

/***********************************

************************************

*******

* AutoExpand - Automatically expands C

statements

*

* DESCRIPTION: - Automatically expands C

statements like if, for, while,

* switch, etc..

*

* Input:

* Output:

* Returns:

*

* modification history

* --------------------

* 01a, 27mar2003, t357 modified

* --------------------

************************************

************************************

******/

macro AutoExpand()

{

// get window, sel, and buffer handles

hwnd = GetCurrentWnd()

if (hwnd == 0)

stop

sel = GetWndSel(hwnd)

if (st == 0)

stop

hbuf = GetWndBuf(hwnd)

// get line the selection (insertion point) is

font-size: 12px;"> // parse word just to the

left of the insertion point

wordinfo = GetWordLeftOfIch(st,

szLine)

ln = t;

chTab = CharFromAscii(9)

// prepare a new indented blank line to be

inserted.

// keep white space font-size: 12px;"> szLine

= strmid(szLine, 0, ich)

t =

st =

=

// expand

if ( == "if" ||

== "while" ||

== "elseif")

{

SetBufSelText(hbuf, " (###)")

InsBufLine(hbuf, ln + 1, "@szLine@" # "{");

InsBufLine(hbuf, ln + 2, "@szLine@" #

chTab);

InsBufLine(hbuf, ln + 3, "@szLine@" # "}");

}

else if ( == "for")

{

SetBufSelText(hbuf, " (###)")

InsBufLine(hbuf, ln + 1, "@szLine@" # "{");

InsBufLine(hbuf, ln + 2, "@szLine@" #

chTab);

InsBufLine(hbuf, ln + 3, "@szLine@" # "}");

}

else if ( == "switch")

{

SetBufSelText(hbuf, " (###)")

InsBufLine(hbuf, ln + 1, "@szLine@" # "{")

InsBufLine(hbuf, ln + 2, "@szLine@" # "case

")

InsBufLine(hbuf, ln + 3, "@szLine@" # chTab)

InsBufLine(hbuf, ln + 4, "@szLine@" # chTab

# "break;")

InsBufLine(hbuf, ln + 5, "@szLine@" #

"default:")

InsBufLine(hbuf, ln + 6, "@szLine@" # chTab)

InsBufLine(hbuf, ln + 7, "@szLine@" # "}")

}

else if ( == "do")

{

InsBufLine(hbuf, ln + 1, "@szLine@" # "{")

InsBufLine(hbuf, ln + 2, "@szLine@" #

chTab);

InsBufLine(hbuf, ln + 3, "@szLine@" # "}

while ();")

}

else if ( == "case")

{

SetBufSelText(hbuf, " ###")

InsBufLine(hbuf, ln + 1, "@szLine@" # chTab)

InsBufLine(hbuf, ln + 2, "@szLine@" # chTab

# "break;")

}

else

stop

SetWndSel(hwnd, sel)

LoadSearchPattern("###", true, false, false);

Search_Forward

}

/* G E T W O R D L E F T O F

/*---------------------------------------------------

----------------------

Given an index to a character (ich) and a

string (sz),

return a "wordinfo" record variable that

describes the

text word just to the left of the ich.

*/ I C H

Output:

= the word string

= the first ich of the word

= the limit ich of the word

------------------------------------------------------

-------------------*/

macro GetWordLeftOfIch(ich, sz)

{

wordinfo = "" // create a "wordinfo"

structure

chTab = CharFromAscii(9)

// scan backwords over white space, if any

ich = ich - 1;

if (ich >= 0)

while (sz[ich] == " " || sz[ich] == chTab)

{

ich = ich - 1;

if (ich < 0)

break;

}

// scan backwords to start of word

ichLim = ich + 1;

asciiA = AsciiFromChar("A")

asciiZ = AsciiFromChar("Z")

while (ich >= 0)

{

ch = toupper(sz[ich])

asciiCh = AsciiFromChar(ch)

if ((asciiCh < asciiA || asciiCh > asciiZ)

&& !IsNumber(ch))

break // stop at first non-identifier

character

ich = ich - 1;

}

ich = ich + 1

= strmid(sz, ich, ichLim)

= ich

= ichLim;

return wordinfo

}