xstr - 从 C 程序提取字符串以实现共享字符串
xstr -c filename [-v] [-l array]
xstr [-l array]
xstr filename [-v] [-l array]
xstr 维护名为 strings 的文件,大型程序组件部分中的字符串会散列至该文件。将使用通用区域的引用来替换这些字符串。这将用于实现共享的常量字符串,如果字符串同时为只读状态,则作用最大。
此命令:
example% xstr −c filename
提取指定 C 源中的字符串,通过 &xstr[number] 格式的表达式替换一定数量的字符串引用。文件前会附加相应的 xstr 声明。会将生成的 C 文本置于文件 x.c 中,然后编译该文件。如果 strings 数据库尚不包含来自此文件的字符串,则会将字符串置于该数据库中。如果字符串重复,或者字符串是现有字符串的后缀,则数据库不会发生任何变化。
编译了大型程序中的所有组件后,可通过以下格式的命令创建声明通用 xstr 空间(名为 xs.c)的文件:
example% xstr
随后应该使用剩余程序编译并装入 xs.c 文件。如果可能,可以将数组设置为只读(共享)以节约空间和交换开销。
xstr 也可用于单个文件。命令:
example% xstr filename
可像之前那样创建文件 x.c 和 xs.c,不会使用或影响相同目录中的任何 strings 文件。
如果有任何宏定义会生成字符串,或者有条件代码包含实际上不需要的字符串,则在 C 预处理程序之后运行 xstr 可能非常有用。如果提供了 "-" 参数,则 xstr 会从标准输入中进行读取。在 C 预处理程序之后运行 xstr 的合适命令序列为:
example% cc −E name.c | xstr −c − example% cc −c x.c example% mv x.o name.o
除非添加了新条目,否则 xstr 不会触动文件 strings;因此 make(1S) 可避免重新生成 xs.o,除非确实需要。
从 filename 中获取 C 源。
详细模式:显示可指示新字符串或重复字符串发现位置的进度报告。
指定程序引用中指定的 array 提取字符串。缺省数组名称为 xstr。
字符串的数据库
消息 C 源
数组 "xstr*(rq 定义的 C 源
xstr filename 不触动 strings 时的临时文件
有关下列属性的说明,请参见 attributes(7):
|
如果字符串是数据库中另一个字符串的后缀,但 xstr 首先看见更短的字符串,那么会将两个字符串都置于数据库中,但实际只需将更长的字符串置于其中即可。
请注意,xstr 会随意替换具有 &xstr[number] 格式表达式的所有字符串,不管原始 C 代码以前使用该字符串的方式。例如,代码使用 sizeof() 来确定文本字符串的长度时,可能产生问题,因为 xstr 很可能会使用与字符串大小不同的指针来替换文本字符串。
要绕开此问题,您可以:
使用 strlen() 代替 sizeof();请注意,sizeof() 会返回数组的大小(包括末尾的空字节),而 strlen() 不会对空字节计数。(strlen("xxx"))+1 与 sizeof(" xxx") 等效。
为 sizeof() 操作数使用 #define 并使用经过 define 的版本。xstr 会忽略 #define 语句。请确保首先在 filename 上运行 xstr,然后再在预处理程序上运行。
声明以下格式的初始化字符串数组时,您可能会遇到问题
char x[] = "xxx";
xstr 将使用不会编译的 &xstr[number] 格式的表达式来替换 xxx。要绕过此问题,请使用 static char *x = "xxx" 代替 static char x[] = "xxx"。