栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

使用C语言和libcyaml库解析yaml配置文件

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用C语言和libcyaml库解析yaml配置文件

C语言的yaml库有 libyaml 和 libcyaml (The Official YAML Web Site)

个人觉得libcyaml比较好用,libcyaml项目地址:GitHub - tlsa/libcyaml: C library for reading and writing YAML.

libcyaml编译没有难度,按照说明编译即可,需要注意的是提前安装libyaml-dev:

sudo apt install libyaml-dev
下面直接上例子:
~/test
    -include
        -cyaml
            cyaml.h
    -lib
        libcyaml.a
    1.yaml
    main.c
    Makefile
1.yaml
# slave 1
Name: "drive_1"
Pos: 1
Vendor_ID: 0x00000A1E
Product_ID: 0x00000305
Sdo:
  - Description: "To disable [AL. 090.1], set [Pr. PC41.0 [AL. 090.1 Homing incomplete] detection selection] to '1' (disabled)."
    Index: 0x2129
    SubIndex: 0x00
    BitLen: 32
    Value: 1
  - Description: "Pr. PD01.2_Input signal automatic ON selection"
    Index: 0x2181
    SubIndex: 0x00
    BitLen: 32
    Value: 0x00000C00
  - Description: "Reset alarm. Writing '1EA5h' resets an alarm."
    Index: 0x2A46
    SubIndex: 0x00
    BitLen: 16
    Value: 0x1EA5
main.c

#include 
#include 

#include 




struct sdo {
	char *description;
	int *index;
	int *subindex;
	int *bitlen;
	int *value;
};


struct slave {
	char *name;
	int *pos;
	int *vendor_id;
	int *product_id;
	struct sdo *sdos;
	unsigned sdos_count;
};




static const cyaml_schema_field_t sdo_fields_schema[] = {
	
	CYAML_FIELD_STRING_PTR(
			"Description", CYAML_FLAG_POINTER,
			struct sdo, description, 0, CYAML_UNLIMITED),

	CYAML_FIELD_UINT("Index", CYAML_FLAG_DEFAULT, struct sdo, index),
	CYAML_FIELD_UINT("SubIndex", CYAML_FLAG_DEFAULT, struct sdo, subindex),
	CYAML_FIELD_UINT("BitLen", CYAML_FLAG_DEFAULT, struct sdo, bitlen),
	CYAML_FIELD_UINT("Value", CYAML_FLAG_DEFAULT, struct sdo, value),
	
	

	
	CYAML_FIELD_END
};


static const cyaml_schema_value_t sdo_schema = {
	CYAML_VALUE_MAPPING(CYAML_FLAG_DEFAULT,
			struct sdo, sdo_fields_schema),
};



static const cyaml_schema_field_t slave_fields_schema[] = {

	CYAML_FIELD_STRING_PTR(
			"Name", CYAML_FLAG_POINTER,
			struct slave, name, 0, CYAML_UNLIMITED),

	CYAML_FIELD_UINT(
			"Pos", CYAML_FLAG_DEFAULT, 
			struct slave, pos),

	CYAML_FIELD_UINT(
			"Vendor_ID", CYAML_FLAG_DEFAULT, 
			struct slave, vendor_id),

	CYAML_FIELD_UINT(
			"Product_ID", CYAML_FLAG_DEFAULT, 
			struct slave, product_id),


	CYAML_FIELD_SEQUENCE(
			"Sdo", CYAML_FLAG_POINTER,
			struct slave, sdos,
			&sdo_schema, 0, CYAML_UNLIMITED),

	
	CYAML_FIELD_END
};



static const cyaml_schema_value_t slave_schema = {
	CYAML_VALUE_MAPPING(CYAML_FLAG_POINTER,
			struct slave, slave_fields_schema),
};






static const cyaml_config_t config = {
	.log_fn = cyaml_log,            
	.mem_fn = cyaml_mem,            
	.log_level = CYAML_LOG_WARNING, 
};


int main(int argc, char *argv[])
{
	cyaml_err_t err;
	struct slave *slave;
	enum {
		ARG_PROG_NAME,
		ARG_PATH_IN,
		ARG_PATH_OUT,
		ARG__COUNT,
	};

	// 
	// if (argc != ARG__COUNT) {
	// 	fprintf(stderr, "Usage:n");
	// 	fprintf(stderr, "  %s  n", argv[ARG_PROG_NAME]);
	// 	return EXIT_FAILURE;
	// }

	
	err = cyaml_load_file(argv[ARG_PATH_IN], &config,
			&slave_schema, (void **) &slave, NULL);
	if (err != CYAML_OK) {
		fprintf(stderr, "ERROR: %sn", cyaml_strerror(err));
		return EXIT_FAILURE;
	}

	
	printf("Project: %sn", slave->name);
	for (unsigned i = 0; i < slave->sdos_count; i++) {
		printf("%u. Description: %sn", i + 1, slave->sdos[i].description);
		printf("Index: 0x%xn", slave->sdos[i].index);
		printf("SubIndex: %dn", slave->sdos[i].subindex);
		printf("BitLen: %dn", slave->sdos[i].bitlen);
		printf("Value: 0x%xn", slave->sdos[i].value);
	}

	// 
	// plan->tasks[0].estimate.days += 3;
	// plan->tasks[0].estimate.weeks += 1;

	// 
	// err = cyaml_save_file(argv[ARG_PATH_OUT], &config,
	// 		&plan_schema, plan, 0);
	// if (err != CYAML_OK) {
	// 	fprintf(stderr, "ERROR: %sn", cyaml_strerror(err));
	// 	cyaml_free(&config, &plan_schema, plan, 0);
	// 	return EXIT_FAILURE;
	// }

	
	cyaml_free(&config, &slave_schema, slave, 0);

	return EXIT_SUCCESS;
}
Makefile
INCLUDE = -I include
CFLAGS += $(INCLUDE)
CFLAGS += -std=c11 -Wall -Wextra -pedantic 
		-Wconversion -Wwrite-strings -Wcast-align -Wpointer-arith 
		-Winit-self -Wshadow -Wstrict-prototypes -Wmissing-prototypes 
		-Wredundant-decls -Wundef -Wvla -Wdeclaration-after-statement
LDFLAGS += -lyaml -Llib -lcyaml

all: main

main: main.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $^ $(LDFLAGS)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942650.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号