summaryrefslogtreecommitdiff
path: root/src/examples/eina/eina_json_03.c
blob: 9b5a0e113f0556bd65aa8b8b3a1bbdc43c153f96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//Compile with:
//gcc -g eina_json_03.c -o eina_json_03 `pkg-config --cflags --libs eina`

// This example demonstrates a simple use of a json context SAX parsing
// with callback function which prints indented json objects

#include "Eina.h"

#define DOERROR(x,args...) { printf(x,## args); return 1; }
#define BUFFSIZE 100

typedef struct
{
   Eina_Strbuf *text;
   unsigned long parent_idx;
} Sax_Parser_Data;

char *json_err_name[]={"No error","Lexical error","Syntax Error","Input Past End"};

char *json_type_string[]={"NULL","NUMBER","STRING","BOOLEAN","PAIR","OBJECT","ARRAY"};

char my_json[] =
"{\n\
\"String\":\"MyJSON\",\n \
\"Array\":[1,2,3,true,5,false,\"\",{},null,[78,\"Hello\"],\"World\"],\n \
\"Object\": { \"Subobj\":{ \"Sub1\":null,\"Sub2\":56} }\n \
}";

void *
sax_parser_cb(Eina_Json_Type type, void *parent, const char *text, void *data)
{
   Sax_Parser_Data *saxdata = (Sax_Parser_Data *)data;
   const char* strval = NULL;

   switch(type)
     {
      case EINA_JSON_TYPE_NUMBER:
      case EINA_JSON_TYPE_STRING:
      case EINA_JSON_TYPE_PAIR:
         strval = text;
         break;
      case EINA_JSON_TYPE_BOOLEAN:
         strval = (*text == 't') ? "true" : "false";
         break;
     }

   saxdata->parent_idx++;
   eina_strbuf_append_printf(saxdata->text,
                             "(%p) PARENT(%p) TYPE:%s",
                             (void*)saxdata->parent_idx,
                             parent,
                             json_type_string[type]);

   if (strval) eina_strbuf_append_printf(saxdata->text, " = \"%s\"", strval);
   eina_strbuf_append_char(saxdata->text, '\n');

   return (void*)saxdata->parent_idx;
}

int
main(int argc,void **argv)
{
   Sax_Parser_Data mysax;

   eina_init();

   mysax.text = eina_strbuf_new();
   mysax.parent_idx = 1;

   // Its a SAX parsing. We initilize it with our our callback function
   // and the data to be used by the callback.
   Eina_Json_Context *ctx = eina_json_context_sax_new(sax_parser_cb, &mysax);

   //Now parse
   eina_json_context_parse(ctx, my_json);

   //Analize and report results
   Eina_Json_Error jsnerr = eina_json_context_error_get(ctx);
   if (jsnerr)
     {
        printf ("Parsing failed\n");
        printf ("Error %d:%d %s\n", eina_json_context_line_get(ctx),
                eina_json_context_column_get(ctx),
                json_err_name[jsnerr]);
     }
   else if (eina_json_context_completed_get(ctx))
     {
        // If parsing was successful - print the text that our callback produced.
        printf ("File was successfully parsed\n\n");
        printf("%s\n", eina_strbuf_string_get(mysax.text));
     }
   else
     printf ("Parsing was not completed\n");

   eina_strbuf_free(mysax.text);
   eina_json_context_free(ctx);

   eina_shutdown();
   return 0;
}