#ifndef KEYWORD_H #define KEYWORD_H #include #include typedef enum keyword_type keyword_type; typedef struct delimiter delimiter; typedef struct keyword keyword; typedef union keyword_val keyword_val; typedef int (set_keyword_cb)(void *ctx, void *ret, const keyword *key, keyword_val val); typedef int (get_keyword_cb)(void *ctx, void *data, const keyword *key, keyword_val *val); typedef int (parse_callback)(void **ret, void *ctx, char *buf); enum keyword_type { TYPE_NONE, TYPE_INT, TYPE_STRING, TYPE_FLOAT, TYPE_BOOL, TYPE_TIME, TYPE_COUNT, }; struct delimiter { char *delm; /* Delimiter. */ int lead_space; /* Leading whitespace. */ int trail_space; /* Trailing whitespace. */ }; struct keyword { const char *key; /* Keyword. */ const char *desc; /* Description of the keyword. */ const char *time_fmt; /* Format string used to parse a timestamp (if needed). */ keyword_type type; /* Datatype of the keyword. */ size_t *offsets; /* Offset(s) of member(s) in a struct (if needed). */ set_keyword_cb *set_callback; /* Callback to keyword specific setter function (if needed). */ get_keyword_cb *get_callback; /* Callback to keyword specific getter function (if needed). */ }; union keyword_val { int i; /* Integer. */ time_t t; /* Time. */ char *str; /* String. */ float f; /* Float. */ }; extern void *get_keyword_offset_ptr(const keyword *key, void *ptr); extern keyword_val get_keyword_value(const keyword *key, char *value, int *error); extern keyword_val get_keyword(const keyword *key, void *data, void *ctx, int *error); extern int set_keyword(const keyword *key, keyword_val val, void *ret, void *ctx); extern keyword_val parse_keyword(const keyword *key, char *key_str, char *value, int *error); extern int parse_keywords(const keyword **keys, char *key, char *value, void *ret, void *ctx); extern int parse_key_value_file(void *ret, void *ctx, const keyword **keywords, char *buf, const char *delm, parse_callback *parse_cb); extern char *create_key_value_str(const keyword *key, keyword_val val, const delimiter *start_delm, const delimiter *end_delm); extern char *create_key_value_file(void *data, void *ctx, const keyword **keywords, const delimiter *start_delm, const delimiter *end_delm); #endif