aboutsummaryrefslogtreecommitdiffstats
path: root/src/parse.h
blob: 1bc6710c29a2a31b306a1d6e267f81ba748495c8 (plain)
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#ifndef CONFCONF_PARSE_H
#define CONFCONF_PARSE_H

#include "tok.h"

#include <uthash.h>

#include <stdbool.h>

#define PARSE_DEFTYPE_MAX_LEN 32

enum parse_type_e {
	PARSE_TYPE_BOOL          = 0,
	PARSE_TYPE_STRING        = 1,
	PARSE_TYPE_INT           = 2,
	PARSE_TYPE_UINT          = 3,
	PARSE_TYPE_DEFTYPE       = 4,

	PARSE_TYPE_ARRAY_BOOL    = 5,
	PARSE_TYPE_ARRAY_STRING  = 6,
	PARSE_TYPE_ARRAY_INT     = 7,
	PARSE_TYPE_ARRAY_UINT    = 8,
	PARSE_TYPE_ARRAY_DEFTYPE = 9,

	PARSE_TYPE_HASH_BOOL     = 10,
	PARSE_TYPE_HASH_STRING   = 11,
	PARSE_TYPE_HASH_INT      = 12,
	PARSE_TYPE_HASH_UINT     = 13,
	PARSE_TYPE_HASH_DEFTYPE  = 14,
};

struct parse_deftype_s {
	char name[TOK_MAX_LEN];
	size_t line;
	size_t col;
	bool is_union;
	unsigned member_list_len;
	enum parse_type_e member_type_list[PARSE_DEFTYPE_MAX_LEN];
	char member_name_list[PARSE_DEFTYPE_MAX_LEN][TOK_MAX_LEN];
	UT_hash_handle hh;
};

struct parse_var_s {
	char name[TOK_MAX_LEN];
	size_t line;
	size_t col;
	bool is_required;
	enum parse_type_e type;
	char deftype_name[TOK_MAX_LEN];
	UT_hash_handle hh;
};

struct parse_result_s {
	unsigned long hkey_size;
	bool hkey_size_seen;
	char hkey_name[TOK_MAX_LEN];
	bool hkey_name_seen;
	char fun_suf[TOK_MAX_LEN];
	bool fun_suf_seen;
	struct parse_deftype_s *deftypes;
	struct parse_var_s *vars;
};

struct parse_result_s parse(FILE *f, const char *fname);

void parse_result_wipe(struct parse_result_s *r);

#endif