ADAPT / lib / include / ini_parser.h
ini_parser.h
Raw
#include <stddef.h>
#include <stdbool.h>


#ifndef INI_PARSER_H
#define INI_PARSER_H


enum INI_TOKEN_TYPE
{
    INI_TOK_L_BRACKET,
    INI_TOK_R_BRACKET,
    INI_TOK_DOT,
    INI_TOK_EQUALS,
    INI_TOK_NUMBER,
    INI_TOK_ID,
    INI_TOK_STRING,
    INI_TOK_WSPACE,
    INI_TOK_END,
    INI_TOK_UNKNOWN,
    INI_NUM_TOKENS
};




struct ini_token
{
    char *str;
    enum INI_TOKEN_TYPE t_type;
};

void ini_token_init(struct ini_token *token, char *str, enum INI_TOKEN_TYPE t_type);


struct ini_token_stream
{
    struct ini_token *tokens;
    size_t num_tokens;
    size_t max_tokens;
};


#define INI_TOKEN_STREAM_INIT_SIZE 32

void ini_token_stream_init(struct ini_token_stream *t_s);
void ini_token_stream_add_token(struct ini_token_stream *t_s,
				struct ini_token *token);
void ini_token_stream_destroy(struct ini_token_stream *t_s);




//let's actually write a character based recognizer this time.
enum INI_TOKEN_TYPE ini_tok_recognize(char *text, int *pos);

//assumes the text memory will not be freed while the token stream is in use.
bool build_ini_token_stream(char *text, struct ini_token_stream *t_s);


enum INI_LAST_SEL{INI_S_INI=0, INI_S_SECTION, INI_S_SUBSECTION};


struct ini_elem
{
    enum INI_LAST_SEL l_s;
    union
    {
	struct ini *ini;
	struct ini_section *i_s;
	struct ini_subsection *i_ss;
    };
};


    
//forward declare it for now implement it later ; and back patch the parser
struct ini;
bool ini_parse(char *ini_text, struct ini *ini);

bool parse_ini(struct ini_token_stream *t_s, int *pos, struct ini *ini,struct ini_elem *last);
bool parse_ini_sections(struct ini_token_stream *t_s, int *pos, struct ini *ini,struct ini_elem *last);
bool parse_ini_properties(struct ini_token_stream *t_s, int *pos, struct ini *ini,struct ini_elem *last);
bool parse_ini_property(struct ini_token_stream *t_s, int *pos, struct ini *ini,struct ini_elem *last);
bool parse_ini_propvalue(struct ini_token_stream *t_s, int *pos, struct ini *ini,struct ini_elem *last);
#endif