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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
/* grecs - Gray's Extensible Configuration System -*- c -*-
Copyright (C) 2007-2016 Sergey Poznyakoff
Grecs is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.
Grecs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with Grecs. If not, see <http://www.gnu.org/licenses/>. */
#ifndef _GRECS_TABLE_H
#define _GRECS_TABLE_H
#include <grecs/node.h>
enum grecs_data_type {
grecs_type_void,
grecs_type_string,
grecs_type_short,
grecs_type_ushort,
grecs_type_int,
grecs_type_uint,
grecs_type_long,
grecs_type_ulong,
grecs_type_size,
/* grecs_type_off,*/
grecs_type_time,
grecs_type_bool,
grecs_type_ipv4,
grecs_type_cidr,
grecs_type_host,
grecs_type_sockaddr,
grecs_type_section,
grecs_type_null
};
#define GRECS_DFLT 0x00 /* Default keyword flags */
#define GRECS_AGGR 0x01 /* Multiple entries aggregate */
#define GRECS_MULT 0x02 /* Statement can appear multiple times */
#define GRECS_INAC 0x04 /* Inactive keyword */
#define GRECS_LIST 0x08 /* Value is a list of declared type */
#define GRECS_HIDDEN 0x10 /* Hidden keyword: don't display in help output */
#define GRECS_CONST 0x20 /* For string types: initial value is constant,
don't try to free it before assigning new value.
This flag is cleared after the first assignment.
*/
enum grecs_callback_command {
grecs_callback_section_begin,
grecs_callback_section_end,
grecs_callback_set_value
};
typedef int (*grecs_callback_fn)(
#if GRECS_TREE_API
enum grecs_callback_command cmd,
grecs_node_t * /* node */,
void * /* varptr */,
void * /* cb_data */
#else
enum grecs_callback_command cmd,
grecs_locus_t * /* locus */,
void * /* varptr */,
grecs_value_t * /* value */,
void * /* cb_data */
#endif
);
struct grecs_keyword {
const char *ident;
const char *argname;
const char *docstring;
enum grecs_data_type type;
int flags;
void *varptr;
size_t offset;
grecs_callback_fn callback;
void *callback_data;
struct grecs_keyword *kwd;
};
extern int grecs_string_convert(void *target, enum grecs_data_type type,
const char *string,
grecs_locus_t const *locus);
extern void grecs_process_ident(struct grecs_keyword *kwp,
grecs_value_t *value,
void *base,
grecs_locus_t *locus);
const char *grecs_data_type_string(enum grecs_data_type type);
int grecs_tree_process(struct grecs_node *node, struct grecs_keyword *kwd);
int grecs_tree_reduce(struct grecs_node *node, struct grecs_keyword *kwd,
int flags);
#endif
|