dustland

dustball in dustland

010editor 模板语法

010editor 模板编写

以linux上的归档文件AR,或者说windows上的静态库LIB为例看看模板是咋写的

总的来说,写010editor模板就是定义结构体.

AR结构

需要结合AR文件的结构,理解AR模板

程序员的自我修养 chapter 9 LIB | Deutschball's blog (dustball.top)

AR文件由一个签名魔数!<arch>\n还有多个obj模块组成,

每个obj模块之前都会有一个头,作用是描述该obj模块的信息

这个头的定义大概是这样的,字节数是对的,但是变量名叫啥无所谓

1
2
3
4
5
6
7
8
9
typedef struct {
char fileName[16];//文件名
char modification_timestamp[12];//最后修改时间戳
char ownerID[6];//拥有者ID
char groupID[6];//组ID
char fileMode[8];//文件模式
char fileSize[10];//文件大小
char endMarker[2];//本头结束符
} OBJ_HEADER;

后面紧跟着就是obj模块正文了

如果obj模块的大小是一个奇数,则后面再填充一个字节

这就是一个obj模块在AR文件中的状态

AR模板

结构定义

AR 模板的主体就是这么一个ar_flie结构体,成员他都有,又附加了一些额外的函数等等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
typedef struct {
// Define header
SetBackColor( cLtYellow );//从这里开始的数据被高亮为亮黄色
char fileName[16];//文件名,没有local修饰,会显示
char modification_timestamp[12];
char ownerID[6];
char groupID[6];
char fileMode[8];
char fileSize[10];
char endMarker[2];
SetBackColor( cNone );//取消高亮

// Define file data
if( endMarker == "\x60\x0a" )//如果endMarker=='\0x60\0x0a'说明都对齐了,没有差错
{
local int64 size;//local变量不会显示,只是计算使用
SScanf( fileSize, "%Ld", size );//010editor API,将fileSize转化成长整型,放到格式化参数size上
if( size > 0 )//如果size>0说明本头是有对应obj模块的,obj模块的大小已经在filesize中给出了
uchar data[size];//此处定义的uchar data[size]没有用local修饰,是会显示的,size会显示出变量值

// Add padding byte
if( size & 1 )//如果size文件大小是个奇数则最后填充一个字节
uchar padding <bgcolor=cLtGray>;//该填充字节使用亮灰色高亮
}
} ar_file <read=ReadArFile>;//读回调函数声明为ReadArFile
// Display filename beside ar_file struct
string ReadArFile( struct ar_file &f )//读回调函数
{
return f.fileName + " size=" + f.fileSize;
}

读回调函数的返回值是一个string字符串,将会显示在Value栏

image-20220917231952934

控制流

上述typedef struct ar_file和ReadArFile都只是定义,这一点和C语言相同,并没有实例化ar_file结构体的对象,也没有调用ReadArFile函数,下面才开始控制流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Read the file signature
char signature[8] <bgcolor=cLtPurple>;//首先定义8个字节用来承载文件魔数,亮紫色高亮
if( signature != "!<arch>\n" )//判断魔数是否是AR的魔数,如果不是则返回-1表明模板错误
{
Warning( "File is not a valid archive. Template stopped." );//API函数,发出警告
return -1;
}

// Read file records
while( !FEof() )//FEof为010editor API,用于检查当前文件指针是否到达文件末尾
{
ar_file file;//如果文件指针没有到达末尾,说明还有obj模块的信息没有分析,每次读入填充一个ar_file,直到全都读取完毕
}

每个obj模块的正文长度都是不一样的,但是读取的时候都是创建ar_file,怎么体现对于不同模块的区别对待呢?

已经包含在ar_file结构体的定义中了

1
2
if( size > 0 )//如果size>0说明本头是有对应obj模块的,obj模块的大小已经在filesize中给出了
uchar data[size];//此处定义的uchar data[size]没有用local修饰,是会显示的,size会显示出变量值

不得不说,优雅,真的太优雅了,010editor将复杂的工作留给自己

模板的组成

变量

只要是在控制流中创建的变量,都分成两种,带local的和不带local

local的是临时变量,不会显示在界面上,只用于承载临时变量,比如作为循环变量或者中间结果

在AR模板中local int size就作为中间结果承载filesize字符串的转换值

不带local的就是界面变量,会显示在界面上.比如ar_file file;比如char signature[8];

属性

尖括号内可以附加属性

比如uchar padding <bgcolor=cLtGray>;这就把一个字节的填充设置为亮灰色

比如char signature[8] <bgcolor=cLtPurple>;就把魔数签名设置为亮紫色了

又如ar_file <read=ReadArFile>;就给每个ar_file头都设置了读回调函数ReadArFile

该函数的作用是在头的value域上写f.fileName + " size=" + f.fileSize

常用的属性有

1
2
3
4
5
6
7
8
<format=hex|decimal|octal|binary>,//设置数字显示格式
fgcolor=<color>, //前景色
bgcolor=<color>, //背景色
comment= "<string>", //注释
open=true|false|suppress, //默认情况下是折叠还是展开
hidden=true|false, //
read=<function_name>, //读回调函数
write=<function_name> //写回调函数

API

参考010Editor脚本语法入门 - 简书 (jianshu.com)

想用啥功能就去查010editor的啥函数