Initialize variables to not make gcc nervous.
[platform/upstream/glib.git] / glib / gutils.c
1 /* GLIB - Library of useful routines for C programming
2  * Copyright (C) 1995-1998  Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 /*
21  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
22  * file for a list of people on the GLib Team.  See the ChangeLog
23  * files for a list of changes.  These files are distributed with
24  * GLib at ftp://ftp.gtk.org/pub/gtk/. 
25  */
26
27 /* 
28  * MT safe for the unix part, FIXME: make the win32 part MT safe as well.
29  */
30
31 #include "config.h"
32
33 #ifdef HAVE_UNISTD_H
34 #include <unistd.h>
35 #endif
36 #include <stdarg.h>
37 #include <stdlib.h>
38 #include <stdio.h>
39 #include <locale.h>
40 #include <string.h>
41 #include <errno.h>
42 #ifdef HAVE_PWD_H
43 #include <pwd.h>
44 #endif
45 #include <sys/types.h>
46 #ifdef HAVE_SYS_PARAM_H
47 #include <sys/param.h>
48 #endif
49
50 /* implement gutils's inline functions
51  */
52 #define G_IMPLEMENT_INLINES 1
53 #define __G_UTILS_C__
54 #include "glib.h"
55 #include "gprintfint.h"
56 #include "gthreadinit.h"
57 #include "galias.h"
58
59 #ifdef  MAXPATHLEN
60 #define G_PATH_LENGTH   MAXPATHLEN
61 #elif   defined (PATH_MAX)
62 #define G_PATH_LENGTH   PATH_MAX
63 #elif   defined (_PC_PATH_MAX)
64 #define G_PATH_LENGTH   sysconf(_PC_PATH_MAX)
65 #else   
66 #define G_PATH_LENGTH   2048
67 #endif
68
69 #ifdef G_PLATFORM_WIN32
70 #  define STRICT                /* Strict typing, please */
71 #  include <windows.h>
72 #  undef STRICT
73 #  ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
74 #    define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 2
75 #    define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 4
76 #  endif
77 #  include <lmcons.h>           /* For UNLEN */
78 #endif /* G_PLATFORM_WIN32 */
79
80 #ifdef G_OS_WIN32
81 #  include <direct.h>
82 #  include <shlobj.h>
83    /* older SDK (e.g. msvc 5.0) does not have these*/
84 #  ifndef CSIDL_INTERNET_CACHE
85 #    define CSIDL_INTERNET_CACHE 32
86 #  endif
87 #  ifndef CSIDL_COMMON_APPDATA
88 #    define CSIDL_COMMON_APPDATA 35
89 #  endif
90 #  ifndef CSIDL_COMMON_DOCUMENTS
91 #    define CSIDL_COMMON_DOCUMENTS 46
92 #  endif
93 #  ifndef CSIDL_PROFILE
94 #    define CSIDL_PROFILE 40
95 #  endif
96 #  include <process.h>
97 #endif
98
99 #ifdef HAVE_CODESET
100 #include <langinfo.h>
101 #endif
102
103 #ifdef HAVE_BIND_TEXTDOMAIN_CODESET
104 #include <libintl.h>
105 #endif
106
107 const guint glib_major_version = GLIB_MAJOR_VERSION;
108 const guint glib_minor_version = GLIB_MINOR_VERSION;
109 const guint glib_micro_version = GLIB_MICRO_VERSION;
110 const guint glib_interface_age = GLIB_INTERFACE_AGE;
111 const guint glib_binary_age = GLIB_BINARY_AGE;
112
113 #ifdef G_PLATFORM_WIN32
114
115 G_WIN32_DLLMAIN_FOR_DLL_NAME (static, dll_name)
116
117 #endif
118
119 /**
120  * glib_check_version:
121  * @required_major: the required major version.
122  * @required_minor: the required major version.
123  * @required_micro: the required major version.
124  *
125  * Checks that the GLib library in use is compatible with the
126  * given version. Generally you would pass in the constants
127  * #GLIB_MAJOR_VERSION, #GLIB_MINOR_VERSION, #GLIB_MICRO_VERSION
128  * as the three arguments to this function; that produces
129  * a check that the library in use is compatible with
130  * the version of GLib the application or module was compiled
131  * against.
132  *
133  * Compatibility is defined by two things: first the version
134  * of the running library is newer than the version
135  * @required_major.required_minor.@required_micro. Second
136  * the running library must be binary compatible with the
137  * version @required_major.required_minor.@required_micro
138  * (same major version.)
139  *
140  * Return value: %NULL if the GLib library is compatible with the
141  *   given version, or a string describing the version mismatch.
142  *   The returned string is owned by GLib and must not be modified
143  *   or freed.
144  *
145  * Since: 2.6
146  **/
147 const gchar *
148 glib_check_version (guint required_major,
149                     guint required_minor,
150                     guint required_micro)
151 {
152   gint glib_effective_micro = 100 * GLIB_MINOR_VERSION + GLIB_MICRO_VERSION;
153   gint required_effective_micro = 100 * required_minor + required_micro;
154
155   if (required_major > GLIB_MAJOR_VERSION)
156     return "GLib version too old (major mismatch)";
157   if (required_major < GLIB_MAJOR_VERSION)
158     return "GLib version too new (major mismatch)";
159   if (required_effective_micro < glib_effective_micro - GLIB_BINARY_AGE)
160     return "GLib version too new (micro mismatch)";
161   if (required_effective_micro > glib_effective_micro)
162     return "GLib version too old (micro mismatch)";
163   return NULL;
164 }
165
166 #if !defined (HAVE_MEMMOVE) && !defined (HAVE_WORKING_BCOPY)
167 /**
168  * g_memmove: 
169  * @dest: the destination address to copy the bytes to.
170  * @src: the source address to copy the bytes from.
171  * @len: the number of bytes to copy.
172  *
173  * Copies a block of memory @len bytes long, from @src to @dest.
174  * The source and destination areas may overlap.
175  *
176  * In order to use this function, you must include 
177  * <filename>string.h</filename> yourself, because this macro will 
178  * typically simply resolve to memmove() and GLib does not include 
179  * <filename>string.h</filename> for you.
180  */
181 void 
182 g_memmove (gpointer      dest, 
183            gconstpointer src, 
184            gulong        len)
185 {
186   gchar* destptr = dest;
187   const gchar* srcptr = src;
188   if (src + len < dest || dest + len < src)
189     {
190       bcopy (src, dest, len);
191       return;
192     }
193   else if (dest <= src)
194     {
195       while (len--)
196         *(destptr++) = *(srcptr++);
197     }
198   else
199     {
200       destptr += len;
201       srcptr += len;
202       while (len--)
203         *(--destptr) = *(--srcptr);
204     }
205 }
206 #endif /* !HAVE_MEMMOVE && !HAVE_WORKING_BCOPY */
207
208 /**
209  * g_atexit:
210  * @func: the function to call on normal program termination.
211  * 
212  * Specifies a function to be called at normal program termination.
213  */
214 void
215 g_atexit (GVoidFunc func)
216 {
217   gint result;
218   const gchar *error = NULL;
219
220   /* keep this in sync with glib.h */
221
222 #ifdef  G_NATIVE_ATEXIT
223   result = ATEXIT (func);
224   if (result)
225     error = g_strerror (errno);
226 #elif defined (HAVE_ATEXIT)
227 #  ifdef NeXT /* @#%@! NeXTStep */
228   result = !atexit ((void (*)(void)) func);
229   if (result)
230     error = g_strerror (errno);
231 #  else
232   result = atexit ((void (*)(void)) func);
233   if (result)
234     error = g_strerror (errno);
235 #  endif /* NeXT */
236 #elif defined (HAVE_ON_EXIT)
237   result = on_exit ((void (*)(int, void *)) func, NULL);
238   if (result)
239     error = g_strerror (errno);
240 #else
241   result = 0;
242   error = "no implementation";
243 #endif /* G_NATIVE_ATEXIT */
244
245   if (error)
246     g_error ("Could not register atexit() function: %s", error);
247 }
248
249 /* Based on execvp() from GNU Libc.
250  * Some of this code is cut-and-pasted into gspawn.c
251  */
252
253 static gchar*
254 my_strchrnul (const gchar *str, 
255               gchar        c)
256 {
257   gchar *p = (gchar*)str;
258   while (*p && (*p != c))
259     ++p;
260
261   return p;
262 }
263
264 #ifdef G_OS_WIN32
265
266 static gchar *inner_find_program_in_path (const gchar *program);
267
268 gchar*
269 g_find_program_in_path (const gchar *program)
270 {
271   const gchar *last_dot = strrchr (program, '.');
272
273   if (last_dot == NULL ||
274       strchr (last_dot, '\\') != NULL ||
275       strchr (last_dot, '/') != NULL)
276     {
277       const gint program_length = strlen (program);
278       gchar *pathext = g_build_path (";",
279                                      ".exe;.cmd;.bat;.com",
280                                      g_getenv ("PATHEXT"),
281                                      NULL);
282       gchar *p;
283       gchar *decorated_program;
284       gchar *retval;
285
286       p = pathext;
287       do
288         {
289           gchar *q = my_strchrnul (p, ';');
290
291           decorated_program = g_malloc (program_length + (q-p) + 1);
292           memcpy (decorated_program, program, program_length);
293           memcpy (decorated_program+program_length, p, q-p);
294           decorated_program [program_length + (q-p)] = '\0';
295           
296           retval = inner_find_program_in_path (decorated_program);
297           g_free (decorated_program);
298
299           if (retval != NULL)
300             {
301               g_free (pathext);
302               return retval;
303             }
304           p = q;
305         } while (*p++ != '\0');
306       g_free (pathext);
307       return NULL;
308     }
309   else
310     return inner_find_program_in_path (program);
311 }
312
313 #endif
314
315 /**
316  * g_find_program_in_path:
317  * @program: a program name in the GLib file name encoding
318  * 
319  * Locates the first executable named @program in the user's path, in the
320  * same way that execvp() would locate it. Returns an allocated string
321  * with the absolute path name, or %NULL if the program is not found in
322  * the path. If @program is already an absolute path, returns a copy of
323  * @program if @program exists and is executable, and %NULL otherwise.
324  *  
325  * On Windows, if @program does not have a file type suffix, tries
326  * with the suffixes .exe, .cmd, .bat and .com, and the suffixes in
327  * the <envar>PATHEXT</envar> environment variable. 
328  * 
329  * On Windows, it looks for the file in the same way as CreateProcess() 
330  * would. This means first in the directory where the executing
331  * program was loaded from, then in the current directory, then in the
332  * Windows 32-bit system directory, then in the Windows directory, and
333  * finally in the directories in the <envar>PATH</envar> environment 
334  * variable. If the program is found, the return value contains the 
335  * full name including the type suffix.
336  *
337  * Return value: absolute path, or %NULL
338  **/
339 #ifdef G_OS_WIN32
340 static gchar *
341 inner_find_program_in_path (const gchar *program)
342 #else
343 gchar*
344 g_find_program_in_path (const gchar *program)
345 #endif
346 {
347   const gchar *path, *p;
348   gchar *name, *freeme;
349 #ifdef G_OS_WIN32
350   const gchar *path_copy;
351   gchar *filename = NULL, *appdir = NULL;
352   gchar *sysdir = NULL, *windir = NULL;
353 #endif
354   size_t len;
355   size_t pathlen;
356
357   g_return_val_if_fail (program != NULL, NULL);
358
359   /* If it is an absolute path, or a relative path including subdirectories,
360    * don't look in PATH.
361    */
362   if (g_path_is_absolute (program)
363       || strchr (program, G_DIR_SEPARATOR) != NULL
364 #ifdef G_OS_WIN32
365       || strchr (program, '/') != NULL
366 #endif
367       )
368     {
369       if (g_file_test (program, G_FILE_TEST_IS_EXECUTABLE) &&
370           !g_file_test (program, G_FILE_TEST_IS_DIR))
371         return g_strdup (program);
372       else
373         return NULL;
374     }
375   
376   path = g_getenv ("PATH");
377 #if defined(G_OS_UNIX) || defined(G_OS_BEOS)
378   if (path == NULL)
379     {
380       /* There is no `PATH' in the environment.  The default
381        * search path in GNU libc is the current directory followed by
382        * the path `confstr' returns for `_CS_PATH'.
383        */
384       
385       /* In GLib we put . last, for security, and don't use the
386        * unportable confstr(); UNIX98 does not actually specify
387        * what to search if PATH is unset. POSIX may, dunno.
388        */
389       
390       path = "/bin:/usr/bin:.";
391     }
392 #else
393   if (G_WIN32_HAVE_WIDECHAR_API ())
394     {
395       int n;
396       wchar_t wfilename[MAXPATHLEN], wsysdir[MAXPATHLEN],
397         wwindir[MAXPATHLEN];
398       
399       n = GetModuleFileNameW (NULL, wfilename, MAXPATHLEN);
400       if (n > 0 && n < MAXPATHLEN)
401         filename = g_utf16_to_utf8 (wfilename, -1, NULL, NULL, NULL);
402       
403       n = GetSystemDirectoryW (wsysdir, MAXPATHLEN);
404       if (n > 0 && n < MAXPATHLEN)
405         sysdir = g_utf16_to_utf8 (wsysdir, -1, NULL, NULL, NULL);
406       
407       n = GetWindowsDirectoryW (wwindir, MAXPATHLEN);
408       if (n > 0 && n < MAXPATHLEN)
409         windir = g_utf16_to_utf8 (wwindir, -1, NULL, NULL, NULL);
410     }
411   else
412     {
413       int n;
414       gchar cpfilename[MAXPATHLEN], cpsysdir[MAXPATHLEN],
415         cpwindir[MAXPATHLEN];
416       
417       n = GetModuleFileNameA (NULL, cpfilename, MAXPATHLEN);
418       if (n > 0 && n < MAXPATHLEN)
419         filename = g_locale_to_utf8 (cpfilename, -1, NULL, NULL, NULL);
420       
421       n = GetSystemDirectoryA (cpsysdir, MAXPATHLEN);
422       if (n > 0 && n < MAXPATHLEN)
423         sysdir = g_locale_to_utf8 (cpsysdir, -1, NULL, NULL, NULL);
424       
425       n = GetWindowsDirectoryA (cpwindir, MAXPATHLEN);
426       if (n > 0 && n < MAXPATHLEN)
427         windir = g_locale_to_utf8 (cpwindir, -1, NULL, NULL, NULL);
428     }
429   
430   if (filename)
431     {
432       appdir = g_path_get_dirname (filename);
433       g_free (filename);
434     }
435   
436   path = g_strdup (path);
437
438   if (windir)
439     {
440       const gchar *tem = path;
441       path = g_strconcat (windir, ";", path, NULL);
442       g_free ((gchar *) tem);
443       g_free (windir);
444     }
445   
446   if (sysdir)
447     {
448       const gchar *tem = path;
449       path = g_strconcat (sysdir, ";", path, NULL);
450       g_free ((gchar *) tem);
451       g_free (sysdir);
452     }
453   
454   {
455     const gchar *tem = path;
456     path = g_strconcat (".;", path, NULL);
457     g_free ((gchar *) tem);
458   }
459   
460   if (appdir)
461     {
462       const gchar *tem = path;
463       path = g_strconcat (appdir, ";", path, NULL);
464       g_free ((gchar *) tem);
465       g_free (appdir);
466     }
467
468   path_copy = path;
469 #endif
470   
471   len = strlen (program) + 1;
472   pathlen = strlen (path);
473   freeme = name = g_malloc (pathlen + len + 1);
474   
475   /* Copy the file name at the top, including '\0'  */
476   memcpy (name + pathlen + 1, program, len);
477   name = name + pathlen;
478   /* And add the slash before the filename  */
479   *name = G_DIR_SEPARATOR;
480   
481   p = path;
482   do
483     {
484       char *startp;
485
486       path = p;
487       p = my_strchrnul (path, G_SEARCHPATH_SEPARATOR);
488
489       if (p == path)
490         /* Two adjacent colons, or a colon at the beginning or the end
491          * of `PATH' means to search the current directory.
492          */
493         startp = name + 1;
494       else
495         startp = memcpy (name - (p - path), path, p - path);
496
497       if (g_file_test (startp, G_FILE_TEST_IS_EXECUTABLE) &&
498           !g_file_test (startp, G_FILE_TEST_IS_DIR))
499         {
500           gchar *ret;
501           ret = g_strdup (startp);
502           g_free (freeme);
503 #ifdef G_OS_WIN32
504           g_free ((gchar *) path_copy);
505 #endif
506           return ret;
507         }
508     }
509   while (*p++ != '\0');
510   
511   g_free (freeme);
512 #ifdef G_OS_WIN32
513   g_free ((gchar *) path_copy);
514 #endif
515
516   return NULL;
517 }
518
519 /**
520  * g_parse_debug_string:
521  * @string: a list of debug options separated by ':' or "all" 
522  *     to set all flags.
523  * @keys: pointer to an array of #GDebugKey which associate 
524  *     strings with bit flags.
525  * @nkeys: the number of #GDebugKey<!-- -->s in the array.
526  *
527  * Parses a string containing debugging options separated 
528  * by ':' into a %guint containing bit flags. This is used 
529  * within GDK and GTK+ to parse the debug options passed on the
530  * command line or through environment variables.
531  *
532  * Returns: the combined set of bit flags.
533  */
534 guint        
535 g_parse_debug_string  (const gchar     *string, 
536                        const GDebugKey *keys, 
537                        guint            nkeys)
538 {
539   guint i;
540   guint result = 0;
541   
542   g_return_val_if_fail (string != NULL, 0);
543   
544   if (!g_ascii_strcasecmp (string, "all"))
545     {
546       for (i=0; i<nkeys; i++)
547         result |= keys[i].value;
548     }
549   else
550     {
551       const gchar *p = string;
552       const gchar *q;
553       gboolean done = FALSE;
554       
555       while (*p && !done)
556         {
557           q = strchr (p, ':');
558           if (!q)
559             {
560               q = p + strlen(p);
561               done = TRUE;
562             }
563           
564           for (i=0; i<nkeys; i++)
565             if (g_ascii_strncasecmp (keys[i].key, p, q - p) == 0 &&
566                 keys[i].key[q - p] == '\0')
567               result |= keys[i].value;
568           
569           p = q + 1;
570         }
571     }
572   
573   return result;
574 }
575
576 /**
577  * g_basename:
578  * @file_name: the name of the file.
579  * 
580  * Gets the name of the file without any leading directory components.  
581  * It returns a pointer into the given file name string.
582  * 
583  * Return value: the name of the file without any leading directory components.
584  *
585  * Deprecated: Use g_path_get_basename() instead, but notice that
586  * g_path_get_basename() allocates new memory for the returned string, unlike
587  * this function which returns a pointer into the argument.
588  **/
589 G_CONST_RETURN gchar*
590 g_basename (const gchar    *file_name)
591 {
592   register gchar *base;
593   
594   g_return_val_if_fail (file_name != NULL, NULL);
595   
596   base = strrchr (file_name, G_DIR_SEPARATOR);
597
598 #ifdef G_OS_WIN32
599   {
600     gchar *q = strrchr (file_name, '/');
601     if (base == NULL || (q != NULL && q > base))
602         base = q;
603   }
604 #endif
605
606   if (base)
607     return base + 1;
608
609 #ifdef G_OS_WIN32
610   if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
611     return (gchar*) file_name + 2;
612 #endif /* G_OS_WIN32 */
613   
614   return (gchar*) file_name;
615 }
616
617 /**
618  * g_path_get_basename:
619  * @file_name: the name of the file.
620  *
621  * Gets the last component of the filename. If @file_name ends with a 
622  * directory separator it gets the component before the last slash. If 
623  * @file_name consists only of directory separators (and on Windows, 
624  * possibly a drive letter), a single separator is returned. If
625  * @file_name is empty, it gets ".".
626  *
627  * Return value: a newly allocated string containing the last component of 
628  *   the filename.
629  */
630 gchar*
631 g_path_get_basename (const gchar   *file_name)
632 {
633   register gssize base;             
634   register gssize last_nonslash;    
635   gsize len;    
636   gchar *retval;
637  
638   g_return_val_if_fail (file_name != NULL, NULL);
639
640   if (file_name[0] == '\0')
641     /* empty string */
642     return g_strdup (".");
643   
644   last_nonslash = strlen (file_name) - 1;
645
646   while (last_nonslash >= 0 && G_IS_DIR_SEPARATOR (file_name [last_nonslash]))
647     last_nonslash--;
648
649   if (last_nonslash == -1)
650     /* string only containing slashes */
651     return g_strdup (G_DIR_SEPARATOR_S);
652
653 #ifdef G_OS_WIN32
654   if (last_nonslash == 1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
655     /* string only containing slashes and a drive */
656     return g_strdup (G_DIR_SEPARATOR_S);
657 #endif /* G_OS_WIN32 */
658
659   base = last_nonslash;
660
661   while (base >=0 && !G_IS_DIR_SEPARATOR (file_name [base]))
662     base--;
663
664 #ifdef G_OS_WIN32
665   if (base == -1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
666     base = 1;
667 #endif /* G_OS_WIN32 */
668
669   len = last_nonslash - base;
670   retval = g_malloc (len + 1);
671   memcpy (retval, file_name + base + 1, len);
672   retval [len] = '\0';
673   return retval;
674 }
675
676 /**
677  * g_path_is_absolute:
678  * @file_name: a file name.
679  *
680  * Returns %TRUE if the given @file_name is an absolute file name,
681  * i.e. it contains a full path from the root directory such as "/usr/local"
682  * on UNIX or "C:\windows" on Windows systems.
683  *
684  * Returns: %TRUE if @file_name is an absolute path. 
685  */
686 gboolean
687 g_path_is_absolute (const gchar *file_name)
688 {
689   g_return_val_if_fail (file_name != NULL, FALSE);
690   
691   if (G_IS_DIR_SEPARATOR (file_name[0]))
692     return TRUE;
693
694 #ifdef G_OS_WIN32
695   /* Recognize drive letter on native Windows */
696   if (g_ascii_isalpha (file_name[0]) && 
697       file_name[1] == ':' && G_IS_DIR_SEPARATOR (file_name[2]))
698     return TRUE;
699 #endif /* G_OS_WIN32 */
700
701   return FALSE;
702 }
703
704 /**
705  * g_path_skip_root:
706  * @file_name: a file name.
707  *
708  * Returns a pointer into @file_name after the root component, i.e. after
709  * the "/" in UNIX or "C:\" under Windows. If @file_name is not an absolute
710  * path it returns %NULL.
711  *
712  * Returns: a pointer into @file_name after the root component.
713  */
714 G_CONST_RETURN gchar*
715 g_path_skip_root (const gchar *file_name)
716 {
717   g_return_val_if_fail (file_name != NULL, NULL);
718   
719 #ifdef G_PLATFORM_WIN32
720   /* Skip \\server\share or //server/share */
721   if (G_IS_DIR_SEPARATOR (file_name[0]) &&
722       G_IS_DIR_SEPARATOR (file_name[1]) &&
723       file_name[2] &&
724       !G_IS_DIR_SEPARATOR (file_name[2]))
725     {
726       gchar *p;
727
728       p = strchr (file_name + 2, G_DIR_SEPARATOR);
729 #ifdef G_OS_WIN32
730       {
731         gchar *q = strchr (file_name + 2, '/');
732         if (p == NULL || (q != NULL && q < p))
733           p = q;
734       }
735 #endif
736       if (p &&
737           p > file_name + 2 &&
738           p[1])
739         {
740           file_name = p + 1;
741
742           while (file_name[0] && !G_IS_DIR_SEPARATOR (file_name[0]))
743             file_name++;
744
745           /* Possibly skip a backslash after the share name */
746           if (G_IS_DIR_SEPARATOR (file_name[0]))
747             file_name++;
748
749           return (gchar *)file_name;
750         }
751     }
752 #endif
753   
754   /* Skip initial slashes */
755   if (G_IS_DIR_SEPARATOR (file_name[0]))
756     {
757       while (G_IS_DIR_SEPARATOR (file_name[0]))
758         file_name++;
759       return (gchar *)file_name;
760     }
761
762 #ifdef G_OS_WIN32
763   /* Skip X:\ */
764   if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':' && G_IS_DIR_SEPARATOR (file_name[2]))
765     return (gchar *)file_name + 3;
766 #endif
767
768   return NULL;
769 }
770
771 /**
772  * g_path_get_dirname:
773  * @file_name: the name of the file.
774  *
775  * Gets the directory components of a file name.  If the file name has no
776  * directory components "." is returned.  The returned string should be
777  * freed when no longer needed.
778  * 
779  * Returns: the directory components of the file.
780  */
781 gchar*
782 g_path_get_dirname (const gchar    *file_name)
783 {
784   register gchar *base;
785   register gsize len;    
786   
787   g_return_val_if_fail (file_name != NULL, NULL);
788   
789   base = strrchr (file_name, G_DIR_SEPARATOR);
790 #ifdef G_OS_WIN32
791   {
792     gchar *q = strrchr (file_name, '/');
793     if (base == NULL || (q != NULL && q > base))
794         base = q;
795   }
796 #endif
797   if (!base)
798     {
799 #ifdef G_OS_WIN32
800       if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
801         {
802           gchar drive_colon_dot[4];
803
804           drive_colon_dot[0] = file_name[0];
805           drive_colon_dot[1] = ':';
806           drive_colon_dot[2] = '.';
807           drive_colon_dot[3] = '\0';
808
809           return g_strdup (drive_colon_dot);
810         }
811 #endif
812     return g_strdup (".");
813     }
814
815   while (base > file_name && G_IS_DIR_SEPARATOR (*base))
816     base--;
817
818 #ifdef G_OS_WIN32
819   /* base points to the char before the last slash.
820    *
821    * In case file_name is the root of a drive (X:\) or a child of the
822    * root of a drive (X:\foo), include the slash.
823    *
824    * In case file_name is the root share of an UNC path
825    * (\\server\share), add a slash, returning \\server\share\ .
826    *
827    * In case file_name is a direct child of a share in an UNC path
828    * (\\server\share\foo), include the slash after the share name,
829    * returning \\server\share\ .
830    */
831   if (base == file_name + 1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
832     base++;
833   else if (G_IS_DIR_SEPARATOR (file_name[0]) &&
834            G_IS_DIR_SEPARATOR (file_name[1]) &&
835            file_name[2] &&
836            !G_IS_DIR_SEPARATOR (file_name[2]) &&
837            base >= file_name + 2)
838     {
839       const gchar *p = file_name + 2;
840       while (*p && !G_IS_DIR_SEPARATOR (*p))
841         p++;
842       if (p == base + 1)
843         {
844           len = (guint) strlen (file_name) + 1;
845           base = g_new (gchar, len + 1);
846           strcpy (base, file_name);
847           base[len-1] = G_DIR_SEPARATOR;
848           base[len] = 0;
849           return base;
850         }
851       if (G_IS_DIR_SEPARATOR (*p))
852         {
853           p++;
854           while (*p && !G_IS_DIR_SEPARATOR (*p))
855             p++;
856           if (p == base + 1)
857             base++;
858         }
859     }
860 #endif
861
862   len = (guint) 1 + base - file_name;
863   
864   base = g_new (gchar, len + 1);
865   g_memmove (base, file_name, len);
866   base[len] = 0;
867   
868   return base;
869 }
870
871 /**
872  * g_get_current_dir:
873  *
874  * Gets the current directory.
875  * The returned string should be freed when no longer needed. The encoding 
876  * of the returned string is system defined. On Windows, it is always UTF-8.
877  * 
878  * Returns: the current directory.
879  */
880 gchar*
881 g_get_current_dir (void)
882 {
883 #ifdef G_OS_WIN32
884
885   gchar *dir = NULL;
886
887   if (G_WIN32_HAVE_WIDECHAR_API ())
888     {
889       wchar_t dummy[2], *wdir;
890       int len;
891
892       len = GetCurrentDirectoryW (2, dummy);
893       wdir = g_new (wchar_t, len);
894
895       if (GetCurrentDirectoryW (len, wdir) == len - 1)
896         dir = g_utf16_to_utf8 (wdir, -1, NULL, NULL, NULL);
897
898       g_free (wdir);
899     }
900   else
901     {
902       gchar dummy[2], *cpdir;
903       int len;
904
905       len = GetCurrentDirectoryA (2, dummy);
906       cpdir = g_new (gchar, len);
907
908       if (GetCurrentDirectoryA (len, cpdir) == len - 1)
909         dir = g_locale_to_utf8 (cpdir, -1, NULL, NULL, NULL);
910
911       g_free (cpdir);
912     }
913
914   if (dir == NULL)
915     dir = g_strdup ("\\");
916
917   return dir;
918
919 #else
920
921   gchar *buffer = NULL;
922   gchar *dir = NULL;
923   static gulong max_len = 0;
924
925   if (max_len == 0) 
926     max_len = (G_PATH_LENGTH == -1) ? 2048 : G_PATH_LENGTH;
927   
928   /* We don't use getcwd(3) on SUNOS, because, it does a popen("pwd")
929    * and, if that wasn't bad enough, hangs in doing so.
930    */
931 #if     (defined (sun) && !defined (__SVR4)) || !defined(HAVE_GETCWD)
932   buffer = g_new (gchar, max_len + 1);
933   *buffer = 0;
934   dir = getwd (buffer);
935 #else   /* !sun || !HAVE_GETCWD */
936   while (max_len < G_MAXULONG / 2)
937     {
938       buffer = g_new (gchar, max_len + 1);
939       *buffer = 0;
940       dir = getcwd (buffer, max_len);
941
942       if (dir || errno != ERANGE)
943         break;
944
945       g_free (buffer);
946       max_len *= 2;
947     }
948 #endif  /* !sun || !HAVE_GETCWD */
949   
950   if (!dir || !*buffer)
951     {
952       /* hm, should we g_error() out here?
953        * this can happen if e.g. "./" has mode \0000
954        */
955       buffer[0] = G_DIR_SEPARATOR;
956       buffer[1] = 0;
957     }
958
959   dir = g_strdup (buffer);
960   g_free (buffer);
961   
962   return dir;
963 #endif /* !Win32 */
964 }
965
966 /**
967  * g_getenv:
968  * @variable: the environment variable to get, in the GLib file name encoding.
969  * 
970  * Returns the value of an environment variable. The name and value
971  * are in the GLib file name encoding. On UNIX, this means the actual
972  * bytes which might or might not be in some consistent character set
973  * and encoding. On Windows, it is in UTF-8. On Windows, in case the
974  * environment variable's value contains references to other
975  * environment variables, they are expanded.
976  * 
977  * Return value: the value of the environment variable, or %NULL if
978  * the environment variable is not found. The returned string may be
979  * overwritten by the next call to g_getenv(), g_setenv() or
980  * g_unsetenv().
981  **/
982 G_CONST_RETURN gchar*
983 g_getenv (const gchar *variable)
984 {
985 #ifndef G_OS_WIN32
986
987   g_return_val_if_fail (variable != NULL, NULL);
988
989   return getenv (variable);
990
991 #else /* G_OS_WIN32 */
992
993   GQuark quark;
994   gchar *value;
995
996   g_return_val_if_fail (variable != NULL, NULL);
997   g_return_val_if_fail (g_utf8_validate (variable, -1, NULL), NULL);
998
999   /* On Windows NT, it is relatively typical that environment
1000    * variables contain references to other environment variables. If
1001    * so, use ExpandEnvironmentStrings(). (In an ideal world, such
1002    * environment variables would be stored in the Registry as
1003    * REG_EXPAND_SZ type values, and would then get automatically
1004    * expanded before a program sees them. But there is broken software
1005    * that stores environment variables as REG_SZ values even if they
1006    * contain references to other environment variables.)
1007    */
1008
1009   if (G_WIN32_HAVE_WIDECHAR_API ())
1010     {
1011       wchar_t dummy[2], *wname, *wvalue;
1012       int len;
1013       
1014       wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL);
1015
1016       len = GetEnvironmentVariableW (wname, dummy, 2);
1017
1018       if (len == 0)
1019         {
1020           g_free (wname);
1021           return NULL;
1022         }
1023       else if (len == 1)
1024         len = 2;
1025
1026       wvalue = g_new (wchar_t, len);
1027
1028       if (GetEnvironmentVariableW (wname, wvalue, len) != len - 1)
1029         {
1030           g_free (wname);
1031           g_free (wvalue);
1032           return NULL;
1033         }
1034
1035       if (wcschr (wvalue, L'%') != NULL)
1036         {
1037           wchar_t *tem = wvalue;
1038
1039           len = ExpandEnvironmentStringsW (wvalue, dummy, 2);
1040
1041           if (len > 0)
1042             {
1043               wvalue = g_new (wchar_t, len);
1044
1045               if (ExpandEnvironmentStringsW (tem, wvalue, len) != len)
1046                 {
1047                   g_free (wvalue);
1048                   wvalue = tem;
1049                 }
1050               else
1051                 g_free (tem);
1052             }
1053         }
1054
1055       value = g_utf16_to_utf8 (wvalue, -1, NULL, NULL, NULL);
1056
1057       g_free (wname);
1058       g_free (wvalue);
1059     }
1060   else
1061     {
1062       gchar dummy[3], *cpname, *cpvalue;
1063       int len;
1064       
1065       cpname = g_locale_from_utf8 (variable, -1, NULL, NULL, NULL);
1066
1067       g_return_val_if_fail (cpname != NULL, NULL);
1068
1069       len = GetEnvironmentVariableA (cpname, dummy, 2);
1070
1071       if (len == 0)
1072         {
1073           g_free (cpname);
1074           return NULL;
1075         }
1076       else if (len == 1)
1077         len = 2;
1078
1079       cpvalue = g_new (gchar, len);
1080
1081       if (GetEnvironmentVariableA (cpname, cpvalue, len) != len - 1)
1082         {
1083           g_free (cpname);
1084           g_free (cpvalue);
1085           return NULL;
1086         }
1087
1088       if (strchr (cpvalue, '%') != NULL)
1089         {
1090           gchar *tem = cpvalue;
1091
1092           len = ExpandEnvironmentStringsA (cpvalue, dummy, 3);
1093
1094           if (len > 0)
1095             {
1096               cpvalue = g_new (gchar, len);
1097
1098               if (ExpandEnvironmentStringsA (tem, cpvalue, len) != len)
1099                 {
1100                   g_free (cpvalue);
1101                   cpvalue = tem;
1102                 }
1103               else
1104                 g_free (tem);
1105             }
1106         }
1107
1108       value = g_locale_to_utf8 (cpvalue, -1, NULL, NULL, NULL);
1109
1110       g_free (cpname);
1111       g_free (cpvalue);
1112     }
1113
1114   quark = g_quark_from_string (value);
1115   g_free (value);
1116   
1117   return g_quark_to_string (quark);
1118
1119 #endif /* G_OS_WIN32 */
1120 }
1121
1122 /**
1123  * g_setenv:
1124  * @variable: the environment variable to set, must not contain '='.
1125  * @value: the value for to set the variable to.
1126  * @overwrite: whether to change the variable if it already exists.
1127  *
1128  * Sets an environment variable. Both the variable's name and value
1129  * should be in the GLib file name encoding. On UNIX, this means that
1130  * they can be any sequence of bytes. On Windows, they should be in
1131  * UTF-8.
1132  *
1133  * Note that on some systems, when variables are overwritten, the memory 
1134  * used for the previous variables and its value isn't reclaimed.
1135  *
1136  * Returns: %FALSE if the environment variable couldn't be set.
1137  *
1138  * Since: 2.4
1139  */
1140 gboolean
1141 g_setenv (const gchar *variable, 
1142           const gchar *value, 
1143           gboolean     overwrite)
1144 {
1145 #ifndef G_OS_WIN32
1146
1147   gint result;
1148 #ifndef HAVE_SETENV
1149   gchar *string;
1150 #endif
1151
1152   g_return_val_if_fail (variable != NULL, FALSE);
1153   g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE);
1154
1155 #ifdef HAVE_SETENV
1156   result = setenv (variable, value, overwrite);
1157 #else
1158   if (!overwrite && getenv (variable) != NULL)
1159     return TRUE;
1160   
1161   /* This results in a leak when you overwrite existing
1162    * settings. It would be fairly easy to fix this by keeping
1163    * our own parallel array or hash table.
1164    */
1165   string = g_strconcat (variable, "=", value, NULL);
1166   result = putenv (string);
1167 #endif
1168   return result == 0;
1169
1170 #else /* G_OS_WIN32 */
1171
1172   gboolean retval;
1173
1174   g_return_val_if_fail (variable != NULL, FALSE);
1175   g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE);
1176   g_return_val_if_fail (g_utf8_validate (variable, -1, NULL), FALSE);
1177   g_return_val_if_fail (g_utf8_validate (value, -1, NULL), FALSE);
1178
1179   if (!overwrite && g_getenv (variable) != NULL)
1180     return TRUE;
1181
1182   /* We want to (if possible) set both the environment variable copy
1183    * kept by the C runtime and the one kept by the system.
1184    *
1185    * We can't use only the C runtime's putenv or _wputenv() as that
1186    * won't work for arbitrary Unicode strings in a "non-Unicode" app
1187    * (with main() and not wmain()). In a "main()" app the C runtime
1188    * initializes the C runtime's environment table by converting the
1189    * real (wide char) environment variables to system codepage, thus
1190    * breaking those that aren't representable in the system codepage.
1191    *
1192    * As the C runtime's putenv() will also set the system copy, we do
1193    * the putenv() first, then call SetEnvironmentValueW ourselves.
1194    */
1195
1196   if (G_WIN32_HAVE_WIDECHAR_API ())
1197     {
1198       wchar_t *wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL);
1199       wchar_t *wvalue = g_utf8_to_utf16 (value, -1, NULL, NULL, NULL);
1200       gchar *tem = g_strconcat (variable, "=", value, NULL);
1201       wchar_t *wassignment = g_utf8_to_utf16 (tem, -1, NULL, NULL, NULL);
1202       
1203       g_free (tem);
1204       _wputenv (wassignment);
1205       g_free (wassignment);
1206
1207       retval = (SetEnvironmentVariableW (wname, wvalue) != 0);
1208
1209       g_free (wname);
1210       g_free (wvalue);
1211     }
1212   else
1213     {
1214       /* In the non-Unicode case (Win9x), just putenv() is good
1215        * enough.
1216        */
1217       gchar *tem = g_strconcat (variable, "=", value, NULL);
1218       gchar *cpassignment = g_locale_from_utf8 (tem, -1, NULL, NULL, NULL);
1219
1220       g_free (tem);
1221       
1222       retval = (putenv (cpassignment) == 0);
1223
1224       g_free (cpassignment);
1225     }
1226
1227   return retval;
1228
1229 #endif /* G_OS_WIN32 */
1230 }
1231
1232 #ifndef G_OS_WIN32
1233
1234 /* According to the Single Unix Specification, environ is not in 
1235  * any system header, although unistd.h often declares it.
1236  */
1237 extern char **environ;
1238
1239 #endif
1240            
1241 /**
1242  * g_unsetenv:
1243  * @variable: the environment variable to remove, must not contain '='.
1244  * 
1245  * Removes an environment variable from the environment.
1246  *
1247  * Note that on some systems, when variables are overwritten, the memory 
1248  * used for the previous variables and its value isn't reclaimed.
1249  * Furthermore, this function can't be guaranteed to operate in a 
1250  * threadsafe way.
1251  *
1252  * Since: 2.4 
1253  **/
1254 void
1255 g_unsetenv (const gchar *variable)
1256 {
1257 #ifndef G_OS_WIN32
1258
1259 #ifdef HAVE_UNSETENV
1260   g_return_if_fail (variable != NULL);
1261   g_return_if_fail (strchr (variable, '=') == NULL);
1262
1263   unsetenv (variable);
1264 #else /* !HAVE_UNSETENV */
1265   int len;
1266   gchar **e, **f;
1267
1268   g_return_if_fail (variable != NULL);
1269   g_return_if_fail (strchr (variable, '=') == NULL);
1270
1271   len = strlen (variable);
1272   
1273   /* Mess directly with the environ array.
1274    * This seems to be the only portable way to do this.
1275    *
1276    * Note that we remove *all* environment entries for
1277    * the variable name, not just the first.
1278    */
1279   e = f = environ;
1280   while (*e != NULL) 
1281     {
1282       if (strncmp (*e, variable, len) != 0 || (*e)[len] != '=') 
1283         {
1284           *f = *e;
1285           f++;
1286         }
1287       e++;
1288     }
1289   *f = NULL;
1290 #endif /* !HAVE_UNSETENV */
1291
1292 #else  /* G_OS_WIN32 */
1293
1294   g_return_if_fail (variable != NULL);
1295   g_return_if_fail (strchr (variable, '=') == NULL);
1296   g_return_if_fail (g_utf8_validate (variable, -1, NULL));
1297
1298   if (G_WIN32_HAVE_WIDECHAR_API ())
1299     {
1300       wchar_t *wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL);
1301       gchar *tem = g_strconcat (variable, "=", NULL);
1302       wchar_t *wassignment = g_utf8_to_utf16 (tem, -1, NULL, NULL, NULL);
1303       
1304       g_free (tem);
1305       _wputenv (wassignment);
1306       g_free (wassignment);
1307
1308       SetEnvironmentVariableW (wname, NULL);
1309
1310       g_free (wname);
1311     }
1312   else
1313     {
1314       /* In the non-Unicode case (Win9x), just putenv() is good
1315        * enough.
1316        */
1317       gchar *tem = g_strconcat (variable, "=", NULL);
1318       gchar *cpassignment = g_locale_from_utf8 (tem, -1, NULL, NULL, NULL);
1319
1320       g_free (tem);
1321       
1322       putenv (cpassignment);
1323
1324       g_free (cpassignment);
1325     }
1326
1327 #endif /* G_OS_WIN32 */
1328 }
1329
1330 /**
1331  * g_listenv:
1332  *
1333  * Gets the names of all variables set in the environment.
1334  * 
1335  * Returns: a %NULL-terminated list of strings which must be freed
1336  * with g_strfreev().
1337  *
1338  * Since: 2.8
1339  */
1340 gchar **
1341 g_listenv (void)
1342 {
1343   gchar **result, *eq;
1344   gint len, i, j;
1345
1346   len = g_strv_length (environ);
1347   result = g_new0 (gchar *, len + 1);
1348   
1349   j = 0;
1350   for (i = 0; i < len; i++)
1351     {
1352       eq = strchr (environ[i], '=');
1353       if (eq)
1354         result[j++] = g_strndup (environ[i], eq - environ[i]);
1355     }
1356
1357   result[j] = NULL;
1358
1359   return result;
1360 }
1361
1362 G_LOCK_DEFINE_STATIC (g_utils_global);
1363
1364 static  gchar   *g_tmp_dir = NULL;
1365 static  gchar   *g_user_name = NULL;
1366 static  gchar   *g_real_name = NULL;
1367 static  gchar   *g_home_dir = NULL;
1368 static  gchar   *g_host_name = NULL;
1369
1370 #ifdef G_OS_WIN32
1371 /* System codepage versions of the above, kept at file level so that they,
1372  * too, are produced only once.
1373  */
1374 static  gchar   *g_tmp_dir_cp = NULL;
1375 static  gchar   *g_user_name_cp = NULL;
1376 static  gchar   *g_real_name_cp = NULL;
1377 static  gchar   *g_home_dir_cp = NULL;
1378 #endif
1379
1380 static  gchar   *g_user_data_dir = NULL;
1381 static  gchar  **g_system_data_dirs = NULL;
1382 static  gchar   *g_user_cache_dir = NULL;
1383 static  gchar   *g_user_config_dir = NULL;
1384 static  gchar  **g_system_config_dirs = NULL;
1385
1386 #ifdef G_OS_WIN32
1387
1388 static gchar *
1389 get_special_folder (int csidl)
1390 {
1391   union {
1392     char c[MAX_PATH+1];
1393     wchar_t wc[MAX_PATH+1];
1394   } path;
1395   HRESULT hr;
1396   LPITEMIDLIST pidl = NULL;
1397   BOOL b;
1398   gchar *retval = NULL;
1399
1400   hr = SHGetSpecialFolderLocation (NULL, csidl, &pidl);
1401   if (hr == S_OK)
1402     {
1403       if (G_WIN32_HAVE_WIDECHAR_API ())
1404         {
1405           b = SHGetPathFromIDListW (pidl, path.wc);
1406           if (b)
1407             retval = g_utf16_to_utf8 (path.wc, -1, NULL, NULL, NULL);
1408         }
1409       else
1410         {
1411           b = SHGetPathFromIDListA (pidl, path.c);
1412           if (b)
1413             retval = g_locale_to_utf8 (path.c, -1, NULL, NULL, NULL);
1414         }
1415       CoTaskMemFree (pidl);
1416     }
1417   return retval;
1418 }
1419
1420 static char *
1421 get_windows_directory_root (void)
1422 {
1423   char windowsdir[MAX_PATH];
1424
1425   if (GetWindowsDirectory (windowsdir, sizeof (windowsdir)))
1426     {
1427       /* Usually X:\Windows, but in terminal server environments
1428        * might be an UNC path, AFAIK.
1429        */
1430       char *p = (char *) g_path_skip_root (windowsdir);
1431       if (G_IS_DIR_SEPARATOR (p[-1]) && p[-2] != ':')
1432         p--;
1433       *p = '\0';
1434       return g_strdup (windowsdir);
1435     }
1436   else
1437     return g_strdup ("C:\\");
1438 }
1439
1440 #endif
1441
1442 /* HOLDS: g_utils_global_lock */
1443 static void
1444 g_get_any_init (void)
1445 {
1446   if (!g_tmp_dir)
1447     {
1448       gchar hostname[100];
1449
1450       g_tmp_dir = g_strdup (g_getenv ("TMPDIR"));
1451       if (!g_tmp_dir)
1452         g_tmp_dir = g_strdup (g_getenv ("TMP"));
1453       if (!g_tmp_dir)
1454         g_tmp_dir = g_strdup (g_getenv ("TEMP"));
1455       
1456 #ifdef G_OS_WIN32
1457       if (!g_tmp_dir)
1458         g_tmp_dir = get_windows_directory_root ();
1459 #else
1460 #ifdef P_tmpdir
1461       if (!g_tmp_dir)
1462         {
1463           gsize k;    
1464           g_tmp_dir = g_strdup (P_tmpdir);
1465           k = strlen (g_tmp_dir);
1466           if (k > 1 && G_IS_DIR_SEPARATOR (g_tmp_dir[k - 1]))
1467             g_tmp_dir[k - 1] = '\0';
1468         }
1469 #endif
1470       
1471       if (!g_tmp_dir)
1472         {
1473           g_tmp_dir = g_strdup ("/tmp");
1474         }
1475 #endif  /* !G_OS_WIN32 */
1476       
1477 #ifdef G_OS_WIN32
1478       /* We check $HOME first for Win32, though it is a last resort for Unix
1479        * where we prefer the results of getpwuid().
1480        */
1481       g_home_dir = g_strdup (g_getenv ("HOME"));
1482
1483       /* Only believe HOME if it is an absolute path and exists */
1484       if (g_home_dir)
1485         {
1486           if (!(g_path_is_absolute (g_home_dir) &&
1487                 g_file_test (g_home_dir, G_FILE_TEST_IS_DIR)))
1488             {
1489               g_free (g_home_dir);
1490               g_home_dir = NULL;
1491             }
1492         }
1493       
1494       /* In case HOME is Unix-style (it happens), convert it to
1495        * Windows style.
1496        */
1497       if (g_home_dir)
1498         {
1499           gchar *p;
1500           while ((p = strchr (g_home_dir, '/')) != NULL)
1501             *p = '\\';
1502         }
1503
1504       if (!g_home_dir)
1505         {
1506           /* USERPROFILE is probably the closest equivalent to $HOME? */
1507           if (g_getenv ("USERPROFILE") != NULL)
1508             g_home_dir = g_strdup (g_getenv ("USERPROFILE"));
1509         }
1510
1511       if (!g_home_dir)
1512         g_home_dir = get_special_folder (CSIDL_PROFILE);
1513       
1514       if (!g_home_dir)
1515         g_home_dir = get_windows_directory_root ();
1516 #endif /* G_OS_WIN32 */
1517       
1518 #ifdef HAVE_PWD_H
1519       {
1520         struct passwd *pw = NULL;
1521         gpointer buffer = NULL;
1522         gint error;
1523         
1524 #  if defined (HAVE_POSIX_GETPWUID_R) || defined (HAVE_NONPOSIX_GETPWUID_R)
1525         struct passwd pwd;
1526 #    ifdef _SC_GETPW_R_SIZE_MAX  
1527         /* This reurns the maximum length */
1528         glong bufsize = sysconf (_SC_GETPW_R_SIZE_MAX);
1529         
1530         if (bufsize < 0)
1531           bufsize = 64;
1532 #    else /* _SC_GETPW_R_SIZE_MAX */
1533         glong bufsize = 64;
1534 #    endif /* _SC_GETPW_R_SIZE_MAX */
1535         
1536         do
1537           {
1538             g_free (buffer);
1539             /* we allocate 6 extra bytes to work around a bug in 
1540              * Mac OS < 10.3. See #156446
1541              */
1542             buffer = g_malloc (bufsize + 6);
1543             errno = 0;
1544             
1545 #    ifdef HAVE_POSIX_GETPWUID_R
1546             error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
1547             error = error < 0 ? errno : error;
1548 #    else /* HAVE_NONPOSIX_GETPWUID_R */
1549        /* HPUX 11 falls into the HAVE_POSIX_GETPWUID_R case */
1550 #      if defined(_AIX) || defined(__hpux)
1551             error = getpwuid_r (getuid (), &pwd, buffer, bufsize);
1552             pw = error == 0 ? &pwd : NULL;
1553 #      else /* !_AIX */
1554             pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
1555             error = pw ? 0 : errno;
1556 #      endif /* !_AIX */            
1557 #    endif /* HAVE_NONPOSIX_GETPWUID_R */
1558             
1559             if (!pw)
1560               {
1561                 /* we bail out prematurely if the user id can't be found
1562                  * (should be pretty rare case actually), or if the buffer
1563                  * should be sufficiently big and lookups are still not
1564                  * successfull.
1565                  */
1566                 if (error == 0 || error == ENOENT)
1567                   {
1568                     g_warning ("getpwuid_r(): failed due to unknown user id (%lu)",
1569                                (gulong) getuid ());
1570                     break;
1571                   }
1572                 if (bufsize > 32 * 1024)
1573                   {
1574                     g_warning ("getpwuid_r(): failed due to: %s.",
1575                                g_strerror (error));
1576                     break;
1577                   }
1578                 
1579                 bufsize *= 2;
1580               }
1581           }
1582         while (!pw);
1583 #  endif /* HAVE_POSIX_GETPWUID_R || HAVE_NONPOSIX_GETPWUID_R */
1584         
1585         if (!pw)
1586           {
1587             setpwent ();
1588             pw = getpwuid (getuid ());
1589             endpwent ();
1590           }
1591         if (pw)
1592           {
1593             g_user_name = g_strdup (pw->pw_name);
1594
1595             if (pw->pw_gecos && *pw->pw_gecos != '\0') 
1596               {
1597                 gchar **gecos_fields;
1598                 gchar **name_parts;
1599
1600                 /* split the gecos field and substitute '&' */
1601                 gecos_fields = g_strsplit (pw->pw_gecos, ",", 0);
1602                 name_parts = g_strsplit (gecos_fields[0], "&", 0);
1603                 pw->pw_name[0] = g_ascii_toupper (pw->pw_name[0]);
1604                 g_real_name = g_strjoinv (pw->pw_name, name_parts);
1605                 g_strfreev (gecos_fields);
1606                 g_strfreev (name_parts);
1607               }
1608
1609             if (!g_home_dir)
1610               g_home_dir = g_strdup (pw->pw_dir);
1611           }
1612         g_free (buffer);
1613       }
1614       
1615 #else /* !HAVE_PWD_H */
1616       
1617 #ifdef G_OS_WIN32
1618       if (G_WIN32_HAVE_WIDECHAR_API ())
1619         {
1620           guint len = UNLEN+1;
1621           wchar_t buffer[UNLEN+1];
1622           
1623           if (GetUserNameW (buffer, (LPDWORD) &len))
1624             {
1625               g_user_name = g_utf16_to_utf8 (buffer, -1, NULL, NULL, NULL);
1626               g_real_name = g_strdup (g_user_name);
1627             }
1628         }
1629       else
1630         {
1631           guint len = UNLEN+1;
1632           char buffer[UNLEN+1];
1633           
1634           if (GetUserNameA (buffer, (LPDWORD) &len))
1635             {
1636               g_user_name = g_locale_to_utf8 (buffer, -1, NULL, NULL, NULL);
1637               g_real_name = g_strdup (g_user_name);
1638             }
1639         }
1640 #endif /* G_OS_WIN32 */
1641
1642 #endif /* !HAVE_PWD_H */
1643
1644 #ifndef G_OS_WIN32
1645       if (!g_home_dir)
1646         g_home_dir = g_strdup (g_getenv ("HOME"));
1647 #endif
1648
1649 #ifdef __EMX__
1650       /* change '\\' in %HOME% to '/' */
1651       g_strdelimit (g_home_dir, "\\",'/');
1652 #endif
1653       if (!g_user_name)
1654         g_user_name = g_strdup ("somebody");
1655       if (!g_real_name)
1656         g_real_name = g_strdup ("Unknown");
1657
1658 #ifndef G_OS_WIN32
1659       if (gethostname (hostname, sizeof (hostname)) == -1)
1660         g_host_name = g_strdup ("unknown");
1661       else
1662         g_host_name = g_strdup (hostname);
1663 #else
1664       {
1665         DWORD size = sizeof (hostname);
1666         
1667         if (!GetComputerName (hostname, &size))
1668           g_host_name = g_strdup ("unknown");
1669         else
1670           g_host_name = g_strdup (hostname);
1671       }
1672 #endif
1673
1674 #ifdef G_OS_WIN32
1675       g_tmp_dir_cp = g_locale_from_utf8 (g_tmp_dir, -1, NULL, NULL, NULL);
1676       g_user_name_cp = g_locale_from_utf8 (g_user_name, -1, NULL, NULL, NULL);
1677       g_real_name_cp = g_locale_from_utf8 (g_real_name, -1, NULL, NULL, NULL);
1678
1679       if (!g_tmp_dir_cp)
1680         g_tmp_dir_cp = g_strdup ("\\");
1681       if (!g_user_name_cp)
1682         g_user_name_cp = g_strdup ("somebody");
1683       if (!g_real_name_cp)
1684         g_real_name_cp = g_strdup ("Unknown");
1685
1686       /* home_dir might be NULL, unlike tmp_dir, user_name and
1687        * real_name.
1688        */
1689       if (g_home_dir)
1690         g_home_dir_cp = g_locale_from_utf8 (g_home_dir, -1, NULL, NULL, NULL);
1691       else
1692         g_home_dir_cp = NULL;
1693 #endif /* G_OS_WIN32 */
1694     }
1695 }
1696
1697 /**
1698  * g_get_user_name:
1699  *
1700  * Gets the user name of the current user. The encoding of the returned
1701  * string is system-defined. On UNIX, it might be the preferred file name
1702  * encoding, or something else, and there is no guarantee that it is even
1703  * consistent on a machine. On Windows, it is always UTF-8.
1704  *
1705  * Returns: the user name of the current user.
1706  */
1707 G_CONST_RETURN gchar*
1708 g_get_user_name (void)
1709 {
1710   G_LOCK (g_utils_global);
1711   if (!g_tmp_dir)
1712     g_get_any_init ();
1713   G_UNLOCK (g_utils_global);
1714   
1715   return g_user_name;
1716 }
1717
1718 /**
1719  * g_get_real_name:
1720  *
1721  * Gets the real name of the user. This usually comes from the user's entry 
1722  * in the <filename>passwd</filename> file. The encoding of the returned 
1723  * string is system-defined. (On Windows, it is, however, always UTF-8.) 
1724  * If the real user name cannot be determined, the string "Unknown" is 
1725  * returned.
1726  *
1727  * Returns: the user's real name.
1728  */
1729 G_CONST_RETURN gchar*
1730 g_get_real_name (void)
1731 {
1732   G_LOCK (g_utils_global);
1733   if (!g_tmp_dir)
1734     g_get_any_init ();
1735   G_UNLOCK (g_utils_global);
1736  
1737   return g_real_name;
1738 }
1739
1740 /**
1741  * g_get_home_dir:
1742  *
1743  * Gets the current user's home directory. 
1744  *
1745  * Note that in contrast to traditional UNIX tools, this function 
1746  * prefers <filename>passwd</filename> entries over the <envar>HOME</envar> 
1747  * environment variable.
1748  *
1749  * Returns: the current user's home directory.
1750  */
1751 G_CONST_RETURN gchar*
1752 g_get_home_dir (void)
1753 {
1754   G_LOCK (g_utils_global);
1755   if (!g_tmp_dir)
1756     g_get_any_init ();
1757   G_UNLOCK (g_utils_global);
1758   
1759   return g_home_dir;
1760 }
1761
1762 /**
1763  * g_get_tmp_dir:
1764  *
1765  * Gets the directory to use for temporary files. This is found from 
1766  * inspecting the environment variables <envar>TMPDIR</envar>, 
1767  * <envar>TMP</envar>, and <envar>TEMP</envar> in that order. If none 
1768  * of those are defined "/tmp" is returned on UNIX and "C:\" on Windows. 
1769  * The encoding of the returned string is system-defined. On Windows, 
1770  * it is always UTF-8. The return value is never %NULL.
1771  *
1772  * Returns: the directory to use for temporary files.
1773  */
1774 G_CONST_RETURN gchar*
1775 g_get_tmp_dir (void)
1776 {
1777   G_LOCK (g_utils_global);
1778   if (!g_tmp_dir)
1779     g_get_any_init ();
1780   G_UNLOCK (g_utils_global);
1781   
1782   return g_tmp_dir;
1783 }
1784
1785 /**
1786  * g_get_host_name:
1787  *
1788  * Return a name for the machine. 
1789  *
1790  * The returned name is not necessarily a fully-qualified domain name,
1791  * or even present in DNS or some other name service at all. It need
1792  * not even be unique on your local network or site, but usually it
1793  * is. Callers should not rely on the return value having any specific
1794  * properties like uniqueness for security purposes. Even if the name
1795  * of the machine is changed while an application is running, the
1796  * return value from this function does not change. The returned
1797  * string is owned by GLib and should not be modified or freed. If no
1798  * name can be determined, a default fixed string "unknown" is
1799  * returned.
1800  *
1801  * Returns: the host name of the machine.
1802  *
1803  * Since: 2.8
1804  */
1805 const gchar *
1806 g_get_host_name (void)
1807 {
1808   G_LOCK (g_utils_global);
1809   if (!g_tmp_dir)
1810     g_get_any_init ();
1811   G_UNLOCK (g_utils_global);
1812
1813   return g_host_name;
1814 }
1815
1816 G_LOCK_DEFINE_STATIC (g_prgname);
1817 static gchar *g_prgname = NULL;
1818
1819 /**
1820  * g_get_prgname:
1821  *
1822  * Gets the name of the program. This name should <emphasis>not</emphasis> 
1823  * be localized, contrast with g_get_application_name().
1824  * (If you are using GDK or GTK+ the program name is set in gdk_init(), 
1825  * which is called by gtk_init(). The program name is found by taking 
1826  * the last component of <literal>argv[0]</literal>.)
1827  *
1828  * Returns: the name of the program. The returned string belongs 
1829  * to GLib and must not be modified or freed.
1830  */
1831 gchar*
1832 g_get_prgname (void)
1833 {
1834   gchar* retval;
1835
1836   G_LOCK (g_prgname);
1837 #ifdef G_OS_WIN32
1838   if (g_prgname == NULL)
1839     {
1840       static gboolean beenhere = FALSE;
1841
1842       if (!beenhere)
1843         {
1844           gchar *utf8_buf = NULL;
1845
1846           beenhere = TRUE;
1847           if (G_WIN32_HAVE_WIDECHAR_API ())
1848             {
1849               wchar_t buf[MAX_PATH+1];
1850               if (GetModuleFileNameW (GetModuleHandle (NULL),
1851                                       buf, G_N_ELEMENTS (buf)) > 0)
1852                 utf8_buf = g_utf16_to_utf8 (buf, -1, NULL, NULL, NULL);
1853             }
1854           else
1855             {
1856               gchar buf[MAX_PATH+1];
1857               if (GetModuleFileNameA (GetModuleHandle (NULL),
1858                                       buf, G_N_ELEMENTS (buf)) > 0)
1859                 utf8_buf = g_locale_to_utf8 (buf, -1, NULL, NULL, NULL);
1860             }
1861           if (utf8_buf)
1862             {
1863               g_prgname = g_path_get_basename (utf8_buf);
1864               g_free (utf8_buf);
1865             }
1866         }
1867     }
1868 #endif
1869   retval = g_prgname;
1870   G_UNLOCK (g_prgname);
1871
1872   return retval;
1873 }
1874
1875 /**
1876  * g_set_prgname:
1877  * @prgname: the name of the program.
1878  *
1879  * Sets the name of the program. This name should <emphasis>not</emphasis> 
1880  * be localized, contrast with g_set_application_name(). Note that for 
1881  * thread-safety reasons this function can only be called once.
1882  */
1883 void
1884 g_set_prgname (const gchar *prgname)
1885 {
1886   G_LOCK (g_prgname);
1887   g_free (g_prgname);
1888   g_prgname = g_strdup (prgname);
1889   G_UNLOCK (g_prgname);
1890 }
1891
1892 G_LOCK_DEFINE_STATIC (g_application_name);
1893 static gchar *g_application_name = NULL;
1894
1895 /**
1896  * g_get_application_name:
1897  * 
1898  * Gets a human-readable name for the application, as set by
1899  * g_set_application_name(). This name should be localized if
1900  * possible, and is intended for display to the user.  Contrast with
1901  * g_get_prgname(), which gets a non-localized name. If
1902  * g_set_application_name() has not been called, returns the result of
1903  * g_get_prgname() (which may be %NULL if g_set_prgname() has also not
1904  * been called).
1905  * 
1906  * Return value: human-readable application name. may return %NULL
1907  *
1908  * Since: 2.2
1909  **/
1910 G_CONST_RETURN gchar*
1911 g_get_application_name (void)
1912 {
1913   gchar* retval;
1914
1915   G_LOCK (g_application_name);
1916   retval = g_application_name;
1917   G_UNLOCK (g_application_name);
1918
1919   if (retval == NULL)
1920     return g_get_prgname ();
1921   
1922   return retval;
1923 }
1924
1925 /**
1926  * g_set_application_name:
1927  * @application_name: localized name of the application
1928  *
1929  * Sets a human-readable name for the application. This name should be
1930  * localized if possible, and is intended for display to the user.
1931  * Contrast with g_set_prgname(), which sets a non-localized name.
1932  * g_set_prgname() will be called automatically by gtk_init(),
1933  * but g_set_application_name() will not.
1934  *
1935  * Note that for thread safety reasons, this function can only
1936  * be called once.
1937  *
1938  * The application name will be used in contexts such as error messages,
1939  * or when displaying an application's name in the task list.
1940  * 
1941  **/
1942 void
1943 g_set_application_name (const gchar *application_name)
1944 {
1945   gboolean already_set = FALSE;
1946         
1947   G_LOCK (g_application_name);
1948   if (g_application_name)
1949     already_set = TRUE;
1950   else
1951     g_application_name = g_strdup (application_name);
1952   G_UNLOCK (g_application_name);
1953
1954   if (already_set)
1955     g_warning ("g_set_application() name called multiple times");
1956 }
1957
1958 /**
1959  * g_get_user_data_dir:
1960  * 
1961  * Returns a base directory in which to access application data such
1962  * as icons that is customized for a particular user.  
1963  *
1964  * On UNIX platforms this is determined using the mechanisms described in
1965  * the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
1966  * XDG Base Directory Specification</ulink>
1967  * 
1968  * Return value: a string owned by GLib that must not be modified 
1969  *               or freed.
1970  * Since: 2.6
1971  **/
1972 G_CONST_RETURN gchar*
1973 g_get_user_data_dir (void)
1974 {
1975   gchar *data_dir;  
1976
1977   G_LOCK (g_utils_global);
1978
1979   if (!g_user_data_dir)
1980     {
1981 #ifdef G_OS_WIN32
1982       data_dir = get_special_folder (CSIDL_PERSONAL);
1983 #else
1984       data_dir = (gchar *) g_getenv ("XDG_DATA_HOME");
1985
1986       if (data_dir && data_dir[0])
1987         data_dir = g_strdup (data_dir);
1988 #endif
1989       if (!data_dir || !data_dir[0])
1990         {
1991           if (!g_tmp_dir)
1992             g_get_any_init ();
1993
1994           if (g_home_dir)
1995             data_dir = g_build_filename (g_home_dir, ".local", 
1996                                          "share", NULL);
1997           else
1998             data_dir = g_build_filename (g_tmp_dir, g_user_name, ".local",
1999                                          "share", NULL);
2000         }
2001
2002       g_user_data_dir = data_dir;
2003     }
2004   else
2005     data_dir = g_user_data_dir;
2006
2007   G_UNLOCK (g_utils_global);
2008
2009   return data_dir;
2010 }
2011
2012 /**
2013  * g_get_user_config_dir:
2014  * 
2015  * Returns a base directory in which to store user-specific application 
2016  * configuration information such as user preferences and settings. 
2017  *
2018  * On UNIX platforms this is determined using the mechanisms described in
2019  * the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
2020  * XDG Base Directory Specification</ulink>
2021  * 
2022  * Return value: a string owned by GLib that must not be modified 
2023  *               or freed.
2024  * Since: 2.6
2025  **/
2026 G_CONST_RETURN gchar*
2027 g_get_user_config_dir (void)
2028 {
2029   gchar *config_dir;  
2030
2031   G_LOCK (g_utils_global);
2032
2033   if (!g_user_config_dir)
2034     {
2035 #ifdef G_OS_WIN32
2036       config_dir = get_special_folder (CSIDL_APPDATA);
2037 #else
2038       config_dir = (gchar *) g_getenv ("XDG_CONFIG_HOME");
2039
2040       if (config_dir && config_dir[0])
2041         config_dir = g_strdup (config_dir);
2042 #endif
2043       if (!config_dir || !config_dir[0])
2044         {
2045           if (!g_tmp_dir)
2046             g_get_any_init ();
2047           
2048           if (g_home_dir)
2049             config_dir = g_build_filename (g_home_dir, ".config", NULL);
2050           else
2051             config_dir = g_build_filename (g_tmp_dir, g_user_name, ".config", NULL);
2052         }
2053       g_user_config_dir = config_dir;
2054     }
2055   else
2056     config_dir = g_user_config_dir;
2057
2058   G_UNLOCK (g_utils_global);
2059
2060   return config_dir;
2061 }
2062
2063 /**
2064  * g_get_user_cache_dir:
2065  * 
2066  * Returns a base directory in which to store non-essential, cached
2067  * data specific to particular user.
2068  *
2069  * On UNIX platforms this is determined using the mechanisms described in
2070  * the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
2071  * XDG Base Directory Specification</ulink>
2072  * 
2073  * Return value: a string owned by GLib that must not be modified 
2074  *               or freed.
2075  * Since: 2.6
2076  **/
2077 G_CONST_RETURN gchar*
2078 g_get_user_cache_dir (void)
2079 {
2080   gchar *cache_dir;  
2081
2082   G_LOCK (g_utils_global);
2083
2084   if (!g_user_cache_dir)
2085     {
2086 #ifdef G_OS_WIN32
2087       cache_dir = get_special_folder (CSIDL_INTERNET_CACHE); /* XXX correct? */
2088 #else
2089       cache_dir = (gchar *) g_getenv ("XDG_CACHE_HOME");
2090
2091       if (cache_dir && cache_dir[0])
2092           cache_dir = g_strdup (cache_dir);
2093 #endif
2094       if (!cache_dir || !cache_dir[0])
2095         {
2096           if (!g_tmp_dir)
2097             g_get_any_init ();
2098
2099           if (g_home_dir)
2100             cache_dir = g_build_filename (g_home_dir, ".cache", NULL);
2101           else
2102             cache_dir = g_build_filename (g_tmp_dir, g_user_name, ".cache", NULL);
2103         }
2104       g_user_cache_dir = cache_dir;
2105     }
2106   else
2107     cache_dir = g_user_cache_dir;
2108
2109   G_UNLOCK (g_utils_global);
2110
2111   return cache_dir;
2112 }
2113
2114 #ifdef G_OS_WIN32
2115
2116 #undef g_get_system_data_dirs
2117
2118 static HMODULE
2119 get_module_for_address (gconstpointer address)
2120 {
2121   /* Holds the g_utils_global lock */
2122
2123   static gboolean beenhere = FALSE;
2124   typedef BOOL (WINAPI *t_GetModuleHandleExA) (DWORD, LPCTSTR, HMODULE *);
2125   static t_GetModuleHandleExA p_GetModuleHandleExA = NULL;
2126   HMODULE hmodule;
2127
2128   if (!address)
2129     return NULL;
2130
2131   if (!beenhere)
2132     {
2133       p_GetModuleHandleExA =
2134         (t_GetModuleHandleExA) GetProcAddress (LoadLibrary ("kernel32.dll"),
2135                                                "GetModuleHandleExA");
2136       beenhere = TRUE;
2137     }
2138
2139   if (p_GetModuleHandleExA == NULL ||
2140       !(*p_GetModuleHandleExA) (GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT |
2141                                 GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
2142                                 address, &hmodule))
2143     {
2144       MEMORY_BASIC_INFORMATION mbi;
2145       VirtualQuery (address, &mbi, sizeof (mbi));
2146       hmodule = (HMODULE) mbi.AllocationBase;
2147     }
2148
2149   return hmodule;
2150 }
2151
2152 static gchar *
2153 get_module_share_dir (gconstpointer address)
2154 {
2155   HMODULE hmodule;
2156   gchar *filename = NULL;
2157   gchar *p, *retval;
2158
2159   hmodule = get_module_for_address (address);
2160   if (hmodule == NULL)
2161     return NULL;
2162
2163   if (G_WIN32_IS_NT_BASED ())
2164     {
2165       wchar_t wfilename[MAX_PATH];
2166       if (GetModuleFileNameW (hmodule, wfilename, G_N_ELEMENTS (wfilename)))
2167         filename = g_utf16_to_utf8 (wfilename, -1, NULL, NULL, NULL);
2168     }
2169   else
2170     {
2171       char cpfilename[MAX_PATH];
2172       if (GetModuleFileNameA (hmodule, cpfilename, G_N_ELEMENTS (cpfilename)))
2173         filename = g_locale_to_utf8 (cpfilename, -1, NULL, NULL, NULL);
2174     }
2175
2176   if (filename == NULL)
2177     return NULL;
2178
2179   if ((p = strrchr (filename, G_DIR_SEPARATOR)) != NULL)
2180     *p = '\0';
2181
2182   p = strrchr (filename, G_DIR_SEPARATOR);
2183   if (p && (g_ascii_strcasecmp (p + 1, "bin") == 0))
2184     *p = '\0';
2185
2186   retval = g_build_filename (filename, "share", NULL);
2187   g_free (filename);
2188
2189   return retval;
2190 }
2191
2192 G_CONST_RETURN gchar * G_CONST_RETURN *
2193 g_win32_get_system_data_dirs_for_module (gconstpointer address)
2194 {
2195   GArray *data_dirs;
2196   HMODULE hmodule;
2197   static GHashTable *per_module_data_dirs = NULL;
2198   gchar **retval;
2199   gchar *p;
2200       
2201   if (address)
2202     {
2203       G_LOCK (g_utils_global);
2204       hmodule = get_module_for_address (address);
2205       if (hmodule != NULL)
2206         {
2207           if (per_module_data_dirs == NULL)
2208             per_module_data_dirs = g_hash_table_new (NULL, NULL);
2209           else
2210             {
2211               retval = g_hash_table_lookup (per_module_data_dirs, hmodule);
2212               
2213               if (retval != NULL)
2214                 {
2215                   G_UNLOCK (g_utils_global);
2216                   return (G_CONST_RETURN gchar * G_CONST_RETURN *) retval;
2217                 }
2218             }
2219         }
2220     }
2221
2222   data_dirs = g_array_new (TRUE, TRUE, sizeof (char *));
2223
2224   /* Documents and Settings\All Users\Application Data */
2225   p = get_special_folder (CSIDL_COMMON_APPDATA);
2226   if (p)
2227     g_array_append_val (data_dirs, p);
2228   
2229   /* Documents and Settings\All Users\Documents */
2230   p = get_special_folder (CSIDL_COMMON_DOCUMENTS);
2231   if (p)
2232     g_array_append_val (data_dirs, p);
2233         
2234   /* Using the above subfolders of Documents and Settings perhaps
2235    * makes sense from a Windows perspective.
2236    *
2237    * But looking at the actual use cases of this function in GTK+
2238    * and GNOME software, what we really want is the "share"
2239    * subdirectory of the installation directory for the package
2240    * our caller is a part of.
2241    *
2242    * The address parameter, if non-NULL, points to a function in the
2243    * calling module. Use that to determine that module's installation
2244    * folder, and use its "share" subfolder.
2245    *
2246    * Additionally, also use the "share" subfolder of the installation
2247    * locations of GLib and the .exe file being run.
2248    *
2249    * To guard against none of the above being what is really wanted,
2250    * callers of this function should have Win32-specific code to look
2251    * up their installation folder themselves, and handle a subfolder
2252    * "share" of it in the same way as the folders returned from this
2253    * function.
2254    */
2255
2256   p = get_module_share_dir (address);
2257   if (p)
2258     g_array_append_val (data_dirs, p);
2259     
2260   p = g_win32_get_package_installation_subdirectory (NULL, dll_name, "share");
2261   if (p)
2262     g_array_append_val (data_dirs, p);
2263   
2264   p = g_win32_get_package_installation_subdirectory (NULL, NULL, "share");
2265   if (p)
2266     g_array_append_val (data_dirs, p);
2267
2268   retval = (gchar **) g_array_free (data_dirs, FALSE);
2269
2270   if (address)
2271     {
2272       if (hmodule != NULL)
2273         g_hash_table_insert (per_module_data_dirs, hmodule, retval);
2274       G_UNLOCK (g_utils_global);
2275     }
2276
2277   return (G_CONST_RETURN gchar * G_CONST_RETURN *) retval;
2278 }
2279
2280 #endif
2281
2282 /**
2283  * g_get_system_data_dirs:
2284  * 
2285  * Returns an ordered list of base directories in which to access 
2286  * system-wide application data.
2287  *
2288  * On UNIX platforms this is determined using the mechanisms described in
2289  * the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
2290  * XDG Base Directory Specification</ulink>
2291  * 
2292  * On Windows the first elements in the list are the Application Data
2293  * and Documents folders for All Users. (These can be determined only
2294  * on Windows 2000 or later and are not present in the list on other
2295  * Windows versions.) See documentation for CSIDL_COMMON_APPDATA and
2296  * CSIDL_COMMON_DOCUMENTS.
2297  *
2298  * Then follows the "share" subfolder in the installation folder for
2299  * the package containing the DLL that calls this function, if it can
2300  * be determined.
2301  * 
2302  * Finally the list contains the "share" subfolder in the installation
2303  * folder for GLib, and in the installation folder for the package the
2304  * application's .exe file belongs to.
2305  *
2306  * The installation folders above are determined by looking up the
2307  * folder where the module (DLL or EXE) in question is located. If the
2308  * folder's name is "bin", its parent is used, otherwise the folder
2309  * itself.
2310  *
2311  * Note that on Windows the returned list can vary depending on where
2312  * this function is called.
2313  *
2314  * Return value: a %NULL-terminated array of strings owned by GLib that must 
2315  *               not be modified or freed.
2316  * Since: 2.6
2317  **/
2318 G_CONST_RETURN gchar * G_CONST_RETURN * 
2319 g_get_system_data_dirs (void)
2320 {
2321   gchar **data_dir_vector;
2322
2323   G_LOCK (g_utils_global);
2324
2325   if (!g_system_data_dirs)
2326     {
2327 #ifdef G_OS_WIN32
2328       data_dir_vector = (gchar **) g_win32_get_system_data_dirs_for_module (NULL);
2329 #else
2330       gchar *data_dirs = (gchar *) g_getenv ("XDG_DATA_DIRS");
2331
2332       if (!data_dirs || !data_dirs[0])
2333           data_dirs = "/usr/local/share/:/usr/share/";
2334
2335       data_dir_vector = g_strsplit (data_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
2336 #endif
2337
2338       g_system_data_dirs = data_dir_vector;
2339     }
2340   else
2341     data_dir_vector = g_system_data_dirs;
2342
2343   G_UNLOCK (g_utils_global);
2344
2345   return (G_CONST_RETURN gchar * G_CONST_RETURN *) data_dir_vector;
2346 }
2347
2348 /**
2349  * g_get_system_config_dirs:
2350  * 
2351  * Returns an ordered list of base directories in which to access 
2352  * system-wide configuration information.
2353  *
2354  * On UNIX platforms this is determined using the mechanisms described in
2355  * the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
2356  * XDG Base Directory Specification</ulink>
2357  * 
2358  * Return value: a %NULL-terminated array of strings owned by GLib that must 
2359  *               not be modified or freed.
2360  * Since: 2.6
2361  **/
2362 G_CONST_RETURN gchar * G_CONST_RETURN *
2363 g_get_system_config_dirs (void)
2364 {
2365   gchar *conf_dirs, **conf_dir_vector;
2366
2367   G_LOCK (g_utils_global);
2368
2369   if (!g_system_config_dirs)
2370     {
2371 #ifdef G_OS_WIN32
2372       conf_dirs = get_special_folder (CSIDL_COMMON_APPDATA);
2373       if (conf_dirs)
2374         {
2375           conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
2376           g_free (conf_dirs);
2377         }
2378       else
2379         {
2380           /* Return empty list */
2381           conf_dir_vector = g_strsplit ("", G_SEARCHPATH_SEPARATOR_S, 0);
2382         }
2383 #else
2384       conf_dirs = (gchar *) g_getenv ("XDG_CONFIG_DIRS");
2385
2386       if (!conf_dirs || !conf_dirs[0])
2387           conf_dirs = "/etc/xdg";
2388
2389       conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
2390 #endif
2391
2392       g_system_config_dirs = conf_dir_vector;
2393     }
2394   else
2395     conf_dir_vector = g_system_config_dirs;
2396   G_UNLOCK (g_utils_global);
2397
2398   return (G_CONST_RETURN gchar * G_CONST_RETURN *) conf_dir_vector;
2399 }
2400
2401 #ifndef G_OS_WIN32
2402
2403 static GHashTable *alias_table = NULL;
2404
2405 /* read an alias file for the locales */
2406 static void
2407 read_aliases (gchar *file)
2408 {
2409   FILE *fp;
2410   char buf[256];
2411   
2412   if (!alias_table)
2413     alias_table = g_hash_table_new (g_str_hash, g_str_equal);
2414   fp = fopen (file,"r");
2415   if (!fp)
2416     return;
2417   while (fgets (buf, 256, fp))
2418     {
2419       char *p, *q;
2420
2421       g_strstrip (buf);
2422
2423       /* Line is a comment */
2424       if ((buf[0] == '#') || (buf[0] == '\0'))
2425         continue;
2426
2427       /* Reads first column */
2428       for (p = buf, q = NULL; *p; p++) {
2429         if ((*p == '\t') || (*p == ' ') || (*p == ':')) {
2430           *p = '\0';
2431           q = p+1;
2432           while ((*q == '\t') || (*q == ' ')) {
2433             q++;
2434           }
2435           break;
2436         }
2437       }
2438       /* The line only had one column */
2439       if (!q || *q == '\0')
2440         continue;
2441       
2442       /* Read second column */
2443       for (p = q; *p; p++) {
2444         if ((*p == '\t') || (*p == ' ')) {
2445           *p = '\0';
2446           break;
2447         }
2448       }
2449
2450       /* Add to alias table if necessary */
2451       if (!g_hash_table_lookup (alias_table, buf)) {
2452         g_hash_table_insert (alias_table, g_strdup (buf), g_strdup (q));
2453       }
2454     }
2455   fclose (fp);
2456 }
2457
2458 #endif
2459
2460 static char *
2461 unalias_lang (char *lang)
2462 {
2463 #ifndef G_OS_WIN32
2464   char *p;
2465   int i;
2466
2467   if (!alias_table)
2468     read_aliases ("/usr/share/locale/locale.alias");
2469
2470   i = 0;
2471   while ((p = g_hash_table_lookup (alias_table, lang)) && (strcmp (p, lang) != 0))
2472     {
2473       lang = p;
2474       if (i++ == 30)
2475         {
2476           static gboolean said_before = FALSE;
2477           if (!said_before)
2478             g_warning ("Too many alias levels for a locale, "
2479                        "may indicate a loop");
2480           said_before = TRUE;
2481           return lang;
2482         }
2483     }
2484 #endif
2485   return lang;
2486 }
2487
2488 /* Mask for components of locale spec. The ordering here is from
2489  * least significant to most significant
2490  */
2491 enum
2492 {
2493   COMPONENT_CODESET =   1 << 0,
2494   COMPONENT_TERRITORY = 1 << 1,
2495   COMPONENT_MODIFIER =  1 << 2
2496 };
2497
2498 /* Break an X/Open style locale specification into components
2499  */
2500 static guint
2501 explode_locale (const gchar *locale,
2502                 gchar      **language, 
2503                 gchar      **territory, 
2504                 gchar      **codeset, 
2505                 gchar      **modifier)
2506 {
2507   const gchar *uscore_pos;
2508   const gchar *at_pos;
2509   const gchar *dot_pos;
2510
2511   guint mask = 0;
2512
2513   uscore_pos = strchr (locale, '_');
2514   dot_pos = strchr (uscore_pos ? uscore_pos : locale, '.');
2515   at_pos = strchr (dot_pos ? dot_pos : (uscore_pos ? uscore_pos : locale), '@');
2516
2517   if (at_pos)
2518     {
2519       mask |= COMPONENT_MODIFIER;
2520       *modifier = g_strdup (at_pos);
2521     }
2522   else
2523     at_pos = locale + strlen (locale);
2524
2525   if (dot_pos)
2526     {
2527       mask |= COMPONENT_CODESET;
2528       *codeset = g_strndup (dot_pos, at_pos - dot_pos);
2529     }
2530   else
2531     dot_pos = at_pos;
2532
2533   if (uscore_pos)
2534     {
2535       mask |= COMPONENT_TERRITORY;
2536       *territory = g_strndup (uscore_pos, dot_pos - uscore_pos);
2537     }
2538   else
2539     uscore_pos = dot_pos;
2540
2541   *language = g_strndup (locale, uscore_pos - locale);
2542
2543   return mask;
2544 }
2545
2546 /*
2547  * Compute all interesting variants for a given locale name -
2548  * by stripping off different components of the value.
2549  *
2550  * For simplicity, we assume that the locale is in
2551  * X/Open format: language[_territory][.codeset][@modifier]
2552  *
2553  * TODO: Extend this to handle the CEN format (see the GNUlibc docs)
2554  *       as well. We could just copy the code from glibc wholesale
2555  *       but it is big, ugly, and complicated, so I'm reluctant
2556  *       to do so when this should handle 99% of the time...
2557  */
2558 GSList *
2559 _g_compute_locale_variants (const gchar *locale)
2560 {
2561   GSList *retval = NULL;
2562
2563   gchar *language = NULL;
2564   gchar *territory = NULL;
2565   gchar *codeset = NULL;
2566   gchar *modifier = NULL;
2567
2568   guint mask;
2569   guint i;
2570
2571   g_return_val_if_fail (locale != NULL, NULL);
2572
2573   mask = explode_locale (locale, &language, &territory, &codeset, &modifier);
2574
2575   /* Iterate through all possible combinations, from least attractive
2576    * to most attractive.
2577    */
2578   for (i = 0; i <= mask; i++)
2579     if ((i & ~mask) == 0)
2580       {
2581         gchar *val = g_strconcat (language,
2582                                   (i & COMPONENT_TERRITORY) ? territory : "",
2583                                   (i & COMPONENT_CODESET) ? codeset : "",
2584                                   (i & COMPONENT_MODIFIER) ? modifier : "",
2585                                   NULL);
2586         retval = g_slist_prepend (retval, val);
2587       }
2588
2589   g_free (language);
2590   if (mask & COMPONENT_CODESET)
2591     g_free (codeset);
2592   if (mask & COMPONENT_TERRITORY)
2593     g_free (territory);
2594   if (mask & COMPONENT_MODIFIER)
2595     g_free (modifier);
2596
2597   return retval;
2598 }
2599
2600 /* The following is (partly) taken from the gettext package.
2601    Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.  */
2602
2603 static const gchar *
2604 guess_category_value (const gchar *category_name)
2605 {
2606   const gchar *retval;
2607
2608   /* The highest priority value is the `LANGUAGE' environment
2609      variable.  This is a GNU extension.  */
2610   retval = g_getenv ("LANGUAGE");
2611   if ((retval != NULL) && (retval[0] != '\0'))
2612     return retval;
2613
2614   /* `LANGUAGE' is not set.  So we have to proceed with the POSIX
2615      methods of looking to `LC_ALL', `LC_xxx', and `LANG'.  On some
2616      systems this can be done by the `setlocale' function itself.  */
2617
2618   /* Setting of LC_ALL overwrites all other.  */
2619   retval = g_getenv ("LC_ALL");  
2620   if ((retval != NULL) && (retval[0] != '\0'))
2621     return retval;
2622
2623   /* Next comes the name of the desired category.  */
2624   retval = g_getenv (category_name);
2625   if ((retval != NULL) && (retval[0] != '\0'))
2626     return retval;
2627
2628   /* Last possibility is the LANG environment variable.  */
2629   retval = g_getenv ("LANG");
2630   if ((retval != NULL) && (retval[0] != '\0'))
2631     return retval;
2632
2633 #ifdef G_PLATFORM_WIN32
2634   /* g_win32_getlocale() first checks for LC_ALL, LC_MESSAGES and
2635    * LANG, which we already did above. Oh well. The main point of
2636    * calling g_win32_getlocale() is to get the thread's locale as used
2637    * by Windows and the Microsoft C runtime (in the "English_United
2638    * States" format) translated into the Unixish format.
2639    */
2640   retval = g_win32_getlocale ();
2641   if ((retval != NULL) && (retval[0] != '\0'))
2642     return retval;
2643 #endif  
2644
2645   return NULL;
2646 }
2647
2648 typedef struct _GLanguageNamesCache GLanguageNamesCache;
2649
2650 struct _GLanguageNamesCache {
2651   gchar *languages;
2652   gchar **language_names;
2653 };
2654
2655 static void
2656 language_names_cache_free (gpointer data)
2657 {
2658   GLanguageNamesCache *cache = data;
2659   g_free (cache->languages);
2660   g_strfreev (cache->language_names);
2661   g_free (cache);
2662 }
2663
2664 /**
2665  * g_get_language_names:
2666  * 
2667  * Computes a list of applicable locale names, which can be used to 
2668  * e.g. construct locale-dependent filenames or search paths. The returned 
2669  * list is sorted from most desirable to least desirable and always contains 
2670  * the default locale "C".
2671  *
2672  * For example, if LANGUAGE=de:en_US, then the returned list is
2673  * "de", "en_US", "en", "C".
2674  *
2675  * This function consults the environment variables <envar>LANGUAGE</envar>, 
2676  * <envar>LC_ALL</envar>, <envar>LC_MESSAGES</envar> and <envar>LANG</envar> 
2677  * to find the list of locales specified by the user.
2678  * 
2679  * Return value: a %NULL-terminated array of strings owned by GLib 
2680  *    that must not be modified or freed.
2681  *
2682  * Since: 2.6
2683  **/
2684 G_CONST_RETURN gchar * G_CONST_RETURN * 
2685 g_get_language_names (void)
2686 {
2687   static GStaticPrivate cache_private = G_STATIC_PRIVATE_INIT;
2688   GLanguageNamesCache *cache = g_static_private_get (&cache_private);
2689   const gchar *value;
2690
2691   if (!cache)
2692     {
2693       cache = g_new0 (GLanguageNamesCache, 1);
2694       g_static_private_set (&cache_private, cache, language_names_cache_free);
2695     }
2696
2697   value = guess_category_value ("LC_MESSAGES");
2698   if (!value)
2699     value = "C";
2700
2701   if (!(cache->languages && strcmp (cache->languages, value) == 0))
2702     {
2703       gchar **languages;
2704       gchar **alist, **a;
2705       GSList *list, *l;
2706       gint i;
2707
2708       g_free (cache->languages);
2709       g_strfreev (cache->language_names);
2710       cache->languages = g_strdup (value);
2711
2712       alist = g_strsplit (value, ":", 0);
2713       list = NULL;
2714       for (a = alist; *a; a++)
2715         {
2716           gchar *b = unalias_lang (*a);
2717           list = g_slist_concat (list, _g_compute_locale_variants (b));
2718         }
2719       g_strfreev (alist);
2720       list = g_slist_append (list, g_strdup ("C"));
2721
2722       cache->language_names = languages = g_new (gchar *, g_slist_length (list) + 1);
2723       for (l = list, i = 0; l; l = l->next, i++)
2724         languages[i] = l->data;
2725       languages[i] = NULL;
2726
2727       g_slist_free (list);
2728     }
2729
2730   return (G_CONST_RETURN gchar * G_CONST_RETURN *) cache->language_names;
2731 }
2732
2733 /**
2734  * g_direct_hash:
2735  * @v: a #gpointer key
2736  *
2737  * Converts a gpointer to a hash value.
2738  * It can be passed to g_hash_table_new() as the @hash_func parameter, 
2739  * when using pointers as keys in a #GHashTable.
2740  *
2741  * Returns: a hash value corresponding to the key.
2742  */
2743 guint
2744 g_direct_hash (gconstpointer v)
2745 {
2746   return GPOINTER_TO_UINT (v);
2747 }
2748
2749 /**
2750  * g_direct_equal:
2751  * @v1: a key.
2752  * @v2: a key to compare with @v1.
2753  *
2754  * Compares two #gpointer arguments and returns %TRUE if they are equal.
2755  * It can be passed to g_hash_table_new() as the @key_equal_func
2756  * parameter, when using pointers as keys in a #GHashTable.
2757  * 
2758  * Returns: %TRUE if the two keys match.
2759  */
2760 gboolean
2761 g_direct_equal (gconstpointer v1,
2762                 gconstpointer v2)
2763 {
2764   return v1 == v2;
2765 }
2766
2767 /**
2768  * g_int_equal:
2769  * @v1: a pointer to a #gint key.
2770  * @v2: a pointer to a #gint key to compare with @v1.
2771  *
2772  * Compares the two #gint values being pointed to and returns 
2773  * %TRUE if they are equal.
2774  * It can be passed to g_hash_table_new() as the @key_equal_func
2775  * parameter, when using pointers to integers as keys in a #GHashTable.
2776  * 
2777  * Returns: %TRUE if the two keys match.
2778  */
2779 gboolean
2780 g_int_equal (gconstpointer v1,
2781              gconstpointer v2)
2782 {
2783   return *((const gint*) v1) == *((const gint*) v2);
2784 }
2785
2786 /**
2787  * g_int_hash:
2788  * @v: a pointer to a #gint key
2789  *
2790  * Converts a pointer to a #gint to a hash value.
2791  * It can be passed to g_hash_table_new() as the @hash_func parameter, 
2792  * when using pointers to integers values as keys in a #GHashTable.
2793  *
2794  * Returns: a hash value corresponding to the key.
2795  */
2796 guint
2797 g_int_hash (gconstpointer v)
2798 {
2799   return *(const gint*) v;
2800 }
2801
2802 /**
2803  * g_nullify_pointer:
2804  * @nullify_location: the memory address of the pointer.
2805  * 
2806  * Set the pointer at the specified location to %NULL.
2807  **/
2808 void
2809 g_nullify_pointer (gpointer *nullify_location)
2810 {
2811   g_return_if_fail (nullify_location != NULL);
2812
2813   *nullify_location = NULL;
2814 }
2815
2816 /**
2817  * g_get_codeset:
2818  * 
2819  * Get the codeset for the current locale.
2820  * 
2821  * Return value: a newly allocated string containing the name
2822  * of the codeset. This string must be freed with g_free().
2823  **/
2824 gchar *
2825 g_get_codeset (void)
2826 {
2827   const gchar *charset;
2828
2829   g_get_charset (&charset);
2830
2831   return g_strdup (charset);
2832 }
2833
2834 /* This is called from g_thread_init(). It's used to
2835  * initialize some static data in a threadsafe way.
2836  */
2837 void
2838 _g_utils_thread_init (void)
2839 {
2840   g_get_language_names ();
2841 }
2842
2843 #ifdef ENABLE_NLS
2844
2845 #include <libintl.h>
2846
2847 #ifdef G_OS_WIN32
2848
2849 /**
2850  * _glib_get_locale_dir:
2851  *
2852  * Return the path to the lib\locale subfolder of the GLib
2853  * installation folder. The path is in the system codepage. We have to
2854  * use system codepage as bindtextdomain() doesn't have a UTF-8
2855  * interface.
2856  */
2857 static const gchar *
2858 _glib_get_locale_dir (void)
2859 {
2860   gchar *dir, *cp_dir;
2861   gchar *retval = NULL;
2862
2863   dir = g_win32_get_package_installation_directory (GETTEXT_PACKAGE, dll_name);
2864   cp_dir = g_win32_locale_filename_from_utf8 (dir);
2865   g_free (dir);
2866
2867   if (cp_dir)
2868     {
2869       /* Don't use g_build_filename() on pathnames in the system
2870        * codepage. In CJK locales cp_dir might end with a double-byte
2871        * character whose trailing byte is a backslash.
2872        */
2873       retval = g_strconcat (cp_dir, "\\lib\\locale", NULL);
2874       g_free (cp_dir);
2875     }
2876
2877   if (retval)
2878     return retval;
2879   else
2880     return g_strdup ("");
2881 }
2882
2883 #undef GLIB_LOCALE_DIR
2884 #define GLIB_LOCALE_DIR _glib_get_locale_dir ()
2885
2886 #endif /* G_OS_WIN32 */
2887
2888 G_CONST_RETURN gchar *
2889 _glib_gettext (const gchar *str)
2890 {
2891   static gboolean _glib_gettext_initialized = FALSE;
2892
2893   if (!_glib_gettext_initialized)
2894     {
2895       bindtextdomain(GETTEXT_PACKAGE, GLIB_LOCALE_DIR);
2896 #    ifdef HAVE_BIND_TEXTDOMAIN_CODESET
2897       bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
2898 #    endif
2899       _glib_gettext_initialized = TRUE;
2900     }
2901   
2902   return dgettext (GETTEXT_PACKAGE, str);
2903 }
2904
2905 #endif /* ENABLE_NLS */
2906
2907 #ifdef G_OS_WIN32
2908
2909 /* Binary compatibility versions. Not for newly compiled code. */
2910
2911 #undef g_find_program_in_path
2912
2913 gchar*
2914 g_find_program_in_path (const gchar *program)
2915 {
2916   gchar *utf8_program = g_locale_to_utf8 (program, -1, NULL, NULL, NULL);
2917   gchar *utf8_retval = g_find_program_in_path_utf8 (utf8_program);
2918   gchar *retval;
2919
2920   g_free (utf8_program);
2921   if (utf8_retval == NULL)
2922     return NULL;
2923   retval = g_locale_from_utf8 (utf8_retval, -1, NULL, NULL, NULL);
2924   g_free (utf8_retval);
2925
2926   return retval;
2927 }
2928
2929 #undef g_get_current_dir
2930
2931 gchar*
2932 g_get_current_dir (void)
2933 {
2934   gchar *utf8_dir = g_get_current_dir_utf8 ();
2935   gchar *dir = g_locale_from_utf8 (utf8_dir, -1, NULL, NULL, NULL);
2936   g_free (utf8_dir);
2937   return dir;
2938 }
2939
2940 #undef g_getenv
2941
2942 G_CONST_RETURN gchar*
2943 g_getenv (const gchar *variable)
2944 {
2945   gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL);
2946   const gchar *utf8_value = g_getenv_utf8 (utf8_variable);
2947   gchar *value;
2948   GQuark quark;
2949
2950   g_free (utf8_variable);
2951   if (!utf8_value)
2952     return NULL;
2953   value = g_locale_from_utf8 (utf8_value, -1, NULL, NULL, NULL);
2954   quark = g_quark_from_string (value);
2955   g_free (value);
2956
2957   return g_quark_to_string (quark);
2958 }
2959
2960 #undef g_setenv
2961
2962 gboolean
2963 g_setenv (const gchar *variable, 
2964           const gchar *value, 
2965           gboolean     overwrite)
2966 {
2967   gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL);
2968   gchar *utf8_value = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
2969   gboolean retval = g_setenv_utf8 (utf8_variable, utf8_value, overwrite);
2970
2971   g_free (utf8_variable);
2972   g_free (utf8_value);
2973
2974   return retval;
2975 }
2976
2977 #undef g_unsetenv
2978
2979 void
2980 g_unsetenv (const gchar *variable)
2981 {
2982   gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL);
2983
2984   g_unsetenv_utf8 (utf8_variable);
2985
2986   g_free (utf8_variable);
2987 }
2988
2989 #undef g_get_user_name
2990
2991 G_CONST_RETURN gchar*
2992 g_get_user_name (void)
2993 {
2994   G_LOCK (g_utils_global);
2995   if (!g_tmp_dir)
2996     g_get_any_init ();
2997   G_UNLOCK (g_utils_global);
2998   
2999   return g_user_name_cp;
3000 }
3001
3002 #undef g_get_real_name
3003
3004 G_CONST_RETURN gchar*
3005 g_get_real_name (void)
3006 {
3007   G_LOCK (g_utils_global);
3008   if (!g_tmp_dir)
3009     g_get_any_init ();
3010   G_UNLOCK (g_utils_global);
3011  
3012   return g_real_name_cp;
3013 }
3014
3015 #undef g_get_home_dir
3016
3017 G_CONST_RETURN gchar*
3018 g_get_home_dir (void)
3019 {
3020   G_LOCK (g_utils_global);
3021   if (!g_tmp_dir)
3022     g_get_any_init ();
3023   G_UNLOCK (g_utils_global);
3024
3025   return g_home_dir_cp;
3026 }
3027
3028 #undef g_get_tmp_dir
3029
3030 G_CONST_RETURN gchar*
3031 g_get_tmp_dir (void)
3032 {
3033   G_LOCK (g_utils_global);
3034   if (!g_tmp_dir)
3035     g_get_any_init ();
3036   G_UNLOCK (g_utils_global);
3037
3038   return g_tmp_dir_cp;
3039 }
3040
3041 #endif
3042
3043 #define __G_UTILS_C__
3044 #include "galiasdef.c"