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