updated [and finally fixed my script to produce ready to go de-in(ed)
[platform/upstream/glib.git] / glib / gutils.c
index 6a1fea6..3a98543 100644 (file)
@@ -30,8 +30,6 @@
 
 #include "config.h"
 
-#include <ctype.h>
-
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 #  include <windows.h>
 #  undef STRICT
 #  include <lmcons.h>          /* For UNLEN */
-#  include <ctype.h>
 #endif /* G_PLATFORM_WIN32 */
 
 #ifdef G_OS_WIN32
 #  include <direct.h>
 #  include <shlobj.h>
+   /* older SDK (e.g. msvc 5.0) does not have these*/
+#  ifndef CSIDL_INTERNET_CACHE
+#    define CSIDL_INTERNET_CACHE 32
+#  endif
+#  ifndef CSIDL_COMMON_APPDATA
+#    define CSIDL_COMMON_APPDATA 35
+#  endif
+#  ifndef CSIDL_COMMON_DOCUMENTS
+#    define CSIDL_COMMON_DOCUMENTS 46
+#  endif
+#  ifndef CSIDL_PROFILE
+#    define CSIDL_PROFILE 40
+#  endif
 #endif
 
 #ifdef HAVE_CODESET
@@ -429,7 +439,7 @@ g_parse_debug_string  (const gchar     *string,
            }
          
          for (i=0; i<nkeys; i++)
-           if (g_ascii_strncasecmp(keys[i].key, p, q - p) == 0 &&
+           if (g_ascii_strncasecmp (keys[i].key, p, q - p) == 0 &&
                keys[i].key[q - p] == '\0')
              result |= keys[i].value;
          
@@ -705,12 +715,33 @@ g_get_current_dir (void)
       buffer[1] = 0;
     }
 
+#ifdef G_OS_WIN32
+  dir = g_locale_to_utf8 (buffer, -1, NULL, NULL, NULL);
+#else
   dir = g_strdup (buffer);
+#endif
   g_free (buffer);
   
   return dir;
 }
 
+#ifdef G_OS_WIN32
+
+#undef g_get_current_dir
+
+/* Binary compatibility version. Not for newly compiled code. */
+
+gchar*
+g_get_current_dir (void)
+{
+  gchar *utf8_dir = g_get_current_dir_utf8 ();
+  gchar *dir = g_locale_from_utf8 (utf8_dir, -1, NULL, NULL, NULL);
+  g_free (utf8_dir);
+  return dir;
+}
+
+#endif
+
 /**
  * g_getenv:
  * @variable: the environment variable to get.
@@ -919,10 +950,7 @@ get_special_folder (int csidl)
        }
       CoTaskMemFree (pidl);
     }
-  if (retval == NULL)
-    return "C:\\";
-  else
-    return retval;
+  return retval;
 }
 
 #endif
@@ -990,7 +1018,7 @@ g_get_any_init (void)
 
       if (!g_home_dir)
        g_home_dir = get_special_folder (CSIDL_PROFILE);
-
+      
       if (!g_home_dir)
        {
          /* At least at some time, HOMEDRIVE and HOMEPATH were used
@@ -1170,6 +1198,27 @@ g_get_home_dir (void)
   return g_home_dir;
 }
 
+#ifdef G_OS_WIN32
+
+#undef g_get_home_dir
+
+G_CONST_RETURN gchar*
+g_get_home_dir (void)
+{
+  static gchar *home_dir = NULL;
+
+  G_LOCK (g_utils_global);
+  if (!g_tmp_dir)
+    g_get_any_init ();
+  if (!home_dir && g_home_dir)
+    home_dir = g_locale_from_utf8 (g_home_dir, -1, NULL, NULL, NULL);
+  G_UNLOCK (g_utils_global);
+
+  return home_dir;
+}
+
+#endif
+
 /* Return a directory to be used to store temporary files. This is the
  * value of the TMPDIR, TMP or TEMP environment variables (they are
  * checked in that order). If none of those exist, use P_tmpdir from
@@ -1188,6 +1237,30 @@ g_get_tmp_dir (void)
   return g_tmp_dir;
 }
 
+#ifdef G_OS_WIN32
+
+#undef g_get_tmp_dir
+
+G_CONST_RETURN gchar*
+g_get_tmp_dir (void)
+{
+  static gchar *tmp_dir = NULL;
+
+  G_LOCK (g_utils_global);
+  if (!g_tmp_dir)
+    g_get_any_init ();
+  if (!tmp_dir)
+    tmp_dir = g_locale_from_utf8 (g_tmp_dir, -1, NULL, NULL, NULL);
+
+  if (tmp_dir == NULL)
+    tmp_dir = "C:\\";
+  G_UNLOCK (g_utils_global);
+
+  return tmp_dir;
+}
+
+#endif
+
 G_LOCK_DEFINE_STATIC (g_prgname);
 static gchar *g_prgname = NULL;
 
@@ -1305,6 +1378,7 @@ g_get_user_data_dir (void)
       data_dir = get_special_folder (CSIDL_PERSONAL);
 #else
       data_dir = (gchar *) g_getenv ("XDG_DATA_HOME");
+#endif
 
       if (data_dir && data_dir[0])
         data_dir = g_strdup (data_dir);
@@ -1316,7 +1390,7 @@ g_get_user_data_dir (void)
          data_dir = g_build_filename (g_home_dir, ".local", 
                                       "share", NULL);
        }
-#endif
+
       g_user_data_dir = data_dir;
     }
   else
@@ -1354,7 +1428,8 @@ g_get_user_config_dir (void)
       config_dir = get_special_folder (CSIDL_APPDATA);
 #else
       config_dir = (gchar *) g_getenv ("XDG_CONFIG_HOME");
-      
+#endif
+
       if (config_dir && config_dir[0])
        config_dir = g_strdup (config_dir);
       else
@@ -1364,7 +1439,6 @@ g_get_user_config_dir (void)
          
          config_dir = g_build_filename (g_home_dir, ".config", NULL);
        }
-#endif      
       g_user_config_dir = config_dir;
     }
   else
@@ -1402,7 +1476,7 @@ g_get_user_cache_dir (void)
       cache_dir = get_special_folder (CSIDL_INTERNET_CACHE); /* XXX correct? */
 #else
       cache_dir = (gchar *) g_getenv ("XDG_CACHE_HOME");
-
+#endif
       if (cache_dir && cache_dir[0])
           cache_dir = g_strdup (cache_dir);
       else
@@ -1412,7 +1486,6 @@ g_get_user_cache_dir (void)
 
           cache_dir = g_build_filename (g_home_dir, ".cache", NULL);
        }
-#endif
       g_user_cache_dir = cache_dir;
     }
   else
@@ -1660,8 +1733,8 @@ explode_locale (const gchar *locale,
  *       but it is big, ugly, and complicated, so I'm reluctant
  *       to do so when this should handle 99% of the time...
  */
-static GSList *
-compute_locale_variants (const gchar *locale)
+GSList *
+_g_compute_locale_variants (const gchar *locale)
 {
   GSList *retval = NULL;
 
@@ -1793,7 +1866,7 @@ g_get_language_names ()
       for (a = alist; *a; a++)
        {
          gchar *b = unalias_lang (*a);
-         list = g_slist_concat (list, compute_locale_variants (b));
+         list = g_slist_concat (list, _g_compute_locale_variants (b));
        }
       g_strfreev (alist);
       list = g_slist_append (list, "C");