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