]> git.sesse.net Git - vlc/commitdiff
Look for Byte Order Mark (UTF-8 only) while loading config file.
authorRémi Denis-Courmont <rem@videolan.org>
Tue, 21 Nov 2006 21:59:08 +0000 (21:59 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Tue, 21 Nov 2006 21:59:08 +0000 (21:59 +0000)
If present, assume everything is UTF-8 (obviously);
if not, assume locale charset.

src/misc/configuration.c

index c37b965bb36dd4479d558687f81ae79c81524b63..9b7c258001f2af9b998187399aed2a58cf7128f1 100644 (file)
@@ -816,6 +816,17 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name )
         /* The config file is organized in sections, one per module. Look for
          * the interesting section ( a section is of the form [foo] ) */
         fseek( file, 0L, SEEK_SET );
+
+        /* Look for UTF-8 Byte Order Mark */
+        char * (*convert) (const char *) = FromLocaleDup;
+        char bom[3];
+
+        if ((fread (bom, 1, 3, file) == 3)
+         && (memcmp (bom, "\xEF\xBB\xBF", 3) == 0))
+            convert = strdup;
+        else
+            rewind (file); // no BOM, rewind
+
         while( fgets( line, 1024, file ) )
         {
             if( (line[0] == '[')
@@ -916,7 +927,7 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name )
                             free( p_item->psz_value );
 
                         p_item->psz_value = *psz_option_value ?
-                            strdup( psz_option_value ) : NULL;
+                            convert( psz_option_value ) : NULL;
 
                         if( p_item->psz_value_saved )
                             free( p_item->psz_value_saved );
@@ -925,7 +936,7 @@ int __config_LoadConfigFile( vlc_object_t *p_this, const char *psz_module_name )
                             (p_item->psz_value && p_item->psz_value_orig &&
                              strcmp(p_item->psz_value,p_item->psz_value_orig)))
                             p_item->psz_value_saved = p_item->psz_value ?
-                                strdup( p_item->psz_value ) : NULL;
+                                convert( p_item->psz_value ) : NULL;
 
                         vlc_mutex_unlock( p_item->p_lock );