Initial commit.
[yacjs.git] / src / yacjs.c
1 #include <stdlib.h>
2
3 #include "yacjs.h"
4 #include "yacjs_dict.h"
5
6 struct yacjs_node {
7     enum yacjs_node_type type;
8     union {
9         const char *string;
10         int64_t number;
11         double fp;
12         struct {
13             struct yacjs_node *entries;
14             int entries_count;
15             int entries_size;
16         } array;
17         struct yacjs_dict *dict;
18     } data;
19 };
20
21 static enum yacjs_error last_error = YACJS_ERROR_NONE;
22
23 enum yacjs_error yacjs_last_error() {
24     enum yacjs_error err = last_error;
25     last_error = YACJS_ERROR_NONE;
26     return err;
27 }
28
29 struct yacjs_node *yacjs_parse(const char *string) {
30     return NULL;
31 }
32
33 enum yacjs_node_type yacjs_node_type(struct yacjs_node *node) {
34     return node->type;
35 }
36
37 const char *yacjs_node_str(struct yacjs_node *node) {
38     if(node->type != YACJS_NODE_STRING) {
39         last_error = YACJS_ERROR_TYPE;
40         return NULL;
41     }
42     return node->data.string;
43 }
44
45 int64_t yacjs_node_num(struct yacjs_node *node) {
46     if(node->type != YACJS_NODE_NUMBER) {
47         last_error = YACJS_ERROR_TYPE;
48         return -1;
49     }
50     return node->data.number;
51 }
52
53 double yacjs_node_float(struct yacjs_node *node) {
54     if(node->type != YACJS_NODE_FLOAT) {
55         last_error = YACJS_ERROR_TYPE;
56         return 1/0.0;
57     }
58     return node->data.fp;
59 }
60
61 int yacjs_node_array_size(struct yacjs_node *node) {
62     if(node->type != YACJS_NODE_ARRAY) {
63         last_error = YACJS_ERROR_TYPE;
64         return -1;
65     }
66     return node->data.array.entries_count;
67 }
68
69 struct yacjs_node *yacjs_node_array_elem(struct yacjs_node *node, int index) {
70     if(node->type != YACJS_NODE_ARRAY) {
71         last_error = YACJS_ERROR_TYPE;
72         return NULL;
73     }
74     if(index >= node->data.array.entries_count || index < 0) {
75         last_error = YACJS_ERROR_BOUNDS;
76         return NULL;
77         
78     }
79     return node->data.array.entries + index;
80 }
81
82 struct yacjs_node *yacjs_node_dict_get(struct yacjs_node *node,
83     const char *key) {
84
85     if(node->type != YACJS_NODE_DICT) {
86         last_error = YACJS_ERROR_TYPE;
87         return NULL;
88     }
89
90     return yacjs_dict_get(node->data.dict, key);
91 }