LINUX.ORG.RU
Ответ на: комментарий от Begemoth

А если серьезно, то все зависит от конкретного приложения, от сложности файла конфигурации. Может имеет смысл использовать s-expr (как в Лиспе), или же что-то типа elk, или librep, или же в случае патологической нелюбви к Лиспу, встроить в программу Tcl.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

> или же в случае патологической нелюбви к Лиспу, встроить в программу Tcl.

Человек просил простого, а не lisp/tcl/python/etc embedded :).

kondor ★★★
()
Ответ на: комментарий от kondor

>libxml2, если только XML там действительно уместен.

конфиги неплохо было бы править руками

generatorglukoff ★★
() автор топика

Зависит от сложности настроек.
libconfig проще.

UVV ★★★★★
()
Ответ на: комментарий от kondor

Ну тогда cc+dlopen+dlsym, проще некуда :-) Ну или gconf использовать :-)

Begemoth ★★★★★
()

Ну вот тебе пример из жизни.

Я загружал конфиг на YAML такого вида:

=================================================================
%YAML 1.1
--- #First, terrain visuals. I hope 256 will be enough
- {id: 0, ascii: 32, color: 0x000000, name: Void}
- {id: 1, ascii: 46, color: 0x008030, name: Grass}
- {id: 2, ascii: 35, color: 0xa0a0a0, name: Wall}
- {id: 3, ascii: 62, color: 0xa0a0a0, name: Downstairs}
- {id: 4, ascii: 60, color: 0xa0a0a0, name: Upstairs}
- {id: 5, ascii: 46, color: 0xa0a0a0, name: Road}

# Then, 256 - 1023 are reserved for testing visuals, like these

- {id: 256, ascii: 64, color: 0xffffff, name: Player}
- {id: 257, ascii: 41, color: 0x0000a0, name: Light cloak}
- {id: 258, ascii: 93, color: 0xa00000, name: Wooden stick}
- {id: 259, ascii: 93, color: 0x0040ff, name: Tiny key}
- {id: 260, ascii: 34, color: 0x008040, name: FreeBSD Handbook}
- {id: 261, ascii: 94, color: 0xff0000, name: Red Hat}
- {id: 262, ascii: 47, color: 0xa0a0a0, name: Sap}
- {id: 263, ascii: 92, color: 0xa0a0a0, name: Short sword}

# 1024 - 4000 are weapons
# 4001 - 16000 are clothings
# 16001 - 65000 are rings, amulets, etc
# 65001 - 75000 are food (including corpses)
# 100000 - ... are creatures

- {id: 65001, ascii: 37, color: 0xa0a000, name: Ration}
- {id: 65002, ascii: 37, color: 0xf00000, name: Apple}

...
=================================================================

Заметь, что многоточие в конце - часть синтаксиса, а не моя заметка.

А вот процедура парсинга через libyaml http://pyyaml.org/wiki/LibYAML

- (void) loadFromYaml: (const char*)filename
{
	yaml_parser_t parser;
	yaml_event_t event;
	memset(&parser, 0, sizeof(parser));
	memset(&event, 0, sizeof(event));
	FILE* fp = fopen(filename, "r");
	if(!fp)
	{
	  /*@throw [NSException exceptionWithName: [NSString stringWithCString: "File opening error"]
					 reason: [NSString stringWithCString: "Unable to open file visuals.yaml"]
									 userInfo: nil];*/
	  return;
	}
	BOOL done = NO;
	BOOL inMapping = NO;
	BOOL awaitingID = NO, awaitingASCII=NO, awaitingColor=NO, awaitingName = NO, awaitingTermcol=NO;
	NSString* name;
	unsigned long color = 0xffffffff;
	char ascii = 0;
	unsigned long v_id = 0xffffffff;
	yaml_parser_initialize(&parser);
	yaml_parser_set_input_file(&parser, fp);
	while(!done)
	{
		if(!yaml_parser_parse(&parser, &event))
		{
		  /*@throw [NSException exceptionWithName: [NSString stringWithCString: "YAML parsing error"]
						   reason: [NSString stringWithCString: "yaml_parser_parse call failed"]
						 userInfo: nil];*/
		  return;
		}
		if(event.type == YAML_STREAM_END_EVENT)
		{
			done = YES;
		}
		switch(event.type)
		{
			case YAML_STREAM_START_EVENT:
			case YAML_STREAM_END_EVENT:
			case YAML_DOCUMENT_START_EVENT:
			case YAML_DOCUMENT_END_EVENT:
			case YAML_ALIAS_EVENT:
				break;
			case YAML_SCALAR_EVENT:
				if(inMapping)
				{
					if(strcmp((char*)event.data.scalar.value, "id") == 0)
					{
						awaitingID = YES;
						break;
					}
					if(strcmp((char*)event.data.scalar.value, "ascii") == 0)
					{
						awaitingASCII = YES;
						break;
					}
					if(strcmp((char*)event.data.scalar.value, "color") == 0)
					{
						awaitingColor = YES;
						break;
					}
					if(strcmp((char*)event.data.scalar.value, "name") == 0)
					{
						awaitingName = YES;
						break;
					}
					if(awaitingID)
					{
						char* str = (char*)event.data.scalar.value;
						int base = 10;
						if(str[0] == '0' && str[1] == 'x')
							base = 16;
						v_id = strtol(str, NULL, base);
						awaitingID = NO;
					}
					else if(awaitingASCII)
					{
						char* str = (char*)event.data.scalar.value;
						int base = 10;
						if(str[0] == '0' && str[1] == 'x')
							base = 16;
						ascii = strtol(str, NULL, base);
						awaitingASCII = NO;
					}
					else if(awaitingName)
					{
						name = [NSString stringWithCString: (char*)event.data.scalar.value];
						awaitingName = NO;
					}
					else if(awaitingColor)
					{
						char* str = (char*)event.data.scalar.value;
						int base = 10;
						if(str[0] == '0' && str[1] == 'x')
							base = 16;
						color = strtol(str, NULL, base);
						awaitingColor = NO;
					}
				}
				break;
			case YAML_SEQUENCE_START_EVENT:
			case YAML_SEQUENCE_END_EVENT:
				break;
			case YAML_MAPPING_START_EVENT:
				if(inMapping)
				{
					gore_log(llWarning, "Error in visuals.yaml: Mapping inside mapping");
					break;
				}
				inMapping = YES;
				//gore_log(llDebug, "Mapping start event;");
				break;
			case YAML_MAPPING_END_EVENT:
				inMapping = NO;
				if(!name)
				{
					gore_log(llWarning, "Error in visuals.yaml: entry without 'name'");
					break;
				}
				if(v_id == 0xffffffff)
				{
					gore_log(llWarning, "Error in visuals.yaml: entry without 'id'");
					break;
				}
				if(ascii == 0)
				{
					gore_log(llWarning, "Error in visuals.yaml: entry without 'ascii'");
					break;
				}
				if(color == 0xffffffff)
				{
					gore_log(llWarning, "Error in visuals.yaml: entry without 'color'");
					break;
				}
				[self addVisual: [[Visual alloc] initWithName: name symbol: ascii color: color] type: v_id];
				gore_log(llDebug, "Visual added: %s(%lu); color=%lu, symbol: %c ", [name cString], v_id, color, ascii);
				break;
			default:
				break;
		}
		// TODO fix possible leaks
	}
	fclose(fp);
	yaml_parser_delete(&parser);
}

xTERM ★★
()
Ответ на: комментарий от Deleted

>либ конфуз :)... мдаа

А, "конфуз"! А я-то прочел con-fuse, т.е. драйвер конфигов через FUSE :)

xTERM ★★
()

glib-2.0, Key-value file parser

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.