8#ifndef PRINTLINES_ALLOWED
9#define PRINTLINES_ALLOWED 1
12static const char *FNAME =
"kest_dictionary.c";
26 default:
return "DICT_ENTRY_TYPE_UNKNOWN";
40 default:
return "unknown";
110 for (
int i = 0; i < list->count; i++)
165 for (
int i = 0; i < bucket->
n_entries; i++)
306 if (!bucket || !result || !name)
309 for (
int i = 0; i < bucket->
n_entries; i++)
426 for (
int i = 0; i < dict->
n_entries; i++)
579 if (!dict || !result || !name)
667 for (
int i = 0; i < dict->
n_entries; i++)
682#define LIST_ENTRY_NAME_BUF_LEN 128
688 if (!ps || !dict || !result)
702 int name_len = strlen(result->
name);
726 goto parse_dict_list_fin;
749 KEST_PRINTF(
"Current entry: %s, current token: \"%s\"\n", str, current->
data);
756 goto parse_dict_list_fin;
759 kest_dictionary_entry_list_append(result->
value.
val_list, centry);
765 KEST_PRINTF(
"Adding entry to list; %s. Current token is \"%s\"\n", str, current ? (current->
data[0] ==
'\n' ?
"\\n" : current->
data) :
"(NULL)");
770 if (!current || strcmp(current->
data,
"}") == 0)
773 if (strcmp(current->
data,
",") == 0)
790 KEST_PRINTF(
"kest_parse_dict_list: result: %s\n", str);
824 int contains_semicolon = 0;
830 if (strcmp(end->
data,
":") == 0)
832 contains_semicolon = 1;
834 else if (strcmp(end->
data,
"(") == 0)
838 else if (strcmp(end->
data,
")") == 0)
853 if (current->
data[0] ==
'"')
857 len = strlen(current->
data) - 2;
860 KEST_PRINTF(
"Syntax error (line %d): excess tokens following string %s\n", current->
line, current->
data);
862 goto parse_dict_val_fin;
869 goto parse_dict_val_fin;
871 else if (strcmp(current->
data,
"(") == 0 && contains_semicolon)
879 if (current && strcmp(current->
data,
")") != 0)
886 goto parse_dict_val_fin;
888 else if (strcmp(current->
data,
"{") == 0)
896 if (current && strcmp(current->
data,
"}") != 0)
903 goto parse_dict_val_fin;
918 goto parse_dict_val_fin;
976 KEST_PRINTF(
"Looking for entry. Current token = \"%s\"\n", current->
data[0] ==
'\n' ?
"\\n" : current->
data);
996 if (!current || (strcmp(current->
data,
":") != 0 && strcmp(current->
data,
"=") != 0))
1000 goto parse_dict_fin;
1008 goto parse_dict_fin;
1018 if (!current || strcmp(current->
data,
")") == 0)
1021 if (strcmp(current->
data,
",") == 0)
1030 KEST_PRINTF(
"Done parsing dictionary; next token: \"%s\"\n", current ? (current->
data[0] ==
'\n' ?
"\\n" : current->
data) :
"(NULL)");
void kest_free(void *ptr)
void * kest_allocator_alloc(kest_allocator *a, size_t n)
int kest_dictionary_bucket_lookup_expr(kest_dictionary_bucket *bucket, const char *name, kest_expression **result)
int kest_dictionary_lookup_dict(kest_dictionary *dict, const char *name, kest_dictionary **result)
int kest_dictionary_lookup_int(kest_dictionary *dict, const char *name, int *result)
int kest_dictionary_lookup_list(kest_dictionary *dict, const char *name, kest_dictionary_entry_list **result)
int kest_dictionary_bucket_lookup_int(kest_dictionary_bucket *bucket, const char *name, int *result)
int kest_dictionary_bucket_add_entry_int(kest_dictionary_bucket *bucket, const char *name, int value)
kest_string * kest_dict_entry_to_string(kest_dictionary_entry *entry)
void print_dict(kest_dictionary *dict)
int kest_dictionary_bucket_add_entry_float(kest_dictionary_bucket *bucket, const char *name, float value)
void print_dict_entry(kest_dictionary_entry *entry)
int kest_dictionary_bucket_add_entry_str(kest_dictionary_bucket *bucket, const char *name, const char *value)
int kest_dictionary_bucket_add_entry(kest_dictionary_bucket *bucket, kest_dictionary_entry entry)
int kest_dictionary_add_entry_float(kest_dictionary *dict, const char *name, float value)
int kest_dictionary_bucket_lookup_list(kest_dictionary_bucket *bucket, const char *name, kest_dictionary_entry_list **result)
int kest_dictionary_lookup_str(kest_dictionary *dict, const char *name, const char **result)
int kest_dictionary_bucket_lookup_float(kest_dictionary_bucket *bucket, const char *name, float *result)
#define LIST_ENTRY_NAME_BUF_LEN
int kest_dictionary_bucket_add_entry_dict(kest_dictionary_bucket *bucket, const char *name, kest_dictionary *value)
int kest_parse_dict_list(kest_eff_parsing_state *ps, kest_dictionary *dict, kest_dictionary_entry *result)
const char * kest_dict_entry_type_to_string(int type)
int kest_dictionary_bucket_lookup_str(kest_dictionary_bucket *bucket, const char *name, const char **result)
kest_dictionary * kest_new_dictionary()
int kest_dictionary_lookup_expr(kest_dictionary *dict, const char *name, kest_expression **result)
int kest_dictionary_bucket_lookup_dict(kest_dictionary_bucket *bucket, const char *name, kest_dictionary **result)
int kest_parse_dictionary(kest_eff_parsing_state *ps, kest_dictionary **result, const char *name)
int kest_dictionary_ensure_capacity(kest_dictionary *dict)
const char * kest_dict_entry_type_to_string_nice(int type)
int kest_dictionary_lookup_float(kest_dictionary *dict, const char *name, float *result)
int kest_dictionary_lookup(kest_dictionary *dict, const char *name, void *result, int type)
int kest_dictionary_add_entry_dict(kest_dictionary *dict, const char *name, kest_dictionary *value)
int kest_dictionary_bucket_init(kest_dictionary_bucket *bucket)
int kest_dictionary_add_entry(kest_dictionary *dict, kest_dictionary_entry entry)
int kest_dictionary_bucket_ensure_capacity(kest_dictionary_bucket *bucket)
int kest_dictionary_bucket_add_entry_expr(kest_dictionary_bucket *bucket, const char *name, kest_expression *value)
int kest_dictionary_bucket_lookup(kest_dictionary_bucket *bucket, const char *name, void *result, int type)
int kest_parse_dict_val(kest_eff_parsing_state *ps, kest_dictionary *dict, kest_dictionary_entry *result)
int kest_dictionary_add_entry_expr(kest_dictionary *dict, const char *name, kest_expression *value)
int kest_dictionary_add_entry_str(kest_dictionary *dict, const char *name, const char *value)
int kest_dictionary_add_entry_int(kest_dictionary *dict, const char *name, int value)
#define DICT_ENTRY_TYPE_SUBDICT
#define DICT_ENTRY_TYPE_INT
#define DICT_ENTRY_TYPE_FLOAT
#define DICT_ENTRY_TYPE_STR
#define DICT_ENTRY_TYPE_LIST
#define DICT_ENTRY_TYPE_NOTHING
#define KEST_DICTIONARY_N_BUCKETS
#define DICT_ENTRY_TYPE_EXPR
char * kest_parser_strndup(const char *str, int n)
kest_allocator * kest_parser_allocator
void kest_parser_error(kest_eff_parsing_state *ps, const char *msg,...)
void * kest_parser_alloc(size_t size)
void kest_parser_error_at(kest_eff_parsing_state *ps, kest_token_ll *token, const char *msg,...)
kest_expression * kest_parse_expression(kest_eff_parsing_state *ps, kest_token_ll *tokens, kest_token_ll *tokens_end)
const char * kest_expression_to_string(kest_expression *expr)
#define IMPLEMENT_LIST(X)
int kest_string_concat(kest_string *a, kest_string *b)
int kest_string_pop_tail(kest_string *string)
int kest_string_append(kest_string *string, char x)
char * kest_string_to_native(kest_string *string)
int kest_string_init_with_allocator(kest_string *string, const kest_allocator *alloc)
int kest_string_appendf(kest_string *string, const char *fmt,...)
char * kest_string_to_native_with_allocator(kest_string *string, kest_allocator *alloc)
int kest_string_len(kest_string *string)
int kest_string_append_str(kest_string *string, const char *str)
int kest_string_init(kest_string *string)
int kest_string_destroy(kest_string *string)
int token_is_name(char *token)
int token_is_dict_entry_seperator(char *token)
int kest_token_ll_advance(kest_token_ll **list)
int kest_token_ll_skip_ws(kest_token_ll **list)
kest_dictionary_entry * entries
union kest_dictionary_entry::@135165320273153367332213364063306072146165325153 value
struct kest_dictionary * val_dict
struct kest_dictionary_entry_list * val_list
kest_expression * val_expr
kest_dictionary_entry * entries
kest_dictionary_bucket buckets[KEST_DICTIONARY_N_BUCKETS]
kest_token_ll * current_token
struct kest_token_ll * next