简述:文本宏替换的例程
这个通用宏替换库用于EPICS base中所有宏替换。大部分例程成功返回0(OK),出错返回-1(ERROR),或者对应其它信息的小整数。macGetValue() 和 macExpandString()是这个的例外,并且返回有关成功/失败的和有关value长度的信息。使用errlogPrintf()报告出错和警告。
简述: 宏名和值的最大尺寸
#define MAC_SIZE 256
简述: 宏替换的上下文,仅由macLib例程使用 . 如果需要, 一个程序可以有多个活动的上下文.
typedef struct {
long magic; /**< 用于验证的魔术值 */
int dirty; /**< 需要从原始值展开的值? */
int level; /**< 作用域 */
int debug; /**< 调试级别 */
ELLLIST list; /**< 宏名/值列表 */
int flags; /**< 操作模式标志 */
} MAC_HANDLE;
简述:创建一个新的宏替换上下文 .
返回: 0 = OK; <0 = ERROR
LIBCOM_API long epicsStdCall macCreateHandle(
MAC_HANDLE **handle, /**< 指向一个变量的指针,此变量接收一个指向新的宏替换上下文的指针 */
const char * pairs[] /**< 指向{name,value}对字符串的NULL结尾数组的指针。一个NULL值隐含未被定义,一个NULL对参数隐含没有宏 */
);
禁用或启用警告消息 .
当macExpandString()不能展开一个宏时,例程打印警告。这个程序可以用于静默那些消息。对于相同的句柄,一个非0值将禁止来自后续库例程的警告消息。
LIBCOM_API void epicsStdCall macSuppressWarning(
MAC_HANDLE *handle, /**< 不透明句柄 */
int falseTrue /**< 0表示发出, 1表示禁止*/
);
简述:展开一个可能包含宏引用的字符串 .
返回:返回被展开字符串的长度,如果宏未被定义,<0。这个例程解析src字符串,查找宏引用并且传递它找到的任何宏给macGetValue()来翻译。
注意: 返回值类似于macGetValue()的返回值。它的绝对值时被复制到dest的字符数目。如果返回值是负数,至少一个未被定义的宏被留下未被展开。
LIBCOM_API long epicsStdCall macExpandString(
MAC_HANDLE *handle, /**< 不透明句柄 */
const char *src, /**< 源字符串 */
char *dest, /**< 目标字符串 */
long capacity /**< 目标缓存的容量(dest) */
);
简述:设置一个特定的宏的值 .
返回: 返回这个value字符串的长度。
如果value是NULL,解除定义所有作用域的name的所有实例。(指定名称的宏在这种情况中不是必须存在的)。在value中引用的宏不需要在此处被定义。
LIBCOM_API long epicsStdCall macPutValue(
MAC_HANDLE *handle, /**< 不透明句柄 */
const char *name, /**< 宏名 */
const char *value /**< 宏值 */
);
简述:返回一个宏的值
返回: 返回这个value字符串的长度,如果未定义,<0
如果这个值的长度少于capacity,value将是0结尾的。 返回值是被复制到value的字符数目(如果宏未被定义, 行为见以下)。
如果capacity是0, 没有字符将被复制到value(其可以是NULL),并且调用可以用于检查这个宏是否被定义。 注意: 不报告这个value的截断,程序应该认为如果返回值等于capacity,截断已经发生。
如果宏未被定义,(如果maxlen允许)宏引用将在value字符串中被返回,并且这个函数值将时被复制的最少字符。注意: capacity用于保持与strncpy()例程保持一致。如果这个值包含宏引用,这些引用将被递归地展开。这个展开将探测一个直接或间接的自引用。
宏引用以一个"$"后面紧跟一个"("或一个"{"开始。宏名接着出现,并且能够可选地后跟一个"="和一个默认值, 一个引用是以一个匹配的")"或"}"字符结束。
LIBCOM_API long epicsStdCall macGetValue(
MAC_HANDLE *handle, /**< 不透明的句柄 */
const char *name, /**< 宏名或引用 */
char *value, /**< 如果宏未被定义, 接收宏值或名称参数的字符串。*/
long capacity /**< 目标缓存(value)的容量*/
);
简述: 标记一个句柄无效,并且释放与它相关联的所有存储
返回: 0 = OK; <0 = ERROR
注意: 这个不释放已经返回宏值所在的任何字符串。宏值总是被返回到由调用者先前分配的字符串。
LIBCOM_API long epicsStdCall macDeleteHandle(
MAC_HANDLE *handle /**< 不透明的句柄 */
);
标记一个新的作用域的开始
返回: 0 = OK; <0 = ERROR
标记在这个调用之后的所有宏定义属于另一个作用域。这些宏将在一个macPopScope()时丢失,
而在当前作用域的那些宏将被重新安装。
LIBCOM_API long epicsStdCall macPushScope(
MAC_HANDLE *handle /**< 不透明的句柄 */
);
简述: 获取上次被压栈的作用域(像栈操作)
返回:0 = OK; <0 = ERROR
见 macPushScope()
LIBCOM_API long epicsStdCall macPopScope(
MAC_HANDLE *handle /**< 不透明的句柄 */
);
简述:报告当前定义细节
返回: 0 = OK; <0 = ERROR
这发送当前定义的细节到标准输出,并且仅用于调试目的
LIBCOM_API long epicsStdCall macReportMacros(
MAC_HANDLE *handle /**< opaque handle */
);
这些便捷函数是用于程序,出于某些目的,使用和提供一个更方便的接口。
简述: 解析宏定义未一个{name, value}对的数组。
返回:找到的宏的数目; <0 = ERROR
这接收"a=xxx,b=yyy"格式的宏定义集合,并且转换它们未一个指向字符串的指针的数组,
这个数组以两个NULL指针终结,并且所有存储区是被连续分配的,因而,可以用单个free()调用释放它们。这个例程独立于任何句柄, 并且提供了可以在别处使用的通用有用的服务。在值中任何宏引用在宏实际必须被转换前可以被定义或者重新定义。
支持shell风格转义和引号,如像"A=B,B=$(C$(A)),CA=CA,CB=CB" (设置 B 为 "CB")的定义。
空白在值中是重要的,但在别处被忽略(即: 在"="和','字符周围)
这个函数返回遇到的定义数目,如果提供的字符串无效,为-1
LIBCOM_API long epicsStdCall macParseDefns(
MAC_HANDLE *handle, /**< 不透明的句柄,如果不需要调试消息,可以是NULL。*/
const char *defns, /**< "a=xxx,b=yyy"格式的宏定义 */
char **pairs[] /**< 接收指向{name, value}对字符串的NULL终结的数组的指针的变量地址所有存储是连续分配的 */
);
简述: 安装{name, value}对的集合作为定义
返回: 定义的宏的数目,<0=ERROR
这接收一个以上定义的对的数组,并且通过调用macPutValue()安装它们作为定义。
对数组是由一个NULL指针终结。
LIBCOM_API long epicsStdCall macInstallMacros(
MAC_HANDLE *handle, /**< 不透明的句柄 */
char *pairs[] /**< 指向{name,value}对字符串的NULL结尾的数组的指针,一个NULL值表示解除定义,
一个NULL参数表示没有宏 */
);
简述:展开在字符串中的环境变量
返回: 展开的字符串,如果使用任何未定义的宏,NULL。
这个里车工展开一个字符串,它可能包含了宏引用引用。它解析这个字符串,查找这些引用并且传递它们给macGetValue来转换。它使用malloc()来为被展开字符串分配空间,并且返回一个指向这个null结尾的字符串的指针。如果这个源字符串包含任何未定义的引用,它返回NULL。
LIBCOM_API char * epicsStdCall macEnvExpand(
const char *str /**< 待被展开的字符串 */
);
简述: 展开在字符串中的宏和环境变量
返回: 展开的字符串,如果使用任何未定义的宏,NULL。
这个例程类似于macEnvExpand(),但它允许传入一个可选的句柄,其可能包含更多的宏定义。
在展开这个字符串时, 从环境变量追加这些宏到宏的集合。
LIBCOM_API char * epicsStdCall macDefExpand(
const char *str, /**< 待被展开的字符串 */
MAC_HANDLE *macros /**< 不透明的句柄, 如果仅使用环境变量,可以是NULL */
);
#include
#include
#include
#include "macLib.h"
int main()
{
MAC_HANDLE * handle = NULL;
char ** ppairs;
printf("Test function: macCreateHandle\n");
macCreateHandle(&handle, NULL);
if (handle == NULL){
printf("can not create handle\n");
return -1;
}
char defns[] = "name=greatwall,location=beijing";
int len;
printf("Test function: macParseDefns\n");
//len = macParseDefns(handle, defns, &ppairs);
len = macParseDefns(NULL , defns, &ppairs);
printf("The length of %s is %d\n", defns, len);
int i;
for (i = 0; i < 2; i++){
printf("%d: key:%s, value: %s\n", i+1, ppairs[i * 2], ppairs[i * 2 + 1] );
}
printf("Test function: macInstallMacros\n");
len = macInstallMacros(handle, ppairs);
printf("The number of macros : %d\n", len);
printf("Call funtion: macPutValue\n");
macPutValue(handle, "sport", "walk");
char name[100];
memset(name, 0, sizeof(name));
char value[100];
memset(value, 0, sizeof(value));
printf("Test function: macGetValue\n");
strcpy(name, "name");
len = macGetValue(handle, name, value, sizeof(value));
printf("len = %d\n", len);
printf("name: %s expanded to value: %s\n", name, value);
printf("Test function : macExpandString\n");
memset(name, 0, sizeof(name));
memset(value, 0, sizeof(value));
strcpy(name, "name: ${name} location: ${location} sport: ${sport}");
macExpandString(handle, name, value, sizeof(value));
printf("%s is expanded to %s\n", name, value);
printf("Call macEnvExpand:\n");
char * pvalue = macEnvExpand("${EPICS_CA_ADDR_LIST}");
printf("EPICS_CA_ADDR_LIST: %s\n", pvalue);
free(pvalue);
printf("Call function: macReportMacros\n");
macReportMacros(handle);
printf("Call function: macDeleteHandle\n");
macDeleteHandle( handle );
free(ppairs);
return 0;
}
测试结果如下:
orangepi@orangepi5:~/C_program/host_program/hostApp$ O.linux-aarch64/testMacLib
Test function: macCreateHandle
Test function: macParseDefns
The length of name=greatwall,location=beijing is 2
1: key:name, value: greatwall
2: key:location, value: beijing
Test function: macInstallMacros
The number of macros : 2
Call funtion: macPutValue
Test function: macGetValue
len = 9
name: name expanded to value: greatwall
Test function : macExpandString
name: ${name} location: ${location} sport: ${sport} is expanded to name: greatwall location: beijing sport: walk
Call macEnvExpand:
EPICS_CA_ADDR_LIST: 192.168.50.25 192.168.50.234:5092 192.168.50.234:5100
Call function: macReportMacros
e name rawval value
- ---- ------ -----
name greatwall greatwall
location beijing beijing
sport walk walk
Call function: macDeleteHandle