1d81ac5339fcf9537a3731ebb5770238f4fa69d59Sebastian Wilhelmi#undef G_DISABLE_ASSERT
2d81ac5339fcf9537a3731ebb5770238f4fa69d59Sebastian Wilhelmi#undef G_LOG_DOMAIN
3d81ac5339fcf9537a3731ebb5770238f4fa69d59Sebastian Wilhelmi
432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington#include <stdio.h>
532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington#include <glib.h>
632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonstatic int depth = 0;
832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonstatic void
1032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonindent (int extra)
1132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington{
1232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  int i = 0;
1332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  while (i < depth)
1432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    {
1532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      fputs ("  ", stdout);
1632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      ++i;
1732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    }
1832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington}
1932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
2032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonstatic void
2132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonstart_element_handler  (GMarkupParseContext *context,
2232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        const gchar         *element_name,
2332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        const gchar        **attribute_names,
2432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        const gchar        **attribute_values,
2532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        gpointer             user_data,
2632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        GError             **error)
2732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington{
2832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  int i;
2932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
3032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  indent (0);
3132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  printf ("ELEMENT '%s'\n", element_name);
3232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
3332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  i = 0;
3432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  while (attribute_names[i] != NULL)
3532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    {
3632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      indent (1);
3732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
3832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      printf ("%s=\"%s\"\n",
3932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington              attribute_names[i],
4032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington              attribute_values[i]);
4132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
4232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      ++i;
4332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    }
4432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
4532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  ++depth;
4632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington}
4732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
4832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonstatic void
4932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonend_element_handler    (GMarkupParseContext *context,
5032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        const gchar         *element_name,
5132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        gpointer             user_data,
5232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        GError             **error)
5332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington{
5432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  --depth;
5532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  indent (0);
5632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  printf ("END '%s'\n", element_name);
57c8922bb143ff1a3f8f8bfef7cef5881e45837c16Matthias Clasen  }
5832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
5932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonstatic void
60c8922bb143ff1a3f8f8bfef7cef5881e45837c16Matthias Clasentext_handler                      (GMarkupParseContext *context,
6132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        const gchar         *text,
62f5c28ce4ab8e8015a1432060b6cfe547183b2f9eOwen Taylor                        gsize                text_len,
6332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        gpointer             user_data,
6432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        GError             **error)
6532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington{
6632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  indent (0);
6760f59976d909a2d77a47ef09140ffcdac2187d92Matthias Clasen  printf ("TEXT '%.*s'\n", (int)text_len, text);
6832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington}
6932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
7032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
7132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonstatic void
7232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonpassthrough_handler    (GMarkupParseContext *context,
7332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        const gchar         *passthrough_text,
74f5c28ce4ab8e8015a1432060b6cfe547183b2f9eOwen Taylor                        gsize                text_len,
7532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        gpointer             user_data,
7632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        GError             **error)
7732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington{
7832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  indent (0);
7932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
8060f59976d909a2d77a47ef09140ffcdac2187d92Matthias Clasen  printf ("PASS '%.*s'\n", (int)text_len, passthrough_text);
8132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington}
8232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
8332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonstatic void
8432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonerror_handler          (GMarkupParseContext *context,
8532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        GError              *error,
8632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                        gpointer             user_data)
8732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington{
8832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  fprintf (stderr, " %s\n", error->message);
8932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington}
9032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
91c8922bb143ff1a3f8f8bfef7cef5881e45837c16Matthias Clasenstatic const GMarkupParser parser = {
9232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  start_element_handler,
9332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  end_element_handler,
9432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  text_handler,
9532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  passthrough_handler,
9632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  error_handler
9732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington};
9832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
99c8922bb143ff1a3f8f8bfef7cef5881e45837c16Matthias Clasenstatic const GMarkupParser silent_parser = {
100c8922bb143ff1a3f8f8bfef7cef5881e45837c16Matthias Clasen  NULL,
101c8922bb143ff1a3f8f8bfef7cef5881e45837c16Matthias Clasen  NULL,
102c8922bb143ff1a3f8f8bfef7cef5881e45837c16Matthias Clasen  NULL,
103c8922bb143ff1a3f8f8bfef7cef5881e45837c16Matthias Clasen  NULL,
104c8922bb143ff1a3f8f8bfef7cef5881e45837c16Matthias Clasen  error_handler
105c8922bb143ff1a3f8f8bfef7cef5881e45837c16Matthias Clasen};
106c8922bb143ff1a3f8f8bfef7cef5881e45837c16Matthias Clasen
10732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonstatic int
10832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtontest_in_chunks (const gchar *contents,
10932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                gint         length,
11032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                gint         chunk_size)
11132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington{
11232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  GMarkupParseContext *context;
11332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  int i = 0;
11432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
115c8922bb143ff1a3f8f8bfef7cef5881e45837c16Matthias Clasen  context = g_markup_parse_context_new (&silent_parser, 0, NULL, NULL);
11632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
11732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  while (i < length)
11832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    {
11932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      int this_chunk = MIN (length - i, chunk_size);
12032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
12132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      if (!g_markup_parse_context_parse (context,
12232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                                         contents + i,
12332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                                         this_chunk,
12432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                                         NULL))
12532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington        {
12632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington          g_markup_parse_context_free (context);
12732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington          return 1;
12832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington        }
12932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
13032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      i += this_chunk;
13132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    }
13232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
13332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  if (!g_markup_parse_context_end_parse (context, NULL))
13432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    {
13532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      g_markup_parse_context_free (context);
13632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      return 1;
13732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    }
13832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
13932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  g_markup_parse_context_free (context);
14032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
14132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  return 0;
14232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington}
14332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
14432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonstatic int
14532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtontest_file (const gchar *filename)
14632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington{
14732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  gchar *contents;
148e7d925595c887356132aa45f1fa4639aab37f8cdSebastian Wilhelmi  gsize  length;
14932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  GError *error;
15032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  GMarkupParseContext *context;
15132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
15232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  error = NULL;
15332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  if (!g_file_get_contents (filename,
15432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                            &contents,
15532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                            &length,
15632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington                            &error))
15732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    {
15832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      fprintf (stderr, "%s\n", error->message);
15932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      g_error_free (error);
16032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      return 1;
16132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    }
16232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
16332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  context = g_markup_parse_context_new (&parser, 0, NULL, NULL);
16432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
16532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  if (!g_markup_parse_context_parse (context, contents, length, NULL))
16632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    {
16732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      g_markup_parse_context_free (context);
16832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      return 1;
16932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    }
17032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
17132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  if (!g_markup_parse_context_end_parse (context, NULL))
17232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    {
17332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      g_markup_parse_context_free (context);
17432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      return 1;
17532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    }
17632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
17732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  g_markup_parse_context_free (context);
17832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
17932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  /* A byte at a time */
18032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  if (test_in_chunks (contents, length, 1) != 0)
18132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    return 1;
18232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
18332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  /* 2 bytes */
18432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  if (test_in_chunks (contents, length, 2) != 0)
18532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    return 1;
18632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
18732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  /*5 bytes */
18832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  if (test_in_chunks (contents, length, 5) != 0)
18932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    return 1;
19032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
19132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  /* 12 bytes */
19232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  if (test_in_chunks (contents, length, 12) != 0)
19332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    return 1;
19432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
19532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  /* 1024 bytes */
19632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  if (test_in_chunks (contents, length, 1024) != 0)
19732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    return 1;
19832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
19932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  return 0;
20032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington}
20132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington
20232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonint
20332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Penningtonmain (int   argc,
20432ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      char *argv[])
20532ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington{
20632ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  if (argc > 1)
20732ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    return test_file (argv[1]);
20832ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington  else
20932ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    {
21032ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      fprintf (stderr, "Give a markup file on the command line\n");
21132ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington      return 1;
21232ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington    }
21332ef70d4b27ac912188a47b6611d5e8c0516cc2fHavoc Pennington}
21460f59976d909a2d77a47ef09140ffcdac2187d92Matthias Clasen
215