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