mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-11-04 10:08:56 +01:00 
			
		
		
		
	Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com> Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane. * gconvert.c (g_convert/g_convert_with_fallback): Remove workarounds for since-fixed GNU libc bugs. Minor doc fix. * gconvert.[ch]: Change gint to gsize/gssize as appropriate. * gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect computation of bytes_read / bytes_written. * gfileutils.[ch] (g_file_get_contents): Make length out parameter 'gsize *len'. * ghook.c (g_hook_compare_ids): Don't compare a and b as 'a - b'. * gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE, GSIZE_TO_POINTER. * gmain.c (g_timeout_prepare): Rewrite to avoid overflows. (Fixes bug when system clock skews backwards more than 24 days.) * gmarkup.[ch]: Make lengths passed to callbacks gsize, length for g_markup_parse-context_parse(), g_markup_escape_text() gssize. * gmessages.[ch] (g_printf_string_upper_bound): Change return value to gsize. * gmessages.c (printf_string_upper_bound): Remove a ridiculous use of 'inline' on a 300 line function. * gstring.[ch]: Represent size of string as a gsize, not gint. Make parameters to functions take gsize, or gssize where -1 is allowed. * gstring.c (g_string_erase): Make g_string_erase (string, pos, -1) a synonym for g_string_truncate for consistency with other G* APIs. * gstrfuncs.[ch]: Make all functions taking a string length, take a gsize, or gssize if -1 is allowed. (g_strstr_len, g_strrstr_len). Also fix some boundary conditions in g_str[r]str[_len]. * gutf8.c tests/unicode-encoding.c: Make parameters that are byte lengths gsize, gssize as appropriate. Make character offsets, other counts, glong. * gasyncqueue.c gcompletion.c timeloop.c timeloop-basic.c gutils.c gspawn.c. Small 64 bit cleanliness fixups. * glist.c (g_list_sort2, g_list_sort_real): Fix functions that should have been static. * gdate.c (g_date_fill_parse_tokens): Fix extra declaration that was shadowing another. * tests/module-test.c: Include string.h Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com> * gutf8.c (g_get_charset): Make argument G_CONST_RETURN char **.
		
			
				
	
	
		
			203 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdio.h>
 | 
						|
#include <glib.h>
 | 
						|
 | 
						|
static int depth = 0;
 | 
						|
 | 
						|
static void
 | 
						|
indent (int extra)
 | 
						|
{
 | 
						|
  int i = 0;
 | 
						|
  while (i < depth)
 | 
						|
    {
 | 
						|
      fputs ("  ", stdout);
 | 
						|
      ++i;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
start_element_handler  (GMarkupParseContext *context,
 | 
						|
                        const gchar         *element_name,
 | 
						|
                        const gchar        **attribute_names,
 | 
						|
                        const gchar        **attribute_values,
 | 
						|
                        gpointer             user_data,
 | 
						|
                        GError             **error)
 | 
						|
{
 | 
						|
  int i;
 | 
						|
  
 | 
						|
  indent (0);
 | 
						|
  printf ("ELEMENT '%s'\n", element_name);
 | 
						|
 | 
						|
  i = 0;
 | 
						|
  while (attribute_names[i] != NULL)
 | 
						|
    {
 | 
						|
      indent (1);
 | 
						|
 | 
						|
      printf ("%s=\"%s\"\n",
 | 
						|
              attribute_names[i],
 | 
						|
              attribute_values[i]);
 | 
						|
      
 | 
						|
      ++i;
 | 
						|
    }
 | 
						|
  
 | 
						|
  ++depth;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
end_element_handler    (GMarkupParseContext *context,
 | 
						|
                        const gchar         *element_name,
 | 
						|
                        gpointer             user_data,
 | 
						|
                        GError             **error)
 | 
						|
{
 | 
						|
  --depth;
 | 
						|
  indent (0);
 | 
						|
  printf ("END '%s'\n", element_name);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
text_handler           (GMarkupParseContext *context,
 | 
						|
                        const gchar         *text,
 | 
						|
                        gsize                text_len,
 | 
						|
                        gpointer             user_data,
 | 
						|
                        GError             **error)
 | 
						|
{
 | 
						|
  indent (0);
 | 
						|
  printf ("TEXT '%s'\n", text);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
static void
 | 
						|
passthrough_handler    (GMarkupParseContext *context,
 | 
						|
                        const gchar         *passthrough_text,
 | 
						|
                        gsize                text_len,
 | 
						|
                        gpointer             user_data,
 | 
						|
                        GError             **error)
 | 
						|
{
 | 
						|
  indent (0);
 | 
						|
 | 
						|
  printf ("PASS '%s'\n", passthrough_text);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
error_handler          (GMarkupParseContext *context,
 | 
						|
                        GError              *error,
 | 
						|
                        gpointer             user_data)
 | 
						|
{
 | 
						|
  fprintf (stderr, " %s\n", error->message);
 | 
						|
}
 | 
						|
 | 
						|
static GMarkupParser parser = {
 | 
						|
  start_element_handler,
 | 
						|
  end_element_handler,
 | 
						|
  text_handler,
 | 
						|
  passthrough_handler,
 | 
						|
  error_handler
 | 
						|
};
 | 
						|
 | 
						|
static int
 | 
						|
test_in_chunks (const gchar *contents,
 | 
						|
                gint         length,
 | 
						|
                gint         chunk_size)
 | 
						|
{
 | 
						|
  GMarkupParseContext *context;
 | 
						|
  int i = 0;
 | 
						|
  
 | 
						|
  context = g_markup_parse_context_new (&parser, 0, NULL, NULL);
 | 
						|
 | 
						|
  while (i < length)
 | 
						|
    {
 | 
						|
      int this_chunk = MIN (length - i, chunk_size);
 | 
						|
 | 
						|
      if (!g_markup_parse_context_parse (context,
 | 
						|
                                         contents + i,
 | 
						|
                                         this_chunk,
 | 
						|
                                         NULL))
 | 
						|
        {
 | 
						|
          g_markup_parse_context_free (context);
 | 
						|
          return 1;
 | 
						|
        }
 | 
						|
 | 
						|
      i += this_chunk;
 | 
						|
    }
 | 
						|
      
 | 
						|
  if (!g_markup_parse_context_end_parse (context, NULL))
 | 
						|
    {
 | 
						|
      g_markup_parse_context_free (context);
 | 
						|
      return 1;
 | 
						|
    }
 | 
						|
 | 
						|
  g_markup_parse_context_free (context);
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
test_file (const gchar *filename)
 | 
						|
{
 | 
						|
  gchar *contents;
 | 
						|
  gint   length;
 | 
						|
  GError *error;
 | 
						|
  GMarkupParseContext *context;
 | 
						|
  
 | 
						|
  error = NULL;
 | 
						|
  if (!g_file_get_contents (filename,
 | 
						|
                            &contents,
 | 
						|
                            &length,
 | 
						|
                            &error))
 | 
						|
    {
 | 
						|
      fprintf (stderr, "%s\n", error->message);
 | 
						|
      g_error_free (error);
 | 
						|
      return 1;
 | 
						|
    }
 | 
						|
 | 
						|
  context = g_markup_parse_context_new (&parser, 0, NULL, NULL);
 | 
						|
 | 
						|
  if (!g_markup_parse_context_parse (context, contents, length, NULL))
 | 
						|
    {
 | 
						|
      g_markup_parse_context_free (context);
 | 
						|
      return 1;
 | 
						|
    }
 | 
						|
 | 
						|
  if (!g_markup_parse_context_end_parse (context, NULL))
 | 
						|
    {
 | 
						|
      g_markup_parse_context_free (context);
 | 
						|
      return 1;
 | 
						|
    }
 | 
						|
 | 
						|
  g_markup_parse_context_free (context);
 | 
						|
 | 
						|
  /* A byte at a time */
 | 
						|
  if (test_in_chunks (contents, length, 1) != 0)
 | 
						|
    return 1;
 | 
						|
 | 
						|
  /* 2 bytes */
 | 
						|
  if (test_in_chunks (contents, length, 2) != 0)
 | 
						|
    return 1;
 | 
						|
 | 
						|
  /*5 bytes */
 | 
						|
  if (test_in_chunks (contents, length, 5) != 0)
 | 
						|
    return 1;
 | 
						|
  
 | 
						|
  /* 12 bytes */
 | 
						|
  if (test_in_chunks (contents, length, 12) != 0)
 | 
						|
    return 1;
 | 
						|
  
 | 
						|
  /* 1024 bytes */
 | 
						|
  if (test_in_chunks (contents, length, 1024) != 0)
 | 
						|
    return 1;
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
main (int   argc,
 | 
						|
      char *argv[])
 | 
						|
{
 | 
						|
  if (argc > 1)
 | 
						|
    return test_file (argv[1]);
 | 
						|
  else
 | 
						|
    {
 | 
						|
      fprintf (stderr, "Give a markup file on the command line\n");
 | 
						|
      return 1;
 | 
						|
    }
 | 
						|
}
 |