glib/gstdio.h glib/gstdio.c Add a chdir() wrapper, too.
[platform/upstream/glib.git] / tests / markup-test.c
1 #undef G_DISABLE_ASSERT
2 #undef G_LOG_DOMAIN
3
4 #include <stdio.h>
5 #include <glib.h>
6
7 static int depth = 0;
8
9 static void
10 indent (int extra)
11 {
12   int i = 0;
13   while (i < depth)
14     {
15       fputs ("  ", stdout);
16       ++i;
17     }
18 }
19
20 static void
21 start_element_handler  (GMarkupParseContext *context,
22                         const gchar         *element_name,
23                         const gchar        **attribute_names,
24                         const gchar        **attribute_values,
25                         gpointer             user_data,
26                         GError             **error)
27 {
28   int i;
29   
30   indent (0);
31   printf ("ELEMENT '%s'\n", element_name);
32
33   i = 0;
34   while (attribute_names[i] != NULL)
35     {
36       indent (1);
37
38       printf ("%s=\"%s\"\n",
39               attribute_names[i],
40               attribute_values[i]);
41       
42       ++i;
43     }
44   
45   ++depth;
46 }
47
48 static void
49 end_element_handler    (GMarkupParseContext *context,
50                         const gchar         *element_name,
51                         gpointer             user_data,
52                         GError             **error)
53 {
54   --depth;
55   indent (0);
56   printf ("END '%s'\n", element_name);
57 }
58
59 static void
60 text_handler           (GMarkupParseContext *context,
61                         const gchar         *text,
62                         gsize                text_len,
63                         gpointer             user_data,
64                         GError             **error)
65 {
66   indent (0);
67   printf ("TEXT '%.*s'\n", (int)text_len, text);
68 }
69
70
71 static void
72 passthrough_handler    (GMarkupParseContext *context,
73                         const gchar         *passthrough_text,
74                         gsize                text_len,
75                         gpointer             user_data,
76                         GError             **error)
77 {
78   indent (0);
79
80   printf ("PASS '%.*s'\n", (int)text_len, passthrough_text);
81 }
82
83 static void
84 error_handler          (GMarkupParseContext *context,
85                         GError              *error,
86                         gpointer             user_data)
87 {
88   fprintf (stderr, " %s\n", error->message);
89 }
90
91 static GMarkupParser parser = {
92   start_element_handler,
93   end_element_handler,
94   text_handler,
95   passthrough_handler,
96   error_handler
97 };
98
99 static int
100 test_in_chunks (const gchar *contents,
101                 gint         length,
102                 gint         chunk_size)
103 {
104   GMarkupParseContext *context;
105   int i = 0;
106   
107   context = g_markup_parse_context_new (&parser, 0, NULL, NULL);
108
109   while (i < length)
110     {
111       int this_chunk = MIN (length - i, chunk_size);
112
113       if (!g_markup_parse_context_parse (context,
114                                          contents + i,
115                                          this_chunk,
116                                          NULL))
117         {
118           g_markup_parse_context_free (context);
119           return 1;
120         }
121
122       i += this_chunk;
123     }
124       
125   if (!g_markup_parse_context_end_parse (context, NULL))
126     {
127       g_markup_parse_context_free (context);
128       return 1;
129     }
130
131   g_markup_parse_context_free (context);
132
133   return 0;
134 }
135
136 static int
137 test_file (const gchar *filename)
138 {
139   gchar *contents;
140   gsize  length;
141   GError *error;
142   GMarkupParseContext *context;
143   
144   error = NULL;
145   if (!g_file_get_contents (filename,
146                             &contents,
147                             &length,
148                             &error))
149     {
150       fprintf (stderr, "%s\n", error->message);
151       g_error_free (error);
152       return 1;
153     }
154
155   context = g_markup_parse_context_new (&parser, 0, NULL, NULL);
156
157   if (!g_markup_parse_context_parse (context, contents, length, NULL))
158     {
159       g_markup_parse_context_free (context);
160       return 1;
161     }
162
163   if (!g_markup_parse_context_end_parse (context, NULL))
164     {
165       g_markup_parse_context_free (context);
166       return 1;
167     }
168
169   g_markup_parse_context_free (context);
170
171   /* A byte at a time */
172   if (test_in_chunks (contents, length, 1) != 0)
173     return 1;
174
175   /* 2 bytes */
176   if (test_in_chunks (contents, length, 2) != 0)
177     return 1;
178
179   /*5 bytes */
180   if (test_in_chunks (contents, length, 5) != 0)
181     return 1;
182   
183   /* 12 bytes */
184   if (test_in_chunks (contents, length, 12) != 0)
185     return 1;
186   
187   /* 1024 bytes */
188   if (test_in_chunks (contents, length, 1024) != 0)
189     return 1;
190
191   return 0;
192 }
193
194 int
195 main (int   argc,
196       char *argv[])
197 {
198   if (argc > 1)
199     return test_file (argv[1]);
200   else
201     {
202       fprintf (stderr, "Give a markup file on the command line\n");
203       return 1;
204     }
205 }
206