1 /**
2  * @file
3  * Simple parser for "key = value" text files, by zamaz.
4  *
5  * Can also manage the following weird cases:
6  *
7  * @code
8  *   # comment
9  *   # empty lines are ignored
10  *   foo = bar # comment
11  *   b\
12  *   lah = blah ; rah=meh
13  *   'with spaces' = "with\ncr"
14  *
15  *   \x2a = 'do not eat \x2a in simple quotes,'" here we can \x2a"
16  *
17  *   # EOF
18  * @endcode
19  */
20 
21 #ifndef CKVP_H_
22 #define CKVP_H_
23 
24 #include <stddef.h>
25 
26 #ifdef __cplusplus
27 #define CKVP_DECL_BEGIN__	extern "C" {
28 #define CKVP_DECL_END__		}
29 #else
30 #define CKVP_DECL_BEGIN__
31 #define CKVP_DECL_END__
32 #endif
33 
34 CKVP_DECL_BEGIN__
35 
36 #define CKVP_OUT_SIZE		511
37 #define CKVP_OUT_SIZE_STR	"511"
38 #define CKVP_INIT		{ CKVP_NONE, 1, 1, 0x0002, 0, "" }
39 
40 /**
41  * ckvp_t stores the state, it must be initialized with CKVP_INIT before
42  * being fed to ckvp_parse().
43  *
44  * When "state" reaches CKVP_OUT_FULL, "out_size" is equal to CKVP_OUT_SIZE
45  * ("out" is full), and ckvp_parse() won't process any more characters until
46  * "out_size" is reset.
47  */
48 typedef struct {
49 	unsigned int state;    /**< Parsing status */
50 	unsigned int line;     /**< Current line */
51 	unsigned int column;   /**< Current column */
52 	unsigned int internal; /**< Internal state */
53 	size_t out_size;       /**< Number of characters in "out" */
54 	/**
55 	 * Output buffer. Be careful, this buffer not NUL-terminated.
56 	 */
57 	char out[(CKVP_OUT_SIZE + 1)]; /* hack: this +1 saves room for \0 */
58 } ckvp_t;
59 
60 /**
61  *  Possible states (previously defined in an enum, but C++ didn't like it)
62  */
63 #define CKVP_NONE      0 /**< Nothing to report */
64 #define CKVP_OUT_FULL  1 /**< Buffer "out" is full, must be flushed */
65 #define CKVP_OUT_KEY   2 /**< Everything stored until now is a key */
66 #define CKVP_OUT_VALUE 3 /**< Everything stored until now is a value */
67 #define CKVP_ERROR     4 /**< Error status, check line/column */
68 
69 /**
70  * ckvp_parse() takes the current state (ckvp), a buffer in[size] and returns
71  * the number of characters processed.
72  *
73  * Each time ckvp_parse() returns, ckvp->state must be checked. If no error
74  * occured, ckvp_parse() must be called again with the remaining characters
75  * if any, otherwise the next input buffer.
76  *
77  * At the end of input, ckvp_parse() must be called with a zero size.
78  *
79  * This function doesn't allocate anything.
80  *
81  * @param[in,out] ckvp Current state.
82  * @param size Number of characters in buffer "in".
83  * @param in Input buffer to parse.
84  * @return Number of characters processed.
85  */
86 extern size_t ckvp_parse(ckvp_t *ckvp, size_t size, const char in[]);
87 
88 CKVP_DECL_END__
89 
90 #endif /* CKVP_H_ */
91