summaryrefslogtreecommitdiff
path: root/src/examples/eina/eina_simple_xml_parser_02.c
blob: 2a9562100274048f125375dadf710cdd44217ada (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
//Compile with:
//gcc -Wall -o eina_simple_xml_parser_02 eina_simple_xml_parser_02.c `pkg-config --cflags --libs eina`

#include <Eina.h>
#include <stdio.h>
#include <string.h>


static Eina_Bool
_xml_attribute_parse_cb(void *data EINA_UNUSED, const char *key, const char *value)
{
   printf("attributes, key = %s, value = %s\n", key, value);
   return EINA_TRUE;
}

static Eina_Bool
_xml_tag_parse_cb(void *data EINA_UNUSED, Eina_Simple_XML_Type type, const char *content,
                  unsigned offset EINA_UNUSED, unsigned int length)
{
   if (length == 0) return EINA_FALSE;

   if (type == EINA_SIMPLE_XML_OPEN)
     {
        //Print tag
        if (!strncmp("Group", content, strlen("Group")))
          printf("tag = Group\n");
        else if (!strncmp("Label", content, strlen("Label")))
          printf("tag = Label\n");

        //Print attributes
        const char *tags = eina_simple_xml_tag_attributes_find(content, length);
        eina_simple_xml_attributes_parse(tags, length - (tags - content),
                                         _xml_attribute_parse_cb, NULL);
     }

   return EINA_TRUE;
}

int
main(void)
{
   FILE *file;
   long size;

   eina_init();

   //1. Open XML File
   file = fopen("exia.xml", "rb");

   if (!file) return 0;

   fseek(file, 0, SEEK_END);
   size = ftell(file);
   fseek(file, 0, SEEK_SET);

   //2. Read XML File
   char *buffer = malloc(size);
   if (!buffer)
     {
        fclose(file);
        return 0;
     }

   fread(buffer, 1, size, file);

   //3. Start Parsing XML
   eina_simple_xml_parse(buffer, size, EINA_FALSE, _xml_tag_parse_cb, NULL);

   fclose(file);
   free(buffer);

   return 0;
}