1998-06-11 01:21:14 +02:00
|
|
|
/* GLIB - Library of useful routines for C programming
|
1998-09-06 02:31:48 +02:00
|
|
|
* Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald
|
1998-06-11 01:21:14 +02:00
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
2000-07-26 13:02:02 +02:00
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
1998-06-11 01:21:14 +02:00
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
2000-07-26 13:02:02 +02:00
|
|
|
* Lesser General Public License for more details.
|
1998-06-11 01:21:14 +02:00
|
|
|
*
|
2000-07-26 13:02:02 +02:00
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
1998-06-11 01:21:14 +02:00
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
1998-11-01 02:32:59 +01:00
|
|
|
|
1999-02-24 07:14:27 +01:00
|
|
|
/*
|
2000-07-26 13:02:02 +02:00
|
|
|
* Modified by the GLib Team and others 1997-2000. See the AUTHORS
|
1999-02-24 07:14:27 +01:00
|
|
|
* file for a list of people on the GLib Team. See the ChangeLog
|
|
|
|
* files for a list of changes. These files are distributed with
|
|
|
|
* GLib at ftp://ftp.gtk.org/pub/gtk/.
|
|
|
|
*/
|
|
|
|
|
1998-12-15 06:28:02 +01:00
|
|
|
/*
|
|
|
|
* MT safe for the unix part, FIXME: make the win32 part MT safe as well.
|
|
|
|
*/
|
|
|
|
|
2002-12-04 02:27:44 +01:00
|
|
|
#include "config.h"
|
1998-11-01 02:32:59 +01:00
|
|
|
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
#ifdef HAVE_UNISTD_H
|
1998-07-10 07:51:17 +02:00
|
|
|
#include <unistd.h>
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
#endif
|
1998-06-11 01:21:14 +02:00
|
|
|
#include <stdarg.h>
|
|
|
|
#include <stdlib.h>
|
1998-07-10 07:51:17 +02:00
|
|
|
#include <stdio.h>
|
2004-09-07 20:37:10 +02:00
|
|
|
#include <locale.h>
|
1998-06-11 01:21:14 +02:00
|
|
|
#include <string.h>
|
2006-07-06 22:30:16 +02:00
|
|
|
#include <ctype.h> /* For tolower() */
|
1998-09-08 06:10:30 +02:00
|
|
|
#include <errno.h>
|
2007-06-04 16:54:49 +02:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
#ifdef HAVE_PWD_H
|
1998-07-10 07:51:17 +02:00
|
|
|
#include <pwd.h>
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
#endif
|
1998-07-10 07:51:17 +02:00
|
|
|
#include <sys/types.h>
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
#ifdef HAVE_SYS_PARAM_H
|
1998-07-10 07:51:17 +02:00
|
|
|
#include <sys/param.h>
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
#endif
|
2005-08-17 20:31:08 +02:00
|
|
|
#ifdef HAVE_CRT_EXTERNS_H
|
2005-08-24 05:11:45 +02:00
|
|
|
#include <crt_externs.h> /* for _NSGetEnviron */
|
2005-08-17 20:31:08 +02:00
|
|
|
#endif
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
|
2001-06-30 18:54:33 +02:00
|
|
|
/* implement gutils's inline functions
|
1998-09-07 11:43:54 +02:00
|
|
|
*/
|
2000-09-08 01:08:25 +02:00
|
|
|
#define G_IMPLEMENT_INLINES 1
|
|
|
|
#define __G_UTILS_C__
|
1998-06-11 01:21:14 +02:00
|
|
|
#include "glib.h"
|
2002-11-21 01:35:15 +01:00
|
|
|
#include "gprintfint.h"
|
Renamed to glib/gthreadprivate.h and moved system thread identifier
2006-05-09 Sebastian Wilhelmi <wilhelmi@google.com>
* glib/gthreadinit.h: Renamed to glib/gthreadprivate.h and moved
system thread identifier comparision and assignment macros from
glib/gthread.c to glib/gthreadprivate.h.
* glib/Makefile.am, glib/gatomic.c, glib/gconvert.c, glib/gmain.c,
glib/gmem.c, glib/gmessages.c, glib/grand.c, glib/gslice.c,
glib/gthread.c, glib/gutils.c, gthread/gthread-impl.c: Use
glib/gthreadprivate.h instead of glib/gthreadinit.h.
* gthread/gthread-impl.c: Use GSystemThread instead of GThread for
owner determination. This fixes #311043 and is mostly modeled
after the patch from jylefort@FreeBSD.org.
2006-05-10 02:44:50 +02:00
|
|
|
#include "gthreadprivate.h"
|
2007-11-28 15:35:14 +01:00
|
|
|
#include "glibintl.h"
|
2005-03-14 05:26:57 +01:00
|
|
|
#include "galias.h"
|
1998-06-11 01:21:14 +02:00
|
|
|
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
#ifdef MAXPATHLEN
|
2000-03-20 17:01:41 +01:00
|
|
|
#define G_PATH_LENGTH MAXPATHLEN
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
#elif defined (PATH_MAX)
|
2000-03-20 17:01:41 +01:00
|
|
|
#define G_PATH_LENGTH PATH_MAX
|
|
|
|
#elif defined (_PC_PATH_MAX)
|
|
|
|
#define G_PATH_LENGTH sysconf(_PC_PATH_MAX)
|
|
|
|
#else
|
|
|
|
#define G_PATH_LENGTH 2048
|
|
|
|
#endif
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
|
2001-03-09 22:31:21 +01:00
|
|
|
#ifdef G_PLATFORM_WIN32
|
2001-12-31 11:12:22 +01:00
|
|
|
# define STRICT /* Strict typing, please */
|
2000-03-22 21:46:19 +01:00
|
|
|
# include <windows.h>
|
2001-03-01 10:34:45 +01:00
|
|
|
# undef STRICT
|
2005-04-08 14:03:16 +02:00
|
|
|
# ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
|
|
|
|
# define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 2
|
|
|
|
# define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 4
|
|
|
|
# endif
|
2001-12-31 11:12:22 +01:00
|
|
|
# include <lmcons.h> /* For UNLEN */
|
2001-03-09 22:31:21 +01:00
|
|
|
#endif /* G_PLATFORM_WIN32 */
|
|
|
|
|
|
|
|
#ifdef G_OS_WIN32
|
2000-03-22 21:46:19 +01:00
|
|
|
# include <direct.h>
|
2004-08-25 02:39:13 +02:00
|
|
|
# include <shlobj.h>
|
2004-10-29 22:58:04 +02:00
|
|
|
/* older SDK (e.g. msvc 5.0) does not have these*/
|
2007-06-06 21:13:45 +02:00
|
|
|
# ifndef CSIDL_MYMUSIC
|
|
|
|
# define CSIDL_MYMUSIC 13
|
|
|
|
# endif
|
|
|
|
# ifndef CSIDL_MYVIDEO
|
|
|
|
# define CSIDL_MYVIDEO 14
|
|
|
|
# endif
|
2004-10-29 22:58:04 +02:00
|
|
|
# ifndef CSIDL_INTERNET_CACHE
|
|
|
|
# define CSIDL_INTERNET_CACHE 32
|
|
|
|
# endif
|
|
|
|
# ifndef CSIDL_COMMON_APPDATA
|
|
|
|
# define CSIDL_COMMON_APPDATA 35
|
|
|
|
# endif
|
2008-02-17 13:49:12 +01:00
|
|
|
# ifndef CSIDL_MYPICTURES
|
|
|
|
# define CSIDL_MYPICTURES 0x27
|
|
|
|
# endif
|
2004-10-29 22:58:04 +02:00
|
|
|
# ifndef CSIDL_COMMON_DOCUMENTS
|
|
|
|
# define CSIDL_COMMON_DOCUMENTS 46
|
|
|
|
# endif
|
|
|
|
# ifndef CSIDL_PROFILE
|
|
|
|
# define CSIDL_PROFILE 40
|
|
|
|
# endif
|
2005-04-09 03:21:29 +02:00
|
|
|
# include <process.h>
|
2001-03-09 22:31:21 +01:00
|
|
|
#endif
|
2000-03-22 21:46:19 +01:00
|
|
|
|
2007-06-04 16:54:49 +02:00
|
|
|
#ifdef HAVE_CARBON
|
|
|
|
#include <CoreServices/CoreServices.h>
|
|
|
|
#endif
|
|
|
|
|
2000-05-29 20:48:29 +02:00
|
|
|
#ifdef HAVE_CODESET
|
|
|
|
#include <langinfo.h>
|
|
|
|
#endif
|
|
|
|
|
1998-06-11 01:21:14 +02:00
|
|
|
const guint glib_major_version = GLIB_MAJOR_VERSION;
|
|
|
|
const guint glib_minor_version = GLIB_MINOR_VERSION;
|
|
|
|
const guint glib_micro_version = GLIB_MICRO_VERSION;
|
version bump to 1.1.1, binary age 1, interface age 0. updates. updates.
Tue Aug 4 15:17:54 1998 Tim Janik <timj@gtk.org>
* configure.in: version bump to 1.1.1, binary age 1, interface age 0.
* NEWS: updates.
* README: updates.
* INSTALL: updates and fixes.
* COPYING: include the GNU LGPL, rather than shipping an empty file.
* AUTHORS: listed original authors here, and added people who made
significant improvements to glib.
* glib.h:
* gutils.c: implement g_get_current_dir() which returns a newly
allocated string, instead of a g_getcwd() variant that operates
on a static buffer.
export glib_interface_age and glib_binary_age.
as a convenience, macro definitions have been added for
g_node_insert_data, g_node_insert_data_before, g_node_append_data and
g_node_prepend_data.
* testglib.c: minor cleanups, print current dir.
1998-08-04 16:26:27 +02:00
|
|
|
const guint glib_interface_age = GLIB_INTERFACE_AGE;
|
|
|
|
const guint glib_binary_age = GLIB_BINARY_AGE;
|
1998-06-11 01:21:14 +02:00
|
|
|
|
2005-04-08 02:40:02 +02:00
|
|
|
#ifdef G_PLATFORM_WIN32
|
|
|
|
|
2008-02-24 02:07:41 +01:00
|
|
|
static HMODULE glib_dll = NULL;
|
|
|
|
|
2008-04-03 22:17:15 +02:00
|
|
|
#ifdef DLL_EXPORT
|
|
|
|
|
2008-02-24 02:07:41 +01:00
|
|
|
BOOL WINAPI
|
|
|
|
DllMain (HINSTANCE hinstDLL,
|
|
|
|
DWORD fdwReason,
|
|
|
|
LPVOID lpvReserved)
|
|
|
|
{
|
|
|
|
if (fdwReason == DLL_PROCESS_ATTACH)
|
|
|
|
glib_dll = hinstDLL;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
2005-04-08 02:40:02 +02:00
|
|
|
|
2008-04-03 22:17:15 +02:00
|
|
|
#endif
|
|
|
|
|
2008-02-24 22:15:47 +01:00
|
|
|
gchar *
|
2008-09-19 12:20:41 +02:00
|
|
|
_glib_get_dll_directory (void)
|
2008-02-24 22:15:47 +01:00
|
|
|
{
|
2008-09-19 12:20:41 +02:00
|
|
|
gchar *retval;
|
|
|
|
gchar *p;
|
|
|
|
wchar_t wc_fn[MAX_PATH];
|
|
|
|
|
2008-04-03 22:17:15 +02:00
|
|
|
#ifdef DLL_EXPORT
|
2008-02-24 22:15:47 +01:00
|
|
|
if (glib_dll == NULL)
|
|
|
|
return NULL;
|
2008-04-03 22:17:15 +02:00
|
|
|
#endif
|
2008-09-19 12:20:41 +02:00
|
|
|
|
|
|
|
/* This code is different from that in
|
|
|
|
* g_win32_get_package_installation_directory_of_module() in that
|
|
|
|
* here we return the actual folder where the GLib DLL is. We don't
|
|
|
|
* do the check for it being in a "bin" or "lib" subfolder and then
|
|
|
|
* returning the parent of that.
|
|
|
|
*
|
|
|
|
* In a statically built GLib, glib_dll will be NULL and we will
|
|
|
|
* thus look up the application's .exe file's location.
|
2008-04-03 22:17:15 +02:00
|
|
|
*/
|
2008-09-19 12:20:41 +02:00
|
|
|
if (!GetModuleFileNameW (glib_dll, wc_fn, MAX_PATH))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
retval = g_utf16_to_utf8 (wc_fn, -1, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
p = strrchr (retval, G_DIR_SEPARATOR);
|
|
|
|
if (p == NULL)
|
|
|
|
{
|
|
|
|
/* Wtf? */
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
*p = '\0';
|
|
|
|
|
|
|
|
return retval;
|
2008-02-24 22:15:47 +01:00
|
|
|
}
|
|
|
|
|
2005-04-08 02:40:02 +02:00
|
|
|
#endif
|
|
|
|
|
2004-08-03 21:41:02 +02:00
|
|
|
/**
|
|
|
|
* glib_check_version:
|
|
|
|
* @required_major: the required major version.
|
2005-12-30 03:08:02 +01:00
|
|
|
* @required_minor: the required minor version.
|
|
|
|
* @required_micro: the required micro version.
|
2004-08-03 21:41:02 +02:00
|
|
|
*
|
|
|
|
* Checks that the GLib library in use is compatible with the
|
|
|
|
* given version. Generally you would pass in the constants
|
|
|
|
* #GLIB_MAJOR_VERSION, #GLIB_MINOR_VERSION, #GLIB_MICRO_VERSION
|
|
|
|
* as the three arguments to this function; that produces
|
|
|
|
* a check that the library in use is compatible with
|
|
|
|
* the version of GLib the application or module was compiled
|
|
|
|
* against.
|
|
|
|
*
|
|
|
|
* Compatibility is defined by two things: first the version
|
|
|
|
* of the running library is newer than the version
|
|
|
|
* @required_major.required_minor.@required_micro. Second
|
|
|
|
* the running library must be binary compatible with the
|
|
|
|
* version @required_major.required_minor.@required_micro
|
|
|
|
* (same major version.)
|
|
|
|
*
|
|
|
|
* Return value: %NULL if the GLib library is compatible with the
|
|
|
|
* given version, or a string describing the version mismatch.
|
|
|
|
* The returned string is owned by GLib and must not be modified
|
|
|
|
* or freed.
|
|
|
|
*
|
|
|
|
* Since: 2.6
|
|
|
|
**/
|
|
|
|
const gchar *
|
|
|
|
glib_check_version (guint required_major,
|
|
|
|
guint required_minor,
|
|
|
|
guint required_micro)
|
|
|
|
{
|
|
|
|
gint glib_effective_micro = 100 * GLIB_MINOR_VERSION + GLIB_MICRO_VERSION;
|
|
|
|
gint required_effective_micro = 100 * required_minor + required_micro;
|
|
|
|
|
|
|
|
if (required_major > GLIB_MAJOR_VERSION)
|
|
|
|
return "GLib version too old (major mismatch)";
|
|
|
|
if (required_major < GLIB_MAJOR_VERSION)
|
|
|
|
return "GLib version too new (major mismatch)";
|
|
|
|
if (required_effective_micro < glib_effective_micro - GLIB_BINARY_AGE)
|
|
|
|
return "GLib version too new (micro mismatch)";
|
|
|
|
if (required_effective_micro > glib_effective_micro)
|
|
|
|
return "GLib version too old (micro mismatch)";
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
1999-07-01 11:30:18 +02:00
|
|
|
#if !defined (HAVE_MEMMOVE) && !defined (HAVE_WORKING_BCOPY)
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_memmove:
|
|
|
|
* @dest: the destination address to copy the bytes to.
|
|
|
|
* @src: the source address to copy the bytes from.
|
|
|
|
* @len: the number of bytes to copy.
|
|
|
|
*
|
|
|
|
* Copies a block of memory @len bytes long, from @src to @dest.
|
|
|
|
* The source and destination areas may overlap.
|
|
|
|
*
|
|
|
|
* In order to use this function, you must include
|
|
|
|
* <filename>string.h</filename> yourself, because this macro will
|
|
|
|
* typically simply resolve to memmove() and GLib does not include
|
|
|
|
* <filename>string.h</filename> for you.
|
|
|
|
*/
|
1999-07-01 11:30:18 +02:00
|
|
|
void
|
2005-02-02 07:07:14 +01:00
|
|
|
g_memmove (gpointer dest,
|
|
|
|
gconstpointer src,
|
|
|
|
gulong len)
|
1999-07-01 11:30:18 +02:00
|
|
|
{
|
|
|
|
gchar* destptr = dest;
|
|
|
|
const gchar* srcptr = src;
|
|
|
|
if (src + len < dest || dest + len < src)
|
|
|
|
{
|
|
|
|
bcopy (src, dest, len);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if (dest <= src)
|
|
|
|
{
|
|
|
|
while (len--)
|
|
|
|
*(destptr++) = *(srcptr++);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
destptr += len;
|
|
|
|
srcptr += len;
|
|
|
|
while (len--)
|
|
|
|
*(--destptr) = *(--srcptr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif /* !HAVE_MEMMOVE && !HAVE_WORKING_BCOPY */
|
|
|
|
|
2005-08-31 23:02:47 +02:00
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
#undef g_atexit
|
|
|
|
#endif
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_atexit:
|
|
|
|
* @func: the function to call on normal program termination.
|
|
|
|
*
|
|
|
|
* Specifies a function to be called at normal program termination.
|
2005-08-31 23:02:47 +02:00
|
|
|
*
|
|
|
|
* Since GLib 2.8.2, on Windows g_atexit() actually is a preprocessor
|
|
|
|
* macro that maps to a call to the atexit() function in the C
|
|
|
|
* library. This means that in case the code that calls g_atexit(),
|
|
|
|
* i.e. atexit(), is in a DLL, the function will be called when the
|
|
|
|
* DLL is detached from the program. This typically makes more sense
|
|
|
|
* than that the function is called when the GLib DLL is detached,
|
|
|
|
* which happened earlier when g_atexit() was a function in the GLib
|
|
|
|
* DLL.
|
|
|
|
*
|
|
|
|
* The behaviour of atexit() in the context of dynamically loaded
|
|
|
|
* modules is not formally specified and varies wildly.
|
|
|
|
*
|
|
|
|
* On POSIX systems, calling g_atexit() (or atexit()) in a dynamically
|
|
|
|
* loaded module which is unloaded before the program terminates might
|
|
|
|
* well cause a crash at program exit.
|
|
|
|
*
|
|
|
|
* Some POSIX systems implement atexit() like Windows, and have each
|
|
|
|
* dynamically loaded module maintain an own atexit chain that is
|
|
|
|
* called when the module is unloaded.
|
|
|
|
*
|
|
|
|
* On other POSIX systems, before a dynamically loaded module is
|
|
|
|
* unloaded, the registered atexit functions (if any) residing in that
|
|
|
|
* module are called, regardless where the code that registered them
|
|
|
|
* resided. This is presumably the most robust approach.
|
|
|
|
*
|
|
|
|
* As can be seen from the above, for portability it's best to avoid
|
|
|
|
* calling g_atexit() (or atexit()) except in the main executable of a
|
|
|
|
* program.
|
2005-02-02 07:07:14 +01:00
|
|
|
*/
|
1998-09-08 06:00:13 +02:00
|
|
|
void
|
|
|
|
g_atexit (GVoidFunc func)
|
|
|
|
{
|
|
|
|
gint result;
|
2001-02-18 00:30:48 +01:00
|
|
|
const gchar *error = NULL;
|
1998-09-08 06:00:13 +02:00
|
|
|
|
|
|
|
/* keep this in sync with glib.h */
|
|
|
|
|
|
|
|
#ifdef G_NATIVE_ATEXIT
|
|
|
|
result = ATEXIT (func);
|
|
|
|
if (result)
|
|
|
|
error = g_strerror (errno);
|
|
|
|
#elif defined (HAVE_ATEXIT)
|
|
|
|
# ifdef NeXT /* @#%@! NeXTStep */
|
|
|
|
result = !atexit ((void (*)(void)) func);
|
|
|
|
if (result)
|
|
|
|
error = g_strerror (errno);
|
|
|
|
# else
|
|
|
|
result = atexit ((void (*)(void)) func);
|
|
|
|
if (result)
|
|
|
|
error = g_strerror (errno);
|
|
|
|
# endif /* NeXT */
|
|
|
|
#elif defined (HAVE_ON_EXIT)
|
|
|
|
result = on_exit ((void (*)(int, void *)) func, NULL);
|
|
|
|
if (result)
|
|
|
|
error = g_strerror (errno);
|
|
|
|
#else
|
|
|
|
result = 0;
|
|
|
|
error = "no implementation";
|
|
|
|
#endif /* G_NATIVE_ATEXIT */
|
|
|
|
|
|
|
|
if (error)
|
|
|
|
g_error ("Could not register atexit() function: %s", error);
|
|
|
|
}
|
|
|
|
|
2000-10-09 18:24:57 +02:00
|
|
|
/* Based on execvp() from GNU Libc.
|
|
|
|
* Some of this code is cut-and-pasted into gspawn.c
|
|
|
|
*/
|
|
|
|
|
|
|
|
static gchar*
|
2005-02-02 07:07:14 +01:00
|
|
|
my_strchrnul (const gchar *str,
|
|
|
|
gchar c)
|
2000-10-09 18:24:57 +02:00
|
|
|
{
|
|
|
|
gchar *p = (gchar*)str;
|
|
|
|
while (*p && (*p != c))
|
|
|
|
++p;
|
|
|
|
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
2001-03-01 11:25:12 +01:00
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
|
2003-10-24 05:41:22 +02:00
|
|
|
static gchar *inner_find_program_in_path (const gchar *program);
|
2001-03-01 11:25:12 +01:00
|
|
|
|
|
|
|
gchar*
|
|
|
|
g_find_program_in_path (const gchar *program)
|
|
|
|
{
|
|
|
|
const gchar *last_dot = strrchr (program, '.');
|
|
|
|
|
2005-01-01 03:09:51 +01:00
|
|
|
if (last_dot == NULL ||
|
|
|
|
strchr (last_dot, '\\') != NULL ||
|
|
|
|
strchr (last_dot, '/') != NULL)
|
2001-03-01 11:25:12 +01:00
|
|
|
{
|
|
|
|
const gint program_length = strlen (program);
|
2005-01-01 03:09:51 +01:00
|
|
|
gchar *pathext = g_build_path (";",
|
|
|
|
".exe;.cmd;.bat;.com",
|
|
|
|
g_getenv ("PATHEXT"),
|
|
|
|
NULL);
|
|
|
|
gchar *p;
|
2001-03-01 11:25:12 +01:00
|
|
|
gchar *decorated_program;
|
|
|
|
gchar *retval;
|
|
|
|
|
|
|
|
p = pathext;
|
|
|
|
do
|
|
|
|
{
|
2005-01-01 03:09:51 +01:00
|
|
|
gchar *q = my_strchrnul (p, ';');
|
2001-03-01 11:25:12 +01:00
|
|
|
|
2005-01-01 03:09:51 +01:00
|
|
|
decorated_program = g_malloc (program_length + (q-p) + 1);
|
2001-03-01 11:25:12 +01:00
|
|
|
memcpy (decorated_program, program, program_length);
|
2005-01-01 03:09:51 +01:00
|
|
|
memcpy (decorated_program+program_length, p, q-p);
|
|
|
|
decorated_program [program_length + (q-p)] = '\0';
|
2001-03-01 11:25:12 +01:00
|
|
|
|
|
|
|
retval = inner_find_program_in_path (decorated_program);
|
|
|
|
g_free (decorated_program);
|
|
|
|
|
|
|
|
if (retval != NULL)
|
2005-01-01 03:09:51 +01:00
|
|
|
{
|
|
|
|
g_free (pathext);
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
p = q;
|
2001-03-01 11:25:12 +01:00
|
|
|
} while (*p++ != '\0');
|
2005-01-01 03:09:51 +01:00
|
|
|
g_free (pathext);
|
2001-03-01 11:25:12 +01:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return inner_find_program_in_path (program);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2000-10-09 18:24:57 +02:00
|
|
|
/**
|
|
|
|
* g_find_program_in_path:
|
2005-01-01 03:09:51 +01:00
|
|
|
* @program: a program name in the GLib file name encoding
|
2000-10-09 18:24:57 +02:00
|
|
|
*
|
2000-11-05 17:38:16 +01:00
|
|
|
* Locates the first executable named @program in the user's path, in the
|
2000-10-09 18:24:57 +02:00
|
|
|
* same way that execvp() would locate it. Returns an allocated string
|
2005-01-03 20:57:20 +01:00
|
|
|
* with the absolute path name, or %NULL if the program is not found in
|
2000-11-05 17:38:16 +01:00
|
|
|
* the path. If @program is already an absolute path, returns a copy of
|
2005-01-03 20:57:20 +01:00
|
|
|
* @program if @program exists and is executable, and %NULL otherwise.
|
|
|
|
*
|
2005-01-01 03:09:51 +01:00
|
|
|
* On Windows, if @program does not have a file type suffix, tries
|
|
|
|
* with the suffixes .exe, .cmd, .bat and .com, and the suffixes in
|
2005-03-07 14:49:24 +01:00
|
|
|
* the <envar>PATHEXT</envar> environment variable.
|
|
|
|
*
|
|
|
|
* On Windows, it looks for the file in the same way as CreateProcess()
|
2005-01-01 03:09:51 +01:00
|
|
|
* would. This means first in the directory where the executing
|
2001-03-01 11:25:12 +01:00
|
|
|
* program was loaded from, then in the current directory, then in the
|
|
|
|
* Windows 32-bit system directory, then in the Windows directory, and
|
2005-01-03 20:57:20 +01:00
|
|
|
* finally in the directories in the <envar>PATH</envar> environment
|
|
|
|
* variable. If the program is found, the return value contains the
|
|
|
|
* full name including the type suffix.
|
2001-03-01 11:25:12 +01:00
|
|
|
*
|
2005-01-03 20:57:20 +01:00
|
|
|
* Return value: absolute path, or %NULL
|
2000-10-09 18:24:57 +02:00
|
|
|
**/
|
2003-10-24 05:41:22 +02:00
|
|
|
#ifdef G_OS_WIN32
|
2005-01-01 03:09:51 +01:00
|
|
|
static gchar *
|
|
|
|
inner_find_program_in_path (const gchar *program)
|
|
|
|
#else
|
2000-10-09 18:24:57 +02:00
|
|
|
gchar*
|
2000-11-05 17:38:16 +01:00
|
|
|
g_find_program_in_path (const gchar *program)
|
2005-01-01 03:09:51 +01:00
|
|
|
#endif
|
2000-10-09 18:24:57 +02:00
|
|
|
{
|
2001-02-18 00:30:48 +01:00
|
|
|
const gchar *path, *p;
|
|
|
|
gchar *name, *freeme;
|
2001-03-01 10:34:45 +01:00
|
|
|
#ifdef G_OS_WIN32
|
2005-01-01 03:09:51 +01:00
|
|
|
const gchar *path_copy;
|
|
|
|
gchar *filename = NULL, *appdir = NULL;
|
|
|
|
gchar *sysdir = NULL, *windir = NULL;
|
2006-08-30 00:45:00 +02:00
|
|
|
int n;
|
|
|
|
wchar_t wfilename[MAXPATHLEN], wsysdir[MAXPATHLEN],
|
|
|
|
wwindir[MAXPATHLEN];
|
2001-03-01 10:34:45 +01:00
|
|
|
#endif
|
2006-12-28 05:48:06 +01:00
|
|
|
gsize len;
|
|
|
|
gsize pathlen;
|
2000-10-09 18:24:57 +02:00
|
|
|
|
2000-11-05 17:38:16 +01:00
|
|
|
g_return_val_if_fail (program != NULL, NULL);
|
2000-10-09 18:24:57 +02:00
|
|
|
|
2001-03-01 11:25:12 +01:00
|
|
|
/* If it is an absolute path, or a relative path including subdirectories,
|
|
|
|
* don't look in PATH.
|
|
|
|
*/
|
|
|
|
if (g_path_is_absolute (program)
|
2003-08-16 21:45:25 +02:00
|
|
|
|| strchr (program, G_DIR_SEPARATOR) != NULL
|
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
|| strchr (program, '/') != NULL
|
|
|
|
#endif
|
|
|
|
)
|
2000-10-09 18:24:57 +02:00
|
|
|
{
|
2005-01-03 20:57:20 +01:00
|
|
|
if (g_file_test (program, G_FILE_TEST_IS_EXECUTABLE) &&
|
|
|
|
!g_file_test (program, G_FILE_TEST_IS_DIR))
|
2000-11-05 17:38:16 +01:00
|
|
|
return g_strdup (program);
|
2000-10-09 18:24:57 +02:00
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
path = g_getenv ("PATH");
|
2005-06-30 21:43:48 +02:00
|
|
|
#if defined(G_OS_UNIX) || defined(G_OS_BEOS)
|
2000-10-09 18:24:57 +02:00
|
|
|
if (path == NULL)
|
|
|
|
{
|
|
|
|
/* There is no `PATH' in the environment. The default
|
2000-11-05 17:38:16 +01:00
|
|
|
* search path in GNU libc is the current directory followed by
|
2000-10-09 18:24:57 +02:00
|
|
|
* the path `confstr' returns for `_CS_PATH'.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* In GLib we put . last, for security, and don't use the
|
|
|
|
* unportable confstr(); UNIX98 does not actually specify
|
|
|
|
* what to search if PATH is unset. POSIX may, dunno.
|
|
|
|
*/
|
|
|
|
|
|
|
|
path = "/bin:/usr/bin:.";
|
|
|
|
}
|
2001-03-01 10:34:45 +01:00
|
|
|
#else
|
2006-08-30 00:45:00 +02:00
|
|
|
n = GetModuleFileNameW (NULL, wfilename, MAXPATHLEN);
|
|
|
|
if (n > 0 && n < MAXPATHLEN)
|
|
|
|
filename = g_utf16_to_utf8 (wfilename, -1, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
n = GetSystemDirectoryW (wsysdir, MAXPATHLEN);
|
|
|
|
if (n > 0 && n < MAXPATHLEN)
|
|
|
|
sysdir = g_utf16_to_utf8 (wsysdir, -1, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
n = GetWindowsDirectoryW (wwindir, MAXPATHLEN);
|
|
|
|
if (n > 0 && n < MAXPATHLEN)
|
|
|
|
windir = g_utf16_to_utf8 (wwindir, -1, NULL, NULL, NULL);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
|
|
|
if (filename)
|
|
|
|
{
|
|
|
|
appdir = g_path_get_dirname (filename);
|
|
|
|
g_free (filename);
|
|
|
|
}
|
|
|
|
|
|
|
|
path = g_strdup (path);
|
|
|
|
|
|
|
|
if (windir)
|
|
|
|
{
|
|
|
|
const gchar *tem = path;
|
|
|
|
path = g_strconcat (windir, ";", path, NULL);
|
|
|
|
g_free ((gchar *) tem);
|
|
|
|
g_free (windir);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sysdir)
|
|
|
|
{
|
|
|
|
const gchar *tem = path;
|
|
|
|
path = g_strconcat (sysdir, ";", path, NULL);
|
|
|
|
g_free ((gchar *) tem);
|
|
|
|
g_free (sysdir);
|
|
|
|
}
|
|
|
|
|
2001-03-01 10:34:45 +01:00
|
|
|
{
|
2005-01-01 03:09:51 +01:00
|
|
|
const gchar *tem = path;
|
|
|
|
path = g_strconcat (".;", path, NULL);
|
|
|
|
g_free ((gchar *) tem);
|
2001-03-01 10:34:45 +01:00
|
|
|
}
|
2005-01-01 03:09:51 +01:00
|
|
|
|
|
|
|
if (appdir)
|
|
|
|
{
|
|
|
|
const gchar *tem = path;
|
|
|
|
path = g_strconcat (appdir, ";", path, NULL);
|
|
|
|
g_free ((gchar *) tem);
|
|
|
|
g_free (appdir);
|
|
|
|
}
|
|
|
|
|
|
|
|
path_copy = path;
|
2001-03-01 10:34:45 +01:00
|
|
|
#endif
|
2000-10-09 18:24:57 +02:00
|
|
|
|
2000-11-05 17:38:16 +01:00
|
|
|
len = strlen (program) + 1;
|
2000-10-09 18:24:57 +02:00
|
|
|
pathlen = strlen (path);
|
|
|
|
freeme = name = g_malloc (pathlen + len + 1);
|
|
|
|
|
|
|
|
/* Copy the file name at the top, including '\0' */
|
2000-11-05 17:38:16 +01:00
|
|
|
memcpy (name + pathlen + 1, program, len);
|
2000-10-09 18:24:57 +02:00
|
|
|
name = name + pathlen;
|
|
|
|
/* And add the slash before the filename */
|
2001-03-01 10:34:45 +01:00
|
|
|
*name = G_DIR_SEPARATOR;
|
2000-10-09 18:24:57 +02:00
|
|
|
|
|
|
|
p = path;
|
|
|
|
do
|
|
|
|
{
|
|
|
|
char *startp;
|
|
|
|
|
|
|
|
path = p;
|
2001-03-01 10:34:45 +01:00
|
|
|
p = my_strchrnul (path, G_SEARCHPATH_SEPARATOR);
|
2000-10-09 18:24:57 +02:00
|
|
|
|
|
|
|
if (p == path)
|
|
|
|
/* Two adjacent colons, or a colon at the beginning or the end
|
|
|
|
* of `PATH' means to search the current directory.
|
|
|
|
*/
|
|
|
|
startp = name + 1;
|
|
|
|
else
|
|
|
|
startp = memcpy (name - (p - path), path, p - path);
|
|
|
|
|
2005-01-03 20:57:20 +01:00
|
|
|
if (g_file_test (startp, G_FILE_TEST_IS_EXECUTABLE) &&
|
|
|
|
!g_file_test (startp, G_FILE_TEST_IS_DIR))
|
2000-10-09 18:24:57 +02:00
|
|
|
{
|
|
|
|
gchar *ret;
|
|
|
|
ret = g_strdup (startp);
|
|
|
|
g_free (freeme);
|
2001-03-01 10:34:45 +01:00
|
|
|
#ifdef G_OS_WIN32
|
2005-01-01 03:09:51 +01:00
|
|
|
g_free ((gchar *) path_copy);
|
2001-03-01 10:34:45 +01:00
|
|
|
#endif
|
2000-10-09 18:24:57 +02:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
while (*p++ != '\0');
|
|
|
|
|
|
|
|
g_free (freeme);
|
2001-03-01 10:34:45 +01:00
|
|
|
#ifdef G_OS_WIN32
|
2005-01-01 03:09:51 +01:00
|
|
|
g_free ((gchar *) path_copy);
|
2001-03-01 10:34:45 +01:00
|
|
|
#endif
|
2000-10-09 18:24:57 +02:00
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2006-07-06 22:30:16 +02:00
|
|
|
static gboolean
|
|
|
|
debug_key_matches (const gchar *key,
|
|
|
|
const gchar *token,
|
|
|
|
guint length)
|
|
|
|
{
|
|
|
|
for (; length; length--, key++, token++)
|
|
|
|
{
|
|
|
|
char k = (*key == '_') ? '-' : tolower (*key );
|
|
|
|
char t = (*token == '_') ? '-' : tolower (*token);
|
|
|
|
|
|
|
|
if (k != t)
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return *key == '\0';
|
|
|
|
}
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_parse_debug_string:
|
2006-07-06 22:30:16 +02:00
|
|
|
* @string: a list of debug options separated by colons, spaces, or
|
2008-11-29 02:40:38 +01:00
|
|
|
* commas, or %NULL.
|
2005-02-02 07:07:14 +01:00
|
|
|
* @keys: pointer to an array of #GDebugKey which associate
|
|
|
|
* strings with bit flags.
|
|
|
|
* @nkeys: the number of #GDebugKey<!-- -->s in the array.
|
|
|
|
*
|
2006-07-06 22:30:16 +02:00
|
|
|
* Parses a string containing debugging options
|
|
|
|
* into a %guint containing bit flags. This is used
|
2005-02-02 07:07:14 +01:00
|
|
|
* within GDK and GTK+ to parse the debug options passed on the
|
|
|
|
* command line or through environment variables.
|
|
|
|
*
|
2008-11-29 02:40:38 +01:00
|
|
|
* If @string is equal to "all", all flags are set. If @string
|
|
|
|
* is equal to "help", all the available keys in @keys are printed
|
|
|
|
* out to standard error.
|
|
|
|
*
|
2005-02-02 07:07:14 +01:00
|
|
|
* Returns: the combined set of bit flags.
|
|
|
|
*/
|
1998-07-10 07:51:17 +02:00
|
|
|
guint
|
2001-04-16 17:04:17 +02:00
|
|
|
g_parse_debug_string (const gchar *string,
|
|
|
|
const GDebugKey *keys,
|
|
|
|
guint nkeys)
|
1998-06-11 01:21:14 +02:00
|
|
|
{
|
|
|
|
guint i;
|
|
|
|
guint result = 0;
|
1998-07-10 07:51:17 +02:00
|
|
|
|
2007-12-16 16:04:51 +01:00
|
|
|
if (string == NULL)
|
|
|
|
return 0;
|
2006-01-23 16:51:06 +01:00
|
|
|
|
|
|
|
/* this function is used by gmem.c/gslice.c initialization code,
|
|
|
|
* so introducing malloc dependencies here would require adaptions
|
|
|
|
* of those code portions.
|
|
|
|
*/
|
1998-07-10 07:51:17 +02:00
|
|
|
|
2001-06-30 18:54:33 +02:00
|
|
|
if (!g_ascii_strcasecmp (string, "all"))
|
1998-06-11 01:21:14 +02:00
|
|
|
{
|
|
|
|
for (i=0; i<nkeys; i++)
|
|
|
|
result |= keys[i].value;
|
|
|
|
}
|
2008-11-29 02:40:38 +01:00
|
|
|
else if (!g_ascii_strcasecmp (string, "help"))
|
|
|
|
{
|
|
|
|
/* using stdio directly for the reason stated above */
|
|
|
|
fprintf (stderr, "Supported debug values: ");
|
|
|
|
for (i=0; i<nkeys; i++)
|
|
|
|
fprintf (stderr, " %s", keys[i].key);
|
|
|
|
fprintf (stderr, "\n");
|
|
|
|
}
|
1998-06-11 01:21:14 +02:00
|
|
|
else
|
|
|
|
{
|
2001-05-14 16:53:59 +02:00
|
|
|
const gchar *p = string;
|
|
|
|
const gchar *q;
|
1998-07-10 07:51:17 +02:00
|
|
|
|
2006-03-14 18:56:27 +01:00
|
|
|
while (*p)
|
1998-06-11 01:21:14 +02:00
|
|
|
{
|
2006-07-06 22:30:16 +02:00
|
|
|
q = strpbrk (p, ":;, \t");
|
1998-06-11 01:21:14 +02:00
|
|
|
if (!q)
|
2006-03-14 18:56:27 +01:00
|
|
|
q = p + strlen(p);
|
1998-07-10 07:51:17 +02:00
|
|
|
|
2006-03-14 18:56:27 +01:00
|
|
|
for (i = 0; i < nkeys; i++)
|
2006-07-06 22:30:16 +02:00
|
|
|
if (debug_key_matches (keys[i].key, p, q - p))
|
1998-06-11 01:21:14 +02:00
|
|
|
result |= keys[i].value;
|
1998-07-10 07:51:17 +02:00
|
|
|
|
2006-03-14 18:56:27 +01:00
|
|
|
p = q;
|
2006-07-06 22:30:16 +02:00
|
|
|
if (*p)
|
2006-03-14 18:56:27 +01:00
|
|
|
p++;
|
1998-06-11 01:21:14 +02:00
|
|
|
}
|
|
|
|
}
|
1998-07-10 07:51:17 +02:00
|
|
|
|
1998-06-11 01:21:14 +02:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2002-11-28 21:46:29 +01:00
|
|
|
/**
|
|
|
|
* g_basename:
|
|
|
|
* @file_name: the name of the file.
|
|
|
|
*
|
|
|
|
* Gets the name of the file without any leading directory components.
|
|
|
|
* It returns a pointer into the given file name string.
|
|
|
|
*
|
|
|
|
* Return value: the name of the file without any leading directory components.
|
|
|
|
*
|
2005-12-05 16:38:54 +01:00
|
|
|
* Deprecated:2.2: Use g_path_get_basename() instead, but notice that
|
2003-06-19 01:12:56 +02:00
|
|
|
* g_path_get_basename() allocates new memory for the returned string, unlike
|
|
|
|
* this function which returns a pointer into the argument.
|
2002-11-28 21:46:29 +01:00
|
|
|
**/
|
2001-02-18 00:30:48 +01:00
|
|
|
G_CONST_RETURN gchar*
|
1998-07-10 07:51:17 +02:00
|
|
|
g_basename (const gchar *file_name)
|
|
|
|
{
|
|
|
|
register gchar *base;
|
|
|
|
|
|
|
|
g_return_val_if_fail (file_name != NULL, NULL);
|
|
|
|
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
base = strrchr (file_name, G_DIR_SEPARATOR);
|
2003-08-16 21:45:25 +02:00
|
|
|
|
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
{
|
|
|
|
gchar *q = strrchr (file_name, '/');
|
|
|
|
if (base == NULL || (q != NULL && q > base))
|
|
|
|
base = q;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
1998-07-10 07:51:17 +02:00
|
|
|
if (base)
|
|
|
|
return base + 1;
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
|
1999-10-04 04:32:50 +02:00
|
|
|
#ifdef G_OS_WIN32
|
2001-06-30 18:54:33 +02:00
|
|
|
if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
return (gchar*) file_name + 2;
|
1999-10-04 04:32:50 +02:00
|
|
|
#endif /* G_OS_WIN32 */
|
1998-07-10 07:51:17 +02:00
|
|
|
|
|
|
|
return (gchar*) file_name;
|
|
|
|
}
|
|
|
|
|
2003-06-19 01:12:56 +02:00
|
|
|
/**
|
|
|
|
* g_path_get_basename:
|
|
|
|
* @file_name: the name of the file.
|
|
|
|
*
|
|
|
|
* Gets the last component of the filename. If @file_name ends with a
|
|
|
|
* directory separator it gets the component before the last slash. If
|
|
|
|
* @file_name consists only of directory separators (and on Windows,
|
|
|
|
* possibly a drive letter), a single separator is returned. If
|
|
|
|
* @file_name is empty, it gets ".".
|
|
|
|
*
|
|
|
|
* Return value: a newly allocated string containing the last component of
|
|
|
|
* the filename.
|
|
|
|
*/
|
2000-07-20 18:58:54 +02:00
|
|
|
gchar*
|
|
|
|
g_path_get_basename (const gchar *file_name)
|
|
|
|
{
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
register gssize base;
|
|
|
|
register gssize last_nonslash;
|
|
|
|
gsize len;
|
2000-07-20 18:58:54 +02:00
|
|
|
gchar *retval;
|
|
|
|
|
|
|
|
g_return_val_if_fail (file_name != NULL, NULL);
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
|
2000-07-20 18:58:54 +02:00
|
|
|
if (file_name[0] == '\0')
|
|
|
|
/* empty string */
|
|
|
|
return g_strdup (".");
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
|
2000-07-20 18:58:54 +02:00
|
|
|
last_nonslash = strlen (file_name) - 1;
|
|
|
|
|
2003-08-16 21:45:25 +02:00
|
|
|
while (last_nonslash >= 0 && G_IS_DIR_SEPARATOR (file_name [last_nonslash]))
|
2000-07-20 18:58:54 +02:00
|
|
|
last_nonslash--;
|
|
|
|
|
|
|
|
if (last_nonslash == -1)
|
|
|
|
/* string only containing slashes */
|
|
|
|
return g_strdup (G_DIR_SEPARATOR_S);
|
|
|
|
|
|
|
|
#ifdef G_OS_WIN32
|
2001-06-30 18:54:33 +02:00
|
|
|
if (last_nonslash == 1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
|
2000-07-20 18:58:54 +02:00
|
|
|
/* string only containing slashes and a drive */
|
|
|
|
return g_strdup (G_DIR_SEPARATOR_S);
|
|
|
|
#endif /* G_OS_WIN32 */
|
|
|
|
|
|
|
|
base = last_nonslash;
|
|
|
|
|
2003-08-16 21:45:25 +02:00
|
|
|
while (base >=0 && !G_IS_DIR_SEPARATOR (file_name [base]))
|
2000-07-20 18:58:54 +02:00
|
|
|
base--;
|
|
|
|
|
|
|
|
#ifdef G_OS_WIN32
|
2001-06-30 18:54:33 +02:00
|
|
|
if (base == -1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
|
2000-07-20 18:58:54 +02:00
|
|
|
base = 1;
|
|
|
|
#endif /* G_OS_WIN32 */
|
|
|
|
|
|
|
|
len = last_nonslash - base;
|
|
|
|
retval = g_malloc (len + 1);
|
|
|
|
memcpy (retval, file_name + base + 1, len);
|
|
|
|
retval [len] = '\0';
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_path_is_absolute:
|
|
|
|
* @file_name: a file name.
|
|
|
|
*
|
|
|
|
* Returns %TRUE if the given @file_name is an absolute file name,
|
|
|
|
* i.e. it contains a full path from the root directory such as "/usr/local"
|
|
|
|
* on UNIX or "C:\windows" on Windows systems.
|
|
|
|
*
|
|
|
|
* Returns: %TRUE if @file_name is an absolute path.
|
|
|
|
*/
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
gboolean
|
|
|
|
g_path_is_absolute (const gchar *file_name)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (file_name != NULL, FALSE);
|
|
|
|
|
2003-08-16 21:45:25 +02:00
|
|
|
if (G_IS_DIR_SEPARATOR (file_name[0]))
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
return TRUE;
|
|
|
|
|
1999-10-04 04:32:50 +02:00
|
|
|
#ifdef G_OS_WIN32
|
2001-03-09 22:31:21 +01:00
|
|
|
/* Recognize drive letter on native Windows */
|
2005-02-02 07:07:14 +01:00
|
|
|
if (g_ascii_isalpha (file_name[0]) &&
|
|
|
|
file_name[1] == ':' && G_IS_DIR_SEPARATOR (file_name[2]))
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
return TRUE;
|
2001-03-09 22:31:21 +01:00
|
|
|
#endif /* G_OS_WIN32 */
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_path_skip_root:
|
|
|
|
* @file_name: a file name.
|
|
|
|
*
|
|
|
|
* Returns a pointer into @file_name after the root component, i.e. after
|
|
|
|
* the "/" in UNIX or "C:\" under Windows. If @file_name is not an absolute
|
|
|
|
* path it returns %NULL.
|
|
|
|
*
|
|
|
|
* Returns: a pointer into @file_name after the root component.
|
|
|
|
*/
|
2001-02-18 00:30:48 +01:00
|
|
|
G_CONST_RETURN gchar*
|
|
|
|
g_path_skip_root (const gchar *file_name)
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
{
|
|
|
|
g_return_val_if_fail (file_name != NULL, NULL);
|
|
|
|
|
2001-03-09 22:31:21 +01:00
|
|
|
#ifdef G_PLATFORM_WIN32
|
2003-08-16 21:45:25 +02:00
|
|
|
/* Skip \\server\share or //server/share */
|
|
|
|
if (G_IS_DIR_SEPARATOR (file_name[0]) &&
|
|
|
|
G_IS_DIR_SEPARATOR (file_name[1]) &&
|
2004-12-30 03:00:49 +01:00
|
|
|
file_name[2] &&
|
|
|
|
!G_IS_DIR_SEPARATOR (file_name[2]))
|
2001-01-05 21:19:37 +01:00
|
|
|
{
|
2001-03-09 22:31:21 +01:00
|
|
|
gchar *p;
|
2001-01-05 21:19:37 +01:00
|
|
|
|
2003-08-16 21:45:25 +02:00
|
|
|
p = strchr (file_name + 2, G_DIR_SEPARATOR);
|
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
{
|
|
|
|
gchar *q = strchr (file_name + 2, '/');
|
|
|
|
if (p == NULL || (q != NULL && q < p))
|
|
|
|
p = q;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
if (p &&
|
|
|
|
p > file_name + 2 &&
|
2001-01-05 21:19:37 +01:00
|
|
|
p[1])
|
|
|
|
{
|
|
|
|
file_name = p + 1;
|
|
|
|
|
2003-08-16 21:45:25 +02:00
|
|
|
while (file_name[0] && !G_IS_DIR_SEPARATOR (file_name[0]))
|
2001-01-05 21:19:37 +01:00
|
|
|
file_name++;
|
|
|
|
|
|
|
|
/* Possibly skip a backslash after the share name */
|
2003-08-16 21:45:25 +02:00
|
|
|
if (G_IS_DIR_SEPARATOR (file_name[0]))
|
2001-01-05 21:19:37 +01:00
|
|
|
file_name++;
|
|
|
|
|
2001-02-18 00:30:48 +01:00
|
|
|
return (gchar *)file_name;
|
2001-01-05 21:19:37 +01:00
|
|
|
}
|
|
|
|
}
|
2001-01-05 20:30:13 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Skip initial slashes */
|
2003-08-16 21:45:25 +02:00
|
|
|
if (G_IS_DIR_SEPARATOR (file_name[0]))
|
2001-01-05 20:30:13 +01:00
|
|
|
{
|
2003-08-16 21:45:25 +02:00
|
|
|
while (G_IS_DIR_SEPARATOR (file_name[0]))
|
2001-01-05 20:30:13 +01:00
|
|
|
file_name++;
|
2001-02-18 00:30:48 +01:00
|
|
|
return (gchar *)file_name;
|
2001-01-05 20:30:13 +01:00
|
|
|
}
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
|
1999-10-04 04:32:50 +02:00
|
|
|
#ifdef G_OS_WIN32
|
2001-01-05 20:30:13 +01:00
|
|
|
/* Skip X:\ */
|
2003-08-16 21:45:25 +02:00
|
|
|
if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':' && G_IS_DIR_SEPARATOR (file_name[2]))
|
2001-02-18 00:30:48 +01:00
|
|
|
return (gchar *)file_name + 3;
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_path_get_dirname:
|
|
|
|
* @file_name: the name of the file.
|
|
|
|
*
|
|
|
|
* Gets the directory components of a file name. If the file name has no
|
|
|
|
* directory components "." is returned. The returned string should be
|
|
|
|
* freed when no longer needed.
|
|
|
|
*
|
|
|
|
* Returns: the directory components of the file.
|
|
|
|
*/
|
1998-07-14 09:39:07 +02:00
|
|
|
gchar*
|
2000-07-20 18:58:54 +02:00
|
|
|
g_path_get_dirname (const gchar *file_name)
|
1998-07-14 09:39:07 +02:00
|
|
|
{
|
|
|
|
register gchar *base;
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
register gsize len;
|
1998-07-14 09:39:07 +02:00
|
|
|
|
|
|
|
g_return_val_if_fail (file_name != NULL, NULL);
|
|
|
|
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
base = strrchr (file_name, G_DIR_SEPARATOR);
|
2003-08-16 21:45:25 +02:00
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
{
|
|
|
|
gchar *q = strrchr (file_name, '/');
|
|
|
|
if (base == NULL || (q != NULL && q > base))
|
|
|
|
base = q;
|
|
|
|
}
|
|
|
|
#endif
|
1998-07-14 09:39:07 +02:00
|
|
|
if (!base)
|
2004-03-21 22:43:13 +01:00
|
|
|
{
|
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
|
|
|
|
{
|
|
|
|
gchar drive_colon_dot[4];
|
|
|
|
|
|
|
|
drive_colon_dot[0] = file_name[0];
|
|
|
|
drive_colon_dot[1] = ':';
|
|
|
|
drive_colon_dot[2] = '.';
|
|
|
|
drive_colon_dot[3] = '\0';
|
|
|
|
|
|
|
|
return g_strdup (drive_colon_dot);
|
|
|
|
}
|
|
|
|
#endif
|
1998-07-14 09:39:07 +02:00
|
|
|
return g_strdup (".");
|
2004-03-21 22:43:13 +01:00
|
|
|
}
|
|
|
|
|
2003-08-16 21:45:25 +02:00
|
|
|
while (base > file_name && G_IS_DIR_SEPARATOR (*base))
|
1998-07-14 09:39:07 +02:00
|
|
|
base--;
|
2004-03-21 22:43:13 +01:00
|
|
|
|
|
|
|
#ifdef G_OS_WIN32
|
2004-12-30 03:00:49 +01:00
|
|
|
/* base points to the char before the last slash.
|
|
|
|
*
|
|
|
|
* In case file_name is the root of a drive (X:\) or a child of the
|
|
|
|
* root of a drive (X:\foo), include the slash.
|
|
|
|
*
|
|
|
|
* In case file_name is the root share of an UNC path
|
|
|
|
* (\\server\share), add a slash, returning \\server\share\ .
|
|
|
|
*
|
|
|
|
* In case file_name is a direct child of a share in an UNC path
|
|
|
|
* (\\server\share\foo), include the slash after the share name,
|
|
|
|
* returning \\server\share\ .
|
|
|
|
*/
|
2004-03-21 22:43:13 +01:00
|
|
|
if (base == file_name + 1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
|
2004-12-30 03:00:49 +01:00
|
|
|
base++;
|
|
|
|
else if (G_IS_DIR_SEPARATOR (file_name[0]) &&
|
|
|
|
G_IS_DIR_SEPARATOR (file_name[1]) &&
|
|
|
|
file_name[2] &&
|
|
|
|
!G_IS_DIR_SEPARATOR (file_name[2]) &&
|
|
|
|
base >= file_name + 2)
|
|
|
|
{
|
|
|
|
const gchar *p = file_name + 2;
|
|
|
|
while (*p && !G_IS_DIR_SEPARATOR (*p))
|
|
|
|
p++;
|
|
|
|
if (p == base + 1)
|
|
|
|
{
|
|
|
|
len = (guint) strlen (file_name) + 1;
|
|
|
|
base = g_new (gchar, len + 1);
|
|
|
|
strcpy (base, file_name);
|
|
|
|
base[len-1] = G_DIR_SEPARATOR;
|
|
|
|
base[len] = 0;
|
|
|
|
return base;
|
|
|
|
}
|
|
|
|
if (G_IS_DIR_SEPARATOR (*p))
|
|
|
|
{
|
|
|
|
p++;
|
|
|
|
while (*p && !G_IS_DIR_SEPARATOR (*p))
|
|
|
|
p++;
|
|
|
|
if (p == base + 1)
|
|
|
|
base++;
|
|
|
|
}
|
|
|
|
}
|
2004-03-21 22:43:13 +01:00
|
|
|
#endif
|
|
|
|
|
1998-07-14 09:39:07 +02:00
|
|
|
len = (guint) 1 + base - file_name;
|
1998-07-25 05:03:01 +02:00
|
|
|
|
1998-07-14 09:39:07 +02:00
|
|
|
base = g_new (gchar, len + 1);
|
|
|
|
g_memmove (base, file_name, len);
|
|
|
|
base[len] = 0;
|
1998-07-25 05:03:01 +02:00
|
|
|
|
1998-07-14 09:39:07 +02:00
|
|
|
return base;
|
|
|
|
}
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_get_current_dir:
|
|
|
|
*
|
|
|
|
* Gets the current directory.
|
|
|
|
* The returned string should be freed when no longer needed. The encoding
|
|
|
|
* of the returned string is system defined. On Windows, it is always UTF-8.
|
|
|
|
*
|
|
|
|
* Returns: the current directory.
|
|
|
|
*/
|
1998-07-10 07:51:17 +02:00
|
|
|
gchar*
|
version bump to 1.1.1, binary age 1, interface age 0. updates. updates.
Tue Aug 4 15:17:54 1998 Tim Janik <timj@gtk.org>
* configure.in: version bump to 1.1.1, binary age 1, interface age 0.
* NEWS: updates.
* README: updates.
* INSTALL: updates and fixes.
* COPYING: include the GNU LGPL, rather than shipping an empty file.
* AUTHORS: listed original authors here, and added people who made
significant improvements to glib.
* glib.h:
* gutils.c: implement g_get_current_dir() which returns a newly
allocated string, instead of a g_getcwd() variant that operates
on a static buffer.
export glib_interface_age and glib_binary_age.
as a convenience, macro definitions have been added for
g_node_insert_data, g_node_insert_data_before, g_node_append_data and
g_node_prepend_data.
* testglib.c: minor cleanups, print current dir.
1998-08-04 16:26:27 +02:00
|
|
|
g_get_current_dir (void)
|
1998-07-10 07:51:17 +02:00
|
|
|
{
|
2004-12-30 18:48:23 +01:00
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
|
2000-03-21 16:21:41 +01:00
|
|
|
gchar *dir = NULL;
|
2006-08-30 00:45:00 +02:00
|
|
|
wchar_t dummy[2], *wdir;
|
|
|
|
int len;
|
2000-09-28 09:35:02 +02:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
len = GetCurrentDirectoryW (2, dummy);
|
|
|
|
wdir = g_new (wchar_t, len);
|
2004-12-30 18:48:23 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
if (GetCurrentDirectoryW (len, wdir) == len - 1)
|
|
|
|
dir = g_utf16_to_utf8 (wdir, -1, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
g_free (wdir);
|
2004-12-30 03:00:49 +01:00
|
|
|
|
2004-12-30 18:48:23 +01:00
|
|
|
if (dir == NULL)
|
|
|
|
dir = g_strdup ("\\");
|
|
|
|
|
2004-12-30 03:00:49 +01:00
|
|
|
return dir;
|
2004-12-30 18:48:23 +01:00
|
|
|
|
2004-12-30 03:00:49 +01:00
|
|
|
#else
|
2004-12-30 18:48:23 +01:00
|
|
|
|
|
|
|
gchar *buffer = NULL;
|
|
|
|
gchar *dir = NULL;
|
|
|
|
static gulong max_len = 0;
|
|
|
|
|
|
|
|
if (max_len == 0)
|
|
|
|
max_len = (G_PATH_LENGTH == -1) ? 2048 : G_PATH_LENGTH;
|
|
|
|
|
1998-07-10 07:51:17 +02:00
|
|
|
/* We don't use getcwd(3) on SUNOS, because, it does a popen("pwd")
|
|
|
|
* and, if that wasn't bad enough, hangs in doing so.
|
|
|
|
*/
|
2000-09-19 16:30:35 +02:00
|
|
|
#if (defined (sun) && !defined (__SVR4)) || !defined(HAVE_GETCWD)
|
2000-03-20 17:01:41 +01:00
|
|
|
buffer = g_new (gchar, max_len + 1);
|
|
|
|
*buffer = 0;
|
version bump to 1.1.1, binary age 1, interface age 0. updates. updates.
Tue Aug 4 15:17:54 1998 Tim Janik <timj@gtk.org>
* configure.in: version bump to 1.1.1, binary age 1, interface age 0.
* NEWS: updates.
* README: updates.
* INSTALL: updates and fixes.
* COPYING: include the GNU LGPL, rather than shipping an empty file.
* AUTHORS: listed original authors here, and added people who made
significant improvements to glib.
* glib.h:
* gutils.c: implement g_get_current_dir() which returns a newly
allocated string, instead of a g_getcwd() variant that operates
on a static buffer.
export glib_interface_age and glib_binary_age.
as a convenience, macro definitions have been added for
g_node_insert_data, g_node_insert_data_before, g_node_append_data and
g_node_prepend_data.
* testglib.c: minor cleanups, print current dir.
1998-08-04 16:26:27 +02:00
|
|
|
dir = getwd (buffer);
|
2000-09-19 16:30:35 +02:00
|
|
|
#else /* !sun || !HAVE_GETCWD */
|
2000-03-22 16:18:11 +01:00
|
|
|
while (max_len < G_MAXULONG / 2)
|
2000-03-20 17:01:41 +01:00
|
|
|
{
|
2007-06-18 18:35:41 +02:00
|
|
|
g_free (buffer);
|
2000-03-20 17:01:41 +01:00
|
|
|
buffer = g_new (gchar, max_len + 1);
|
|
|
|
*buffer = 0;
|
|
|
|
dir = getcwd (buffer, max_len);
|
|
|
|
|
|
|
|
if (dir || errno != ERANGE)
|
|
|
|
break;
|
|
|
|
|
|
|
|
max_len *= 2;
|
|
|
|
}
|
2000-09-19 16:30:35 +02:00
|
|
|
#endif /* !sun || !HAVE_GETCWD */
|
1998-07-10 07:51:17 +02:00
|
|
|
|
version bump to 1.1.1, binary age 1, interface age 0. updates. updates.
Tue Aug 4 15:17:54 1998 Tim Janik <timj@gtk.org>
* configure.in: version bump to 1.1.1, binary age 1, interface age 0.
* NEWS: updates.
* README: updates.
* INSTALL: updates and fixes.
* COPYING: include the GNU LGPL, rather than shipping an empty file.
* AUTHORS: listed original authors here, and added people who made
significant improvements to glib.
* glib.h:
* gutils.c: implement g_get_current_dir() which returns a newly
allocated string, instead of a g_getcwd() variant that operates
on a static buffer.
export glib_interface_age and glib_binary_age.
as a convenience, macro definitions have been added for
g_node_insert_data, g_node_insert_data_before, g_node_append_data and
g_node_prepend_data.
* testglib.c: minor cleanups, print current dir.
1998-08-04 16:26:27 +02:00
|
|
|
if (!dir || !*buffer)
|
1998-07-10 07:51:17 +02:00
|
|
|
{
|
version bump to 1.1.1, binary age 1, interface age 0. updates. updates.
Tue Aug 4 15:17:54 1998 Tim Janik <timj@gtk.org>
* configure.in: version bump to 1.1.1, binary age 1, interface age 0.
* NEWS: updates.
* README: updates.
* INSTALL: updates and fixes.
* COPYING: include the GNU LGPL, rather than shipping an empty file.
* AUTHORS: listed original authors here, and added people who made
significant improvements to glib.
* glib.h:
* gutils.c: implement g_get_current_dir() which returns a newly
allocated string, instead of a g_getcwd() variant that operates
on a static buffer.
export glib_interface_age and glib_binary_age.
as a convenience, macro definitions have been added for
g_node_insert_data, g_node_insert_data_before, g_node_append_data and
g_node_prepend_data.
* testglib.c: minor cleanups, print current dir.
1998-08-04 16:26:27 +02:00
|
|
|
/* hm, should we g_error() out here?
|
|
|
|
* this can happen if e.g. "./" has mode \0000
|
1998-07-10 07:51:17 +02:00
|
|
|
*/
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
buffer[0] = G_DIR_SEPARATOR;
|
version bump to 1.1.1, binary age 1, interface age 0. updates. updates.
Tue Aug 4 15:17:54 1998 Tim Janik <timj@gtk.org>
* configure.in: version bump to 1.1.1, binary age 1, interface age 0.
* NEWS: updates.
* README: updates.
* INSTALL: updates and fixes.
* COPYING: include the GNU LGPL, rather than shipping an empty file.
* AUTHORS: listed original authors here, and added people who made
significant improvements to glib.
* glib.h:
* gutils.c: implement g_get_current_dir() which returns a newly
allocated string, instead of a g_getcwd() variant that operates
on a static buffer.
export glib_interface_age and glib_binary_age.
as a convenience, macro definitions have been added for
g_node_insert_data, g_node_insert_data_before, g_node_append_data and
g_node_prepend_data.
* testglib.c: minor cleanups, print current dir.
1998-08-04 16:26:27 +02:00
|
|
|
buffer[1] = 0;
|
1998-07-10 07:51:17 +02:00
|
|
|
}
|
version bump to 1.1.1, binary age 1, interface age 0. updates. updates.
Tue Aug 4 15:17:54 1998 Tim Janik <timj@gtk.org>
* configure.in: version bump to 1.1.1, binary age 1, interface age 0.
* NEWS: updates.
* README: updates.
* INSTALL: updates and fixes.
* COPYING: include the GNU LGPL, rather than shipping an empty file.
* AUTHORS: listed original authors here, and added people who made
significant improvements to glib.
* glib.h:
* gutils.c: implement g_get_current_dir() which returns a newly
allocated string, instead of a g_getcwd() variant that operates
on a static buffer.
export glib_interface_age and glib_binary_age.
as a convenience, macro definitions have been added for
g_node_insert_data, g_node_insert_data_before, g_node_append_data and
g_node_prepend_data.
* testglib.c: minor cleanups, print current dir.
1998-08-04 16:26:27 +02:00
|
|
|
|
|
|
|
dir = g_strdup (buffer);
|
|
|
|
g_free (buffer);
|
1998-07-10 07:51:17 +02:00
|
|
|
|
version bump to 1.1.1, binary age 1, interface age 0. updates. updates.
Tue Aug 4 15:17:54 1998 Tim Janik <timj@gtk.org>
* configure.in: version bump to 1.1.1, binary age 1, interface age 0.
* NEWS: updates.
* README: updates.
* INSTALL: updates and fixes.
* COPYING: include the GNU LGPL, rather than shipping an empty file.
* AUTHORS: listed original authors here, and added people who made
significant improvements to glib.
* glib.h:
* gutils.c: implement g_get_current_dir() which returns a newly
allocated string, instead of a g_getcwd() variant that operates
on a static buffer.
export glib_interface_age and glib_binary_age.
as a convenience, macro definitions have been added for
g_node_insert_data, g_node_insert_data_before, g_node_append_data and
g_node_prepend_data.
* testglib.c: minor cleanups, print current dir.
1998-08-04 16:26:27 +02:00
|
|
|
return dir;
|
2004-12-30 03:00:49 +01:00
|
|
|
#endif /* !Win32 */
|
1998-07-10 07:51:17 +02:00
|
|
|
}
|
|
|
|
|
2003-07-30 21:00:36 +02:00
|
|
|
/**
|
|
|
|
* g_getenv:
|
2005-01-01 03:09:51 +01:00
|
|
|
* @variable: the environment variable to get, in the GLib file name encoding.
|
2003-07-30 21:00:36 +02:00
|
|
|
*
|
2005-01-01 03:09:51 +01:00
|
|
|
* Returns the value of an environment variable. The name and value
|
2005-02-02 07:07:14 +01:00
|
|
|
* are in the GLib file name encoding. On UNIX, this means the actual
|
2005-01-01 03:09:51 +01:00
|
|
|
* bytes which might or might not be in some consistent character set
|
|
|
|
* and encoding. On Windows, it is in UTF-8. On Windows, in case the
|
|
|
|
* environment variable's value contains references to other
|
|
|
|
* environment variables, they are expanded.
|
2003-07-30 21:00:36 +02:00
|
|
|
*
|
2005-01-01 03:09:51 +01:00
|
|
|
* Return value: the value of the environment variable, or %NULL if
|
|
|
|
* the environment variable is not found. The returned string may be
|
|
|
|
* overwritten by the next call to g_getenv(), g_setenv() or
|
|
|
|
* g_unsetenv().
|
2003-07-30 21:00:36 +02:00
|
|
|
**/
|
2001-02-18 00:30:48 +01:00
|
|
|
G_CONST_RETURN gchar*
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
g_getenv (const gchar *variable)
|
|
|
|
{
|
1999-10-04 04:32:50 +02:00
|
|
|
#ifndef G_OS_WIN32
|
2005-01-01 03:09:51 +01:00
|
|
|
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
g_return_val_if_fail (variable != NULL, NULL);
|
|
|
|
|
|
|
|
return getenv (variable);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
|
|
|
#else /* G_OS_WIN32 */
|
|
|
|
|
2003-08-10 10:04:10 +02:00
|
|
|
GQuark quark;
|
2005-01-01 03:09:51 +01:00
|
|
|
gchar *value;
|
2006-08-30 00:45:00 +02:00
|
|
|
wchar_t dummy[2], *wname, *wvalue;
|
|
|
|
int len;
|
1998-10-27 07:58:33 +01:00
|
|
|
|
|
|
|
g_return_val_if_fail (variable != NULL, NULL);
|
2005-01-01 03:09:51 +01:00
|
|
|
g_return_val_if_fail (g_utf8_validate (variable, -1, NULL), NULL);
|
2003-08-10 10:04:10 +02:00
|
|
|
|
|
|
|
/* On Windows NT, it is relatively typical that environment
|
|
|
|
* variables contain references to other environment variables. If
|
2005-01-01 03:09:51 +01:00
|
|
|
* so, use ExpandEnvironmentStrings(). (In an ideal world, such
|
|
|
|
* environment variables would be stored in the Registry as
|
|
|
|
* REG_EXPAND_SZ type values, and would then get automatically
|
|
|
|
* expanded before a program sees them. But there is broken software
|
|
|
|
* that stores environment variables as REG_SZ values even if they
|
|
|
|
* contain references to other environment variables.)
|
2000-04-19 10:43:52 +02:00
|
|
|
*/
|
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
len = GetEnvironmentVariableW (wname, dummy, 2);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
if (len == 0)
|
|
|
|
{
|
|
|
|
g_free (wname);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
else if (len == 1)
|
|
|
|
len = 2;
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
wvalue = g_new (wchar_t, len);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
if (GetEnvironmentVariableW (wname, wvalue, len) != len - 1)
|
|
|
|
{
|
2005-01-01 03:09:51 +01:00
|
|
|
g_free (wname);
|
|
|
|
g_free (wvalue);
|
2006-08-30 00:45:00 +02:00
|
|
|
return NULL;
|
2003-08-10 10:04:10 +02:00
|
|
|
}
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
if (wcschr (wvalue, L'%') != NULL)
|
|
|
|
{
|
|
|
|
wchar_t *tem = wvalue;
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
len = ExpandEnvironmentStringsW (wvalue, dummy, 2);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
if (len > 0)
|
2005-01-01 03:09:51 +01:00
|
|
|
{
|
2006-08-30 00:45:00 +02:00
|
|
|
wvalue = g_new (wchar_t, len);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
if (ExpandEnvironmentStringsW (tem, wvalue, len) != len)
|
2005-01-01 03:09:51 +01:00
|
|
|
{
|
2006-08-30 00:45:00 +02:00
|
|
|
g_free (wvalue);
|
|
|
|
wvalue = tem;
|
2005-01-01 03:09:51 +01:00
|
|
|
}
|
2006-08-30 00:45:00 +02:00
|
|
|
else
|
|
|
|
g_free (tem);
|
2005-01-01 03:09:51 +01:00
|
|
|
}
|
2006-08-30 00:45:00 +02:00
|
|
|
}
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
value = g_utf16_to_utf8 (wvalue, -1, NULL, NULL, NULL);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
g_free (wname);
|
|
|
|
g_free (wvalue);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
|
|
|
quark = g_quark_from_string (value);
|
|
|
|
g_free (value);
|
2003-08-10 10:04:10 +02:00
|
|
|
|
|
|
|
return g_quark_to_string (quark);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
|
|
|
#endif /* G_OS_WIN32 */
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
}
|
|
|
|
|
2006-01-23 16:51:06 +01:00
|
|
|
/* _g_getenv_nomalloc
|
|
|
|
* this function does a getenv() without doing any kind of allocation
|
|
|
|
* through glib. it's suitable for chars <= 127 only (both, for the
|
|
|
|
* variable name and the contents) and for contents < 1024 chars in
|
|
|
|
* length. also, it aliases "" to a NULL return value.
|
|
|
|
**/
|
|
|
|
const gchar*
|
|
|
|
_g_getenv_nomalloc (const gchar *variable,
|
|
|
|
gchar buffer[1024])
|
|
|
|
{
|
|
|
|
const gchar *retval = getenv (variable);
|
|
|
|
if (retval && retval[0])
|
|
|
|
{
|
|
|
|
gint l = strlen (retval);
|
|
|
|
if (l < 1024)
|
|
|
|
{
|
|
|
|
strncpy (buffer, retval, l);
|
|
|
|
buffer[l] = 0;
|
|
|
|
return buffer;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2003-07-28 21:24:22 +02:00
|
|
|
/**
|
|
|
|
* g_setenv:
|
2003-08-07 23:51:38 +02:00
|
|
|
* @variable: the environment variable to set, must not contain '='.
|
2003-07-28 21:24:22 +02:00
|
|
|
* @value: the value for to set the variable to.
|
|
|
|
* @overwrite: whether to change the variable if it already exists.
|
|
|
|
*
|
2005-01-01 03:09:51 +01:00
|
|
|
* Sets an environment variable. Both the variable's name and value
|
2005-02-02 07:07:14 +01:00
|
|
|
* should be in the GLib file name encoding. On UNIX, this means that
|
2005-01-01 03:09:51 +01:00
|
|
|
* they can be any sequence of bytes. On Windows, they should be in
|
|
|
|
* UTF-8.
|
2003-07-28 21:24:22 +02:00
|
|
|
*
|
2005-01-03 05:21:24 +01:00
|
|
|
* Note that on some systems, when variables are overwritten, the memory
|
|
|
|
* used for the previous variables and its value isn't reclaimed.
|
2003-07-28 21:24:22 +02:00
|
|
|
*
|
|
|
|
* Returns: %FALSE if the environment variable couldn't be set.
|
|
|
|
*
|
|
|
|
* Since: 2.4
|
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
g_setenv (const gchar *variable,
|
|
|
|
const gchar *value,
|
|
|
|
gboolean overwrite)
|
|
|
|
{
|
2005-01-01 03:09:51 +01:00
|
|
|
#ifndef G_OS_WIN32
|
|
|
|
|
2003-07-28 21:24:22 +02:00
|
|
|
gint result;
|
2003-08-08 22:38:15 +02:00
|
|
|
#ifndef HAVE_SETENV
|
|
|
|
gchar *string;
|
|
|
|
#endif
|
|
|
|
|
2005-01-01 03:09:51 +01:00
|
|
|
g_return_val_if_fail (variable != NULL, FALSE);
|
2003-08-07 23:51:38 +02:00
|
|
|
g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE);
|
2003-08-08 22:38:15 +02:00
|
|
|
|
2003-07-28 21:24:22 +02:00
|
|
|
#ifdef HAVE_SETENV
|
|
|
|
result = setenv (variable, value, overwrite);
|
|
|
|
#else
|
2005-01-01 03:09:51 +01:00
|
|
|
if (!overwrite && getenv (variable) != NULL)
|
2003-07-28 21:24:22 +02:00
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
/* This results in a leak when you overwrite existing
|
|
|
|
* settings. It would be fairly easy to fix this by keeping
|
|
|
|
* our own parallel array or hash table.
|
|
|
|
*/
|
|
|
|
string = g_strconcat (variable, "=", value, NULL);
|
|
|
|
result = putenv (string);
|
|
|
|
#endif
|
|
|
|
return result == 0;
|
2005-01-01 03:09:51 +01:00
|
|
|
|
|
|
|
#else /* G_OS_WIN32 */
|
|
|
|
|
|
|
|
gboolean retval;
|
2006-08-30 00:45:00 +02:00
|
|
|
wchar_t *wname, *wvalue, *wassignment;
|
|
|
|
gchar *tem;
|
2005-01-01 03:09:51 +01:00
|
|
|
|
|
|
|
g_return_val_if_fail (variable != NULL, FALSE);
|
|
|
|
g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE);
|
|
|
|
g_return_val_if_fail (g_utf8_validate (variable, -1, NULL), FALSE);
|
|
|
|
g_return_val_if_fail (g_utf8_validate (value, -1, NULL), FALSE);
|
|
|
|
|
|
|
|
if (!overwrite && g_getenv (variable) != NULL)
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
/* We want to (if possible) set both the environment variable copy
|
|
|
|
* kept by the C runtime and the one kept by the system.
|
|
|
|
*
|
|
|
|
* We can't use only the C runtime's putenv or _wputenv() as that
|
|
|
|
* won't work for arbitrary Unicode strings in a "non-Unicode" app
|
|
|
|
* (with main() and not wmain()). In a "main()" app the C runtime
|
|
|
|
* initializes the C runtime's environment table by converting the
|
|
|
|
* real (wide char) environment variables to system codepage, thus
|
|
|
|
* breaking those that aren't representable in the system codepage.
|
|
|
|
*
|
|
|
|
* As the C runtime's putenv() will also set the system copy, we do
|
|
|
|
* the putenv() first, then call SetEnvironmentValueW ourselves.
|
|
|
|
*/
|
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL);
|
|
|
|
wvalue = g_utf8_to_utf16 (value, -1, NULL, NULL, NULL);
|
|
|
|
tem = g_strconcat (variable, "=", value, NULL);
|
|
|
|
wassignment = g_utf8_to_utf16 (tem, -1, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
g_free (tem);
|
|
|
|
_wputenv (wassignment);
|
|
|
|
g_free (wassignment);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
retval = (SetEnvironmentVariableW (wname, wvalue) != 0);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
g_free (wname);
|
|
|
|
g_free (wvalue);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
|
|
|
return retval;
|
|
|
|
|
|
|
|
#endif /* G_OS_WIN32 */
|
2003-07-28 21:24:22 +02:00
|
|
|
}
|
2003-08-07 23:51:38 +02:00
|
|
|
|
2005-08-17 20:31:08 +02:00
|
|
|
#ifdef HAVE__NSGETENVIRON
|
|
|
|
#define environ (*_NSGetEnviron())
|
|
|
|
#elif !defined(G_OS_WIN32)
|
2005-02-08 05:28:31 +01:00
|
|
|
|
2003-08-07 23:51:38 +02:00
|
|
|
/* According to the Single Unix Specification, environ is not in
|
|
|
|
* any system header, although unistd.h often declares it.
|
|
|
|
*/
|
|
|
|
extern char **environ;
|
|
|
|
#endif
|
2005-08-17 20:31:08 +02:00
|
|
|
|
2003-07-28 21:24:22 +02:00
|
|
|
/**
|
|
|
|
* g_unsetenv:
|
2003-08-07 23:51:38 +02:00
|
|
|
* @variable: the environment variable to remove, must not contain '='.
|
2003-07-28 21:24:22 +02:00
|
|
|
*
|
|
|
|
* Removes an environment variable from the environment.
|
|
|
|
*
|
2005-01-03 05:21:24 +01:00
|
|
|
* Note that on some systems, when variables are overwritten, the memory
|
|
|
|
* used for the previous variables and its value isn't reclaimed.
|
|
|
|
* Furthermore, this function can't be guaranteed to operate in a
|
2003-07-28 21:24:22 +02:00
|
|
|
* threadsafe way.
|
|
|
|
*
|
|
|
|
* Since: 2.4
|
|
|
|
**/
|
|
|
|
void
|
|
|
|
g_unsetenv (const gchar *variable)
|
|
|
|
{
|
2005-01-01 03:09:51 +01:00
|
|
|
#ifndef G_OS_WIN32
|
|
|
|
|
2003-07-28 21:24:22 +02:00
|
|
|
#ifdef HAVE_UNSETENV
|
2005-01-01 03:09:51 +01:00
|
|
|
g_return_if_fail (variable != NULL);
|
2003-08-07 23:51:38 +02:00
|
|
|
g_return_if_fail (strchr (variable, '=') == NULL);
|
|
|
|
|
2003-07-28 21:24:22 +02:00
|
|
|
unsetenv (variable);
|
2005-01-01 03:09:51 +01:00
|
|
|
#else /* !HAVE_UNSETENV */
|
2003-08-10 10:04:10 +02:00
|
|
|
int len;
|
2003-07-28 21:24:22 +02:00
|
|
|
gchar **e, **f;
|
2003-08-07 23:51:38 +02:00
|
|
|
|
2005-01-01 03:09:51 +01:00
|
|
|
g_return_if_fail (variable != NULL);
|
2003-08-07 23:51:38 +02:00
|
|
|
g_return_if_fail (strchr (variable, '=') == NULL);
|
|
|
|
|
2003-07-28 21:24:22 +02:00
|
|
|
len = strlen (variable);
|
|
|
|
|
|
|
|
/* Mess directly with the environ array.
|
|
|
|
* This seems to be the only portable way to do this.
|
|
|
|
*
|
|
|
|
* Note that we remove *all* environment entries for
|
|
|
|
* the variable name, not just the first.
|
|
|
|
*/
|
|
|
|
e = f = environ;
|
|
|
|
while (*e != NULL)
|
|
|
|
{
|
|
|
|
if (strncmp (*e, variable, len) != 0 || (*e)[len] != '=')
|
|
|
|
{
|
|
|
|
*f = *e;
|
|
|
|
f++;
|
|
|
|
}
|
|
|
|
e++;
|
|
|
|
}
|
|
|
|
*f = NULL;
|
2005-01-01 03:09:51 +01:00
|
|
|
#endif /* !HAVE_UNSETENV */
|
|
|
|
|
|
|
|
#else /* G_OS_WIN32 */
|
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
wchar_t *wname, *wassignment;
|
|
|
|
gchar *tem;
|
|
|
|
|
2005-01-01 03:09:51 +01:00
|
|
|
g_return_if_fail (variable != NULL);
|
|
|
|
g_return_if_fail (strchr (variable, '=') == NULL);
|
|
|
|
g_return_if_fail (g_utf8_validate (variable, -1, NULL));
|
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL);
|
|
|
|
tem = g_strconcat (variable, "=", NULL);
|
|
|
|
wassignment = g_utf8_to_utf16 (tem, -1, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
g_free (tem);
|
|
|
|
_wputenv (wassignment);
|
|
|
|
g_free (wassignment);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
SetEnvironmentVariableW (wname, NULL);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
g_free (wname);
|
2005-01-01 03:09:51 +01:00
|
|
|
|
|
|
|
#endif /* G_OS_WIN32 */
|
2003-07-28 21:24:22 +02:00
|
|
|
}
|
1999-01-23 03:16:11 +01:00
|
|
|
|
2005-02-08 05:28:31 +01:00
|
|
|
/**
|
|
|
|
* g_listenv:
|
|
|
|
*
|
|
|
|
* Gets the names of all variables set in the environment.
|
|
|
|
*
|
2005-05-01 23:40:46 +02:00
|
|
|
* Returns: a %NULL-terminated list of strings which must be freed
|
2005-02-08 05:28:31 +01:00
|
|
|
* with g_strfreev().
|
|
|
|
*
|
2006-06-14 00:46:52 +02:00
|
|
|
* Programs that want to be portable to Windows should typically use
|
|
|
|
* this function and g_getenv() instead of using the environ array
|
|
|
|
* from the C library directly. On Windows, the strings in the environ
|
|
|
|
* array are in system codepage encoding, while in most of the typical
|
|
|
|
* use cases for environment variables in GLib-using programs you want
|
|
|
|
* the UTF-8 encoding that this function and g_getenv() provide.
|
|
|
|
*
|
2005-02-08 05:28:31 +01:00
|
|
|
* Since: 2.8
|
|
|
|
*/
|
|
|
|
gchar **
|
|
|
|
g_listenv (void)
|
|
|
|
{
|
2006-03-01 15:18:55 +01:00
|
|
|
#ifndef G_OS_WIN32
|
2005-02-08 05:28:31 +01:00
|
|
|
gchar **result, *eq;
|
2005-07-10 06:44:27 +02:00
|
|
|
gint len, i, j;
|
2005-02-08 05:28:31 +01:00
|
|
|
|
|
|
|
len = g_strv_length (environ);
|
|
|
|
result = g_new0 (gchar *, len + 1);
|
|
|
|
|
2005-07-10 06:44:27 +02:00
|
|
|
j = 0;
|
2005-02-08 05:28:31 +01:00
|
|
|
for (i = 0; i < len; i++)
|
|
|
|
{
|
|
|
|
eq = strchr (environ[i], '=');
|
2005-07-10 06:44:27 +02:00
|
|
|
if (eq)
|
|
|
|
result[j++] = g_strndup (environ[i], eq - environ[i]);
|
2005-02-08 05:28:31 +01:00
|
|
|
}
|
|
|
|
|
2005-07-10 06:44:27 +02:00
|
|
|
result[j] = NULL;
|
2005-02-08 05:28:31 +01:00
|
|
|
|
|
|
|
return result;
|
2006-03-01 15:18:55 +01:00
|
|
|
#else
|
|
|
|
gchar **result, *eq;
|
2006-08-30 00:45:00 +02:00
|
|
|
gint len = 0, j;
|
|
|
|
wchar_t *p, *q;
|
2006-03-01 15:18:55 +01:00
|
|
|
|
2006-08-30 00:45:00 +02:00
|
|
|
p = (wchar_t *) GetEnvironmentStringsW ();
|
|
|
|
if (p != NULL)
|
2006-03-01 15:18:55 +01:00
|
|
|
{
|
|
|
|
q = p;
|
|
|
|
while (*q)
|
|
|
|
{
|
|
|
|
q += wcslen (q) + 1;
|
2006-08-30 00:45:00 +02:00
|
|
|
len++;
|
2006-03-01 15:18:55 +01:00
|
|
|
}
|
|
|
|
}
|
2006-08-30 00:45:00 +02:00
|
|
|
result = g_new0 (gchar *, len + 1);
|
|
|
|
|
|
|
|
j = 0;
|
|
|
|
q = p;
|
|
|
|
while (*q)
|
2006-03-01 15:18:55 +01:00
|
|
|
{
|
2006-08-30 00:45:00 +02:00
|
|
|
result[j] = g_utf16_to_utf8 (q, -1, NULL, NULL, NULL);
|
|
|
|
if (result[j] != NULL)
|
2006-03-01 15:18:55 +01:00
|
|
|
{
|
2006-08-30 00:45:00 +02:00
|
|
|
eq = strchr (result[j], '=');
|
|
|
|
if (eq && eq > result[j])
|
2006-03-01 15:18:55 +01:00
|
|
|
{
|
2006-08-30 00:45:00 +02:00
|
|
|
*eq = '\0';
|
|
|
|
j++;
|
2006-03-01 15:18:55 +01:00
|
|
|
}
|
2006-08-30 00:45:00 +02:00
|
|
|
else
|
|
|
|
g_free (result[j]);
|
2006-03-01 15:18:55 +01:00
|
|
|
}
|
2006-08-30 00:45:00 +02:00
|
|
|
q += wcslen (q) + 1;
|
2006-03-01 15:18:55 +01:00
|
|
|
}
|
2006-08-30 00:45:00 +02:00
|
|
|
result[j] = NULL;
|
|
|
|
FreeEnvironmentStringsW (p);
|
2006-03-01 15:18:55 +01:00
|
|
|
|
|
|
|
return result;
|
|
|
|
#endif
|
2005-02-08 05:28:31 +01:00
|
|
|
}
|
|
|
|
|
1999-02-10 10:40:46 +01:00
|
|
|
G_LOCK_DEFINE_STATIC (g_utils_global);
|
1998-12-15 06:28:02 +01:00
|
|
|
|
1998-07-10 07:51:17 +02:00
|
|
|
static gchar *g_tmp_dir = NULL;
|
|
|
|
static gchar *g_user_name = NULL;
|
|
|
|
static gchar *g_real_name = NULL;
|
|
|
|
static gchar *g_home_dir = NULL;
|
2005-06-22 10:54:28 +02:00
|
|
|
static gchar *g_host_name = NULL;
|
1998-07-10 07:51:17 +02:00
|
|
|
|
2004-11-28 19:39:24 +01:00
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
/* System codepage versions of the above, kept at file level so that they,
|
|
|
|
* too, are produced only once.
|
|
|
|
*/
|
|
|
|
static gchar *g_tmp_dir_cp = NULL;
|
|
|
|
static gchar *g_user_name_cp = NULL;
|
|
|
|
static gchar *g_real_name_cp = NULL;
|
|
|
|
static gchar *g_home_dir_cp = NULL;
|
|
|
|
#endif
|
|
|
|
|
2004-08-11 19:53:05 +02:00
|
|
|
static gchar *g_user_data_dir = NULL;
|
|
|
|
static gchar **g_system_data_dirs = NULL;
|
|
|
|
static gchar *g_user_cache_dir = NULL;
|
|
|
|
static gchar *g_user_config_dir = NULL;
|
|
|
|
static gchar **g_system_config_dirs = NULL;
|
|
|
|
|
2007-06-04 16:54:49 +02:00
|
|
|
static gchar **g_user_special_dirs = NULL;
|
|
|
|
|
|
|
|
/* fifteen minutes of fame for everybody */
|
|
|
|
#define G_USER_DIRS_EXPIRE 15 * 60
|
|
|
|
|
2004-08-25 02:39:13 +02:00
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
|
|
|
|
static gchar *
|
|
|
|
get_special_folder (int csidl)
|
|
|
|
{
|
2007-08-01 11:49:02 +02:00
|
|
|
wchar_t path[MAX_PATH+1];
|
2004-08-25 02:39:13 +02:00
|
|
|
HRESULT hr;
|
|
|
|
LPITEMIDLIST pidl = NULL;
|
|
|
|
BOOL b;
|
|
|
|
gchar *retval = NULL;
|
|
|
|
|
|
|
|
hr = SHGetSpecialFolderLocation (NULL, csidl, &pidl);
|
|
|
|
if (hr == S_OK)
|
|
|
|
{
|
2007-08-01 11:49:02 +02:00
|
|
|
b = SHGetPathFromIDListW (pidl, path);
|
2006-08-30 00:45:00 +02:00
|
|
|
if (b)
|
2007-08-01 11:49:02 +02:00
|
|
|
retval = g_utf16_to_utf8 (path, -1, NULL, NULL, NULL);
|
2004-08-25 02:39:13 +02:00
|
|
|
CoTaskMemFree (pidl);
|
|
|
|
}
|
2004-10-29 22:58:04 +02:00
|
|
|
return retval;
|
2004-08-25 02:39:13 +02:00
|
|
|
}
|
|
|
|
|
2005-06-08 22:03:12 +02:00
|
|
|
static char *
|
|
|
|
get_windows_directory_root (void)
|
|
|
|
{
|
2006-12-28 16:47:42 +01:00
|
|
|
wchar_t wwindowsdir[MAX_PATH];
|
2005-06-08 22:03:12 +02:00
|
|
|
|
2006-12-28 16:47:42 +01:00
|
|
|
if (GetWindowsDirectoryW (wwindowsdir, G_N_ELEMENTS (wwindowsdir)))
|
2005-06-08 22:03:12 +02:00
|
|
|
{
|
|
|
|
/* Usually X:\Windows, but in terminal server environments
|
|
|
|
* might be an UNC path, AFAIK.
|
|
|
|
*/
|
2006-12-28 16:47:42 +01:00
|
|
|
char *windowsdir = g_utf16_to_utf8 (wwindowsdir, -1, NULL, NULL, NULL);
|
|
|
|
char *p;
|
|
|
|
|
|
|
|
if (windowsdir == NULL)
|
|
|
|
return g_strdup ("C:\\");
|
|
|
|
|
|
|
|
p = (char *) g_path_skip_root (windowsdir);
|
2005-06-08 22:03:12 +02:00
|
|
|
if (G_IS_DIR_SEPARATOR (p[-1]) && p[-2] != ':')
|
|
|
|
p--;
|
|
|
|
*p = '\0';
|
2006-12-28 16:47:42 +01:00
|
|
|
return windowsdir;
|
2005-06-08 22:03:12 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
return g_strdup ("C:\\");
|
|
|
|
}
|
|
|
|
|
2004-08-25 02:39:13 +02:00
|
|
|
#endif
|
|
|
|
|
1998-12-15 06:28:02 +01:00
|
|
|
/* HOLDS: g_utils_global_lock */
|
1998-07-10 07:51:17 +02:00
|
|
|
static void
|
2005-08-17 14:00:51 +02:00
|
|
|
g_get_any_init_do (void)
|
1998-07-10 07:51:17 +02:00
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
gchar hostname[100];
|
|
|
|
|
|
|
|
g_tmp_dir = g_strdup (g_getenv ("TMPDIR"));
|
1998-07-10 07:51:17 +02:00
|
|
|
if (!g_tmp_dir)
|
2005-08-17 14:00:51 +02:00
|
|
|
g_tmp_dir = g_strdup (g_getenv ("TMP"));
|
|
|
|
if (!g_tmp_dir)
|
|
|
|
g_tmp_dir = g_strdup (g_getenv ("TEMP"));
|
2005-06-22 10:54:28 +02:00
|
|
|
|
2005-06-08 22:03:12 +02:00
|
|
|
#ifdef G_OS_WIN32
|
2005-08-17 14:00:51 +02:00
|
|
|
if (!g_tmp_dir)
|
|
|
|
g_tmp_dir = get_windows_directory_root ();
|
|
|
|
#else
|
1998-11-01 05:19:54 +01:00
|
|
|
#ifdef P_tmpdir
|
2005-08-17 14:00:51 +02:00
|
|
|
if (!g_tmp_dir)
|
|
|
|
{
|
|
|
|
gsize k;
|
|
|
|
g_tmp_dir = g_strdup (P_tmpdir);
|
|
|
|
k = strlen (g_tmp_dir);
|
|
|
|
if (k > 1 && G_IS_DIR_SEPARATOR (g_tmp_dir[k - 1]))
|
|
|
|
g_tmp_dir[k - 1] = '\0';
|
|
|
|
}
|
1998-11-01 05:19:54 +01:00
|
|
|
#endif
|
2005-08-17 14:00:51 +02:00
|
|
|
|
|
|
|
if (!g_tmp_dir)
|
|
|
|
{
|
|
|
|
g_tmp_dir = g_strdup ("/tmp");
|
|
|
|
}
|
2005-06-08 22:03:12 +02:00
|
|
|
#endif /* !G_OS_WIN32 */
|
2005-08-17 14:00:51 +02:00
|
|
|
|
1999-10-04 04:32:50 +02:00
|
|
|
#ifdef G_OS_WIN32
|
2005-08-17 14:00:51 +02:00
|
|
|
/* We check $HOME first for Win32, though it is a last resort for Unix
|
|
|
|
* where we prefer the results of getpwuid().
|
|
|
|
*/
|
|
|
|
g_home_dir = g_strdup (g_getenv ("HOME"));
|
2004-11-28 19:39:24 +01:00
|
|
|
|
2005-08-17 14:00:51 +02:00
|
|
|
/* Only believe HOME if it is an absolute path and exists */
|
|
|
|
if (g_home_dir)
|
|
|
|
{
|
|
|
|
if (!(g_path_is_absolute (g_home_dir) &&
|
|
|
|
g_file_test (g_home_dir, G_FILE_TEST_IS_DIR)))
|
2001-01-05 20:30:13 +01:00
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_free (g_home_dir);
|
|
|
|
g_home_dir = NULL;
|
2001-01-05 20:30:13 +01:00
|
|
|
}
|
2005-08-17 14:00:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* In case HOME is Unix-style (it happens), convert it to
|
|
|
|
* Windows style.
|
|
|
|
*/
|
|
|
|
if (g_home_dir)
|
|
|
|
{
|
|
|
|
gchar *p;
|
|
|
|
while ((p = strchr (g_home_dir, '/')) != NULL)
|
|
|
|
*p = '\\';
|
|
|
|
}
|
2001-02-21 13:41:28 +01:00
|
|
|
|
2005-08-17 14:00:51 +02:00
|
|
|
if (!g_home_dir)
|
|
|
|
{
|
|
|
|
/* USERPROFILE is probably the closest equivalent to $HOME? */
|
|
|
|
if (g_getenv ("USERPROFILE") != NULL)
|
|
|
|
g_home_dir = g_strdup (g_getenv ("USERPROFILE"));
|
|
|
|
}
|
2001-02-21 13:41:28 +01:00
|
|
|
|
2005-08-17 14:00:51 +02:00
|
|
|
if (!g_home_dir)
|
|
|
|
g_home_dir = get_special_folder (CSIDL_PROFILE);
|
|
|
|
|
|
|
|
if (!g_home_dir)
|
|
|
|
g_home_dir = get_windows_directory_root ();
|
2000-03-22 21:46:19 +01:00
|
|
|
#endif /* G_OS_WIN32 */
|
2005-08-17 14:00:51 +02:00
|
|
|
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
#ifdef HAVE_PWD_H
|
2005-08-17 14:00:51 +02:00
|
|
|
{
|
|
|
|
struct passwd *pw = NULL;
|
|
|
|
gpointer buffer = NULL;
|
|
|
|
gint error;
|
2005-12-04 08:00:50 +01:00
|
|
|
gchar *logname;
|
|
|
|
|
2000-11-15 18:48:43 +01:00
|
|
|
# if defined (HAVE_POSIX_GETPWUID_R) || defined (HAVE_NONPOSIX_GETPWUID_R)
|
2005-08-17 14:00:51 +02:00
|
|
|
struct passwd pwd;
|
1999-04-22 15:16:10 +02:00
|
|
|
# ifdef _SC_GETPW_R_SIZE_MAX
|
2005-08-17 14:00:51 +02:00
|
|
|
/* This reurns the maximum length */
|
|
|
|
glong bufsize = sysconf (_SC_GETPW_R_SIZE_MAX);
|
|
|
|
|
|
|
|
if (bufsize < 0)
|
|
|
|
bufsize = 64;
|
1999-04-22 15:16:10 +02:00
|
|
|
# else /* _SC_GETPW_R_SIZE_MAX */
|
2005-08-17 14:00:51 +02:00
|
|
|
glong bufsize = 64;
|
1999-04-22 15:16:10 +02:00
|
|
|
# endif /* _SC_GETPW_R_SIZE_MAX */
|
2005-12-04 08:00:50 +01:00
|
|
|
|
|
|
|
logname = (gchar *) g_getenv ("LOGNAME");
|
|
|
|
|
2005-08-17 14:00:51 +02:00
|
|
|
do
|
|
|
|
{
|
|
|
|
g_free (buffer);
|
|
|
|
/* we allocate 6 extra bytes to work around a bug in
|
|
|
|
* Mac OS < 10.3. See #156446
|
|
|
|
*/
|
|
|
|
buffer = g_malloc (bufsize + 6);
|
|
|
|
errno = 0;
|
1999-02-10 09:06:26 +01:00
|
|
|
|
2000-11-15 18:48:43 +01:00
|
|
|
# ifdef HAVE_POSIX_GETPWUID_R
|
2005-12-04 08:00:50 +01:00
|
|
|
if (logname) {
|
|
|
|
error = getpwnam_r (logname, &pwd, buffer, bufsize, &pw);
|
|
|
|
if (!pw || (pw->pw_uid != getuid ())) {
|
|
|
|
/* LOGNAME is lying, fall back to looking up the uid */
|
|
|
|
error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
|
|
|
|
}
|
2005-08-17 14:00:51 +02:00
|
|
|
error = error < 0 ? errno : error;
|
2000-11-15 18:48:43 +01:00
|
|
|
# else /* HAVE_NONPOSIX_GETPWUID_R */
|
2005-08-17 14:00:51 +02:00
|
|
|
/* HPUX 11 falls into the HAVE_POSIX_GETPWUID_R case */
|
2002-12-15 03:35:28 +01:00
|
|
|
# if defined(_AIX) || defined(__hpux)
|
2005-08-17 14:00:51 +02:00
|
|
|
error = getpwuid_r (getuid (), &pwd, buffer, bufsize);
|
|
|
|
pw = error == 0 ? &pwd : NULL;
|
1999-03-01 08:55:34 +01:00
|
|
|
# else /* !_AIX */
|
2005-12-04 08:00:50 +01:00
|
|
|
if (logname) {
|
|
|
|
pw = getpwnam_r (logname, &pwd, buffer, bufsize);
|
|
|
|
if (!pw || (pw->pw_uid != getuid ())) {
|
|
|
|
/* LOGNAME is lying, fall back to looking up the uid */
|
|
|
|
pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
|
|
|
|
}
|
2005-08-17 14:00:51 +02:00
|
|
|
error = pw ? 0 : errno;
|
1999-03-01 08:55:34 +01:00
|
|
|
# endif /* !_AIX */
|
2000-11-15 18:48:43 +01:00
|
|
|
# endif /* HAVE_NONPOSIX_GETPWUID_R */
|
1999-02-10 09:06:26 +01:00
|
|
|
|
1999-02-05 17:41:02 +01:00
|
|
|
if (!pw)
|
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
/* we bail out prematurely if the user id can't be found
|
|
|
|
* (should be pretty rare case actually), or if the buffer
|
|
|
|
* should be sufficiently big and lookups are still not
|
|
|
|
* successfull.
|
|
|
|
*/
|
|
|
|
if (error == 0 || error == ENOENT)
|
2004-01-22 20:48:33 +01:00
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_warning ("getpwuid_r(): failed due to unknown user id (%lu)",
|
|
|
|
(gulong) getuid ());
|
|
|
|
break;
|
2004-01-22 20:48:33 +01:00
|
|
|
}
|
2005-08-17 14:00:51 +02:00
|
|
|
if (bufsize > 32 * 1024)
|
|
|
|
{
|
|
|
|
g_warning ("getpwuid_r(): failed due to: %s.",
|
|
|
|
g_strerror (error));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
bufsize *= 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
while (!pw);
|
|
|
|
# endif /* HAVE_POSIX_GETPWUID_R || HAVE_NONPOSIX_GETPWUID_R */
|
|
|
|
|
|
|
|
if (!pw)
|
|
|
|
{
|
|
|
|
setpwent ();
|
|
|
|
pw = getpwuid (getuid ());
|
|
|
|
endpwent ();
|
|
|
|
}
|
|
|
|
if (pw)
|
|
|
|
{
|
|
|
|
g_user_name = g_strdup (pw->pw_name);
|
2004-01-22 00:41:46 +01:00
|
|
|
|
2005-08-17 14:00:51 +02:00
|
|
|
if (pw->pw_gecos && *pw->pw_gecos != '\0')
|
|
|
|
{
|
|
|
|
gchar **gecos_fields;
|
|
|
|
gchar **name_parts;
|
|
|
|
|
|
|
|
/* split the gecos field and substitute '&' */
|
|
|
|
gecos_fields = g_strsplit (pw->pw_gecos, ",", 0);
|
|
|
|
name_parts = g_strsplit (gecos_fields[0], "&", 0);
|
|
|
|
pw->pw_name[0] = g_ascii_toupper (pw->pw_name[0]);
|
|
|
|
g_real_name = g_strjoinv (pw->pw_name, name_parts);
|
|
|
|
g_strfreev (gecos_fields);
|
|
|
|
g_strfreev (name_parts);
|
1999-01-20 16:06:46 +01:00
|
|
|
}
|
2005-08-17 14:00:51 +02:00
|
|
|
|
|
|
|
if (!g_home_dir)
|
|
|
|
g_home_dir = g_strdup (pw->pw_dir);
|
1999-01-20 16:06:46 +01:00
|
|
|
}
|
2005-08-17 14:00:51 +02:00
|
|
|
g_free (buffer);
|
|
|
|
}
|
|
|
|
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
#else /* !HAVE_PWD_H */
|
2005-08-17 14:00:51 +02:00
|
|
|
|
2004-11-28 19:39:24 +01:00
|
|
|
#ifdef G_OS_WIN32
|
2006-09-02 01:32:05 +02:00
|
|
|
{
|
|
|
|
guint len = UNLEN+1;
|
|
|
|
wchar_t buffer[UNLEN+1];
|
2006-08-30 00:45:00 +02:00
|
|
|
|
2006-09-02 01:32:05 +02:00
|
|
|
if (GetUserNameW (buffer, (LPDWORD) &len))
|
|
|
|
{
|
|
|
|
g_user_name = g_utf16_to_utf8 (buffer, -1, NULL, NULL, NULL);
|
|
|
|
g_real_name = g_strdup (g_user_name);
|
|
|
|
}
|
|
|
|
}
|
2004-11-28 19:39:24 +01:00
|
|
|
#endif /* G_OS_WIN32 */
|
2002-03-05 06:46:08 +01:00
|
|
|
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
#endif /* !HAVE_PWD_H */
|
2002-03-05 06:46:08 +01:00
|
|
|
|
2004-11-28 19:39:24 +01:00
|
|
|
#ifndef G_OS_WIN32
|
2005-08-17 14:00:51 +02:00
|
|
|
if (!g_home_dir)
|
|
|
|
g_home_dir = g_strdup (g_getenv ("HOME"));
|
2004-11-28 19:39:24 +01:00
|
|
|
#endif
|
|
|
|
|
1999-03-06 11:05:32 +01:00
|
|
|
#ifdef __EMX__
|
2005-08-17 14:00:51 +02:00
|
|
|
/* change '\\' in %HOME% to '/' */
|
|
|
|
g_strdelimit (g_home_dir, "\\",'/');
|
1999-03-06 11:05:32 +01:00
|
|
|
#endif
|
2005-08-17 14:00:51 +02:00
|
|
|
if (!g_user_name)
|
|
|
|
g_user_name = g_strdup ("somebody");
|
|
|
|
if (!g_real_name)
|
|
|
|
g_real_name = g_strdup ("Unknown");
|
2004-11-28 19:39:24 +01:00
|
|
|
|
2005-08-17 14:00:51 +02:00
|
|
|
{
|
2005-06-22 10:54:28 +02:00
|
|
|
#ifndef G_OS_WIN32
|
2005-08-17 14:00:51 +02:00
|
|
|
gboolean hostname_fail = (gethostname (hostname, sizeof (hostname)) == -1);
|
2005-06-22 10:54:28 +02:00
|
|
|
#else
|
2005-08-17 14:00:51 +02:00
|
|
|
DWORD size = sizeof (hostname);
|
|
|
|
gboolean hostname_fail = (!GetComputerName (hostname, &size));
|
2005-06-22 10:54:28 +02:00
|
|
|
#endif
|
2005-08-17 14:00:51 +02:00
|
|
|
g_host_name = g_strdup (hostname_fail ? "localhost" : hostname);
|
|
|
|
}
|
2005-06-22 10:54:28 +02:00
|
|
|
|
2004-11-28 19:39:24 +01:00
|
|
|
#ifdef G_OS_WIN32
|
2005-08-17 14:00:51 +02:00
|
|
|
g_tmp_dir_cp = g_locale_from_utf8 (g_tmp_dir, -1, NULL, NULL, NULL);
|
|
|
|
g_user_name_cp = g_locale_from_utf8 (g_user_name, -1, NULL, NULL, NULL);
|
|
|
|
g_real_name_cp = g_locale_from_utf8 (g_real_name, -1, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
if (!g_tmp_dir_cp)
|
|
|
|
g_tmp_dir_cp = g_strdup ("\\");
|
|
|
|
if (!g_user_name_cp)
|
|
|
|
g_user_name_cp = g_strdup ("somebody");
|
|
|
|
if (!g_real_name_cp)
|
|
|
|
g_real_name_cp = g_strdup ("Unknown");
|
|
|
|
|
|
|
|
/* home_dir might be NULL, unlike tmp_dir, user_name and
|
|
|
|
* real_name.
|
|
|
|
*/
|
|
|
|
if (g_home_dir)
|
|
|
|
g_home_dir_cp = g_locale_from_utf8 (g_home_dir, -1, NULL, NULL, NULL);
|
|
|
|
else
|
|
|
|
g_home_dir_cp = NULL;
|
2004-11-28 19:39:24 +01:00
|
|
|
#endif /* G_OS_WIN32 */
|
1998-07-10 07:51:17 +02:00
|
|
|
}
|
|
|
|
|
2005-08-17 14:00:51 +02:00
|
|
|
static inline void
|
|
|
|
g_get_any_init (void)
|
|
|
|
{
|
|
|
|
if (!g_tmp_dir)
|
|
|
|
g_get_any_init_do ();
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
g_get_any_init_locked (void)
|
|
|
|
{
|
|
|
|
G_LOCK (g_utils_global);
|
|
|
|
g_get_any_init ();
|
|
|
|
G_UNLOCK (g_utils_global);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_get_user_name:
|
|
|
|
*
|
|
|
|
* Gets the user name of the current user. The encoding of the returned
|
|
|
|
* string is system-defined. On UNIX, it might be the preferred file name
|
|
|
|
* encoding, or something else, and there is no guarantee that it is even
|
|
|
|
* consistent on a machine. On Windows, it is always UTF-8.
|
|
|
|
*
|
|
|
|
* Returns: the user name of the current user.
|
|
|
|
*/
|
2001-02-18 00:30:48 +01:00
|
|
|
G_CONST_RETURN gchar*
|
1998-07-10 07:51:17 +02:00
|
|
|
g_get_user_name (void)
|
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_get_any_init_locked ();
|
1998-07-10 07:51:17 +02:00
|
|
|
return g_user_name;
|
|
|
|
}
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_get_real_name:
|
|
|
|
*
|
|
|
|
* Gets the real name of the user. This usually comes from the user's entry
|
|
|
|
* in the <filename>passwd</filename> file. The encoding of the returned
|
|
|
|
* string is system-defined. (On Windows, it is, however, always UTF-8.)
|
|
|
|
* If the real user name cannot be determined, the string "Unknown" is
|
|
|
|
* returned.
|
|
|
|
*
|
|
|
|
* Returns: the user's real name.
|
|
|
|
*/
|
2001-02-18 00:30:48 +01:00
|
|
|
G_CONST_RETURN gchar*
|
1998-07-10 07:51:17 +02:00
|
|
|
g_get_real_name (void)
|
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_get_any_init_locked ();
|
1998-07-10 07:51:17 +02:00
|
|
|
return g_real_name;
|
|
|
|
}
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_get_home_dir:
|
|
|
|
*
|
2007-01-12 18:54:13 +01:00
|
|
|
* Gets the current user's home directory as defined in the
|
|
|
|
* password database.
|
2005-02-02 07:07:14 +01:00
|
|
|
*
|
|
|
|
* Note that in contrast to traditional UNIX tools, this function
|
|
|
|
* prefers <filename>passwd</filename> entries over the <envar>HOME</envar>
|
2007-06-18 21:12:10 +02:00
|
|
|
* environment variable.
|
2005-02-02 07:07:14 +01:00
|
|
|
*
|
2007-06-18 21:12:10 +02:00
|
|
|
* One of the reasons for this decision is that applications in many
|
|
|
|
* cases need special handling to deal with the case where
|
|
|
|
* <envar>HOME</envar> is
|
|
|
|
* <simplelist>
|
|
|
|
* <member>Not owned by the user</member>
|
|
|
|
* <member>Not writeable</member>
|
|
|
|
* <member>Not even readable</member>
|
|
|
|
* </simplelist>
|
|
|
|
* Since applications are in general <emphasis>not</emphasis> written
|
|
|
|
* to deal with these situations it was considered better to make
|
2008-09-02 18:48:40 +02:00
|
|
|
* g_get_home_dir() not pay attention to <envar>HOME</envar> and to
|
2007-06-18 21:12:10 +02:00
|
|
|
* return the real home directory for the user. If applications
|
|
|
|
* want to pay attention to <envar>HOME</envar>, they can do:
|
2007-11-25 07:05:06 +01:00
|
|
|
* |[
|
2007-06-18 21:12:10 +02:00
|
|
|
* const char *homedir = g_getenv ("HOME");
|
|
|
|
* if (!homedir)
|
2008-09-02 18:48:40 +02:00
|
|
|
* homedir = g_get_home_dir (<!-- -->);
|
2007-11-25 07:05:06 +01:00
|
|
|
* ]|
|
2007-06-18 21:12:10 +02:00
|
|
|
*
|
|
|
|
* Returns: the current user's home directory
|
2005-02-02 07:07:14 +01:00
|
|
|
*/
|
2001-02-18 00:30:48 +01:00
|
|
|
G_CONST_RETURN gchar*
|
1998-07-10 07:51:17 +02:00
|
|
|
g_get_home_dir (void)
|
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_get_any_init_locked ();
|
1998-07-10 07:51:17 +02:00
|
|
|
return g_home_dir;
|
|
|
|
}
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_get_tmp_dir:
|
|
|
|
*
|
|
|
|
* Gets the directory to use for temporary files. This is found from
|
|
|
|
* inspecting the environment variables <envar>TMPDIR</envar>,
|
|
|
|
* <envar>TMP</envar>, and <envar>TEMP</envar> in that order. If none
|
|
|
|
* of those are defined "/tmp" is returned on UNIX and "C:\" on Windows.
|
|
|
|
* The encoding of the returned string is system-defined. On Windows,
|
|
|
|
* it is always UTF-8. The return value is never %NULL.
|
|
|
|
*
|
|
|
|
* Returns: the directory to use for temporary files.
|
1998-11-01 05:19:54 +01:00
|
|
|
*/
|
2001-02-18 00:30:48 +01:00
|
|
|
G_CONST_RETURN gchar*
|
1998-07-10 07:51:17 +02:00
|
|
|
g_get_tmp_dir (void)
|
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_get_any_init_locked ();
|
1998-07-10 07:51:17 +02:00
|
|
|
return g_tmp_dir;
|
|
|
|
}
|
|
|
|
|
2005-06-22 10:54:28 +02:00
|
|
|
/**
|
|
|
|
* g_get_host_name:
|
|
|
|
*
|
|
|
|
* Return a name for the machine.
|
|
|
|
*
|
|
|
|
* The returned name is not necessarily a fully-qualified domain name,
|
|
|
|
* or even present in DNS or some other name service at all. It need
|
|
|
|
* not even be unique on your local network or site, but usually it
|
|
|
|
* is. Callers should not rely on the return value having any specific
|
|
|
|
* properties like uniqueness for security purposes. Even if the name
|
|
|
|
* of the machine is changed while an application is running, the
|
|
|
|
* return value from this function does not change. The returned
|
|
|
|
* string is owned by GLib and should not be modified or freed. If no
|
2005-08-10 23:13:29 +02:00
|
|
|
* name can be determined, a default fixed string "localhost" is
|
2005-06-22 10:54:28 +02:00
|
|
|
* returned.
|
2005-06-22 11:02:41 +02:00
|
|
|
*
|
2005-08-03 22:24:18 +02:00
|
|
|
* Returns: the host name of the machine.
|
|
|
|
*
|
2005-06-22 11:02:41 +02:00
|
|
|
* Since: 2.8
|
2005-06-22 10:54:28 +02:00
|
|
|
*/
|
|
|
|
const gchar *
|
|
|
|
g_get_host_name (void)
|
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_get_any_init_locked ();
|
2005-06-22 10:54:28 +02:00
|
|
|
return g_host_name;
|
|
|
|
}
|
|
|
|
|
2003-10-24 05:41:22 +02:00
|
|
|
G_LOCK_DEFINE_STATIC (g_prgname);
|
1998-07-10 07:51:17 +02:00
|
|
|
static gchar *g_prgname = NULL;
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_get_prgname:
|
|
|
|
*
|
|
|
|
* Gets the name of the program. This name should <emphasis>not</emphasis>
|
|
|
|
* be localized, contrast with g_get_application_name().
|
|
|
|
* (If you are using GDK or GTK+ the program name is set in gdk_init(),
|
|
|
|
* which is called by gtk_init(). The program name is found by taking
|
|
|
|
* the last component of <literal>argv[0]</literal>.)
|
|
|
|
*
|
|
|
|
* Returns: the name of the program. The returned string belongs
|
|
|
|
* to GLib and must not be modified or freed.
|
|
|
|
*/
|
1998-07-10 07:51:17 +02:00
|
|
|
gchar*
|
|
|
|
g_get_prgname (void)
|
|
|
|
{
|
1998-12-15 06:28:02 +01:00
|
|
|
gchar* retval;
|
|
|
|
|
2001-10-19 10:09:22 +02:00
|
|
|
G_LOCK (g_prgname);
|
2005-03-20 11:52:38 +01:00
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
if (g_prgname == NULL)
|
|
|
|
{
|
|
|
|
static gboolean beenhere = FALSE;
|
|
|
|
|
|
|
|
if (!beenhere)
|
|
|
|
{
|
|
|
|
gchar *utf8_buf = NULL;
|
2006-08-30 00:45:00 +02:00
|
|
|
wchar_t buf[MAX_PATH+1];
|
2005-03-20 11:52:38 +01:00
|
|
|
|
|
|
|
beenhere = TRUE;
|
2006-08-30 00:45:00 +02:00
|
|
|
if (GetModuleFileNameW (GetModuleHandle (NULL),
|
|
|
|
buf, G_N_ELEMENTS (buf)) > 0)
|
|
|
|
utf8_buf = g_utf16_to_utf8 (buf, -1, NULL, NULL, NULL);
|
|
|
|
|
2005-03-20 11:52:38 +01:00
|
|
|
if (utf8_buf)
|
|
|
|
{
|
|
|
|
g_prgname = g_path_get_basename (utf8_buf);
|
|
|
|
g_free (utf8_buf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
1998-12-15 06:28:02 +01:00
|
|
|
retval = g_prgname;
|
2001-10-19 10:09:22 +02:00
|
|
|
G_UNLOCK (g_prgname);
|
1998-12-15 06:28:02 +01:00
|
|
|
|
|
|
|
return retval;
|
1998-07-10 07:51:17 +02:00
|
|
|
}
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_set_prgname:
|
|
|
|
* @prgname: the name of the program.
|
|
|
|
*
|
|
|
|
* Sets the name of the program. This name should <emphasis>not</emphasis>
|
|
|
|
* be localized, contrast with g_set_application_name(). Note that for
|
|
|
|
* thread-safety reasons this function can only be called once.
|
|
|
|
*/
|
1998-07-10 07:51:17 +02:00
|
|
|
void
|
|
|
|
g_set_prgname (const gchar *prgname)
|
|
|
|
{
|
2001-10-19 10:09:22 +02:00
|
|
|
G_LOCK (g_prgname);
|
2009-12-21 15:11:23 +01:00
|
|
|
g_free (g_prgname);
|
|
|
|
g_prgname = g_strdup (prgname);
|
2001-10-19 10:09:22 +02:00
|
|
|
G_UNLOCK (g_prgname);
|
1998-07-10 07:51:17 +02:00
|
|
|
}
|
|
|
|
|
2003-10-24 05:41:22 +02:00
|
|
|
G_LOCK_DEFINE_STATIC (g_application_name);
|
2002-11-08 01:51:25 +01:00
|
|
|
static gchar *g_application_name = NULL;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_get_application_name:
|
|
|
|
*
|
|
|
|
* Gets a human-readable name for the application, as set by
|
|
|
|
* g_set_application_name(). This name should be localized if
|
|
|
|
* possible, and is intended for display to the user. Contrast with
|
|
|
|
* g_get_prgname(), which gets a non-localized name. If
|
|
|
|
* g_set_application_name() has not been called, returns the result of
|
|
|
|
* g_get_prgname() (which may be %NULL if g_set_prgname() has also not
|
|
|
|
* been called).
|
|
|
|
*
|
|
|
|
* Return value: human-readable application name. may return %NULL
|
2002-11-29 00:11:58 +01:00
|
|
|
*
|
|
|
|
* Since: 2.2
|
2002-11-08 01:51:25 +01:00
|
|
|
**/
|
|
|
|
G_CONST_RETURN gchar*
|
|
|
|
g_get_application_name (void)
|
|
|
|
{
|
|
|
|
gchar* retval;
|
|
|
|
|
|
|
|
G_LOCK (g_application_name);
|
|
|
|
retval = g_application_name;
|
|
|
|
G_UNLOCK (g_application_name);
|
|
|
|
|
|
|
|
if (retval == NULL)
|
|
|
|
return g_get_prgname ();
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_set_application_name:
|
|
|
|
* @application_name: localized name of the application
|
|
|
|
*
|
|
|
|
* Sets a human-readable name for the application. This name should be
|
|
|
|
* localized if possible, and is intended for display to the user.
|
|
|
|
* Contrast with g_set_prgname(), which sets a non-localized name.
|
|
|
|
* g_set_prgname() will be called automatically by gtk_init(),
|
|
|
|
* but g_set_application_name() will not.
|
|
|
|
*
|
|
|
|
* Note that for thread safety reasons, this function can only
|
|
|
|
* be called once.
|
|
|
|
*
|
|
|
|
* The application name will be used in contexts such as error messages,
|
|
|
|
* or when displaying an application's name in the task list.
|
|
|
|
*
|
2007-11-09 04:01:01 +01:00
|
|
|
* Since: 2.2
|
2002-11-08 01:51:25 +01:00
|
|
|
**/
|
|
|
|
void
|
|
|
|
g_set_application_name (const gchar *application_name)
|
|
|
|
{
|
|
|
|
gboolean already_set = FALSE;
|
|
|
|
|
|
|
|
G_LOCK (g_application_name);
|
|
|
|
if (g_application_name)
|
|
|
|
already_set = TRUE;
|
|
|
|
else
|
|
|
|
g_application_name = g_strdup (application_name);
|
|
|
|
G_UNLOCK (g_application_name);
|
|
|
|
|
|
|
|
if (already_set)
|
2009-10-23 14:49:38 +02:00
|
|
|
g_warning ("g_set_application_name() called multiple times");
|
2002-11-08 01:51:25 +01:00
|
|
|
}
|
|
|
|
|
2004-08-11 19:53:05 +02:00
|
|
|
/**
|
|
|
|
* g_get_user_data_dir:
|
|
|
|
*
|
|
|
|
* Returns a base directory in which to access application data such
|
|
|
|
* as icons that is customized for a particular user.
|
|
|
|
*
|
2005-02-02 07:07:14 +01:00
|
|
|
* On UNIX platforms this is determined using the mechanisms described in
|
2004-08-11 19:53:05 +02:00
|
|
|
* the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
|
2010-06-06 04:57:46 +02:00
|
|
|
* XDG Base Directory Specification</ulink>.
|
|
|
|
* In this case the directory retrieved will be XDG_DATA_HOME.
|
|
|
|
*
|
|
|
|
* On Windows is the virtual folder that represents the My Documents
|
|
|
|
* desktop item. See documentation for CSIDL_PERSONAL.
|
|
|
|
*
|
2004-08-11 19:53:05 +02:00
|
|
|
* Return value: a string owned by GLib that must not be modified
|
|
|
|
* or freed.
|
|
|
|
* Since: 2.6
|
|
|
|
**/
|
|
|
|
G_CONST_RETURN gchar*
|
|
|
|
g_get_user_data_dir (void)
|
|
|
|
{
|
|
|
|
gchar *data_dir;
|
|
|
|
|
|
|
|
G_LOCK (g_utils_global);
|
|
|
|
|
|
|
|
if (!g_user_data_dir)
|
|
|
|
{
|
2004-08-25 02:39:13 +02:00
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
data_dir = get_special_folder (CSIDL_PERSONAL);
|
|
|
|
#else
|
2004-08-11 19:53:05 +02:00
|
|
|
data_dir = (gchar *) g_getenv ("XDG_DATA_HOME");
|
|
|
|
|
|
|
|
if (data_dir && data_dir[0])
|
|
|
|
data_dir = g_strdup (data_dir);
|
2005-03-09 03:08:34 +01:00
|
|
|
#endif
|
|
|
|
if (!data_dir || !data_dir[0])
|
2004-08-23 07:36:48 +02:00
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_get_any_init ();
|
2004-08-23 07:36:48 +02:00
|
|
|
|
2005-03-09 03:08:34 +01:00
|
|
|
if (g_home_dir)
|
|
|
|
data_dir = g_build_filename (g_home_dir, ".local",
|
|
|
|
"share", NULL);
|
|
|
|
else
|
2005-08-17 14:00:51 +02:00
|
|
|
data_dir = g_build_filename (g_tmp_dir, g_user_name, ".local",
|
2005-03-09 03:08:34 +01:00
|
|
|
"share", NULL);
|
2004-08-23 07:36:48 +02:00
|
|
|
}
|
2004-10-29 22:58:04 +02:00
|
|
|
|
2004-08-11 19:53:05 +02:00
|
|
|
g_user_data_dir = data_dir;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
data_dir = g_user_data_dir;
|
|
|
|
|
|
|
|
G_UNLOCK (g_utils_global);
|
|
|
|
|
|
|
|
return data_dir;
|
|
|
|
}
|
|
|
|
|
2007-06-05 19:36:17 +02:00
|
|
|
static void
|
|
|
|
g_init_user_config_dir (void)
|
2004-08-11 19:53:05 +02:00
|
|
|
{
|
2007-06-05 19:36:17 +02:00
|
|
|
gchar *config_dir;
|
2004-08-11 19:53:05 +02:00
|
|
|
|
|
|
|
if (!g_user_config_dir)
|
|
|
|
{
|
2004-08-25 02:39:13 +02:00
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
config_dir = get_special_folder (CSIDL_APPDATA);
|
|
|
|
#else
|
|
|
|
config_dir = (gchar *) g_getenv ("XDG_CONFIG_HOME");
|
2004-10-29 22:58:04 +02:00
|
|
|
|
2004-08-25 02:39:13 +02:00
|
|
|
if (config_dir && config_dir[0])
|
|
|
|
config_dir = g_strdup (config_dir);
|
2005-03-09 03:08:34 +01:00
|
|
|
#endif
|
|
|
|
if (!config_dir || !config_dir[0])
|
2004-08-25 02:39:13 +02:00
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_get_any_init ();
|
|
|
|
|
2005-03-09 03:08:34 +01:00
|
|
|
if (g_home_dir)
|
|
|
|
config_dir = g_build_filename (g_home_dir, ".config", NULL);
|
|
|
|
else
|
|
|
|
config_dir = g_build_filename (g_tmp_dir, g_user_name, ".config", NULL);
|
2004-08-25 02:39:13 +02:00
|
|
|
}
|
2007-06-05 19:36:17 +02:00
|
|
|
|
2004-08-25 02:39:13 +02:00
|
|
|
g_user_config_dir = config_dir;
|
2004-08-11 19:53:05 +02:00
|
|
|
}
|
2007-06-05 19:36:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_get_user_config_dir:
|
|
|
|
*
|
|
|
|
* Returns a base directory in which to store user-specific application
|
|
|
|
* configuration information such as user preferences and settings.
|
|
|
|
*
|
|
|
|
* On UNIX platforms this is determined using the mechanisms described in
|
|
|
|
* the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
|
2010-06-05 18:34:38 +02:00
|
|
|
* XDG Base Directory Specification</ulink>.
|
|
|
|
* In this case the directory retrieved will be XDG_CONFIG_HOME.
|
|
|
|
*
|
|
|
|
* On Windows is the directory that serves as a common repository for
|
|
|
|
* application-specific data. A typical path is
|
|
|
|
* C:\Documents and Settings\username\Application. See documentation for
|
|
|
|
* CSIDL_APPDATA.
|
|
|
|
*
|
2007-06-05 19:36:17 +02:00
|
|
|
* Return value: a string owned by GLib that must not be modified
|
|
|
|
* or freed.
|
|
|
|
* Since: 2.6
|
|
|
|
**/
|
|
|
|
G_CONST_RETURN gchar*
|
|
|
|
g_get_user_config_dir (void)
|
|
|
|
{
|
|
|
|
G_LOCK (g_utils_global);
|
|
|
|
|
|
|
|
g_init_user_config_dir ();
|
2004-08-11 19:53:05 +02:00
|
|
|
|
|
|
|
G_UNLOCK (g_utils_global);
|
|
|
|
|
2007-06-05 19:36:17 +02:00
|
|
|
return g_user_config_dir;
|
2004-08-11 19:53:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_get_user_cache_dir:
|
|
|
|
*
|
|
|
|
* Returns a base directory in which to store non-essential, cached
|
|
|
|
* data specific to particular user.
|
|
|
|
*
|
2005-02-02 07:07:14 +01:00
|
|
|
* On UNIX platforms this is determined using the mechanisms described in
|
2004-08-11 19:53:05 +02:00
|
|
|
* the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
|
2010-06-06 05:05:15 +02:00
|
|
|
* XDG Base Directory Specification</ulink>.
|
|
|
|
* In this case the directory retrieved will be XDG_CACHE_HOME.
|
|
|
|
*
|
|
|
|
* On Windows is the directory that serves as a common repository for
|
|
|
|
* temporary Internet files. A typical path is
|
|
|
|
* C:\Documents and Settings\username\Local Settings\Temporary Internet Files.
|
|
|
|
* See documentation for CSIDL_INTERNET_CACHE.
|
|
|
|
*
|
2004-08-11 19:53:05 +02:00
|
|
|
* Return value: a string owned by GLib that must not be modified
|
|
|
|
* or freed.
|
|
|
|
* Since: 2.6
|
|
|
|
**/
|
|
|
|
G_CONST_RETURN gchar*
|
|
|
|
g_get_user_cache_dir (void)
|
|
|
|
{
|
|
|
|
gchar *cache_dir;
|
|
|
|
|
|
|
|
G_LOCK (g_utils_global);
|
|
|
|
|
|
|
|
if (!g_user_cache_dir)
|
|
|
|
{
|
2004-08-25 02:39:13 +02:00
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
cache_dir = get_special_folder (CSIDL_INTERNET_CACHE); /* XXX correct? */
|
|
|
|
#else
|
2004-08-11 19:53:05 +02:00
|
|
|
cache_dir = (gchar *) g_getenv ("XDG_CACHE_HOME");
|
2005-03-09 03:08:34 +01:00
|
|
|
|
2004-08-11 19:53:05 +02:00
|
|
|
if (cache_dir && cache_dir[0])
|
|
|
|
cache_dir = g_strdup (cache_dir);
|
2005-03-09 03:08:34 +01:00
|
|
|
#endif
|
|
|
|
if (!cache_dir || !cache_dir[0])
|
2004-08-23 07:36:48 +02:00
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_get_any_init ();
|
|
|
|
|
2005-03-09 03:08:34 +01:00
|
|
|
if (g_home_dir)
|
|
|
|
cache_dir = g_build_filename (g_home_dir, ".cache", NULL);
|
|
|
|
else
|
|
|
|
cache_dir = g_build_filename (g_tmp_dir, g_user_name, ".cache", NULL);
|
2004-08-23 07:36:48 +02:00
|
|
|
}
|
2004-08-11 19:53:05 +02:00
|
|
|
g_user_cache_dir = cache_dir;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
cache_dir = g_user_cache_dir;
|
|
|
|
|
|
|
|
G_UNLOCK (g_utils_global);
|
|
|
|
|
|
|
|
return cache_dir;
|
|
|
|
}
|
|
|
|
|
2007-06-04 16:54:49 +02:00
|
|
|
#ifdef HAVE_CARBON
|
|
|
|
|
|
|
|
static gchar *
|
|
|
|
find_folder (OSType type)
|
|
|
|
{
|
|
|
|
gchar *filename = NULL;
|
|
|
|
FSRef found;
|
|
|
|
|
|
|
|
if (FSFindFolder (kUserDomain, type, kDontCreateFolder, &found) == noErr)
|
|
|
|
{
|
|
|
|
CFURLRef url = CFURLCreateFromFSRef (kCFAllocatorSystemDefault, &found);
|
|
|
|
|
|
|
|
if (url)
|
|
|
|
{
|
|
|
|
CFStringRef path = CFURLCopyFileSystemPath (url, kCFURLPOSIXPathStyle);
|
|
|
|
|
|
|
|
if (path)
|
|
|
|
{
|
|
|
|
filename = g_strdup (CFStringGetCStringPtr (path, kCFStringEncodingUTF8));
|
|
|
|
|
|
|
|
if (! filename)
|
|
|
|
{
|
|
|
|
filename = g_new0 (gchar, CFStringGetLength (path) * 3 + 1);
|
|
|
|
|
|
|
|
CFStringGetCString (path, filename,
|
|
|
|
CFStringGetLength (path) * 3 + 1,
|
|
|
|
kCFStringEncodingUTF8);
|
|
|
|
}
|
|
|
|
|
|
|
|
CFRelease (path);
|
|
|
|
}
|
|
|
|
|
|
|
|
CFRelease (url);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return filename;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
load_user_special_dirs (void)
|
|
|
|
{
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = find_folder (kDesktopFolderType);
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_DOCUMENTS] = find_folder (kDocumentsFolderType);
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = find_folder (kDesktopFolderType); /* XXX correct ? */
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_MUSIC] = find_folder (kMusicDocumentsFolderType);
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_PICTURES] = find_folder (kPictureDocumentsFolderType);
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = NULL;
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_TEMPLATES] = NULL;
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_VIDEOS] = find_folder (kMovieDocumentsFolderType);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* HAVE_CARBON */
|
|
|
|
|
|
|
|
#if defined(G_OS_WIN32)
|
|
|
|
static void
|
|
|
|
load_user_special_dirs (void)
|
|
|
|
{
|
2008-05-12 08:58:50 +02:00
|
|
|
typedef HRESULT (WINAPI *t_SHGetKnownFolderPath) (const GUID *rfid,
|
|
|
|
DWORD dwFlags,
|
|
|
|
HANDLE hToken,
|
|
|
|
PWSTR *ppszPath);
|
|
|
|
t_SHGetKnownFolderPath p_SHGetKnownFolderPath;
|
|
|
|
static const GUID FOLDERID_Downloads =
|
|
|
|
{ 0x374de290, 0x123f, 0x4565, { 0x91, 0x64, 0x39, 0xc4, 0x92, 0x5e, 0x46, 0x7b } };
|
|
|
|
static const GUID FOLDERID_Public =
|
|
|
|
{ 0xDFDF76A2, 0xC82A, 0x4D63, { 0x90, 0x6A, 0x56, 0x44, 0xAC, 0x45, 0x73, 0x85 } };
|
|
|
|
wchar_t *wcp;
|
|
|
|
|
|
|
|
p_SHGetKnownFolderPath = (t_SHGetKnownFolderPath) GetProcAddress (LoadLibrary ("shell32.dll"),
|
|
|
|
"SHGetKnownFolderPath");
|
|
|
|
|
2007-06-04 16:54:49 +02:00
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = get_special_folder (CSIDL_DESKTOPDIRECTORY);
|
2007-06-06 21:13:45 +02:00
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_DOCUMENTS] = get_special_folder (CSIDL_PERSONAL);
|
2008-05-12 08:58:50 +02:00
|
|
|
|
|
|
|
if (p_SHGetKnownFolderPath == NULL)
|
|
|
|
{
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = get_special_folder (CSIDL_DESKTOPDIRECTORY);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
wcp = NULL;
|
|
|
|
(*p_SHGetKnownFolderPath) (&FOLDERID_Downloads, 0, NULL, &wcp);
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = g_utf16_to_utf8 (wcp, -1, NULL, NULL, NULL);
|
|
|
|
if (g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] == NULL)
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = get_special_folder (CSIDL_DESKTOPDIRECTORY);
|
|
|
|
CoTaskMemFree (wcp);
|
|
|
|
}
|
|
|
|
|
2007-06-04 16:54:49 +02:00
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_MUSIC] = get_special_folder (CSIDL_MYMUSIC);
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_PICTURES] = get_special_folder (CSIDL_MYPICTURES);
|
2008-05-12 08:58:50 +02:00
|
|
|
|
|
|
|
if (p_SHGetKnownFolderPath == NULL)
|
|
|
|
{
|
|
|
|
/* XXX */
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = get_special_folder (CSIDL_COMMON_DOCUMENTS);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
wcp = NULL;
|
|
|
|
(*p_SHGetKnownFolderPath) (&FOLDERID_Public, 0, NULL, &wcp);
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = g_utf16_to_utf8 (wcp, -1, NULL, NULL, NULL);
|
|
|
|
if (g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] == NULL)
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = get_special_folder (CSIDL_COMMON_DOCUMENTS);
|
|
|
|
CoTaskMemFree (wcp);
|
|
|
|
}
|
|
|
|
|
2007-06-04 16:54:49 +02:00
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_TEMPLATES] = get_special_folder (CSIDL_TEMPLATES);
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_VIDEOS] = get_special_folder (CSIDL_MYVIDEO);
|
|
|
|
}
|
|
|
|
#endif /* G_OS_WIN32 */
|
|
|
|
|
2007-06-11 17:31:29 +02:00
|
|
|
static void g_init_user_config_dir (void);
|
2007-06-04 16:54:49 +02:00
|
|
|
|
|
|
|
#if defined(G_OS_UNIX) && !defined(HAVE_CARBON)
|
|
|
|
|
|
|
|
/* adapted from xdg-user-dir-lookup.c
|
|
|
|
*
|
|
|
|
* Copyright (C) 2007 Red Hat Inc.
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person
|
|
|
|
* obtaining a copy of this software and associated documentation files
|
|
|
|
* (the "Software"), to deal in the Software without restriction,
|
|
|
|
* including without limitation the rights to use, copy, modify, merge,
|
|
|
|
* publish, distribute, sublicense, and/or sell copies of the Software,
|
|
|
|
* and to permit persons to whom the Software is furnished to do so,
|
|
|
|
* subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be
|
2007-06-06 21:13:45 +02:00
|
|
|
* included in all copies or substantial portions of the Software.
|
2007-06-04 16:54:49 +02:00
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
|
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
|
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
|
* SOFTWARE.
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
load_user_special_dirs (void)
|
|
|
|
{
|
|
|
|
gchar *config_file;
|
|
|
|
gchar *data;
|
|
|
|
gchar **lines;
|
|
|
|
gint n_lines, i;
|
|
|
|
|
2007-06-05 19:36:17 +02:00
|
|
|
g_init_user_config_dir ();
|
|
|
|
config_file = g_build_filename (g_user_config_dir,
|
2007-06-04 16:54:49 +02:00
|
|
|
"user-dirs.dirs",
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
if (!g_file_get_contents (config_file, &data, NULL, NULL))
|
|
|
|
{
|
|
|
|
g_free (config_file);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
lines = g_strsplit (data, "\n", -1);
|
|
|
|
n_lines = g_strv_length (lines);
|
|
|
|
g_free (data);
|
|
|
|
|
|
|
|
for (i = 0; i < n_lines; i++)
|
|
|
|
{
|
|
|
|
gchar *buffer = lines[i];
|
|
|
|
gchar *d, *p;
|
|
|
|
gint len;
|
|
|
|
gboolean is_relative = FALSE;
|
|
|
|
GUserDirectory directory;
|
|
|
|
|
|
|
|
/* Remove newline at end */
|
|
|
|
len = strlen (buffer);
|
|
|
|
if (len > 0 && buffer[len - 1] == '\n')
|
|
|
|
buffer[len - 1] = 0;
|
|
|
|
|
|
|
|
p = buffer;
|
|
|
|
while (*p == ' ' || *p == '\t')
|
|
|
|
p++;
|
|
|
|
|
|
|
|
if (strncmp (p, "XDG_DESKTOP_DIR", strlen ("XDG_DESKTOP_DIR")) == 0)
|
|
|
|
{
|
|
|
|
directory = G_USER_DIRECTORY_DESKTOP;
|
|
|
|
p += strlen ("XDG_DESKTOP_DIR");
|
|
|
|
}
|
|
|
|
else if (strncmp (p, "XDG_DOCUMENTS_DIR", strlen ("XDG_DOCUMENTS_DIR")) == 0)
|
|
|
|
{
|
|
|
|
directory = G_USER_DIRECTORY_DOCUMENTS;
|
|
|
|
p += strlen ("XDG_DOCUMENTS_DIR");
|
|
|
|
}
|
|
|
|
else if (strncmp (p, "XDG_DOWNLOAD_DIR", strlen ("XDG_DOWNLOAD_DIR")) == 0)
|
|
|
|
{
|
|
|
|
directory = G_USER_DIRECTORY_DOWNLOAD;
|
|
|
|
p += strlen ("XDG_DOWNLOAD_DIR");
|
|
|
|
}
|
|
|
|
else if (strncmp (p, "XDG_MUSIC_DIR", strlen ("XDG_MUSIC_DIR")) == 0)
|
|
|
|
{
|
|
|
|
directory = G_USER_DIRECTORY_MUSIC;
|
|
|
|
p += strlen ("XDG_MUSIC_DIR");
|
|
|
|
}
|
|
|
|
else if (strncmp (p, "XDG_PICTURES_DIR", strlen ("XDG_PICTURES_DIR")) == 0)
|
|
|
|
{
|
|
|
|
directory = G_USER_DIRECTORY_PICTURES;
|
|
|
|
p += strlen ("XDG_PICTURES_DIR");
|
|
|
|
}
|
|
|
|
else if (strncmp (p, "XDG_PUBLICSHARE_DIR", strlen ("XDG_PUBLICSHARE_DIR")) == 0)
|
|
|
|
{
|
|
|
|
directory = G_USER_DIRECTORY_PUBLIC_SHARE;
|
|
|
|
p += strlen ("XDG_PUBLICSHARE_DIR");
|
|
|
|
}
|
|
|
|
else if (strncmp (p, "XDG_TEMPLATES_DIR", strlen ("XDG_TEMPLATES_DIR")) == 0)
|
|
|
|
{
|
|
|
|
directory = G_USER_DIRECTORY_TEMPLATES;
|
|
|
|
p += strlen ("XDG_TEMPLATES_DIR");
|
|
|
|
}
|
|
|
|
else if (strncmp (p, "XDG_VIDEOS_DIR", strlen ("XDG_VIDEOS_DIR")) == 0)
|
|
|
|
{
|
|
|
|
directory = G_USER_DIRECTORY_VIDEOS;
|
|
|
|
p += strlen ("XDG_VIDEOS_DIR");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
continue;
|
|
|
|
|
|
|
|
while (*p == ' ' || *p == '\t')
|
|
|
|
p++;
|
|
|
|
|
|
|
|
if (*p != '=')
|
|
|
|
continue;
|
|
|
|
p++;
|
|
|
|
|
|
|
|
while (*p == ' ' || *p == '\t')
|
|
|
|
p++;
|
|
|
|
|
|
|
|
if (*p != '"')
|
|
|
|
continue;
|
|
|
|
p++;
|
|
|
|
|
|
|
|
if (strncmp (p, "$HOME", 5) == 0)
|
|
|
|
{
|
|
|
|
p += 5;
|
|
|
|
is_relative = TRUE;
|
|
|
|
}
|
|
|
|
else if (*p != '/')
|
|
|
|
continue;
|
|
|
|
|
|
|
|
d = strrchr (p, '"');
|
|
|
|
if (!d)
|
|
|
|
continue;
|
|
|
|
*d = 0;
|
|
|
|
|
|
|
|
d = p;
|
|
|
|
|
|
|
|
/* remove trailing slashes */
|
|
|
|
len = strlen (d);
|
|
|
|
if (d[len - 1] == '/')
|
|
|
|
d[len - 1] = 0;
|
|
|
|
|
|
|
|
if (is_relative)
|
2007-06-05 19:36:17 +02:00
|
|
|
{
|
|
|
|
g_get_any_init ();
|
|
|
|
g_user_special_dirs[directory] = g_build_filename (g_home_dir, d, NULL);
|
|
|
|
}
|
2007-06-04 16:54:49 +02:00
|
|
|
else
|
|
|
|
g_user_special_dirs[directory] = g_strdup (d);
|
|
|
|
}
|
|
|
|
|
|
|
|
g_strfreev (lines);
|
|
|
|
g_free (config_file);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* G_OS_UNIX && !HAVE_CARBON */
|
|
|
|
|
2009-06-15 13:18:22 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* g_reload_user_special_dirs_cache:
|
|
|
|
*
|
|
|
|
* Resets the cache used for g_get_user_special_dir(), so
|
|
|
|
* that the latest on-disk version is used. Call this only
|
|
|
|
* if you just changed the data on disk yourself.
|
|
|
|
*
|
|
|
|
* Due to threadsafety issues this may cause leaking of strings
|
|
|
|
* that were previously returned from g_get_user_special_dir()
|
|
|
|
* that can't be freed. We ensure to only leak the data for
|
|
|
|
* the directories that actually changed value though.
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
g_reload_user_special_dirs_cache (void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
G_LOCK (g_utils_global);
|
|
|
|
|
|
|
|
if (g_user_special_dirs != NULL)
|
|
|
|
{
|
|
|
|
/* save a copy of the pointer, to check if some memory can be preserved */
|
|
|
|
char **old_g_user_special_dirs = g_user_special_dirs;
|
|
|
|
char *old_val;
|
|
|
|
|
|
|
|
/* recreate and reload our cache */
|
|
|
|
g_user_special_dirs = g_new0 (gchar *, G_USER_N_DIRECTORIES);
|
|
|
|
load_user_special_dirs ();
|
|
|
|
|
|
|
|
/* only leak changed directories */
|
|
|
|
for (i = 0; i < G_USER_N_DIRECTORIES; i++)
|
|
|
|
{
|
|
|
|
old_val = old_g_user_special_dirs[i];
|
|
|
|
if (g_strcmp0 (old_val, g_user_special_dirs[i]) == 0)
|
|
|
|
{
|
|
|
|
/* don't leak */
|
|
|
|
g_free (g_user_special_dirs[i]);
|
|
|
|
g_user_special_dirs[i] = old_val;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
g_free (old_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* free the old array */
|
|
|
|
g_free (old_g_user_special_dirs);
|
|
|
|
}
|
|
|
|
|
|
|
|
G_UNLOCK (g_utils_global);
|
|
|
|
}
|
|
|
|
|
2007-06-04 16:54:49 +02:00
|
|
|
/**
|
|
|
|
* g_get_user_special_dir:
|
|
|
|
* @directory: the logical id of special directory
|
|
|
|
*
|
|
|
|
* Returns the full path of a special directory using its logical id.
|
|
|
|
*
|
|
|
|
* On Unix this is done using the XDG special user directories.
|
2008-06-11 18:17:56 +02:00
|
|
|
* For compatibility with existing practise, %G_USER_DIRECTORY_DESKTOP
|
|
|
|
* falls back to <filename>$HOME/Desktop</filename> when XDG special
|
|
|
|
* user directories have not been set up.
|
2007-06-04 16:54:49 +02:00
|
|
|
*
|
2007-06-11 17:31:29 +02:00
|
|
|
* Depending on the platform, the user might be able to change the path
|
|
|
|
* of the special directory without requiring the session to restart; GLib
|
|
|
|
* will not reflect any change once the special directories are loaded.
|
|
|
|
*
|
2007-06-04 16:54:49 +02:00
|
|
|
* Return value: the path to the specified special directory, or %NULL
|
|
|
|
* if the logical id was not found. The returned string is owned by
|
|
|
|
* GLib and should not be modified or freed.
|
|
|
|
*
|
|
|
|
* Since: 2.14
|
|
|
|
*/
|
|
|
|
G_CONST_RETURN gchar *
|
|
|
|
g_get_user_special_dir (GUserDirectory directory)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (directory >= G_USER_DIRECTORY_DESKTOP &&
|
|
|
|
directory < G_USER_N_DIRECTORIES, NULL);
|
|
|
|
|
|
|
|
G_LOCK (g_utils_global);
|
|
|
|
|
2007-06-11 17:31:29 +02:00
|
|
|
if (G_UNLIKELY (g_user_special_dirs == NULL))
|
2007-06-04 16:54:49 +02:00
|
|
|
{
|
|
|
|
g_user_special_dirs = g_new0 (gchar *, G_USER_N_DIRECTORIES);
|
2007-06-06 21:05:53 +02:00
|
|
|
|
2007-06-04 16:54:49 +02:00
|
|
|
load_user_special_dirs ();
|
2007-06-06 21:05:53 +02:00
|
|
|
|
|
|
|
/* Special-case desktop for historical compatibility */
|
|
|
|
if (g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] == NULL)
|
|
|
|
{
|
|
|
|
g_get_any_init ();
|
2007-06-11 17:31:29 +02:00
|
|
|
|
|
|
|
g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] =
|
|
|
|
g_build_filename (g_home_dir, "Desktop", NULL);
|
2007-06-06 21:05:53 +02:00
|
|
|
}
|
2007-06-04 16:54:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
G_UNLOCK (g_utils_global);
|
|
|
|
|
|
|
|
return g_user_special_dirs[directory];
|
|
|
|
}
|
|
|
|
|
2005-04-08 14:03:16 +02:00
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
|
|
|
|
#undef g_get_system_data_dirs
|
|
|
|
|
|
|
|
static HMODULE
|
|
|
|
get_module_for_address (gconstpointer address)
|
|
|
|
{
|
|
|
|
/* Holds the g_utils_global lock */
|
|
|
|
|
|
|
|
static gboolean beenhere = FALSE;
|
|
|
|
typedef BOOL (WINAPI *t_GetModuleHandleExA) (DWORD, LPCTSTR, HMODULE *);
|
|
|
|
static t_GetModuleHandleExA p_GetModuleHandleExA = NULL;
|
2008-02-24 02:07:41 +01:00
|
|
|
HMODULE hmodule = NULL;
|
2005-04-08 14:03:16 +02:00
|
|
|
|
|
|
|
if (!address)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (!beenhere)
|
|
|
|
{
|
|
|
|
p_GetModuleHandleExA =
|
|
|
|
(t_GetModuleHandleExA) GetProcAddress (LoadLibrary ("kernel32.dll"),
|
|
|
|
"GetModuleHandleExA");
|
|
|
|
beenhere = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (p_GetModuleHandleExA == NULL ||
|
|
|
|
!(*p_GetModuleHandleExA) (GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT |
|
|
|
|
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
|
|
|
|
address, &hmodule))
|
|
|
|
{
|
|
|
|
MEMORY_BASIC_INFORMATION mbi;
|
|
|
|
VirtualQuery (address, &mbi, sizeof (mbi));
|
|
|
|
hmodule = (HMODULE) mbi.AllocationBase;
|
|
|
|
}
|
|
|
|
|
|
|
|
return hmodule;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gchar *
|
|
|
|
get_module_share_dir (gconstpointer address)
|
|
|
|
{
|
|
|
|
HMODULE hmodule;
|
2008-02-24 02:07:41 +01:00
|
|
|
gchar *filename;
|
|
|
|
gchar *retval;
|
2005-04-08 14:03:16 +02:00
|
|
|
|
|
|
|
hmodule = get_module_for_address (address);
|
|
|
|
if (hmodule == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
2008-02-24 02:07:41 +01:00
|
|
|
filename = g_win32_get_package_installation_directory_of_module (hmodule);
|
2005-04-08 14:03:16 +02:00
|
|
|
retval = g_build_filename (filename, "share", NULL);
|
|
|
|
g_free (filename);
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
G_CONST_RETURN gchar * G_CONST_RETURN *
|
2009-02-23 10:52:48 +01:00
|
|
|
g_win32_get_system_data_dirs_for_module (void (*address_of_function)())
|
2005-04-08 14:03:16 +02:00
|
|
|
{
|
|
|
|
GArray *data_dirs;
|
|
|
|
HMODULE hmodule;
|
|
|
|
static GHashTable *per_module_data_dirs = NULL;
|
|
|
|
gchar **retval;
|
|
|
|
gchar *p;
|
2008-02-24 02:07:41 +01:00
|
|
|
gchar *exe_root;
|
2005-04-08 14:03:16 +02:00
|
|
|
|
2009-02-23 10:52:48 +01:00
|
|
|
if (address_of_function)
|
2005-04-08 14:03:16 +02:00
|
|
|
{
|
|
|
|
G_LOCK (g_utils_global);
|
2009-02-23 10:52:48 +01:00
|
|
|
hmodule = get_module_for_address (address_of_function);
|
2005-04-08 14:03:16 +02:00
|
|
|
if (hmodule != NULL)
|
|
|
|
{
|
|
|
|
if (per_module_data_dirs == NULL)
|
|
|
|
per_module_data_dirs = g_hash_table_new (NULL, NULL);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
retval = g_hash_table_lookup (per_module_data_dirs, hmodule);
|
|
|
|
|
|
|
|
if (retval != NULL)
|
|
|
|
{
|
|
|
|
G_UNLOCK (g_utils_global);
|
|
|
|
return (G_CONST_RETURN gchar * G_CONST_RETURN *) retval;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
data_dirs = g_array_new (TRUE, TRUE, sizeof (char *));
|
|
|
|
|
|
|
|
/* Documents and Settings\All Users\Application Data */
|
|
|
|
p = get_special_folder (CSIDL_COMMON_APPDATA);
|
|
|
|
if (p)
|
|
|
|
g_array_append_val (data_dirs, p);
|
|
|
|
|
|
|
|
/* Documents and Settings\All Users\Documents */
|
|
|
|
p = get_special_folder (CSIDL_COMMON_DOCUMENTS);
|
|
|
|
if (p)
|
|
|
|
g_array_append_val (data_dirs, p);
|
|
|
|
|
|
|
|
/* Using the above subfolders of Documents and Settings perhaps
|
|
|
|
* makes sense from a Windows perspective.
|
|
|
|
*
|
|
|
|
* But looking at the actual use cases of this function in GTK+
|
|
|
|
* and GNOME software, what we really want is the "share"
|
|
|
|
* subdirectory of the installation directory for the package
|
|
|
|
* our caller is a part of.
|
|
|
|
*
|
2009-02-23 10:52:48 +01:00
|
|
|
* The address_of_function parameter, if non-NULL, points to a
|
|
|
|
* function in the calling module. Use that to determine that
|
|
|
|
* module's installation folder, and use its "share" subfolder.
|
2005-04-08 14:03:16 +02:00
|
|
|
*
|
|
|
|
* Additionally, also use the "share" subfolder of the installation
|
|
|
|
* locations of GLib and the .exe file being run.
|
|
|
|
*
|
|
|
|
* To guard against none of the above being what is really wanted,
|
|
|
|
* callers of this function should have Win32-specific code to look
|
|
|
|
* up their installation folder themselves, and handle a subfolder
|
|
|
|
* "share" of it in the same way as the folders returned from this
|
|
|
|
* function.
|
|
|
|
*/
|
|
|
|
|
2009-02-23 10:52:48 +01:00
|
|
|
p = get_module_share_dir (address_of_function);
|
2005-04-08 14:03:16 +02:00
|
|
|
if (p)
|
|
|
|
g_array_append_val (data_dirs, p);
|
|
|
|
|
2008-02-24 02:07:41 +01:00
|
|
|
if (glib_dll != NULL)
|
|
|
|
{
|
|
|
|
gchar *glib_root = g_win32_get_package_installation_directory_of_module (glib_dll);
|
|
|
|
p = g_build_filename (glib_root, "share", NULL);
|
|
|
|
if (p)
|
|
|
|
g_array_append_val (data_dirs, p);
|
|
|
|
g_free (glib_root);
|
|
|
|
}
|
2005-04-08 14:03:16 +02:00
|
|
|
|
2008-02-24 02:07:41 +01:00
|
|
|
exe_root = g_win32_get_package_installation_directory_of_module (NULL);
|
|
|
|
p = g_build_filename (exe_root, "share", NULL);
|
2005-04-08 14:03:16 +02:00
|
|
|
if (p)
|
|
|
|
g_array_append_val (data_dirs, p);
|
2008-02-24 02:07:41 +01:00
|
|
|
g_free (exe_root);
|
2005-04-08 14:03:16 +02:00
|
|
|
|
|
|
|
retval = (gchar **) g_array_free (data_dirs, FALSE);
|
|
|
|
|
2009-02-23 10:52:48 +01:00
|
|
|
if (address_of_function)
|
2005-04-08 14:03:16 +02:00
|
|
|
{
|
|
|
|
if (hmodule != NULL)
|
|
|
|
g_hash_table_insert (per_module_data_dirs, hmodule, retval);
|
|
|
|
G_UNLOCK (g_utils_global);
|
|
|
|
}
|
|
|
|
|
|
|
|
return (G_CONST_RETURN gchar * G_CONST_RETURN *) retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2004-08-11 19:53:05 +02:00
|
|
|
/**
|
|
|
|
* g_get_system_data_dirs:
|
|
|
|
*
|
|
|
|
* Returns an ordered list of base directories in which to access
|
|
|
|
* system-wide application data.
|
|
|
|
*
|
2005-02-02 07:07:14 +01:00
|
|
|
* On UNIX platforms this is determined using the mechanisms described in
|
2004-08-11 19:53:05 +02:00
|
|
|
* the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
|
|
|
|
* XDG Base Directory Specification</ulink>
|
2010-06-06 05:13:06 +02:00
|
|
|
* In this case the list of directories retrieved will be XDG_DATA_DIRS.
|
|
|
|
*
|
2005-04-08 14:03:16 +02:00
|
|
|
* On Windows the first elements in the list are the Application Data
|
|
|
|
* and Documents folders for All Users. (These can be determined only
|
|
|
|
* on Windows 2000 or later and are not present in the list on other
|
|
|
|
* Windows versions.) See documentation for CSIDL_COMMON_APPDATA and
|
|
|
|
* CSIDL_COMMON_DOCUMENTS.
|
|
|
|
*
|
|
|
|
* Then follows the "share" subfolder in the installation folder for
|
|
|
|
* the package containing the DLL that calls this function, if it can
|
|
|
|
* be determined.
|
|
|
|
*
|
|
|
|
* Finally the list contains the "share" subfolder in the installation
|
|
|
|
* folder for GLib, and in the installation folder for the package the
|
|
|
|
* application's .exe file belongs to.
|
|
|
|
*
|
|
|
|
* The installation folders above are determined by looking up the
|
|
|
|
* folder where the module (DLL or EXE) in question is located. If the
|
|
|
|
* folder's name is "bin", its parent is used, otherwise the folder
|
|
|
|
* itself.
|
|
|
|
*
|
|
|
|
* Note that on Windows the returned list can vary depending on where
|
|
|
|
* this function is called.
|
|
|
|
*
|
2004-08-11 19:53:05 +02:00
|
|
|
* Return value: a %NULL-terminated array of strings owned by GLib that must
|
|
|
|
* not be modified or freed.
|
|
|
|
* Since: 2.6
|
|
|
|
**/
|
|
|
|
G_CONST_RETURN gchar * G_CONST_RETURN *
|
|
|
|
g_get_system_data_dirs (void)
|
|
|
|
{
|
2005-04-08 14:03:16 +02:00
|
|
|
gchar **data_dir_vector;
|
2004-08-11 19:53:05 +02:00
|
|
|
|
|
|
|
G_LOCK (g_utils_global);
|
|
|
|
|
|
|
|
if (!g_system_data_dirs)
|
|
|
|
{
|
2004-08-25 02:39:13 +02:00
|
|
|
#ifdef G_OS_WIN32
|
2005-04-08 14:03:16 +02:00
|
|
|
data_dir_vector = (gchar **) g_win32_get_system_data_dirs_for_module (NULL);
|
2004-08-25 02:39:13 +02:00
|
|
|
#else
|
2005-04-08 14:03:16 +02:00
|
|
|
gchar *data_dirs = (gchar *) g_getenv ("XDG_DATA_DIRS");
|
2004-08-11 19:53:05 +02:00
|
|
|
|
|
|
|
if (!data_dirs || !data_dirs[0])
|
|
|
|
data_dirs = "/usr/local/share/:/usr/share/";
|
2005-03-09 03:08:34 +01:00
|
|
|
|
2004-08-25 02:39:13 +02:00
|
|
|
data_dir_vector = g_strsplit (data_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
|
2005-03-09 03:08:34 +01:00
|
|
|
#endif
|
2004-08-11 19:53:05 +02:00
|
|
|
|
|
|
|
g_system_data_dirs = data_dir_vector;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
data_dir_vector = g_system_data_dirs;
|
|
|
|
|
|
|
|
G_UNLOCK (g_utils_global);
|
|
|
|
|
|
|
|
return (G_CONST_RETURN gchar * G_CONST_RETURN *) data_dir_vector;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_get_system_config_dirs:
|
|
|
|
*
|
|
|
|
* Returns an ordered list of base directories in which to access
|
|
|
|
* system-wide configuration information.
|
|
|
|
*
|
2005-02-02 07:07:14 +01:00
|
|
|
* On UNIX platforms this is determined using the mechanisms described in
|
2004-08-11 19:53:05 +02:00
|
|
|
* the <ulink url="http://www.freedesktop.org/Standards/basedir-spec">
|
|
|
|
* XDG Base Directory Specification</ulink>
|
|
|
|
*
|
|
|
|
* Return value: a %NULL-terminated array of strings owned by GLib that must
|
|
|
|
* not be modified or freed.
|
|
|
|
* Since: 2.6
|
|
|
|
**/
|
|
|
|
G_CONST_RETURN gchar * G_CONST_RETURN *
|
|
|
|
g_get_system_config_dirs (void)
|
|
|
|
{
|
|
|
|
gchar *conf_dirs, **conf_dir_vector;
|
|
|
|
|
|
|
|
G_LOCK (g_utils_global);
|
|
|
|
|
|
|
|
if (!g_system_config_dirs)
|
|
|
|
{
|
2004-08-25 02:39:13 +02:00
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
conf_dirs = get_special_folder (CSIDL_COMMON_APPDATA);
|
2005-03-09 03:08:34 +01:00
|
|
|
if (conf_dirs)
|
|
|
|
{
|
|
|
|
conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
|
|
|
|
g_free (conf_dirs);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Return empty list */
|
|
|
|
conf_dir_vector = g_strsplit ("", G_SEARCHPATH_SEPARATOR_S, 0);
|
|
|
|
}
|
2004-08-25 02:39:13 +02:00
|
|
|
#else
|
2004-08-11 19:53:05 +02:00
|
|
|
conf_dirs = (gchar *) g_getenv ("XDG_CONFIG_DIRS");
|
|
|
|
|
|
|
|
if (!conf_dirs || !conf_dirs[0])
|
|
|
|
conf_dirs = "/etc/xdg";
|
2005-03-09 03:08:34 +01:00
|
|
|
|
2004-08-25 02:39:13 +02:00
|
|
|
conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
|
2005-03-09 03:08:34 +01:00
|
|
|
#endif
|
2004-12-02 15:27:31 +01:00
|
|
|
|
|
|
|
g_system_config_dirs = conf_dir_vector;
|
2004-08-11 19:53:05 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
conf_dir_vector = g_system_config_dirs;
|
|
|
|
G_UNLOCK (g_utils_global);
|
|
|
|
|
|
|
|
return (G_CONST_RETURN gchar * G_CONST_RETURN *) conf_dir_vector;
|
|
|
|
}
|
|
|
|
|
2005-04-08 08:48:17 +02:00
|
|
|
#ifndef G_OS_WIN32
|
|
|
|
|
2004-09-07 20:37:10 +02:00
|
|
|
static GHashTable *alias_table = NULL;
|
|
|
|
|
|
|
|
/* read an alias file for the locales */
|
|
|
|
static void
|
|
|
|
read_aliases (gchar *file)
|
|
|
|
{
|
|
|
|
FILE *fp;
|
|
|
|
char buf[256];
|
|
|
|
|
|
|
|
if (!alias_table)
|
|
|
|
alias_table = g_hash_table_new (g_str_hash, g_str_equal);
|
|
|
|
fp = fopen (file,"r");
|
|
|
|
if (!fp)
|
|
|
|
return;
|
|
|
|
while (fgets (buf, 256, fp))
|
|
|
|
{
|
|
|
|
char *p, *q;
|
|
|
|
|
|
|
|
g_strstrip (buf);
|
|
|
|
|
|
|
|
/* Line is a comment */
|
|
|
|
if ((buf[0] == '#') || (buf[0] == '\0'))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
/* Reads first column */
|
|
|
|
for (p = buf, q = NULL; *p; p++) {
|
|
|
|
if ((*p == '\t') || (*p == ' ') || (*p == ':')) {
|
|
|
|
*p = '\0';
|
|
|
|
q = p+1;
|
|
|
|
while ((*q == '\t') || (*q == ' ')) {
|
|
|
|
q++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* The line only had one column */
|
|
|
|
if (!q || *q == '\0')
|
|
|
|
continue;
|
|
|
|
|
|
|
|
/* Read second column */
|
|
|
|
for (p = q; *p; p++) {
|
|
|
|
if ((*p == '\t') || (*p == ' ')) {
|
|
|
|
*p = '\0';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Add to alias table if necessary */
|
|
|
|
if (!g_hash_table_lookup (alias_table, buf)) {
|
|
|
|
g_hash_table_insert (alias_table, g_strdup (buf), g_strdup (q));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fclose (fp);
|
|
|
|
}
|
|
|
|
|
2005-04-08 08:48:17 +02:00
|
|
|
#endif
|
|
|
|
|
2004-09-07 20:37:10 +02:00
|
|
|
static char *
|
|
|
|
unalias_lang (char *lang)
|
|
|
|
{
|
2005-04-08 08:48:17 +02:00
|
|
|
#ifndef G_OS_WIN32
|
2004-09-07 20:37:10 +02:00
|
|
|
char *p;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (!alias_table)
|
|
|
|
read_aliases ("/usr/share/locale/locale.alias");
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
while ((p = g_hash_table_lookup (alias_table, lang)) && (strcmp (p, lang) != 0))
|
|
|
|
{
|
|
|
|
lang = p;
|
|
|
|
if (i++ == 30)
|
|
|
|
{
|
|
|
|
static gboolean said_before = FALSE;
|
|
|
|
if (!said_before)
|
|
|
|
g_warning ("Too many alias levels for a locale, "
|
|
|
|
"may indicate a loop");
|
|
|
|
said_before = TRUE;
|
|
|
|
return lang;
|
|
|
|
}
|
|
|
|
}
|
2005-04-08 08:48:17 +02:00
|
|
|
#endif
|
2004-09-07 20:37:10 +02:00
|
|
|
return lang;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Mask for components of locale spec. The ordering here is from
|
|
|
|
* least significant to most significant
|
|
|
|
*/
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
COMPONENT_CODESET = 1 << 0,
|
|
|
|
COMPONENT_TERRITORY = 1 << 1,
|
|
|
|
COMPONENT_MODIFIER = 1 << 2
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Break an X/Open style locale specification into components
|
|
|
|
*/
|
|
|
|
static guint
|
|
|
|
explode_locale (const gchar *locale,
|
|
|
|
gchar **language,
|
|
|
|
gchar **territory,
|
|
|
|
gchar **codeset,
|
|
|
|
gchar **modifier)
|
|
|
|
{
|
|
|
|
const gchar *uscore_pos;
|
|
|
|
const gchar *at_pos;
|
|
|
|
const gchar *dot_pos;
|
|
|
|
|
|
|
|
guint mask = 0;
|
|
|
|
|
|
|
|
uscore_pos = strchr (locale, '_');
|
|
|
|
dot_pos = strchr (uscore_pos ? uscore_pos : locale, '.');
|
|
|
|
at_pos = strchr (dot_pos ? dot_pos : (uscore_pos ? uscore_pos : locale), '@');
|
|
|
|
|
|
|
|
if (at_pos)
|
|
|
|
{
|
|
|
|
mask |= COMPONENT_MODIFIER;
|
|
|
|
*modifier = g_strdup (at_pos);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
at_pos = locale + strlen (locale);
|
|
|
|
|
|
|
|
if (dot_pos)
|
|
|
|
{
|
|
|
|
mask |= COMPONENT_CODESET;
|
|
|
|
*codeset = g_strndup (dot_pos, at_pos - dot_pos);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
dot_pos = at_pos;
|
|
|
|
|
|
|
|
if (uscore_pos)
|
|
|
|
{
|
|
|
|
mask |= COMPONENT_TERRITORY;
|
|
|
|
*territory = g_strndup (uscore_pos, dot_pos - uscore_pos);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
uscore_pos = dot_pos;
|
|
|
|
|
|
|
|
*language = g_strndup (locale, uscore_pos - locale);
|
|
|
|
|
|
|
|
return mask;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Compute all interesting variants for a given locale name -
|
|
|
|
* by stripping off different components of the value.
|
|
|
|
*
|
|
|
|
* For simplicity, we assume that the locale is in
|
|
|
|
* X/Open format: language[_territory][.codeset][@modifier]
|
|
|
|
*
|
|
|
|
* TODO: Extend this to handle the CEN format (see the GNUlibc docs)
|
|
|
|
* as well. We could just copy the code from glibc wholesale
|
|
|
|
* but it is big, ugly, and complicated, so I'm reluctant
|
|
|
|
* to do so when this should handle 99% of the time...
|
|
|
|
*/
|
2004-10-23 08:16:42 +02:00
|
|
|
GSList *
|
|
|
|
_g_compute_locale_variants (const gchar *locale)
|
2004-09-07 20:37:10 +02:00
|
|
|
{
|
|
|
|
GSList *retval = NULL;
|
|
|
|
|
2005-08-09 04:45:20 +02:00
|
|
|
gchar *language = NULL;
|
|
|
|
gchar *territory = NULL;
|
|
|
|
gchar *codeset = NULL;
|
|
|
|
gchar *modifier = NULL;
|
2004-09-07 20:37:10 +02:00
|
|
|
|
|
|
|
guint mask;
|
|
|
|
guint i;
|
|
|
|
|
|
|
|
g_return_val_if_fail (locale != NULL, NULL);
|
|
|
|
|
|
|
|
mask = explode_locale (locale, &language, &territory, &codeset, &modifier);
|
|
|
|
|
|
|
|
/* Iterate through all possible combinations, from least attractive
|
|
|
|
* to most attractive.
|
|
|
|
*/
|
|
|
|
for (i = 0; i <= mask; i++)
|
|
|
|
if ((i & ~mask) == 0)
|
|
|
|
{
|
|
|
|
gchar *val = g_strconcat (language,
|
|
|
|
(i & COMPONENT_TERRITORY) ? territory : "",
|
|
|
|
(i & COMPONENT_CODESET) ? codeset : "",
|
|
|
|
(i & COMPONENT_MODIFIER) ? modifier : "",
|
|
|
|
NULL);
|
|
|
|
retval = g_slist_prepend (retval, val);
|
|
|
|
}
|
|
|
|
|
|
|
|
g_free (language);
|
|
|
|
if (mask & COMPONENT_CODESET)
|
|
|
|
g_free (codeset);
|
|
|
|
if (mask & COMPONENT_TERRITORY)
|
|
|
|
g_free (territory);
|
|
|
|
if (mask & COMPONENT_MODIFIER)
|
|
|
|
g_free (modifier);
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The following is (partly) taken from the gettext package.
|
|
|
|
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. */
|
|
|
|
|
|
|
|
static const gchar *
|
|
|
|
guess_category_value (const gchar *category_name)
|
|
|
|
{
|
|
|
|
const gchar *retval;
|
|
|
|
|
|
|
|
/* The highest priority value is the `LANGUAGE' environment
|
|
|
|
variable. This is a GNU extension. */
|
|
|
|
retval = g_getenv ("LANGUAGE");
|
|
|
|
if ((retval != NULL) && (retval[0] != '\0'))
|
|
|
|
return retval;
|
|
|
|
|
|
|
|
/* `LANGUAGE' is not set. So we have to proceed with the POSIX
|
|
|
|
methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some
|
|
|
|
systems this can be done by the `setlocale' function itself. */
|
|
|
|
|
|
|
|
/* Setting of LC_ALL overwrites all other. */
|
|
|
|
retval = g_getenv ("LC_ALL");
|
|
|
|
if ((retval != NULL) && (retval[0] != '\0'))
|
|
|
|
return retval;
|
|
|
|
|
|
|
|
/* Next comes the name of the desired category. */
|
|
|
|
retval = g_getenv (category_name);
|
|
|
|
if ((retval != NULL) && (retval[0] != '\0'))
|
|
|
|
return retval;
|
|
|
|
|
|
|
|
/* Last possibility is the LANG environment variable. */
|
|
|
|
retval = g_getenv ("LANG");
|
|
|
|
if ((retval != NULL) && (retval[0] != '\0'))
|
|
|
|
return retval;
|
|
|
|
|
2004-09-09 00:44:22 +02:00
|
|
|
#ifdef G_PLATFORM_WIN32
|
|
|
|
/* g_win32_getlocale() first checks for LC_ALL, LC_MESSAGES and
|
|
|
|
* LANG, which we already did above. Oh well. The main point of
|
|
|
|
* calling g_win32_getlocale() is to get the thread's locale as used
|
|
|
|
* by Windows and the Microsoft C runtime (in the "English_United
|
|
|
|
* States" format) translated into the Unixish format.
|
|
|
|
*/
|
|
|
|
retval = g_win32_getlocale ();
|
|
|
|
if ((retval != NULL) && (retval[0] != '\0'))
|
|
|
|
return retval;
|
|
|
|
#endif
|
|
|
|
|
2004-09-07 20:37:10 +02:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2004-12-07 16:20:15 +01:00
|
|
|
typedef struct _GLanguageNamesCache GLanguageNamesCache;
|
|
|
|
|
|
|
|
struct _GLanguageNamesCache {
|
|
|
|
gchar *languages;
|
|
|
|
gchar **language_names;
|
|
|
|
};
|
|
|
|
|
|
|
|
static void
|
|
|
|
language_names_cache_free (gpointer data)
|
|
|
|
{
|
|
|
|
GLanguageNamesCache *cache = data;
|
|
|
|
g_free (cache->languages);
|
|
|
|
g_strfreev (cache->language_names);
|
|
|
|
g_free (cache);
|
|
|
|
}
|
2004-09-07 20:37:10 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* g_get_language_names:
|
|
|
|
*
|
|
|
|
* Computes a list of applicable locale names, which can be used to
|
|
|
|
* e.g. construct locale-dependent filenames or search paths. The returned
|
|
|
|
* list is sorted from most desirable to least desirable and always contains
|
|
|
|
* the default locale "C".
|
|
|
|
*
|
|
|
|
* For example, if LANGUAGE=de:en_US, then the returned list is
|
|
|
|
* "de", "en_US", "en", "C".
|
|
|
|
*
|
|
|
|
* This function consults the environment variables <envar>LANGUAGE</envar>,
|
|
|
|
* <envar>LC_ALL</envar>, <envar>LC_MESSAGES</envar> and <envar>LANG</envar>
|
|
|
|
* to find the list of locales specified by the user.
|
|
|
|
*
|
|
|
|
* Return value: a %NULL-terminated array of strings owned by GLib
|
|
|
|
* that must not be modified or freed.
|
|
|
|
*
|
|
|
|
* Since: 2.6
|
|
|
|
**/
|
|
|
|
G_CONST_RETURN gchar * G_CONST_RETURN *
|
2004-11-01 19:47:12 +01:00
|
|
|
g_get_language_names (void)
|
2004-09-07 20:37:10 +02:00
|
|
|
{
|
2004-12-07 16:20:15 +01:00
|
|
|
static GStaticPrivate cache_private = G_STATIC_PRIVATE_INIT;
|
|
|
|
GLanguageNamesCache *cache = g_static_private_get (&cache_private);
|
|
|
|
const gchar *value;
|
|
|
|
|
|
|
|
if (!cache)
|
|
|
|
{
|
|
|
|
cache = g_new0 (GLanguageNamesCache, 1);
|
|
|
|
g_static_private_set (&cache_private, cache, language_names_cache_free);
|
|
|
|
}
|
|
|
|
|
|
|
|
value = guess_category_value ("LC_MESSAGES");
|
|
|
|
if (!value)
|
|
|
|
value = "C";
|
2004-09-07 20:37:10 +02:00
|
|
|
|
2004-12-07 16:20:15 +01:00
|
|
|
if (!(cache->languages && strcmp (cache->languages, value) == 0))
|
2004-09-07 20:37:10 +02:00
|
|
|
{
|
2004-12-07 16:20:15 +01:00
|
|
|
gchar **languages;
|
2004-09-07 20:37:10 +02:00
|
|
|
gchar **alist, **a;
|
|
|
|
GSList *list, *l;
|
|
|
|
gint i;
|
|
|
|
|
2004-12-07 16:20:15 +01:00
|
|
|
g_free (cache->languages);
|
|
|
|
g_strfreev (cache->language_names);
|
|
|
|
cache->languages = g_strdup (value);
|
2004-09-07 20:37:10 +02:00
|
|
|
|
|
|
|
alist = g_strsplit (value, ":", 0);
|
|
|
|
list = NULL;
|
|
|
|
for (a = alist; *a; a++)
|
|
|
|
{
|
|
|
|
gchar *b = unalias_lang (*a);
|
2004-10-23 08:16:42 +02:00
|
|
|
list = g_slist_concat (list, _g_compute_locale_variants (b));
|
2004-09-07 20:37:10 +02:00
|
|
|
}
|
|
|
|
g_strfreev (alist);
|
2004-12-07 16:20:15 +01:00
|
|
|
list = g_slist_append (list, g_strdup ("C"));
|
2004-09-07 20:37:10 +02:00
|
|
|
|
2004-12-07 16:20:15 +01:00
|
|
|
cache->language_names = languages = g_new (gchar *, g_slist_length (list) + 1);
|
2004-09-07 20:37:10 +02:00
|
|
|
for (l = list, i = 0; l; l = l->next, i++)
|
|
|
|
languages[i] = l->data;
|
|
|
|
languages[i] = NULL;
|
|
|
|
|
|
|
|
g_slist_free (list);
|
|
|
|
}
|
|
|
|
|
2004-12-07 16:20:15 +01:00
|
|
|
return (G_CONST_RETURN gchar * G_CONST_RETURN *) cache->language_names;
|
2004-09-07 20:37:10 +02:00
|
|
|
}
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_direct_hash:
|
|
|
|
* @v: a #gpointer key
|
|
|
|
*
|
|
|
|
* Converts a gpointer to a hash value.
|
|
|
|
* It can be passed to g_hash_table_new() as the @hash_func parameter,
|
|
|
|
* when using pointers as keys in a #GHashTable.
|
|
|
|
*
|
|
|
|
* Returns: a hash value corresponding to the key.
|
|
|
|
*/
|
1998-06-11 01:21:14 +02:00
|
|
|
guint
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
g_direct_hash (gconstpointer v)
|
1998-06-11 01:21:14 +02:00
|
|
|
{
|
1998-06-12 11:38:32 +02:00
|
|
|
return GPOINTER_TO_UINT (v);
|
1998-06-11 01:21:14 +02:00
|
|
|
}
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_direct_equal:
|
|
|
|
* @v1: a key.
|
|
|
|
* @v2: a key to compare with @v1.
|
|
|
|
*
|
|
|
|
* Compares two #gpointer arguments and returns %TRUE if they are equal.
|
|
|
|
* It can be passed to g_hash_table_new() as the @key_equal_func
|
|
|
|
* parameter, when using pointers as keys in a #GHashTable.
|
|
|
|
*
|
|
|
|
* Returns: %TRUE if the two keys match.
|
|
|
|
*/
|
Introduced new function type GEqualFunc to return TRUE for equal params.
2000-10-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h:
Introduced new function type GEqualFunc to return TRUE for equal
params. This is now used instead of GCompareFunc (which should
work akin to strcmp) here. This kind of fixes Bug #14412. Note
that technically GCompareFunc and GEqualFunc are still the same
types, as gint == gboolean.
* ghash.h, gutils.c: g_int_equal and g_direct_equal now return
gboolean to be really become GEqualFunc.
* gscanner.c, testglib.c, tests/hash-test.c: Some tiny changes to
follow the above change.
2000-10-30 15:34:52 +01:00
|
|
|
gboolean
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
g_direct_equal (gconstpointer v1,
|
|
|
|
gconstpointer v2)
|
1998-06-12 11:38:32 +02:00
|
|
|
{
|
1999-02-10 09:06:26 +01:00
|
|
|
return v1 == v2;
|
1998-06-12 11:38:32 +02:00
|
|
|
}
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_int_equal:
|
|
|
|
* @v1: a pointer to a #gint key.
|
|
|
|
* @v2: a pointer to a #gint key to compare with @v1.
|
|
|
|
*
|
|
|
|
* Compares the two #gint values being pointed to and returns
|
|
|
|
* %TRUE if they are equal.
|
|
|
|
* It can be passed to g_hash_table_new() as the @key_equal_func
|
|
|
|
* parameter, when using pointers to integers as keys in a #GHashTable.
|
|
|
|
*
|
|
|
|
* Returns: %TRUE if the two keys match.
|
|
|
|
*/
|
Introduced new function type GEqualFunc to return TRUE for equal params.
2000-10-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h:
Introduced new function type GEqualFunc to return TRUE for equal
params. This is now used instead of GCompareFunc (which should
work akin to strcmp) here. This kind of fixes Bug #14412. Note
that technically GCompareFunc and GEqualFunc are still the same
types, as gint == gboolean.
* ghash.h, gutils.c: g_int_equal and g_direct_equal now return
gboolean to be really become GEqualFunc.
* gscanner.c, testglib.c, tests/hash-test.c: Some tiny changes to
follow the above change.
2000-10-30 15:34:52 +01:00
|
|
|
gboolean
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
g_int_equal (gconstpointer v1,
|
|
|
|
gconstpointer v2)
|
1998-06-12 11:38:32 +02:00
|
|
|
{
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
return *((const gint*) v1) == *((const gint*) v2);
|
1998-06-12 11:38:32 +02:00
|
|
|
}
|
|
|
|
|
2005-02-02 07:07:14 +01:00
|
|
|
/**
|
|
|
|
* g_int_hash:
|
|
|
|
* @v: a pointer to a #gint key
|
|
|
|
*
|
|
|
|
* Converts a pointer to a #gint to a hash value.
|
|
|
|
* It can be passed to g_hash_table_new() as the @hash_func parameter,
|
|
|
|
* when using pointers to integers values as keys in a #GHashTable.
|
|
|
|
*
|
|
|
|
* Returns: a hash value corresponding to the key.
|
|
|
|
*/
|
1998-06-12 11:38:32 +02:00
|
|
|
guint
|
|
|
|
g_int_hash (gconstpointer v)
|
|
|
|
{
|
|
|
|
return *(const gint*) v;
|
|
|
|
}
|
2000-05-29 20:48:29 +02:00
|
|
|
|
2009-04-26 04:41:07 +02:00
|
|
|
/**
|
|
|
|
* g_int64_equal:
|
|
|
|
* @v1: a pointer to a #gint64 key.
|
|
|
|
* @v2: a pointer to a #gint64 key to compare with @v1.
|
|
|
|
*
|
|
|
|
* Compares the two #gint64 values being pointed to and returns
|
|
|
|
* %TRUE if they are equal.
|
|
|
|
* It can be passed to g_hash_table_new() as the @key_equal_func
|
|
|
|
* parameter, when using pointers to 64-bit integers as keys in a #GHashTable.
|
|
|
|
*
|
|
|
|
* Returns: %TRUE if the two keys match.
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
g_int64_equal (gconstpointer v1,
|
|
|
|
gconstpointer v2)
|
|
|
|
{
|
|
|
|
return *((const gint64*) v1) == *((const gint64*) v2);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_int64_hash:
|
|
|
|
* @v: a pointer to a #gint64 key
|
|
|
|
*
|
|
|
|
* Converts a pointer to a #gint64 to a hash value.
|
|
|
|
* It can be passed to g_hash_table_new() as the @hash_func parameter,
|
|
|
|
* when using pointers to 64-bit integers values as keys in a #GHashTable.
|
|
|
|
*
|
|
|
|
* Returns: a hash value corresponding to the key.
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
*/
|
|
|
|
guint
|
|
|
|
g_int64_hash (gconstpointer v)
|
|
|
|
{
|
|
|
|
return (guint) *(const gint64*) v;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_double_equal:
|
|
|
|
* @v1: a pointer to a #gdouble key.
|
|
|
|
* @v2: a pointer to a #gdouble key to compare with @v1.
|
|
|
|
*
|
|
|
|
* Compares the two #gdouble values being pointed to and returns
|
|
|
|
* %TRUE if they are equal.
|
|
|
|
* It can be passed to g_hash_table_new() as the @key_equal_func
|
|
|
|
* parameter, when using pointers to doubles as keys in a #GHashTable.
|
|
|
|
*
|
|
|
|
* Returns: %TRUE if the two keys match.
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
g_double_equal (gconstpointer v1,
|
|
|
|
gconstpointer v2)
|
|
|
|
{
|
|
|
|
return *((const gdouble*) v1) == *((const gdouble*) v2);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_double_hash:
|
|
|
|
* @v: a pointer to a #gdouble key
|
|
|
|
*
|
|
|
|
* Converts a pointer to a #gdouble to a hash value.
|
|
|
|
* It can be passed to g_hash_table_new() as the @hash_func parameter,
|
|
|
|
* when using pointers to doubles as keys in a #GHashTable.
|
|
|
|
*
|
|
|
|
* Returns: a hash value corresponding to the key.
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
*/
|
|
|
|
guint
|
|
|
|
g_double_hash (gconstpointer v)
|
|
|
|
{
|
|
|
|
return (guint) *(const gdouble*) v;
|
|
|
|
}
|
|
|
|
|
2001-08-06 22:55:11 +02:00
|
|
|
/**
|
|
|
|
* g_nullify_pointer:
|
|
|
|
* @nullify_location: the memory address of the pointer.
|
|
|
|
*
|
|
|
|
* Set the pointer at the specified location to %NULL.
|
|
|
|
**/
|
|
|
|
void
|
|
|
|
g_nullify_pointer (gpointer *nullify_location)
|
|
|
|
{
|
|
|
|
g_return_if_fail (nullify_location != NULL);
|
|
|
|
|
|
|
|
*nullify_location = NULL;
|
|
|
|
}
|
|
|
|
|
2000-05-30 22:05:23 +02:00
|
|
|
/**
|
|
|
|
* g_get_codeset:
|
|
|
|
*
|
|
|
|
* Get the codeset for the current locale.
|
|
|
|
*
|
|
|
|
* Return value: a newly allocated string containing the name
|
|
|
|
* of the codeset. This string must be freed with g_free().
|
|
|
|
**/
|
2000-05-29 20:48:29 +02:00
|
|
|
gchar *
|
2000-05-30 22:05:23 +02:00
|
|
|
g_get_codeset (void)
|
2000-05-29 20:48:29 +02:00
|
|
|
{
|
2004-08-05 22:53:25 +02:00
|
|
|
const gchar *charset;
|
2004-05-09 05:08:19 +02:00
|
|
|
|
|
|
|
g_get_charset (&charset);
|
|
|
|
|
2004-08-05 22:53:25 +02:00
|
|
|
return g_strdup (charset);
|
2000-05-29 20:48:29 +02:00
|
|
|
}
|
2001-01-16 03:24:24 +01:00
|
|
|
|
2004-12-07 16:20:15 +01:00
|
|
|
/* This is called from g_thread_init(). It's used to
|
|
|
|
* initialize some static data in a threadsafe way.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
_g_utils_thread_init (void)
|
|
|
|
{
|
|
|
|
g_get_language_names ();
|
|
|
|
}
|
|
|
|
|
2005-04-27 11:50:09 +02:00
|
|
|
#ifdef G_OS_WIN32
|
2001-10-23 11:26:54 +02:00
|
|
|
|
2005-04-27 11:50:09 +02:00
|
|
|
/**
|
|
|
|
* _glib_get_locale_dir:
|
|
|
|
*
|
2007-11-26 23:32:12 +01:00
|
|
|
* Return the path to the share\locale or lib\locale subfolder of the
|
|
|
|
* GLib installation folder. The path is in the system codepage. We
|
|
|
|
* have to use system codepage as bindtextdomain() doesn't have a
|
|
|
|
* UTF-8 interface.
|
2005-04-27 11:50:09 +02:00
|
|
|
*/
|
2007-10-22 22:13:55 +02:00
|
|
|
static gchar *
|
2001-10-23 11:26:54 +02:00
|
|
|
_glib_get_locale_dir (void)
|
|
|
|
{
|
2008-02-24 02:07:41 +01:00
|
|
|
gchar *install_dir = NULL, *locale_dir;
|
2005-04-27 11:50:09 +02:00
|
|
|
gchar *retval = NULL;
|
2001-10-23 11:26:54 +02:00
|
|
|
|
2008-02-24 02:07:41 +01:00
|
|
|
if (glib_dll != NULL)
|
|
|
|
install_dir = g_win32_get_package_installation_directory_of_module (glib_dll);
|
2005-04-27 11:50:09 +02:00
|
|
|
|
2007-11-26 23:32:12 +01:00
|
|
|
if (install_dir)
|
2005-04-27 11:50:09 +02:00
|
|
|
{
|
2007-11-26 23:32:12 +01:00
|
|
|
/*
|
|
|
|
* Append "/share/locale" or "/lib/locale" depending on whether
|
|
|
|
* autoconfigury detected GNU gettext or not.
|
2005-04-27 11:50:09 +02:00
|
|
|
*/
|
2007-11-26 23:32:12 +01:00
|
|
|
const char *p = GLIB_LOCALE_DIR + strlen (GLIB_LOCALE_DIR);
|
|
|
|
while (*--p != '/')
|
|
|
|
;
|
|
|
|
while (*--p != '/')
|
|
|
|
;
|
|
|
|
|
|
|
|
locale_dir = g_build_filename (install_dir, p, NULL);
|
|
|
|
|
|
|
|
retval = g_win32_locale_filename_from_utf8 (locale_dir);
|
|
|
|
|
|
|
|
g_free (install_dir);
|
|
|
|
g_free (locale_dir);
|
2005-04-27 11:50:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (retval)
|
|
|
|
return retval;
|
|
|
|
else
|
|
|
|
return g_strdup ("");
|
2001-10-23 11:26:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#undef GLIB_LOCALE_DIR
|
|
|
|
|
2005-04-27 11:50:09 +02:00
|
|
|
#endif /* G_OS_WIN32 */
|
2001-01-16 03:24:24 +01:00
|
|
|
|
2007-11-26 17:12:50 +01:00
|
|
|
/**
|
|
|
|
* glib_gettext:
|
2008-01-30 21:52:13 +01:00
|
|
|
* @str: The string to be translated
|
2007-11-26 17:12:50 +01:00
|
|
|
*
|
|
|
|
* Returns the translated string from the glib translations.
|
|
|
|
* This is an internal function and should only be used by
|
|
|
|
* the internals of glib (such as libgio).
|
2007-11-28 19:53:22 +01:00
|
|
|
*
|
|
|
|
* Returns: the transation of @str to the current locale
|
2007-11-26 17:12:50 +01:00
|
|
|
*/
|
2001-02-18 00:30:48 +01:00
|
|
|
G_CONST_RETURN gchar *
|
2007-11-26 17:12:50 +01:00
|
|
|
glib_gettext (const gchar *str)
|
2001-01-16 03:24:24 +01:00
|
|
|
{
|
2001-04-18 23:37:25 +02:00
|
|
|
static gboolean _glib_gettext_initialized = FALSE;
|
2001-01-17 05:31:20 +01:00
|
|
|
|
|
|
|
if (!_glib_gettext_initialized)
|
|
|
|
{
|
2007-10-22 22:13:55 +02:00
|
|
|
#ifdef G_OS_WIN32
|
2007-11-25 07:05:06 +01:00
|
|
|
gchar *tmp = _glib_get_locale_dir ();
|
|
|
|
bindtextdomain (GETTEXT_PACKAGE, tmp);
|
|
|
|
g_free (tmp);
|
2007-10-22 22:13:55 +02:00
|
|
|
#else
|
2007-11-25 07:05:06 +01:00
|
|
|
bindtextdomain (GETTEXT_PACKAGE, GLIB_LOCALE_DIR);
|
2007-10-22 22:13:55 +02:00
|
|
|
#endif
|
2002-03-08 06:48:03 +01:00
|
|
|
# ifdef HAVE_BIND_TEXTDOMAIN_CODESET
|
|
|
|
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
|
|
|
# endif
|
2001-01-17 05:31:20 +01:00
|
|
|
_glib_gettext_initialized = TRUE;
|
|
|
|
}
|
2001-01-16 03:24:24 +01:00
|
|
|
|
2008-06-12 01:37:49 +02:00
|
|
|
return g_dgettext (GETTEXT_PACKAGE, str);
|
2001-01-16 03:24:24 +01:00
|
|
|
}
|
|
|
|
|
2008-07-27 19:15:16 +02:00
|
|
|
#if defined (G_OS_WIN32) && !defined (_WIN64)
|
2005-01-01 03:09:51 +01:00
|
|
|
|
|
|
|
/* Binary compatibility versions. Not for newly compiled code. */
|
|
|
|
|
|
|
|
#undef g_find_program_in_path
|
|
|
|
|
|
|
|
gchar*
|
|
|
|
g_find_program_in_path (const gchar *program)
|
|
|
|
{
|
|
|
|
gchar *utf8_program = g_locale_to_utf8 (program, -1, NULL, NULL, NULL);
|
|
|
|
gchar *utf8_retval = g_find_program_in_path_utf8 (utf8_program);
|
|
|
|
gchar *retval;
|
|
|
|
|
|
|
|
g_free (utf8_program);
|
|
|
|
if (utf8_retval == NULL)
|
|
|
|
return NULL;
|
|
|
|
retval = g_locale_from_utf8 (utf8_retval, -1, NULL, NULL, NULL);
|
|
|
|
g_free (utf8_retval);
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef g_get_current_dir
|
|
|
|
|
|
|
|
gchar*
|
|
|
|
g_get_current_dir (void)
|
|
|
|
{
|
|
|
|
gchar *utf8_dir = g_get_current_dir_utf8 ();
|
|
|
|
gchar *dir = g_locale_from_utf8 (utf8_dir, -1, NULL, NULL, NULL);
|
|
|
|
g_free (utf8_dir);
|
|
|
|
return dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef g_getenv
|
|
|
|
|
|
|
|
G_CONST_RETURN gchar*
|
|
|
|
g_getenv (const gchar *variable)
|
|
|
|
{
|
|
|
|
gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL);
|
|
|
|
const gchar *utf8_value = g_getenv_utf8 (utf8_variable);
|
2005-01-01 17:55:10 +01:00
|
|
|
gchar *value;
|
|
|
|
GQuark quark;
|
2005-01-01 03:09:51 +01:00
|
|
|
|
|
|
|
g_free (utf8_variable);
|
2005-01-01 17:55:10 +01:00
|
|
|
if (!utf8_value)
|
|
|
|
return NULL;
|
|
|
|
value = g_locale_from_utf8 (utf8_value, -1, NULL, NULL, NULL);
|
|
|
|
quark = g_quark_from_string (value);
|
2005-01-01 03:09:51 +01:00
|
|
|
g_free (value);
|
|
|
|
|
|
|
|
return g_quark_to_string (quark);
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef g_setenv
|
|
|
|
|
|
|
|
gboolean
|
|
|
|
g_setenv (const gchar *variable,
|
|
|
|
const gchar *value,
|
|
|
|
gboolean overwrite)
|
|
|
|
{
|
|
|
|
gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL);
|
|
|
|
gchar *utf8_value = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
|
|
|
|
gboolean retval = g_setenv_utf8 (utf8_variable, utf8_value, overwrite);
|
|
|
|
|
|
|
|
g_free (utf8_variable);
|
|
|
|
g_free (utf8_value);
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef g_unsetenv
|
|
|
|
|
|
|
|
void
|
|
|
|
g_unsetenv (const gchar *variable)
|
|
|
|
{
|
|
|
|
gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
g_unsetenv_utf8 (utf8_variable);
|
|
|
|
|
|
|
|
g_free (utf8_variable);
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef g_get_user_name
|
|
|
|
|
|
|
|
G_CONST_RETURN gchar*
|
|
|
|
g_get_user_name (void)
|
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_get_any_init_locked ();
|
2005-01-01 03:09:51 +01:00
|
|
|
return g_user_name_cp;
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef g_get_real_name
|
|
|
|
|
|
|
|
G_CONST_RETURN gchar*
|
|
|
|
g_get_real_name (void)
|
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_get_any_init_locked ();
|
2005-01-01 03:09:51 +01:00
|
|
|
return g_real_name_cp;
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef g_get_home_dir
|
|
|
|
|
|
|
|
G_CONST_RETURN gchar*
|
|
|
|
g_get_home_dir (void)
|
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_get_any_init_locked ();
|
2005-01-01 03:09:51 +01:00
|
|
|
return g_home_dir_cp;
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef g_get_tmp_dir
|
|
|
|
|
|
|
|
G_CONST_RETURN gchar*
|
|
|
|
g_get_tmp_dir (void)
|
|
|
|
{
|
2005-08-17 14:00:51 +02:00
|
|
|
g_get_any_init_locked ();
|
2005-01-01 03:09:51 +01:00
|
|
|
return g_tmp_dir_cp;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
2005-03-14 05:26:57 +01:00
|
|
|
|
|
|
|
#define __G_UTILS_C__
|
|
|
|
#include "galiasdef.c"
|