mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-10-31 00:12:19 +01:00 
			
		
		
		
	re-work to retain a copy of the cached charset rather than the actual
2003-11-07 Mark McLoughlin <mark@skynet.ie> * glib/gconvert.c: (get_filename_charset): re-work to retain a copy of the cached charset rather than the actual return value from g_get_charset (which may change). Also, re-initialize the cache if it does change. See bug #126454.
This commit is contained in:
		
				
					committed by
					
						 Mark McLoughlin
						Mark McLoughlin
					
				
			
			
				
	
			
			
			
						parent
						
							d7626f52be
						
					
				
				
					commit
					57f22f15be
				
			| @@ -1,3 +1,11 @@ | ||||
| 2003-11-07  Mark McLoughlin  <mark@skynet.ie> | ||||
|  | ||||
| 	* glib/gconvert.c: (get_filename_charset): re-work to | ||||
| 	retain a copy of the cached charset rather than the | ||||
| 	actual return value from g_get_charset (which may | ||||
| 	change). Also, re-initialize the cache if it does | ||||
| 	change.	See bug #126454. | ||||
|  | ||||
| Thu Nov  6 00:04:46 2003  Matthias Clasen  <maclas@gmx.de> | ||||
|  | ||||
| 	* glib/gconvert.c (get_filename_charset): Replacement for | ||||
|   | ||||
| @@ -1,3 +1,11 @@ | ||||
| 2003-11-07  Mark McLoughlin  <mark@skynet.ie> | ||||
|  | ||||
| 	* glib/gconvert.c: (get_filename_charset): re-work to | ||||
| 	retain a copy of the cached charset rather than the | ||||
| 	actual return value from g_get_charset (which may | ||||
| 	change). Also, re-initialize the cache if it does | ||||
| 	change.	See bug #126454. | ||||
|  | ||||
| Thu Nov  6 00:04:46 2003  Matthias Clasen  <maclas@gmx.de> | ||||
|  | ||||
| 	* glib/gconvert.c (get_filename_charset): Replacement for | ||||
|   | ||||
| @@ -1,3 +1,11 @@ | ||||
| 2003-11-07  Mark McLoughlin  <mark@skynet.ie> | ||||
|  | ||||
| 	* glib/gconvert.c: (get_filename_charset): re-work to | ||||
| 	retain a copy of the cached charset rather than the | ||||
| 	actual return value from g_get_charset (which may | ||||
| 	change). Also, re-initialize the cache if it does | ||||
| 	change.	See bug #126454. | ||||
|  | ||||
| Thu Nov  6 00:04:46 2003  Matthias Clasen  <maclas@gmx.de> | ||||
|  | ||||
| 	* glib/gconvert.c (get_filename_charset): Replacement for | ||||
|   | ||||
| @@ -1,3 +1,11 @@ | ||||
| 2003-11-07  Mark McLoughlin  <mark@skynet.ie> | ||||
|  | ||||
| 	* glib/gconvert.c: (get_filename_charset): re-work to | ||||
| 	retain a copy of the cached charset rather than the | ||||
| 	actual return value from g_get_charset (which may | ||||
| 	change). Also, re-initialize the cache if it does | ||||
| 	change.	See bug #126454. | ||||
|  | ||||
| Thu Nov  6 00:04:46 2003  Matthias Clasen  <maclas@gmx.de> | ||||
|  | ||||
| 	* glib/gconvert.c (get_filename_charset): Replacement for | ||||
|   | ||||
| @@ -1,3 +1,11 @@ | ||||
| 2003-11-07  Mark McLoughlin  <mark@skynet.ie> | ||||
|  | ||||
| 	* glib/gconvert.c: (get_filename_charset): re-work to | ||||
| 	retain a copy of the cached charset rather than the | ||||
| 	actual return value from g_get_charset (which may | ||||
| 	change). Also, re-initialize the cache if it does | ||||
| 	change.	See bug #126454. | ||||
|  | ||||
| Thu Nov  6 00:04:46 2003  Matthias Clasen  <maclas@gmx.de> | ||||
|  | ||||
| 	* glib/gconvert.c (get_filename_charset): Replacement for | ||||
|   | ||||
| @@ -1,3 +1,11 @@ | ||||
| 2003-11-07  Mark McLoughlin  <mark@skynet.ie> | ||||
|  | ||||
| 	* glib/gconvert.c: (get_filename_charset): re-work to | ||||
| 	retain a copy of the cached charset rather than the | ||||
| 	actual return value from g_get_charset (which may | ||||
| 	change). Also, re-initialize the cache if it does | ||||
| 	change.	See bug #126454. | ||||
|  | ||||
| Thu Nov  6 00:04:46 2003  Matthias Clasen  <maclas@gmx.de> | ||||
|  | ||||
| 	* glib/gconvert.c (get_filename_charset): Replacement for | ||||
|   | ||||
| @@ -992,6 +992,23 @@ g_locale_from_utf8 (const gchar *utf8string, | ||||
|  | ||||
| #ifndef G_PLATFORM_WIN32 | ||||
|  | ||||
| typedef struct _GFilenameCharsetCache GFilenameCharsetCache; | ||||
|  | ||||
| struct _GFilenameCharsetCache { | ||||
|   gboolean is_utf8; | ||||
|   gchar *charset; | ||||
|   gchar *filename_charset; | ||||
| }; | ||||
|  | ||||
| static void | ||||
| filename_charset_cache_free (gpointer data) | ||||
| { | ||||
|   GFilenameCharsetCache *cache = data; | ||||
|   g_free (cache->charset); | ||||
|   g_free (cache->filename_charset); | ||||
|   g_free (cache); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * get_filename_charset: | ||||
|  * @charset: return location for the name of the filename encoding  | ||||
| @@ -1011,17 +1028,28 @@ g_locale_from_utf8 (const gchar *utf8string, | ||||
|  * Return value: %TRUE if the charset used for filename is UTF-8. | ||||
|  */ | ||||
| static gboolean | ||||
| get_filename_charset (const gchar **charset) | ||||
| get_filename_charset (const gchar **filename_charset) | ||||
| { | ||||
|   static gboolean initialized = FALSE; | ||||
|   static const gchar *filename_charset; | ||||
|   static gboolean is_utf8; | ||||
|   static GStaticPrivate cache_private = G_STATIC_PRIVATE_INIT; | ||||
|   GFilenameCharsetCache *cache = g_static_private_get (&cache_private); | ||||
|   const gchar *charset; | ||||
|    | ||||
|   if (!initialized) | ||||
|   if (!cache) | ||||
|     { | ||||
|       cache = g_new0 (GFilenameCharsetCache, 1); | ||||
|       g_static_private_set (&cache_private, cache, filename_charset_cache_free); | ||||
|     } | ||||
|  | ||||
|   g_get_charset (&charset); | ||||
|  | ||||
|   if (!(cache->charset && strcmp (cache->charset, charset) == 0)) | ||||
|     { | ||||
|       const gchar *new_charset; | ||||
|       gchar *p, *q; | ||||
|  | ||||
|       initialized = TRUE; | ||||
|       g_free (cache->charset); | ||||
|       g_free (cache->filename_charset); | ||||
|       cache->charset = g_strdup (charset); | ||||
|        | ||||
|       p = getenv ("G_FILENAME_ENCODING"); | ||||
|       if (p != NULL)  | ||||
| @@ -1031,26 +1059,34 @@ get_filename_charset (const gchar **charset) | ||||
| 	    q = p + strlen (p); | ||||
|  | ||||
| 	  if (strncmp ("@locale", p, q - p) == 0) | ||||
| 	    is_utf8 = g_get_charset (&filename_charset); | ||||
| 	    { | ||||
| 	      cache->is_utf8 = g_get_charset (&new_charset); | ||||
| 	      cache->filename_charset = g_strdup (new_charset); | ||||
| 	    } | ||||
| 	  else | ||||
| 	    { | ||||
| 	      filename_charset = g_strndup (p, q - p); | ||||
| 	      is_utf8 = (strcmp (filename_charset, "UTF-8") == 0); | ||||
| 	      cache->filename_charset = g_strndup (p, q - p); | ||||
| 	      cache->is_utf8 = (strcmp (cache->filename_charset, "UTF-8") == 0); | ||||
| 	    } | ||||
| 	} | ||||
|       else if (getenv ("G_BROKEN_FILENAMES") != NULL) | ||||
| 	is_utf8 = g_get_charset (&filename_charset); | ||||
| 	{ | ||||
| 	  cache->is_utf8 = g_get_charset (&new_charset); | ||||
| 	  cache->filename_charset = g_strdup (new_charset); | ||||
| 	} | ||||
|       else  | ||||
| 	{ | ||||
| 	  filename_charset = "UTF-8"; | ||||
| 	  is_utf8 = TRUE; | ||||
| 	  cache->filename_charset = g_strdup ("UTF-8"); | ||||
| 	  cache->is_utf8 = TRUE; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   *charset = filename_charset; | ||||
|   if (filename_charset) | ||||
|     *filename_charset = cache->filename_charset; | ||||
|  | ||||
|   return is_utf8; | ||||
|   return cache->is_utf8; | ||||
| } | ||||
|  | ||||
| #else /* G_PLATFORM_WIN32 */ | ||||
| #define get_filename_charset (charset) TRUE | ||||
| #endif /* G_PLATFORM_WIN32 */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user