summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog115
-rw-r--r--ChangeLog.pre-2-0115
-rw-r--r--ChangeLog.pre-2-10115
-rw-r--r--ChangeLog.pre-2-12115
-rw-r--r--ChangeLog.pre-2-2115
-rw-r--r--ChangeLog.pre-2-4115
-rw-r--r--ChangeLog.pre-2-6115
-rw-r--r--ChangeLog.pre-2-8115
-rw-r--r--Makefile.am14
-rw-r--r--README.win327
-rw-r--r--TAGS.inc12
-rw-r--r--acconfig.h8
-rw-r--r--configure.in10
-rw-r--r--gbacktrace.c19
-rw-r--r--gerror.c19
-rw-r--r--glib.def302
-rw-r--r--glib.h213
-rw-r--r--glib/Makefile.am14
-rw-r--r--glib/gbacktrace.c19
-rw-r--r--glib/gerror.c19
-rw-r--r--glib/glib.def302
-rw-r--r--glib/glib.h213
-rw-r--r--glib/gmem.c22
-rw-r--r--glib/gmessages.c30
-rw-r--r--glib/gscanner.c26
-rw-r--r--glib/gstrfuncs.c35
-rw-r--r--glib/gtimer.c73
-rw-r--r--glib/gutils.c416
-rw-r--r--glibconfig.h.in29
-rw-r--r--glibconfig.h.win32119
-rw-r--r--gmem.c22
-rw-r--r--gmessages.c30
-rw-r--r--gmodule/ChangeLog42
-rw-r--r--gmodule/Makefile.am5
-rw-r--r--gmodule/gmodule-dl.c10
-rw-r--r--gmodule/gmodule-dld.c10
-rw-r--r--gmodule/gmodule-win32.c93
-rw-r--r--gmodule/gmodule.c23
-rw-r--r--gmodule/gmodule.def9
-rw-r--r--gmodule/gmodule.h25
-rw-r--r--gmodule/gmoduleconf.h.in1
-rw-r--r--gmodule/libgplugin_a.c11
-rw-r--r--gmodule/libgplugin_b.c10
-rw-r--r--gmodule/testgmodule.c7
-rw-r--r--gscanner.c26
-rw-r--r--gstrfuncs.c35
-rw-r--r--gtimer.c73
-rw-r--r--gutils.c416
-rw-r--r--makefile.lcc99
-rw-r--r--makefile.msc110
-rw-r--r--testglib.c53
-rw-r--r--tests/testglib.c53
52 files changed, 3834 insertions, 170 deletions
diff --git a/ChangeLog b/ChangeLog
index 5bc38f602..1fed20553 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,118 @@
+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.
+
Sun Oct 25 01:24:01 CST 1998 Shawn T. Amundson <amundson@gtk.org>
* Released GLib 1.1.4
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index 5bc38f602..1fed20553 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,3 +1,118 @@
+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.
+
Sun Oct 25 01:24:01 CST 1998 Shawn T. Amundson <amundson@gtk.org>
* Released GLib 1.1.4
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 5bc38f602..1fed20553 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,118 @@
+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.
+
Sun Oct 25 01:24:01 CST 1998 Shawn T. Amundson <amundson@gtk.org>
* Released GLib 1.1.4
diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12
index 5bc38f602..1fed20553 100644
--- a/ChangeLog.pre-2-12
+++ b/ChangeLog.pre-2-12
@@ -1,3 +1,118 @@
+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.
+
Sun Oct 25 01:24:01 CST 1998 Shawn T. Amundson <amundson@gtk.org>
* Released GLib 1.1.4
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index 5bc38f602..1fed20553 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,3 +1,118 @@
+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.
+
Sun Oct 25 01:24:01 CST 1998 Shawn T. Amundson <amundson@gtk.org>
* Released GLib 1.1.4
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index 5bc38f602..1fed20553 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,118 @@
+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.
+
Sun Oct 25 01:24:01 CST 1998 Shawn T. Amundson <amundson@gtk.org>
* Released GLib 1.1.4
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index 5bc38f602..1fed20553 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,118 @@
+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.
+
Sun Oct 25 01:24:01 CST 1998 Shawn T. Amundson <amundson@gtk.org>
* Released GLib 1.1.4
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index 5bc38f602..1fed20553 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,118 @@
+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.
+
Sun Oct 25 01:24:01 CST 1998 Shawn T. Amundson <amundson@gtk.org>
* Released GLib 1.1.4
diff --git a/Makefile.am b/Makefile.am
index 829a7c793..0483110b5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -10,10 +10,16 @@ glib-config: glib-config.in
DEFS += -DG_LOG_DOMAIN=g_log_domain_glib
-EXTRA_DIST = \
- glib.m4 \
- glib.spec \
- sanity_check
+EXTRA_DIST = \
+ glib.m4 \
+ glib.spec \
+ sanity_check \
+ README.win32 \
+ glib.def \
+ makefile.lcc \
+ makefile.msc \
+ glibconfig.h.win32
+
# build . first, then SUBDIRS
all-recursive-am: all-am
diff --git a/README.win32 b/README.win32
new file mode 100644
index 000000000..e819d9364
--- /dev/null
+++ b/README.win32
@@ -0,0 +1,7 @@
+For more information about the Windows port, see
+http://www.iki.fi/tml/gimp/win32/ .
+
+As for now, only Microsoft C is really supported. Before compiling,
+check the BIN definition in makefile.msc. Compile with `nmake -f
+makefile.msc`. Install with `nmake -f makefile.msc install`. Gnu-Win32
+with egcs and maybe LCC-Win32 support will be added later.
diff --git a/TAGS.inc b/TAGS.inc
new file mode 100644
index 000000000..460a945e9
--- /dev/null
+++ b/TAGS.inc
@@ -0,0 +1,12 @@
+
+/usr/src/glib/TAGS,include
+
+/usr/src/glib/gmodule/TAGS,include
+
+/usr/src/gtk+/gtk/TAGS,include
+
+/usr/src/gtk+/gdk/TAGS,include
+
+/usr/src/gle/TAGS,include
+
+/usr/src/devel-utils/TAGS,include
diff --git a/acconfig.h b/acconfig.h
index 60cc36f5f..e2daff8c4 100644
--- a/acconfig.h
+++ b/acconfig.h
@@ -43,9 +43,14 @@
#undef HAVE_FLOAT_H
#undef HAVE_LIMITS_H
#undef HAVE_LONG_DOUBLE
+#undef HAVE_PWD_H
+#undef HAVE_SYS_PARAM_H
#undef HAVE_SYS_SELECT_H
+#undef HAVE_SYS_TIME_H
+#undef HAVE_SYS_TIMES_H
#undef HAVE_STRERROR
#undef HAVE_STRSIGNAL
+#undef HAVE_UNISTD_H
#undef HAVE_VSNPRINTF
#undef HAVE_VALUES_H
#undef HAVE_VPRINTF
@@ -74,6 +79,9 @@
#undef GLIB_INTERFACE_AGE
#undef GLIB_BINARY_AGE
+#undef WIN32
+#undef NATIVE_WIN32
+
/* #undef PACKAGE */
/* #undef VERSION */
diff --git a/configure.in b/configure.in
index b259e54f8..df599bfb8 100644
--- a/configure.in
+++ b/configure.in
@@ -219,10 +219,16 @@ AC_C_BIGENDIAN
dnl header file checks
AC_CHECK_HEADERS(float.h, AC_DEFINE(HAVE_FLOAT_H))
AC_CHECK_HEADERS(limits.h, AC_DEFINE(HAVE_LIMITS_H))
+AC_CHECK_HEADERS(pwd.h, AC_DEFINE(HAVE_PWD_H))
+AC_CHECK_HEADERS(sys/param.h, AC_DEFINE(HAVE_SYS_PARAM_H))
+AC_CHECK_HEADERS(sys/select.h, AC_DEFINE(HAVE_SYS_SELECT_H))
+AC_CHECK_HEADERS(sys/time.h, AC_DEFINE(HAVE_SYS_TIME_H))
+AC_CHECK_HEADERS(sys/times.h, AC_DEFINE(HAVE_SYS_TIMES_H))
+AC_CHECK_HEADERS(unistd.h, AC_DEFINE(HAVE_UNISTD_H))
AC_CHECK_HEADERS(values.h, AC_DEFINE(HAVE_VALUES_H))
-# Check for strerror, strsignal, memmove, vsnprintf, and strcasecmp functions
-AC_CHECK_FUNCS(strerror strsignal memmove vsnprintf strcasecmp)
+# Check for some functions
+AC_CHECK_FUNCS(lstat strerror strsignal memmove vsnprintf strcasecmp)
# Check for sys_errlist
AC_MSG_CHECKING(for sys_errlist)
diff --git a/gbacktrace.c b/gbacktrace.c
index b2834b289..89edd9152 100644
--- a/gbacktrace.c
+++ b/gbacktrace.c
@@ -20,13 +20,19 @@
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
+#include "glib.h"
+#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TIMES_H
#include <sys/times.h>
+#endif
#include <sys/types.h>
#include <time.h>
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
-#include "glib.h"
+#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
@@ -36,6 +42,9 @@
#include <string.h> /* for bzero on BSD systems */
#endif
+#ifdef _MSC_VER
+#include <process.h> /* For _getpid() */
+#endif
#ifndef NO_FD_SET
# define SELECT_MASK fd_set
@@ -115,6 +124,7 @@ g_on_error_query (const gchar *prg_name)
void
g_on_error_stack_trace (const gchar *prg_name)
{
+#ifndef NATIVE_WIN32
pid_t pid;
gchar buf[16];
gchar *args[4] = { "gdb", NULL, NULL, NULL };
@@ -142,6 +152,9 @@ g_on_error_stack_trace (const gchar *prg_name)
while (glib_on_error_halt)
;
glib_on_error_halt = TRUE;
+#else
+ abort ();
+#endif
}
static gboolean stack_trace_done = FALSE;
@@ -155,6 +168,7 @@ stack_trace_sigchld (int signum)
static void
stack_trace (char **args)
{
+#ifndef NATIVE_WIN32
pid_t pid;
int in_fd[2];
int out_fd[2];
@@ -249,4 +263,7 @@ stack_trace (char **args)
close (out_fd[0]);
close (out_fd[1]);
_exit (0);
+#else
+ abort ();
+#endif
}
diff --git a/gerror.c b/gerror.c
index b2834b289..89edd9152 100644
--- a/gerror.c
+++ b/gerror.c
@@ -20,13 +20,19 @@
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
+#include "glib.h"
+#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TIMES_H
#include <sys/times.h>
+#endif
#include <sys/types.h>
#include <time.h>
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
-#include "glib.h"
+#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
@@ -36,6 +42,9 @@
#include <string.h> /* for bzero on BSD systems */
#endif
+#ifdef _MSC_VER
+#include <process.h> /* For _getpid() */
+#endif
#ifndef NO_FD_SET
# define SELECT_MASK fd_set
@@ -115,6 +124,7 @@ g_on_error_query (const gchar *prg_name)
void
g_on_error_stack_trace (const gchar *prg_name)
{
+#ifndef NATIVE_WIN32
pid_t pid;
gchar buf[16];
gchar *args[4] = { "gdb", NULL, NULL, NULL };
@@ -142,6 +152,9 @@ g_on_error_stack_trace (const gchar *prg_name)
while (glib_on_error_halt)
;
glib_on_error_halt = TRUE;
+#else
+ abort ();
+#endif
}
static gboolean stack_trace_done = FALSE;
@@ -155,6 +168,7 @@ stack_trace_sigchld (int signum)
static void
stack_trace (char **args)
{
+#ifndef NATIVE_WIN32
pid_t pid;
int in_fd[2];
int out_fd[2];
@@ -249,4 +263,7 @@ stack_trace (char **args)
close (out_fd[0]);
close (out_fd[1]);
_exit (0);
+#else
+ abort ();
+#endif
}
diff --git a/glib.def b/glib.def
new file mode 100644
index 000000000..0adf2e9a9
--- /dev/null
+++ b/glib.def
@@ -0,0 +1,302 @@
+EXPORTS
+ g_array_append_vals
+ g_array_free
+ g_array_new
+ g_array_prepend_vals
+ g_array_set_size
+ g_atexit
+ g_basename
+ g_bit_nth_lsf
+ g_bit_nth_msf
+ g_bit_storage
+ g_blow_chunks
+ g_byte_array_append
+ g_byte_array_free
+ g_byte_array_new
+ g_byte_array_prepend
+ g_byte_array_set_size
+ g_cache_destroy
+ g_cache_insert
+ g_cache_key_foreach
+ g_cache_new
+ g_cache_remove
+ g_cache_value_foreach
+ g_completion_add_items
+ g_completion_clear_items
+ g_completion_complete
+ g_completion_free
+ g_completion_new
+ g_completion_remove_items
+ g_datalist_clear
+ g_datalist_foreach
+ g_datalist_id_get_data
+ g_datalist_id_remove_no_notify
+ g_datalist_id_set_data_full
+ g_datalist_init
+ g_dataset_destroy
+ g_dataset_foreach
+ g_dataset_id_get_data
+ g_dataset_id_remove_no_notify
+ g_dataset_id_set_data_full
+ g_direct_equal
+ g_direct_hash
+ g_dirname
+ g_free
+ g_get_current_dir
+ g_get_home_dir
+ g_get_prgname
+ g_get_real_name
+ g_get_tmp_dir
+ g_get_user_name
+ g_getenv
+ g_hash_table_destroy
+ g_hash_table_foreach
+ g_hash_table_foreach_remove
+ g_hash_table_freeze
+ g_hash_table_insert
+ g_hash_table_lookup
+ g_hash_table_lookup_extended
+ g_hash_table_new
+ g_hash_table_remove
+ g_hash_table_size
+ g_hash_table_thaw
+ g_hook_alloc
+ g_hook_compare_ids
+ g_hook_destroy
+ g_hook_destroy_link
+ g_hook_find
+ g_hook_find_data
+ g_hook_find_func
+ g_hook_find_func_data
+ g_hook_first_valid
+ g_hook_free
+ g_hook_get
+ g_hook_insert_before
+ g_hook_insert_sorted
+ g_hook_list_init
+ g_hook_list_invoke
+ g_hook_list_invoke_check
+ g_hook_list_marshal
+ g_hook_list_clear
+ g_hook_next_valid
+ g_hook_prepend
+ g_hook_ref
+ g_hook_unref
+ g_int_equal
+ g_int_hash
+ g_iochannel_new
+ g_iochannel_free
+ g_iochannel_close_and_free
+ g_iochannel_wakeup_peer
+ g_list_alloc
+ g_list_allocator_free
+ g_list_allocator_new
+ g_list_append
+ g_list_concat
+ g_list_find
+ g_list_find_custom
+ g_list_first
+ g_list_foreach
+ g_list_free
+ g_list_free_1
+ g_list_index
+ g_list_insert
+ g_list_insert_sorted
+ g_list_last
+ g_list_length
+ g_list_nth
+ g_list_nth_data
+ g_list_position
+ g_list_prepend
+ g_list_remove
+ g_list_remove_link
+ g_list_reverse
+ g_list_set_allocator
+ g_log
+ g_log_default_handler
+ g_log_remove_handler
+ g_log_set_always_fatal
+ g_log_set_fatal_mask
+ g_log_set_handler
+ g_logv
+ g_malloc
+ g_malloc0
+ g_mem_check
+ g_mem_chunk_alloc
+ g_mem_chunk_alloc0
+ g_mem_chunk_clean
+ g_mem_chunk_destroy
+ g_mem_chunk_free
+ g_mem_chunk_info
+ g_mem_chunk_new
+ g_mem_chunk_print
+ g_mem_chunk_reset
+ g_mem_profile
+ g_memdup
+ g_node_child_index
+ g_node_child_position
+ g_node_children_foreach
+ g_node_depth
+ g_node_destroy
+ g_node_find
+ g_node_find_child
+ g_node_first_sibling
+ g_node_get_root
+ g_node_insert
+ g_node_insert_before
+ g_node_is_ancestor
+ g_node_last_child
+ g_node_last_sibling
+ g_node_max_height
+ g_node_n_children
+ g_node_n_nodes
+ g_node_new
+ g_node_nth_child
+ g_node_prepend
+ g_node_reverse_children
+ g_node_traverse
+ g_node_unlink
+ g_on_error_query
+ g_on_error_stack_trace
+ g_parse_debug_string
+ g_path_is_absolute
+ g_path_skip_root
+ g_print
+ g_printerr
+ g_printf_string_upper_bound
+ g_ptr_array_add
+ g_ptr_array_free
+ g_ptr_array_new
+ g_ptr_array_remove
+ g_ptr_array_remove_index
+ g_ptr_array_set_size
+ g_quark_from_static_string
+ g_quark_from_string
+ g_quark_to_string
+ g_quark_try_string
+ g_realloc
+ g_relation_count
+ g_relation_delete
+ g_relation_destroy
+ g_relation_exists
+ g_relation_index
+ g_relation_insert
+ g_relation_new
+ g_relation_print
+ g_relation_select
+ g_scanner_cur_line
+ g_scanner_cur_position
+ g_scanner_cur_token
+ g_scanner_cur_value
+ g_scanner_destroy
+ g_scanner_eof
+ g_scanner_error
+ g_scanner_freeze_symbol_table
+ g_scanner_get_next_token
+ g_scanner_input_file
+ g_scanner_input_text
+ g_scanner_lookup_symbol
+ g_scanner_new
+ g_scanner_peek_next_token
+ g_scanner_scope_add_symbol
+ g_scanner_scope_foreach_symbol
+ g_scanner_scope_lookup_symbol
+ g_scanner_scope_remove_symbol
+ g_scanner_set_scope
+ g_scanner_stat_mode
+ g_scanner_thaw_symbol_table
+ g_scanner_unexp_token
+ g_scanner_warn
+ g_set_error_handler
+ g_set_message_handler
+ g_set_prgname
+ g_set_print_handler
+ g_set_printerr_handler
+ g_set_warning_handler
+ g_slist_alloc
+ g_slist_append
+ g_slist_concat
+ g_slist_find
+ g_slist_find_custom
+ g_slist_foreach
+ g_slist_free
+ g_slist_free_1
+ g_slist_index
+ g_slist_insert
+ g_slist_insert_sorted
+ g_slist_last
+ g_slist_length
+ g_slist_nth
+ g_slist_nth_data
+ g_slist_position
+ g_slist_prepend
+ g_slist_remove
+ g_slist_remove_link
+ g_slist_reverse
+ g_slist_set_allocator
+ g_snprintf
+ g_str_equal
+ g_str_hash
+ g_strcasecmp
+ g_strconcat
+ g_strdelimit
+ g_strdown
+ g_strdup
+ g_strdup_printf
+ g_strdup_vprintf
+ g_strerror
+ g_string_append
+ g_string_append_c
+ g_string_assign
+ g_string_chunk_free
+ g_string_chunk_insert
+ g_string_chunk_insert_const
+ g_string_chunk_new
+ g_string_down
+ g_string_erase
+ g_string_free
+ g_string_insert
+ g_string_insert_c
+ g_string_new
+ g_string_prepend
+ g_string_prepend_c
+ g_string_sized_new
+ g_string_sprintf
+ g_string_sprintfa
+ g_string_truncate
+ g_string_up
+ g_strescape
+ g_strndup
+ g_strnfill
+ g_strreverse
+ g_strsignal
+ g_strtod
+ g_strup
+ g_timer_destroy
+ g_timer_elapsed
+ g_timer_new
+ g_timer_reset
+ g_timer_start
+ g_timer_stop
+ g_tree_destroy
+ g_tree_height
+ g_tree_insert
+ g_tree_lookup
+ g_tree_new
+ g_tree_nnodes
+ g_tree_remove
+ g_tree_search
+ g_tree_traverse
+ g_tuples_destroy
+ g_tuples_index
+ g_vsnprintf
+ glib_binary_age
+ glib_interface_age
+ glib_major_version
+ glib_micro_version
+ glib_minor_version
+ gwin_ftruncate
+ gwin_opendir
+ gwin_readdir
+ gwin_rewinddir
+ gwin_closedir
diff --git a/glib.h b/glib.h
index 1468f5570..dbf89c061 100644
--- a/glib.h
+++ b/glib.h
@@ -34,6 +34,53 @@
#endif
+#ifdef NATIVE_WIN32
+
+/* On native Win32, directory separator is the backslash, and search path
+ * separator is the semicolon.
+ */
+#define G_DIR_SEPARATOR '\\'
+#define G_DIR_SEPARATOR_S "\\"
+#define G_SEARCHPATH_SEPARATOR ';'
+#define G_SEARCHPATH_SEPARATOR_S ";"
+
+#else /* !NATIVE_WIN32 */
+
+/* Unix */
+
+#define G_DIR_SEPARATOR '/'
+#define G_DIR_SEPARATOR_S "/"
+#define G_SEARCHPATH_SEPARATOR ':'
+#define G_SEARCHPATH_SEPARATOR_S ":"
+
+#endif /* !NATIVE_WIN32 */
+
+#ifdef _MSC_VER
+/* Make MSVC more pedantic, this is a recommended pragma list
+ * from _Win32_Programming_ by Rector and Newcomer.
+ */
+#pragma warning(error:4002)
+#pragma warning(error:4003)
+#pragma warning(1:4010)
+#pragma warning(error:4013)
+#pragma warning(1:4016)
+#pragma warning(error:4020)
+#pragma warning(error:4021)
+#pragma warning(error:4027)
+#pragma warning(error:4029)
+#pragma warning(error:4033)
+#pragma warning(error:4035)
+#pragma warning(error:4045)
+#pragma warning(error:4047)
+#pragma warning(error:4049)
+#pragma warning(error:4053)
+#pragma warning(error:4071)
+#pragma warning(disable:4101)
+#pragma warning(error:4150)
+
+#pragma warning(disable:4244) /* No possible loss of data warnings, please */
+#endif /* _MSC_VER */
+
/* glib provides definitions for the extrema of many
* of the standard types. These are:
* G_MINFLOAT
@@ -599,13 +646,24 @@ typedef gint32 GTime;
/* Glib version.
- */
-extern const guint glib_major_version;
-extern const guint glib_minor_version;
-extern const guint glib_micro_version;
-extern const guint glib_interface_age;
-extern const guint glib_binary_age;
-
+ * we prefix variable declarations so they can
+ * properly get exported in windows dlls.
+ */
+#ifdef NATIVE_WIN32
+# ifdef GLIB_COMPILATION
+# define GUTILS_C_VAR __declspec(dllexport)
+# else /* !GLIB_COMPILATION */
+# define GUTILS_C_VAR __declspec(dllimport)
+# endif /* !GLIB_COMPILATION */
+#else /* !NATIVE_WIN32 */
+# define GUTILS_C_VAR extern
+#endif /* !NATIVE_WIN32 */
+
+GUTILS_C_VAR const guint glib_major_version;
+GUTILS_C_VAR const guint glib_minor_version;
+GUTILS_C_VAR const guint glib_micro_version;
+GUTILS_C_VAR const guint glib_interface_age;
+GUTILS_C_VAR const guint glib_binary_age;
/* Forward declarations of glib types.
*/
@@ -634,6 +692,7 @@ typedef struct _GTimer GTimer;
typedef struct _GTree GTree;
typedef struct _GTuples GTuples;
typedef union _GTokenValue GTokenValue;
+typedef struct _GIOChannel GIOChannel;
typedef enum
@@ -774,13 +833,6 @@ struct _GDebugKey
guint value;
};
-struct _GCache { gint dummy; };
-struct _GTree { gint dummy; };
-struct _GTimer { gint dummy; };
-struct _GMemChunk { gint dummy; };
-struct _GListAllocator { gint dummy; };
-struct _GStringChunk { gint dummy; };
-
/* Doubly linked lists
*/
@@ -1172,7 +1224,7 @@ void g_on_error_stack_trace (const gchar *prg_name);
/* Logging mechanism
*/
-extern const gchar *g_log_domain_glib;
+extern const gchar *g_log_domain_glib;
guint g_log_set_handler (const gchar *log_domain,
GLogLevelFlags log_levels,
GLogFunc log_func,
@@ -1350,8 +1402,6 @@ gint g_strcasecmp (const gchar *s1,
void g_strdown (gchar *string);
void g_strup (gchar *string);
void g_strreverse (gchar *string);
-gpointer g_memdup (gconstpointer mem,
- guint byte_size);
/* removes leading spaces */
gchar* g_strchug (gchar *string);
/* removes trailing spaces */
@@ -1375,6 +1425,9 @@ gchar* g_strconcat (const gchar *string1,
...); /* NULL terminated */
gchar* g_strjoin (const gchar *separator,
...); /* NULL terminated */
+gchar* g_strescape (gchar *string);
+gpointer g_memdup (gconstpointer mem,
+ guint byte_size);
/* NULL terminated string arrays.
* g_strsplit() splits up string into max_tokens tokens at delim and
@@ -1422,10 +1475,15 @@ gint g_vsnprintf (gchar *string,
gchar const *format,
va_list args);
gchar* g_basename (const gchar *file_name);
+/* Check if a file name is an absolute path */
+gboolean g_path_is_absolute (const gchar *file_name);
+/* In case of absolute paths, skip the root part */
+gchar* g_path_skip_root (gchar *file_name);
/* strings are newly allocated with g_malloc() */
gchar* g_dirname (const gchar *file_name);
gchar* g_get_current_dir (void);
+gchar* g_getenv (const gchar *variable);
/* We make the assumption that if memmove isn't available, then
* bcopy will do the job. This isn't safe everywhere. (bcopy can't
@@ -1507,7 +1565,6 @@ g_bit_storage (guint number)
}
#endif /* G_CAN_INLINE */
-
/* String Chunks
*/
GStringChunk* g_string_chunk_new (gint size);
@@ -1996,14 +2053,124 @@ gpointer g_tuples_index (GTuples *tuples,
* next largest prime, or the highest it knows about which is about
* MAXINT/4.
*/
-
guint g_spaced_primes_closest (guint num);
-/* Glib version.
+
+/* IO Channels.
+ * These are used for plug-in communication in the GIMP, for instance.
+ * On Unix, it's simply an encapsulated file descriptor (a pipe).
+ * On Windows, it's a handle to an anonymouos pipe, *and* (in the case
+ * of the writable end) a thread id to post a message to when you have written
+ * stuff.
+ */
+struct _GIOChannel
+{
+ gint fd; /* file handle (pseudo such in Win32) */
+#ifdef NATIVE_WIN32
+ guint peer; /* thread to post message to */
+ guint peer_fd; /* read handle (in the other process) */
+ guint offset; /* counter of accumulated bytes, to
+ * be included in the message posted
+ * so we keep in sync.
+ */
+ guint peer_offset; /* in input channels where the writer's
+ * offset is, so we don't try to read too much
+ */
+#endif
+};
+
+GIOChannel *g_iochannel_new (gint fd);
+void g_iochannel_free (GIOChannel *channel);
+void g_iochannel_close_and_free (GIOChannel *channel);
+void g_iochannel_wakeup_peer (GIOChannel *channel);
+#ifndef NATIVE_WIN32
+# define g_iochannel_wakeup_peer(channel) G_STMT_START { } G_STMT_END
+#endif
+
+
+/* Windows emulation stubs for common unix functions
*/
-extern const guint glib_major_version;
-extern const guint glib_minor_version;
-extern const guint glib_micro_version;
+#ifdef NATIVE_WIN32
+
+#define MAXPATHLEN 1024
+
+#ifdef _MSC_VER
+typedef int pid_t;
+
+/* These POSIXish functions are available in the Microsoft C library
+ * prefixed with underscore (which of course technically speaking is
+ * the Right Thing, as they are non-ANSI. Not that being non-ANSI
+ * prevents Microsoft from practically requiring you to include
+ * <windows.h> every now and then...).
+ *
+ * You still need to include the appropriate headers to get the
+ * prototypes, <io.h> or <direct.h>.
+ *
+ * For some functions, we provide emulators in glib, which are prefixed
+ * with gwin_.
+ */
+#define getcwd _getcwd
+#define getpid _getpid
+#define access _access
+#define open _open
+#define read _read
+#define write _write
+#define lseek _lseek
+#define close _close
+#define pipe(phandles) _pipe (phandles, 4096, _O_BINARY)
+#define popen _popen
+#define pclose _pclose
+#define fdopen _fdopen
+#define ftruncate(fd, size) gwin_ftruncate (fd, size)
+#define opendir gwin_opendir
+#define readdir gwin_readdir
+#define rewinddir gwin_rewinddir
+#define closedir gwin_closedir
+
+#define NAME_MAX 255
+
+struct DIR
+{
+ gchar *dir_name;
+
+ gboolean just_opened;
+ guint find_file_handle;
+ gpointer find_file_data;
+};
+typedef struct DIR DIR;
+struct dirent
+{
+ gchar d_name[NAME_MAX + 1];
+};
+
+/* emulation functions */
+extern int gwin_ftruncate (gint f,
+ guint size);
+DIR* gwin_opendir (const gchar *dirname);
+struct dirent* gwin_readdir (DIR *dir);
+void gwin_rewinddir (DIR *dir);
+gint gwin_closedir (DIR *dir);
+
+#endif /* _MSC_VER */
+
+#define g_ntohl(x) \
+ ((guint32)((((guint32)(x) & 0x000000ffU) << 24) | \
+ (((guint32)(x) & 0x0000ff00U) << 8) | \
+ (((guint32)(x) & 0x00ff0000U) >> 8) | \
+ (((guint32)(x) & 0xff000000U) >> 24)))
+
+#define g_htonl(x) g_ntohl(x)
+
+#define g_ntohs(x) \
+ ((guint16)((((guint16)(x) & 0x00ff) << 8) | \
+ (((guint16)(x) & 0xff00) >> 8)))
+
+#define g_htons(x) g_ntohs(x)
+
+#endif /* NATIVE_WIN32 */
+
+
+
#ifdef __cplusplus
}
diff --git a/glib/Makefile.am b/glib/Makefile.am
index 829a7c793..0483110b5 100644
--- a/glib/Makefile.am
+++ b/glib/Makefile.am
@@ -10,10 +10,16 @@ glib-config: glib-config.in
DEFS += -DG_LOG_DOMAIN=g_log_domain_glib
-EXTRA_DIST = \
- glib.m4 \
- glib.spec \
- sanity_check
+EXTRA_DIST = \
+ glib.m4 \
+ glib.spec \
+ sanity_check \
+ README.win32 \
+ glib.def \
+ makefile.lcc \
+ makefile.msc \
+ glibconfig.h.win32
+
# build . first, then SUBDIRS
all-recursive-am: all-am
diff --git a/glib/gbacktrace.c b/glib/gbacktrace.c
index b2834b289..89edd9152 100644
--- a/glib/gbacktrace.c
+++ b/glib/gbacktrace.c
@@ -20,13 +20,19 @@
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
+#include "glib.h"
+#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TIMES_H
#include <sys/times.h>
+#endif
#include <sys/types.h>
#include <time.h>
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
-#include "glib.h"
+#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
@@ -36,6 +42,9 @@
#include <string.h> /* for bzero on BSD systems */
#endif
+#ifdef _MSC_VER
+#include <process.h> /* For _getpid() */
+#endif
#ifndef NO_FD_SET
# define SELECT_MASK fd_set
@@ -115,6 +124,7 @@ g_on_error_query (const gchar *prg_name)
void
g_on_error_stack_trace (const gchar *prg_name)
{
+#ifndef NATIVE_WIN32
pid_t pid;
gchar buf[16];
gchar *args[4] = { "gdb", NULL, NULL, NULL };
@@ -142,6 +152,9 @@ g_on_error_stack_trace (const gchar *prg_name)
while (glib_on_error_halt)
;
glib_on_error_halt = TRUE;
+#else
+ abort ();
+#endif
}
static gboolean stack_trace_done = FALSE;
@@ -155,6 +168,7 @@ stack_trace_sigchld (int signum)
static void
stack_trace (char **args)
{
+#ifndef NATIVE_WIN32
pid_t pid;
int in_fd[2];
int out_fd[2];
@@ -249,4 +263,7 @@ stack_trace (char **args)
close (out_fd[0]);
close (out_fd[1]);
_exit (0);
+#else
+ abort ();
+#endif
}
diff --git a/glib/gerror.c b/glib/gerror.c
index b2834b289..89edd9152 100644
--- a/glib/gerror.c
+++ b/glib/gerror.c
@@ -20,13 +20,19 @@
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
+#include "glib.h"
+#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TIMES_H
#include <sys/times.h>
+#endif
#include <sys/types.h>
#include <time.h>
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
-#include "glib.h"
+#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
@@ -36,6 +42,9 @@
#include <string.h> /* for bzero on BSD systems */
#endif
+#ifdef _MSC_VER
+#include <process.h> /* For _getpid() */
+#endif
#ifndef NO_FD_SET
# define SELECT_MASK fd_set
@@ -115,6 +124,7 @@ g_on_error_query (const gchar *prg_name)
void
g_on_error_stack_trace (const gchar *prg_name)
{
+#ifndef NATIVE_WIN32
pid_t pid;
gchar buf[16];
gchar *args[4] = { "gdb", NULL, NULL, NULL };
@@ -142,6 +152,9 @@ g_on_error_stack_trace (const gchar *prg_name)
while (glib_on_error_halt)
;
glib_on_error_halt = TRUE;
+#else
+ abort ();
+#endif
}
static gboolean stack_trace_done = FALSE;
@@ -155,6 +168,7 @@ stack_trace_sigchld (int signum)
static void
stack_trace (char **args)
{
+#ifndef NATIVE_WIN32
pid_t pid;
int in_fd[2];
int out_fd[2];
@@ -249,4 +263,7 @@ stack_trace (char **args)
close (out_fd[0]);
close (out_fd[1]);
_exit (0);
+#else
+ abort ();
+#endif
}
diff --git a/glib/glib.def b/glib/glib.def
new file mode 100644
index 000000000..0adf2e9a9
--- /dev/null
+++ b/glib/glib.def
@@ -0,0 +1,302 @@
+EXPORTS
+ g_array_append_vals
+ g_array_free
+ g_array_new
+ g_array_prepend_vals
+ g_array_set_size
+ g_atexit
+ g_basename
+ g_bit_nth_lsf
+ g_bit_nth_msf
+ g_bit_storage
+ g_blow_chunks
+ g_byte_array_append
+ g_byte_array_free
+ g_byte_array_new
+ g_byte_array_prepend
+ g_byte_array_set_size
+ g_cache_destroy
+ g_cache_insert
+ g_cache_key_foreach
+ g_cache_new
+ g_cache_remove
+ g_cache_value_foreach
+ g_completion_add_items
+ g_completion_clear_items
+ g_completion_complete
+ g_completion_free
+ g_completion_new
+ g_completion_remove_items
+ g_datalist_clear
+ g_datalist_foreach
+ g_datalist_id_get_data
+ g_datalist_id_remove_no_notify
+ g_datalist_id_set_data_full
+ g_datalist_init
+ g_dataset_destroy
+ g_dataset_foreach
+ g_dataset_id_get_data
+ g_dataset_id_remove_no_notify
+ g_dataset_id_set_data_full
+ g_direct_equal
+ g_direct_hash
+ g_dirname
+ g_free
+ g_get_current_dir
+ g_get_home_dir
+ g_get_prgname
+ g_get_real_name
+ g_get_tmp_dir
+ g_get_user_name
+ g_getenv
+ g_hash_table_destroy
+ g_hash_table_foreach
+ g_hash_table_foreach_remove
+ g_hash_table_freeze
+ g_hash_table_insert
+ g_hash_table_lookup
+ g_hash_table_lookup_extended
+ g_hash_table_new
+ g_hash_table_remove
+ g_hash_table_size
+ g_hash_table_thaw
+ g_hook_alloc
+ g_hook_compare_ids
+ g_hook_destroy
+ g_hook_destroy_link
+ g_hook_find
+ g_hook_find_data
+ g_hook_find_func
+ g_hook_find_func_data
+ g_hook_first_valid
+ g_hook_free
+ g_hook_get
+ g_hook_insert_before
+ g_hook_insert_sorted
+ g_hook_list_init
+ g_hook_list_invoke
+ g_hook_list_invoke_check
+ g_hook_list_marshal
+ g_hook_list_clear
+ g_hook_next_valid
+ g_hook_prepend
+ g_hook_ref
+ g_hook_unref
+ g_int_equal
+ g_int_hash
+ g_iochannel_new
+ g_iochannel_free
+ g_iochannel_close_and_free
+ g_iochannel_wakeup_peer
+ g_list_alloc
+ g_list_allocator_free
+ g_list_allocator_new
+ g_list_append
+ g_list_concat
+ g_list_find
+ g_list_find_custom
+ g_list_first
+ g_list_foreach
+ g_list_free
+ g_list_free_1
+ g_list_index
+ g_list_insert
+ g_list_insert_sorted
+ g_list_last
+ g_list_length
+ g_list_nth
+ g_list_nth_data
+ g_list_position
+ g_list_prepend
+ g_list_remove
+ g_list_remove_link
+ g_list_reverse
+ g_list_set_allocator
+ g_log
+ g_log_default_handler
+ g_log_remove_handler
+ g_log_set_always_fatal
+ g_log_set_fatal_mask
+ g_log_set_handler
+ g_logv
+ g_malloc
+ g_malloc0
+ g_mem_check
+ g_mem_chunk_alloc
+ g_mem_chunk_alloc0
+ g_mem_chunk_clean
+ g_mem_chunk_destroy
+ g_mem_chunk_free
+ g_mem_chunk_info
+ g_mem_chunk_new
+ g_mem_chunk_print
+ g_mem_chunk_reset
+ g_mem_profile
+ g_memdup
+ g_node_child_index
+ g_node_child_position
+ g_node_children_foreach
+ g_node_depth
+ g_node_destroy
+ g_node_find
+ g_node_find_child
+ g_node_first_sibling
+ g_node_get_root
+ g_node_insert
+ g_node_insert_before
+ g_node_is_ancestor
+ g_node_last_child
+ g_node_last_sibling
+ g_node_max_height
+ g_node_n_children
+ g_node_n_nodes
+ g_node_new
+ g_node_nth_child
+ g_node_prepend
+ g_node_reverse_children
+ g_node_traverse
+ g_node_unlink
+ g_on_error_query
+ g_on_error_stack_trace
+ g_parse_debug_string
+ g_path_is_absolute
+ g_path_skip_root
+ g_print
+ g_printerr
+ g_printf_string_upper_bound
+ g_ptr_array_add
+ g_ptr_array_free
+ g_ptr_array_new
+ g_ptr_array_remove
+ g_ptr_array_remove_index
+ g_ptr_array_set_size
+ g_quark_from_static_string
+ g_quark_from_string
+ g_quark_to_string
+ g_quark_try_string
+ g_realloc
+ g_relation_count
+ g_relation_delete
+ g_relation_destroy
+ g_relation_exists
+ g_relation_index
+ g_relation_insert
+ g_relation_new
+ g_relation_print
+ g_relation_select
+ g_scanner_cur_line
+ g_scanner_cur_position
+ g_scanner_cur_token
+ g_scanner_cur_value
+ g_scanner_destroy
+ g_scanner_eof
+ g_scanner_error
+ g_scanner_freeze_symbol_table
+ g_scanner_get_next_token
+ g_scanner_input_file
+ g_scanner_input_text
+ g_scanner_lookup_symbol
+ g_scanner_new
+ g_scanner_peek_next_token
+ g_scanner_scope_add_symbol
+ g_scanner_scope_foreach_symbol
+ g_scanner_scope_lookup_symbol
+ g_scanner_scope_remove_symbol
+ g_scanner_set_scope
+ g_scanner_stat_mode
+ g_scanner_thaw_symbol_table
+ g_scanner_unexp_token
+ g_scanner_warn
+ g_set_error_handler
+ g_set_message_handler
+ g_set_prgname
+ g_set_print_handler
+ g_set_printerr_handler
+ g_set_warning_handler
+ g_slist_alloc
+ g_slist_append
+ g_slist_concat
+ g_slist_find
+ g_slist_find_custom
+ g_slist_foreach
+ g_slist_free
+ g_slist_free_1
+ g_slist_index
+ g_slist_insert
+ g_slist_insert_sorted
+ g_slist_last
+ g_slist_length
+ g_slist_nth
+ g_slist_nth_data
+ g_slist_position
+ g_slist_prepend
+ g_slist_remove
+ g_slist_remove_link
+ g_slist_reverse
+ g_slist_set_allocator
+ g_snprintf
+ g_str_equal
+ g_str_hash
+ g_strcasecmp
+ g_strconcat
+ g_strdelimit
+ g_strdown
+ g_strdup
+ g_strdup_printf
+ g_strdup_vprintf
+ g_strerror
+ g_string_append
+ g_string_append_c
+ g_string_assign
+ g_string_chunk_free
+ g_string_chunk_insert
+ g_string_chunk_insert_const
+ g_string_chunk_new
+ g_string_down
+ g_string_erase
+ g_string_free
+ g_string_insert
+ g_string_insert_c
+ g_string_new
+ g_string_prepend
+ g_string_prepend_c
+ g_string_sized_new
+ g_string_sprintf
+ g_string_sprintfa
+ g_string_truncate
+ g_string_up
+ g_strescape
+ g_strndup
+ g_strnfill
+ g_strreverse
+ g_strsignal
+ g_strtod
+ g_strup
+ g_timer_destroy
+ g_timer_elapsed
+ g_timer_new
+ g_timer_reset
+ g_timer_start
+ g_timer_stop
+ g_tree_destroy
+ g_tree_height
+ g_tree_insert
+ g_tree_lookup
+ g_tree_new
+ g_tree_nnodes
+ g_tree_remove
+ g_tree_search
+ g_tree_traverse
+ g_tuples_destroy
+ g_tuples_index
+ g_vsnprintf
+ glib_binary_age
+ glib_interface_age
+ glib_major_version
+ glib_micro_version
+ glib_minor_version
+ gwin_ftruncate
+ gwin_opendir
+ gwin_readdir
+ gwin_rewinddir
+ gwin_closedir
diff --git a/glib/glib.h b/glib/glib.h
index 1468f5570..dbf89c061 100644
--- a/glib/glib.h
+++ b/glib/glib.h
@@ -34,6 +34,53 @@
#endif
+#ifdef NATIVE_WIN32
+
+/* On native Win32, directory separator is the backslash, and search path
+ * separator is the semicolon.
+ */
+#define G_DIR_SEPARATOR '\\'
+#define G_DIR_SEPARATOR_S "\\"
+#define G_SEARCHPATH_SEPARATOR ';'
+#define G_SEARCHPATH_SEPARATOR_S ";"
+
+#else /* !NATIVE_WIN32 */
+
+/* Unix */
+
+#define G_DIR_SEPARATOR '/'
+#define G_DIR_SEPARATOR_S "/"
+#define G_SEARCHPATH_SEPARATOR ':'
+#define G_SEARCHPATH_SEPARATOR_S ":"
+
+#endif /* !NATIVE_WIN32 */
+
+#ifdef _MSC_VER
+/* Make MSVC more pedantic, this is a recommended pragma list
+ * from _Win32_Programming_ by Rector and Newcomer.
+ */
+#pragma warning(error:4002)
+#pragma warning(error:4003)
+#pragma warning(1:4010)
+#pragma warning(error:4013)
+#pragma warning(1:4016)
+#pragma warning(error:4020)
+#pragma warning(error:4021)
+#pragma warning(error:4027)
+#pragma warning(error:4029)
+#pragma warning(error:4033)
+#pragma warning(error:4035)
+#pragma warning(error:4045)
+#pragma warning(error:4047)
+#pragma warning(error:4049)
+#pragma warning(error:4053)
+#pragma warning(error:4071)
+#pragma warning(disable:4101)
+#pragma warning(error:4150)
+
+#pragma warning(disable:4244) /* No possible loss of data warnings, please */
+#endif /* _MSC_VER */
+
/* glib provides definitions for the extrema of many
* of the standard types. These are:
* G_MINFLOAT
@@ -599,13 +646,24 @@ typedef gint32 GTime;
/* Glib version.
- */
-extern const guint glib_major_version;
-extern const guint glib_minor_version;
-extern const guint glib_micro_version;
-extern const guint glib_interface_age;
-extern const guint glib_binary_age;
-
+ * we prefix variable declarations so they can
+ * properly get exported in windows dlls.
+ */
+#ifdef NATIVE_WIN32
+# ifdef GLIB_COMPILATION
+# define GUTILS_C_VAR __declspec(dllexport)
+# else /* !GLIB_COMPILATION */
+# define GUTILS_C_VAR __declspec(dllimport)
+# endif /* !GLIB_COMPILATION */
+#else /* !NATIVE_WIN32 */
+# define GUTILS_C_VAR extern
+#endif /* !NATIVE_WIN32 */
+
+GUTILS_C_VAR const guint glib_major_version;
+GUTILS_C_VAR const guint glib_minor_version;
+GUTILS_C_VAR const guint glib_micro_version;
+GUTILS_C_VAR const guint glib_interface_age;
+GUTILS_C_VAR const guint glib_binary_age;
/* Forward declarations of glib types.
*/
@@ -634,6 +692,7 @@ typedef struct _GTimer GTimer;
typedef struct _GTree GTree;
typedef struct _GTuples GTuples;
typedef union _GTokenValue GTokenValue;
+typedef struct _GIOChannel GIOChannel;
typedef enum
@@ -774,13 +833,6 @@ struct _GDebugKey
guint value;
};
-struct _GCache { gint dummy; };
-struct _GTree { gint dummy; };
-struct _GTimer { gint dummy; };
-struct _GMemChunk { gint dummy; };
-struct _GListAllocator { gint dummy; };
-struct _GStringChunk { gint dummy; };
-
/* Doubly linked lists
*/
@@ -1172,7 +1224,7 @@ void g_on_error_stack_trace (const gchar *prg_name);
/* Logging mechanism
*/
-extern const gchar *g_log_domain_glib;
+extern const gchar *g_log_domain_glib;
guint g_log_set_handler (const gchar *log_domain,
GLogLevelFlags log_levels,
GLogFunc log_func,
@@ -1350,8 +1402,6 @@ gint g_strcasecmp (const gchar *s1,
void g_strdown (gchar *string);
void g_strup (gchar *string);
void g_strreverse (gchar *string);
-gpointer g_memdup (gconstpointer mem,
- guint byte_size);
/* removes leading spaces */
gchar* g_strchug (gchar *string);
/* removes trailing spaces */
@@ -1375,6 +1425,9 @@ gchar* g_strconcat (const gchar *string1,
...); /* NULL terminated */
gchar* g_strjoin (const gchar *separator,
...); /* NULL terminated */
+gchar* g_strescape (gchar *string);
+gpointer g_memdup (gconstpointer mem,
+ guint byte_size);
/* NULL terminated string arrays.
* g_strsplit() splits up string into max_tokens tokens at delim and
@@ -1422,10 +1475,15 @@ gint g_vsnprintf (gchar *string,
gchar const *format,
va_list args);
gchar* g_basename (const gchar *file_name);
+/* Check if a file name is an absolute path */
+gboolean g_path_is_absolute (const gchar *file_name);
+/* In case of absolute paths, skip the root part */
+gchar* g_path_skip_root (gchar *file_name);
/* strings are newly allocated with g_malloc() */
gchar* g_dirname (const gchar *file_name);
gchar* g_get_current_dir (void);
+gchar* g_getenv (const gchar *variable);
/* We make the assumption that if memmove isn't available, then
* bcopy will do the job. This isn't safe everywhere. (bcopy can't
@@ -1507,7 +1565,6 @@ g_bit_storage (guint number)
}
#endif /* G_CAN_INLINE */
-
/* String Chunks
*/
GStringChunk* g_string_chunk_new (gint size);
@@ -1996,14 +2053,124 @@ gpointer g_tuples_index (GTuples *tuples,
* next largest prime, or the highest it knows about which is about
* MAXINT/4.
*/
-
guint g_spaced_primes_closest (guint num);
-/* Glib version.
+
+/* IO Channels.
+ * These are used for plug-in communication in the GIMP, for instance.
+ * On Unix, it's simply an encapsulated file descriptor (a pipe).
+ * On Windows, it's a handle to an anonymouos pipe, *and* (in the case
+ * of the writable end) a thread id to post a message to when you have written
+ * stuff.
+ */
+struct _GIOChannel
+{
+ gint fd; /* file handle (pseudo such in Win32) */
+#ifdef NATIVE_WIN32
+ guint peer; /* thread to post message to */
+ guint peer_fd; /* read handle (in the other process) */
+ guint offset; /* counter of accumulated bytes, to
+ * be included in the message posted
+ * so we keep in sync.
+ */
+ guint peer_offset; /* in input channels where the writer's
+ * offset is, so we don't try to read too much
+ */
+#endif
+};
+
+GIOChannel *g_iochannel_new (gint fd);
+void g_iochannel_free (GIOChannel *channel);
+void g_iochannel_close_and_free (GIOChannel *channel);
+void g_iochannel_wakeup_peer (GIOChannel *channel);
+#ifndef NATIVE_WIN32
+# define g_iochannel_wakeup_peer(channel) G_STMT_START { } G_STMT_END
+#endif
+
+
+/* Windows emulation stubs for common unix functions
*/
-extern const guint glib_major_version;
-extern const guint glib_minor_version;
-extern const guint glib_micro_version;
+#ifdef NATIVE_WIN32
+
+#define MAXPATHLEN 1024
+
+#ifdef _MSC_VER
+typedef int pid_t;
+
+/* These POSIXish functions are available in the Microsoft C library
+ * prefixed with underscore (which of course technically speaking is
+ * the Right Thing, as they are non-ANSI. Not that being non-ANSI
+ * prevents Microsoft from practically requiring you to include
+ * <windows.h> every now and then...).
+ *
+ * You still need to include the appropriate headers to get the
+ * prototypes, <io.h> or <direct.h>.
+ *
+ * For some functions, we provide emulators in glib, which are prefixed
+ * with gwin_.
+ */
+#define getcwd _getcwd
+#define getpid _getpid
+#define access _access
+#define open _open
+#define read _read
+#define write _write
+#define lseek _lseek
+#define close _close
+#define pipe(phandles) _pipe (phandles, 4096, _O_BINARY)
+#define popen _popen
+#define pclose _pclose
+#define fdopen _fdopen
+#define ftruncate(fd, size) gwin_ftruncate (fd, size)
+#define opendir gwin_opendir
+#define readdir gwin_readdir
+#define rewinddir gwin_rewinddir
+#define closedir gwin_closedir
+
+#define NAME_MAX 255
+
+struct DIR
+{
+ gchar *dir_name;
+
+ gboolean just_opened;
+ guint find_file_handle;
+ gpointer find_file_data;
+};
+typedef struct DIR DIR;
+struct dirent
+{
+ gchar d_name[NAME_MAX + 1];
+};
+
+/* emulation functions */
+extern int gwin_ftruncate (gint f,
+ guint size);
+DIR* gwin_opendir (const gchar *dirname);
+struct dirent* gwin_readdir (DIR *dir);
+void gwin_rewinddir (DIR *dir);
+gint gwin_closedir (DIR *dir);
+
+#endif /* _MSC_VER */
+
+#define g_ntohl(x) \
+ ((guint32)((((guint32)(x) & 0x000000ffU) << 24) | \
+ (((guint32)(x) & 0x0000ff00U) << 8) | \
+ (((guint32)(x) & 0x00ff0000U) >> 8) | \
+ (((guint32)(x) & 0xff000000U) >> 24)))
+
+#define g_htonl(x) g_ntohl(x)
+
+#define g_ntohs(x) \
+ ((guint16)((((guint16)(x) & 0x00ff) << 8) | \
+ (((guint16)(x) & 0xff00) >> 8)))
+
+#define g_htons(x) g_ntohs(x)
+
+#endif /* NATIVE_WIN32 */
+
+
+
#ifdef __cplusplus
}
diff --git a/glib/gmem.c b/glib/gmem.c
index a92acedfc..179d8d213 100644
--- a/glib/gmem.c
+++ b/glib/gmem.c
@@ -23,6 +23,7 @@
/* #define ENABLE_MEM_PROFILE */
/* #define ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS */
/* #define ENABLE_MEM_CHECK */
+#define MEM_PROFILE_TABLE_SIZE 8192
/*
* This library can check for some attempts to do illegal things to
@@ -114,7 +115,7 @@ static gint g_mem_chunk_area_search (GMemArea *a,
static GRealMemChunk *mem_chunks = NULL;
#ifdef ENABLE_MEM_PROFILE
-static gulong allocations[4096] = { 0 };
+static gulong allocations[MEM_PROFILE_TABLE_SIZE] = { 0 };
static gulong allocated_mem = 0;
static gulong freed_mem = 0;
static gint allocating_for_mem_chunk = 0;
@@ -171,10 +172,10 @@ g_malloc (gulong size)
# ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
if(!allocating_for_mem_chunk) {
# endif
- if (size <= 4095)
+ if (size <= MEM_PROFILE_TABLE_SIZE - 1)
allocations[size-1] += 1;
else
- allocations[4095] += 1;
+ allocations[MEM_PROFILE_TABLE_SIZE - 1] += 1;
allocated_mem += size;
# ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
}
@@ -234,10 +235,10 @@ g_malloc0 (gulong size)
# ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
if(!allocating_for_mem_chunk) {
# endif
- if (size <= 4095)
+ if (size <= (MEM_PROFILE_TABLE_SIZE - 1))
allocations[size-1] += 1;
else
- allocations[4095] += 1;
+ allocations[MEM_PROFILE_TABLE_SIZE - 1] += 1;
allocated_mem += size;
# ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
}
@@ -318,10 +319,10 @@ g_realloc (gpointer mem,
#ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
if(!allocating_for_mem_chunk) {
#endif
- if (size <= 4095)
+ if (size <= (MEM_PROFILE_TABLE_SIZE - 1))
allocations[size-1] += 1;
else
- allocations[4095] += 1;
+ allocations[MEM_PROFILE_TABLE_SIZE - 1] += 1;
allocated_mem += size;
#ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
}
@@ -375,14 +376,15 @@ g_mem_profile (void)
#ifdef ENABLE_MEM_PROFILE
gint i;
- for (i = 0; i < 4095; i++)
+ for (i = 0; i < (MEM_PROFILE_TABLE_SIZE - 1); i++)
if (allocations[i] > 0)
g_log (g_log_domain_glib, G_LOG_LEVEL_INFO,
"%lu allocations of %d bytes\n", allocations[i], i + 1);
- if (allocations[4095] > 0)
+ if (allocations[MEM_PROFILE_TABLE_SIZE - 1] > 0)
g_log (g_log_domain_glib, G_LOG_LEVEL_INFO,
- "%lu allocations of greater than 4095 bytes\n", allocations[4095]);
+ "%lu allocations of greater than %d bytes\n",
+ allocations[MEM_PROFILE_TABLE_SIZE - 1], MEM_PROFILE_TABLE_SIZE - 1);
g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "%lu bytes allocated\n", allocated_mem);
g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "%lu bytes freed\n", freed_mem);
g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "%lu bytes in use\n", allocated_mem - freed_mem);
diff --git a/glib/gmessages.c b/glib/gmessages.c
index 83d30732b..fa523111a 100644
--- a/glib/gmessages.c
+++ b/glib/gmessages.c
@@ -20,8 +20,25 @@
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
-#include <unistd.h>
#include "glib.h"
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef NATIVE_WIN32
+/* Just use stdio. If we're out of memroy, we're hosed anyway. */
+#undef write
+
+static inline int
+write (FILE *fd,
+ const char *buf,
+ int len)
+{
+ fwrite (buf, len, 1, fd);
+
+ return len;
+}
+#endif /* NATIVE_WIN32 */
/* --- structures --- */
@@ -334,7 +351,11 @@ g_log_default_handler (const gchar *log_domain,
const gchar *message,
gpointer unused_data)
{
+#ifdef NATIVE_WIN32
+ FILE *fd;
+#else
gint fd;
+#endif
gboolean in_recursion;
gboolean is_fatal;
@@ -345,7 +366,14 @@ g_log_default_handler (const gchar *log_domain,
if (!message)
message = "g_log_default_handler(): (NULL) message";
+#ifdef NATIVE_WIN32
+ /* Use just stdout as stderr is hard to get redirected from the
+ * DOS prompt.
+ */
+ fd = stdout;
+#else
fd = (log_level >= G_LOG_LEVEL_MESSAGE) ? 1 : 2;
+#endif
switch (log_level)
{
diff --git a/glib/gscanner.c b/glib/gscanner.c
index b73ca4c1b..0372b1871 100644
--- a/glib/gscanner.c
+++ b/glib/gscanner.c
@@ -25,13 +25,16 @@
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
+#include "glib.h"
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
+#endif
#include <errno.h>
#include <sys/types.h> /* needed for sys/stat.h */
#include <sys/stat.h>
-#include "glib.h"
-
-
+#ifdef _MSC_VER
+#include <io.h> /* For _read() */
+#endif
/* --- defines --- */
#define to_lower(c) ( \
@@ -61,7 +64,7 @@ struct _GScannerKey
static GScannerConfig g_scanner_config_template =
{
(
- " \t\n"
+ " \t\r\n"
) /* cset_skip_characters */,
(
G_CSET_a_2_z
@@ -613,10 +616,15 @@ g_scanner_cur_value (GScanner *scanner)
{
GTokenValue v;
- v.v_int = 0;
g_return_val_if_fail (scanner != NULL, v);
+
+ /* MSC isn't capable of handling return scanner->value; ? */
+
+ v.v_int = 0;
- return scanner->value;
+ v = scanner->value;
+
+ return v;
}
guint
@@ -1064,9 +1072,11 @@ g_scanner_stat_mode (const gchar *filename)
gint st_mode;
stat_buf = g_new0 (struct stat, 1);
-
+#ifdef HAVE_LSTAT
lstat (filename, stat_buf);
-
+#else
+ stat (filename, stat_buf);
+#endif
st_mode = stat_buf->st_mode;
g_free (stat_buf);
diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c
index 5b58c5446..37d3a8c90 100644
--- a/glib/gstrfuncs.c
+++ b/glib/gstrfuncs.c
@@ -951,6 +951,9 @@ g_strcasecmp (const gchar *s1,
#else
gint c1, c2;
+ g_return_val_if_fail (s1 != NULL, 0);
+ g_return_val_if_fail (s2 != NULL, 0);
+
while (*s1 && *s2)
{
/* According to A. Cox, some platforms have islower's that
@@ -988,6 +991,38 @@ g_strdelimit (gchar *string,
return string;
}
+gchar*
+g_strescape (gchar *string)
+{
+ gchar *q;
+ gchar *escaped;
+ guint backslashes = 0;
+ gchar *p = string;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ while (*p != '\000')
+ backslashes += (*p++ == '\\');
+
+ if (!backslashes)
+ return g_strdup (string);
+
+ escaped = g_new (gchar, strlen (string) + backslashes + 1);
+
+ p = string;
+ q = escaped;
+
+ while (*p != '\000')
+ {
+ if (*p == '\\')
+ *q++ = '\\';
+ *q++ = *p++;
+ }
+ *q = '\000';
+
+ return escaped;
+}
+
/* blame Elliot for these next five routines */
gchar*
g_strchug (gchar *string)
diff --git a/glib/gtimer.c b/glib/gtimer.c
index 47946b39b..a9ceed2d2 100644
--- a/glib/gtimer.c
+++ b/glib/gtimer.c
@@ -16,20 +16,32 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
-#include <sys/time.h>
-#include <unistd.h>
#include "glib.h"
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#ifndef NATIVE_WIN32
+#include <sys/time.h>
+#endif /* NATIVE_WIN32 */
+#ifdef NATIVE_WIN32
+#include <windows.h>
+#endif /* NATIVE_WIN32 */
typedef struct _GRealTimer GRealTimer;
struct _GRealTimer
{
+#ifdef NATIVE_WIN32
+ DWORD start;
+ DWORD end;
+#else /* !NATIVE_WIN32 */
struct timeval start;
struct timeval end;
- gint active;
-};
+#endif /* !NATIVE_WIN32 */
+ guint active : 1;
+};
GTimer*
g_timer_new (void)
@@ -39,7 +51,11 @@ g_timer_new (void)
timer = g_new (GRealTimer, 1);
timer->active = TRUE;
+#ifdef NATIVE_WIN32
+ timer->start = GetTickCount ();
+#else /* !NATIVE_WIN32 */
gettimeofday (&timer->start, NULL);
+#endif /* !NATIVE_WIN32 */
return ((GTimer*) timer);
}
@@ -60,8 +76,13 @@ g_timer_start (GTimer *timer)
g_assert (timer != NULL);
rtimer = (GRealTimer*) timer;
+ rtimer->active = TRUE;
+
+#ifdef NATIVE_WIN32
+ rtimer->start = GetTickCount ();
+#else /* !NATIVE_WIN32 */
gettimeofday (&rtimer->start, NULL);
- rtimer->active = 1;
+#endif /* !NATIVE_WIN32 */
}
void
@@ -72,8 +93,13 @@ g_timer_stop (GTimer *timer)
g_assert (timer != NULL);
rtimer = (GRealTimer*) timer;
+ rtimer->active = FALSE;
+
+#ifdef NATIVE_WIN32
+ rtimer->end = GetTickCount ();
+#else /* !NATIVE_WIN32 */
gettimeofday (&rtimer->end, NULL);
- rtimer->active = 0;
+#endif /* !NATIVE_WIN32 */
}
void
@@ -84,7 +110,12 @@ g_timer_reset (GTimer *timer)
g_assert (timer != NULL);
rtimer = (GRealTimer*) timer;
+
+#ifdef NATIVE_WIN32
+ rtimer->start = GetTickCount ();
+#else /* !NATIVE_WIN32 */
gettimeofday (&rtimer->start, NULL);
+#endif /* !NATIVE_WIN32 */
}
gdouble
@@ -92,13 +123,38 @@ g_timer_elapsed (GTimer *timer,
gulong *microseconds)
{
GRealTimer *rtimer;
- struct timeval elapsed;
gdouble total;
+#ifndef NATIVE_WIN32
+ struct timeval elapsed;
+#endif /* NATIVE_WIN32 */
- g_assert (timer != NULL);
+ g_return_val_if_fail (timer != NULL, 0);
rtimer = (GRealTimer*) timer;
+#ifdef NATIVE_WIN32
+ if (rtimer->active)
+ rtimer->end = GetTickCount ();
+
+ /* Check for wraparound, which happens every 49.7 days.
+ * No, Win95 machines probably are never running for that long,
+ * but NT machines are.
+ */
+ if (rtimer->end < rtimer->start)
+ total = (UINT_MAX - (rtimer->start - rtimer->end)) / 1000.0;
+ else
+ total = (rtimer->end - rtimer->start) / 1000.0;
+
+ if (microseconds)
+ {
+ if (rtimer->end < rtimer->start)
+ *microseconds =
+ ((UINT_MAX - (rtimer->start - rtimer->end)) % 1000) * 1000;
+ else
+ *microseconds =
+ ((rtimer->end - rtimer->start) % 1000) * 1000;
+ }
+#else /* !NATIVE_WIN32 */
if (rtimer->active)
gettimeofday (&rtimer->end, NULL);
@@ -115,6 +171,7 @@ g_timer_elapsed (GTimer *timer,
if (microseconds)
*microseconds = elapsed.tv_usec;
+#endif /* !NATIVE_WIN32 */
return total;
}
diff --git a/glib/gutils.c b/glib/gutils.c
index 6c2d4cfeb..dd42ef850 100644
--- a/glib/gutils.c
+++ b/glib/gutils.c
@@ -16,15 +16,34 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
+#include "glibconfig.h"
+
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
+#endif
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
+#ifdef HAVE_PWD_H
#include <pwd.h>
+#endif
#include <sys/types.h>
+#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
+#endif
+
+#ifdef NATIVE_WIN32
+# define STRICT /* Strict typing, please */
+# include <windows.h>
+# include <direct.h>
+# include <errno.h>
+# include <ctype.h>
+# ifdef _MSC_VER
+# include <io.h>
+# endif /* _MSC_VER */
+#endif /* NATIVE_WIN32 */
/* implement Glib's inline functions
*/
@@ -32,12 +51,29 @@
#define G_CAN_INLINE 1
#include "glib.h"
+#ifdef MAXPATHLEN
+#define G_PATH_LENGTH (MAXPATHLEN + 1)
+#elif defined (PATH_MAX)
+#define G_PATH_LENGTH (PATH_MAX + 1)
+#else /* !MAXPATHLEN */
+#define G_PATH_LENGTH (2048 + 1)
+#endif /* !MAXPATHLEN && !PATH_MAX */
+
const guint glib_major_version = GLIB_MAJOR_VERSION;
const guint glib_minor_version = GLIB_MINOR_VERSION;
const guint glib_micro_version = GLIB_MICRO_VERSION;
const guint glib_interface_age = GLIB_INTERFACE_AGE;
const guint glib_binary_age = GLIB_BINARY_AGE;
+#if defined (NATIVE_WIN32) && defined (__LCC__)
+int __stdcall
+LibMain (void *hinstDll,
+ unsigned long dwReason,
+ void *reserved)
+{
+ return 1;
+}
+#endif /* NATIVE_WIN32 && __LCC__ */
void
g_atexit (GVoidFunc func)
@@ -184,13 +220,50 @@ g_basename (const gchar *file_name)
g_return_val_if_fail (file_name != NULL, NULL);
- base = strrchr (file_name, '/');
+ base = strrchr (file_name, G_DIR_SEPARATOR);
if (base)
return base + 1;
+
+#ifdef NATIVE_WIN32
+ if (isalpha (file_name[0]) && file_name[1] == ':')
+ return (gchar*) file_name + 2;
+#endif /* NATIVE_WIN32 */
return (gchar*) file_name;
}
+gboolean
+g_path_is_absolute (const gchar *file_name)
+{
+ g_return_val_if_fail (file_name != NULL, FALSE);
+
+ if (file_name[0] == G_DIR_SEPARATOR)
+ return TRUE;
+
+#ifdef NATIVE_WIN32
+ if (isalpha (file_name[0]) && file_name[1] == ':' && file_name[2] == G_DIR_SEPARATOR)
+ return TRUE;
+#endif
+
+ return FALSE;
+}
+
+gchar*
+g_path_skip_root (gchar *file_name)
+{
+ g_return_val_if_fail (file_name != NULL, NULL);
+
+ if (file_name[0] == G_DIR_SEPARATOR)
+ return file_name + 1;
+
+#ifdef NATIVE_WIN32
+ if (isalpha (file_name[0]) && file_name[1] == ':' && file_name[2] == G_DIR_SEPARATOR)
+ return file_name + 3;
+#endif
+
+ return NULL;
+}
+
gchar*
g_dirname (const gchar *file_name)
{
@@ -199,10 +272,10 @@ g_dirname (const gchar *file_name)
g_return_val_if_fail (file_name != NULL, NULL);
- base = strrchr (file_name, '/');
+ base = strrchr (file_name, G_DIR_SEPARATOR);
if (!base)
return g_strdup (".");
- while (base > file_name && *base == '/')
+ while (base > file_name && *base == G_DIR_SEPARATOR)
base--;
len = (guint) 1 + base - file_name;
@@ -213,14 +286,6 @@ g_dirname (const gchar *file_name)
return base;
}
-#ifdef MAXPATHLEN
-#define G_PATH_LENGTH (MAXPATHLEN + 1)
-#elif defined (PATH_MAX)
-#define G_PATH_LENGTH (PATH_MAX + 1)
-#else /* !MAXPATHLEN */
-#define G_PATH_LENGTH (2048 + 1)
-#endif /* !MAXPATHLEN && !PATH_MAX */
-
gchar*
g_get_current_dir (void)
{
@@ -244,7 +309,7 @@ g_get_current_dir (void)
/* hm, should we g_error() out here?
* this can happen if e.g. "./" has mode \0000
*/
- buffer[0] = '/';
+ buffer[0] = G_DIR_SEPARATOR;
buffer[1] = 0;
}
@@ -254,6 +319,48 @@ g_get_current_dir (void)
return dir;
}
+gchar*
+g_getenv (const gchar *variable)
+{
+ g_return_val_if_fail (variable != NULL, NULL);
+
+#ifndef NATIVE_WIN32
+ return getenv (variable);
+#else
+ gchar *v;
+ guint l, k;
+ gchar *p;
+
+ v = getenv (variable);
+ if (!v)
+ return NULL;
+
+ /* On Windows NT, it is relatively typical that environment variables
+ * contain references to other environment variables. Handle that by
+ * calling ExpandEnvironmentStrings.
+ */
+
+ v = g_strdup (v);
+ l = 16;
+ do
+ {
+ p = g_new (gchar, l);
+
+ k = ExpandEnvironmentStrings (v, p, l);
+ if (k > l)
+ {
+ g_free (p);
+ l *= 2;
+ }
+ }
+ while (k > l);
+
+ g_free (v);
+
+ return p;
+#endif
+}
+
static gchar *g_tmp_dir = NULL;
static gchar *g_user_name = NULL;
static gchar *g_real_name = NULL;
@@ -264,18 +371,28 @@ g_get_any_init (void)
{
if (!g_tmp_dir)
{
+#ifdef HAVE_PWD_H
struct passwd *pw;
-
- g_tmp_dir = g_strdup (getenv ("TMPDIR"));
+#endif
+
+ g_tmp_dir = g_strdup (g_getenv ("TMPDIR"));
if (!g_tmp_dir)
- g_tmp_dir = g_strdup (getenv ("TMP"));
+ g_tmp_dir = g_strdup (g_getenv ("TMP"));
if (!g_tmp_dir)
- g_tmp_dir = g_strdup (getenv ("TEMP"));
+ g_tmp_dir = g_strdup (g_getenv ("TEMP"));
+
if (!g_tmp_dir)
- g_tmp_dir = g_strdup ("/tmp");
+ {
+#ifndef NATIVE_WIN32
+ g_tmp_dir = g_strdup (G_DIR_SEPARATOR_S "tmp");
+#else /* !NATIVE_WIN32 */
+ g_tmp_dir = g_strdup (".");
+#endif /* !NATIVE_WIN32 */
+ }
- g_home_dir = g_strdup (getenv ("HOME"));
+ g_home_dir = g_strdup (g_getenv ("HOME"));
+#ifdef HAVE_PWD_H
setpwent ();
pw = getpwuid (getuid ());
endpwent ();
@@ -287,7 +404,33 @@ g_get_any_init (void)
if (!g_home_dir)
g_home_dir = g_strdup (pw->pw_dir);
}
+#else /* !HAVE_PWD_H */
+# ifdef NATIVE_WIN32
+ {
+ guint len = 17;
+
+ g_user_name = g_new (gchar, len);
+
+ if (!GetUserName (g_user_name, &len))
+ {
+ g_free (g_user_name);
+ g_user_name = g_strdup ("somebody");
+ g_real_name = g_strdup ("Unknown");
+ }
+ else
+ g_real_name = g_strdup (g_user_name);
+ g_home_dir = NULL;
+ }
+# else /* !NATIVE_WIN32 */
+ g_user_name = g_strdup ("somebody");
+ g_real_name = g_strdup ("Unknown");
+ g_home_dir = NULL;
+# endif /* !NATIVE_WIN32 */
+#endif /* !HAVE_PWD_H */
}
+
+ if (!g_home_dir)
+ g_home_dir = g_strdup (g_tmp_dir);
}
gchar*
@@ -344,21 +487,23 @@ g_set_prgname (const gchar *prgname)
}
guint
-g_direct_hash(gconstpointer v)
+g_direct_hash (gconstpointer v)
{
return GPOINTER_TO_UINT (v);
}
gint
-g_direct_equal(gconstpointer v, gconstpointer v2)
+g_direct_equal (gconstpointer v1,
+ gconstpointer v2)
{
- return GPOINTER_TO_UINT (v) == GPOINTER_TO_UINT (v2);
+ return GPOINTER_TO_UINT (v1) == GPOINTER_TO_UINT (v2);
}
gint
-g_int_equal (gconstpointer v, gconstpointer v2)
+g_int_equal (gconstpointer v1,
+ gconstpointer v2)
{
- return *((const gint*) v) == *((const gint*) v2);
+ return *((const gint*) v1) == *((const gint*) v2);
}
guint
@@ -366,3 +511,228 @@ g_int_hash (gconstpointer v)
{
return *(const gint*) v;
}
+
+GIOChannel*
+g_iochannel_new (gint fd)
+{
+ GIOChannel *channel = g_new0 (GIOChannel, 1);
+
+ channel->fd = fd;
+
+#ifdef NATIVE_WIN32
+ channel->peer = 0;
+ channel->peer_fd = 0;
+ channel->offset = 0;
+ channel->peer_offset = 0;
+#endif /* NATIVE_WIN32 */
+
+ return channel;
+}
+
+void
+g_iochannel_free (GIOChannel *channel)
+{
+ g_return_if_fail (channel != NULL);
+
+ g_free (channel);
+}
+
+void
+g_iochannel_close_and_free (GIOChannel *channel)
+{
+ g_return_if_fail (channel != NULL);
+
+ close (channel->fd);
+
+ g_iochannel_free (channel);
+}
+
+#undef g_iochannel_wakeup_peer
+
+void
+g_iochannel_wakeup_peer (GIOChannel *channel)
+{
+ static guint message = 0;
+
+ g_return_if_fail (channel != NULL);
+
+#ifdef NATIVE_WIN32
+ if (message == 0)
+ message = RegisterWindowMessage ("gdk-pipe-readable");
+
+# if 0
+ g_print ("g_iochannel_wakeup_peer: calling PostThreadMessage (%#x, %d, %d, %d)\n",
+ channel->peer, message, channel->peer_fd, channel->offset);
+# endif
+ PostThreadMessage (channel->peer, message,
+ channel->peer_fd, channel->offset);
+#endif /* NATIVE_WIN32 */
+}
+
+
+#ifdef NATIVE_WIN32
+#ifdef _MSC_VER
+
+int
+gwin_ftruncate (gint fd,
+ guint size)
+{
+ HANDLE hfile;
+ guint curpos;
+
+ g_return_val_if_fail (fd >= 0, -1);
+
+ hfile = (HANDLE) _get_osfhandle (fd);
+ curpos = SetFilePointer (hfile, 0, NULL, FILE_CURRENT);
+ if (curpos == 0xFFFFFFFF
+ || SetFilePointer (hfile, size, NULL, FILE_BEGIN) == 0xFFFFFFFF
+ || !SetEndOfFile (hfile))
+ {
+ gint error = GetLastError ();
+
+ switch (error)
+ {
+ case ERROR_INVALID_HANDLE:
+ errno = EBADF;
+ break;
+ default:
+ errno = EIO;
+ break;
+ }
+
+ return -1;
+ }
+
+ return 0;
+}
+
+DIR*
+gwin_opendir (const char *dirname)
+{
+ DIR *result;
+ gchar *mask;
+ guint k;
+
+ g_return_val_if_fail (dirname != NULL, NULL);
+
+ result = g_new0 (DIR, 1);
+ result->find_file_data = g_new0 (WIN32_FIND_DATA, 1);
+ result->dir_name = g_strdup (dirname);
+
+ k = strlen (result->dir_name);
+ if (k && result->dir_name[k - 1] == '\\')
+ {
+ result->dir_name[k - 1] = '\0';
+ k--;
+ }
+ mask = g_strdup_printf ("%s\\*", result->dir_name);
+
+ result->find_file_handle = (guint) FindFirstFile (mask,
+ (LPWIN32_FIND_DATA) result->find_file_data);
+ g_free (mask);
+
+ if (result->find_file_handle == (guint) INVALID_HANDLE_VALUE)
+ {
+ int error = GetLastError ();
+
+ g_free (result->dir_name);
+ g_free (result->find_file_data);
+ g_free (result);
+ switch (error)
+ {
+ default:
+ errno = EIO;
+ return NULL;
+ }
+ }
+ result->just_opened = TRUE;
+
+ return result;
+}
+
+struct dirent*
+gwin_readdir (DIR *dir)
+{
+ static struct dirent result;
+
+ g_return_val_if_fail (dir != NULL, NULL);
+
+ if (dir->just_opened)
+ dir->just_opened = FALSE;
+ else
+ {
+ if (!FindNextFile ((HANDLE) dir->find_file_handle,
+ (LPWIN32_FIND_DATA) dir->find_file_data))
+ {
+ int error = GetLastError ();
+
+ switch (error)
+ {
+ case ERROR_NO_MORE_FILES:
+ return NULL;
+ default:
+ errno = EIO;
+ return NULL;
+ }
+ }
+ }
+ strcpy (result.d_name, g_basename (((LPWIN32_FIND_DATA) dir->find_file_data)->cFileName));
+
+ return &result;
+}
+
+void
+gwin_rewinddir (DIR *dir)
+{
+ gchar *mask;
+
+ g_return_if_fail (dir != NULL);
+
+ if (!FindClose ((HANDLE) dir->find_file_handle))
+ g_warning ("gwin_rewinddir(): FindClose() failed\n");
+
+ mask = g_strdup_printf ("%s\\*", dir->dir_name);
+ dir->find_file_handle = (guint) FindFirstFile (mask,
+ (LPWIN32_FIND_DATA) dir->find_file_data);
+ g_free (mask);
+
+ if (dir->find_file_handle == (guint) INVALID_HANDLE_VALUE)
+ {
+ int error = GetLastError ();
+
+ switch (error)
+ {
+ default:
+ errno = EIO;
+ return;
+ }
+ }
+ dir->just_opened = TRUE;
+}
+
+gint
+gwin_closedir (DIR *dir)
+{
+ g_return_val_if_fail (dir != NULL, -1);
+
+ if (!FindClose ((HANDLE) dir->find_file_handle))
+ {
+ int error = GetLastError ();
+
+ switch (error)
+ {
+ default:
+ errno = EIO; return -1;
+ }
+ }
+
+ g_free (dir->dir_name);
+ g_free (dir->find_file_data);
+ g_free (dir);
+
+ return 0;
+}
+
+#endif /* _MSC_VER */
+
+#endif /* NATIVE_WIN32 */
diff --git a/glibconfig.h.in b/glibconfig.h.in
index 4d0715fd0..1d3751588 100644
--- a/glibconfig.h.in
+++ b/glibconfig.h.in
@@ -6,6 +6,9 @@
/* Define if you don't have vprintf but do have _doprnt. */
#undef HAVE_DOPRNT
+/* Define if you have <unistd.h>. */
+#undef HAVE_UNISTD_H
+
/* Define if you have the vprintf function. */
#undef HAVE_VPRINTF
@@ -25,9 +28,14 @@
#undef HAVE_FLOAT_H
#undef HAVE_LIMITS_H
#undef HAVE_LONG_DOUBLE
+#undef HAVE_PWD_H
+#undef HAVE_SYS_PARAM_H
#undef HAVE_SYS_SELECT_H
+#undef HAVE_SYS_TIME_H
+#undef HAVE_SYS_TIMES_H
#undef HAVE_STRERROR
#undef HAVE_STRSIGNAL
+#undef HAVE_UNISTD_H
#undef HAVE_VSNPRINTF
#undef HAVE_VALUES_H
#undef HAVE_VPRINTF
@@ -71,6 +79,9 @@
/* Define if you have the atexit function. */
#undef HAVE_ATEXIT
+/* Define if you have the lstat function. */
+#undef HAVE_LSTAT
+
/* Define if you have the memmove function. */
#undef HAVE_MEMMOVE
@@ -95,5 +106,23 @@
/* Define if you have the <limits.h> header file. */
#undef HAVE_LIMITS_H
+/* Define if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define if you have the <sys/times.h> header file. */
+#undef HAVE_SYS_TIMES_H
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
/* Define if you have the <values.h> header file. */
#undef HAVE_VALUES_H
diff --git a/glibconfig.h.win32 b/glibconfig.h.win32
new file mode 100644
index 000000000..4380c2630
--- /dev/null
+++ b/glibconfig.h.win32
@@ -0,0 +1,119 @@
+/* glibconfig.h.win32. Handcrafted for Microsoft C */
+
+#if !(defined(_MSC_VER) || defined(__LCC__))
+#error Unrecognized Win32 compiler, edit glibconfig.h by hand
+#endif
+
+/* Define to empty if the keyword does not work. */
+/* #undef const */
+
+/* Define if you don't have vprintf but do have _doprnt. */
+/* #undef HAVE_DOPRNT */
+
+/* Define if you have the vprintf function. */
+#define HAVE_VPRINTF 1
+
+/* Define as __inline if that's what the C compiler calls it. */
+#if defined (_MSC_VER)
+#define G_HAVE___INLINE
+#endif
+
+/* Define if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* #undef ENABLE_MEM_CHECK */
+/* #undef ENABLE_MEM_PROFILE */
+
+/* #undef G_COMPILED_WITH_DEBUGGING */
+/* #undef HAVE_BROKEN_WCTYPE */
+/* #undef HAVE_DOPRNT */
+/* #undef HAVE_LONG_DOUBLE */
+/* #undef HAVE_PWD_H */
+/* #undef HAVE_SYS_PARAM_H */
+/* #undef HAVE_SYS_SELECT_H */
+/* #undef HAVE_SYS_TIME_H */
+/* #undef HAVE_SYS_TIMES_H */
+/* #undef HAVE_UNISTD_H */
+/* #undef HAVE_VSNPRINTF */
+#define HAVE_VPRINTF 1
+#ifdef _MSC_VER
+#define HAVE_WCHAR_H 1
+#define HAVE_WCTYPE_H 1
+#else
+#undef HAVE_WCHAR_H
+#undef HAVE_WCTYPE_H
+#endif
+
+/* #undef NO_FD_SET */
+/* #undef NO_SYS_ERRLIST */
+#define NO_SYS_SIGLIST 1
+
+#define GLIB_MAJOR_VERSION 1
+#define GLIB_MINOR_VERSION 1
+#define GLIB_MICRO_VERSION 4
+#define GLIB_INTERFACE_AGE 0
+#define GLIB_BINARY_AGE 0
+
+/* The number of bytes in a char. */
+#define SIZEOF_CHAR 1
+
+/* The number of bytes in a int. */
+#define SIZEOF_INT 4
+
+/* The number of bytes in a long. */
+#define SIZEOF_LONG 4
+
+/* The number of bytes in a long long. */
+/* #undef SIZEOF_LONG_LONG */
+
+/* The number of bytes in a short. */
+#define SIZEOF_SHORT 2
+
+/* The number of bytes in a void *. */
+#define SIZEOF_VOID_P 4
+
+/* Define if you have the atexit function. */
+#define HAVE_ATEXIT 1
+
+/* Define if you have the lstat function. */
+/* #undef HAVE_LSTAT */
+
+/* Define if you have the memmove function. */
+#define HAVE_MEMMOVE 1
+
+/* Define if you have the on_exit function. */
+/* #undef HAVE_ON_EXIT */
+
+/* Define if you have the strcasecmp function. */
+/* #undef HAVE_STRCASECMP */
+
+/* Define if you have the strerror function. */
+#define HAVE_STRERROR 1
+
+/* Define if you have the strsignal function. */
+/* #undef HAVE_STRSIGNAL */
+
+/* Define if you have the vsnprintf function. */
+/* #undef HAVE_VSNPRINTF */
+
+/* Define if you have the getpid function. */
+/* #undef HAVE_GETPID */
+
+/* Define if you have the <float.h> header file. */
+#ifdef _MSC_VER
+#define HAVE_FLOAT_H 1
+#else
+/* #undef HAVE_FLOAT_H */
+#endif
+
+/* Define if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define if you have the <values.h> header file. */
+/* #undef HAVE_VALUES_H */
+
+/* Define if this is Win32, possibly using the GNU-Win32 emulation layer. */
+#define WIN32 1
+
+/* Define if this is Win32 without GNU-Win32. */
+#define NATIVE_WIN32 1
diff --git a/gmem.c b/gmem.c
index a92acedfc..179d8d213 100644
--- a/gmem.c
+++ b/gmem.c
@@ -23,6 +23,7 @@
/* #define ENABLE_MEM_PROFILE */
/* #define ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS */
/* #define ENABLE_MEM_CHECK */
+#define MEM_PROFILE_TABLE_SIZE 8192
/*
* This library can check for some attempts to do illegal things to
@@ -114,7 +115,7 @@ static gint g_mem_chunk_area_search (GMemArea *a,
static GRealMemChunk *mem_chunks = NULL;
#ifdef ENABLE_MEM_PROFILE
-static gulong allocations[4096] = { 0 };
+static gulong allocations[MEM_PROFILE_TABLE_SIZE] = { 0 };
static gulong allocated_mem = 0;
static gulong freed_mem = 0;
static gint allocating_for_mem_chunk = 0;
@@ -171,10 +172,10 @@ g_malloc (gulong size)
# ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
if(!allocating_for_mem_chunk) {
# endif
- if (size <= 4095)
+ if (size <= MEM_PROFILE_TABLE_SIZE - 1)
allocations[size-1] += 1;
else
- allocations[4095] += 1;
+ allocations[MEM_PROFILE_TABLE_SIZE - 1] += 1;
allocated_mem += size;
# ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
}
@@ -234,10 +235,10 @@ g_malloc0 (gulong size)
# ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
if(!allocating_for_mem_chunk) {
# endif
- if (size <= 4095)
+ if (size <= (MEM_PROFILE_TABLE_SIZE - 1))
allocations[size-1] += 1;
else
- allocations[4095] += 1;
+ allocations[MEM_PROFILE_TABLE_SIZE - 1] += 1;
allocated_mem += size;
# ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
}
@@ -318,10 +319,10 @@ g_realloc (gpointer mem,
#ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
if(!allocating_for_mem_chunk) {
#endif
- if (size <= 4095)
+ if (size <= (MEM_PROFILE_TABLE_SIZE - 1))
allocations[size-1] += 1;
else
- allocations[4095] += 1;
+ allocations[MEM_PROFILE_TABLE_SIZE - 1] += 1;
allocated_mem += size;
#ifdef ENABLE_MEM_PROFILE_EXCLUDES_MEM_CHUNKS
}
@@ -375,14 +376,15 @@ g_mem_profile (void)
#ifdef ENABLE_MEM_PROFILE
gint i;
- for (i = 0; i < 4095; i++)
+ for (i = 0; i < (MEM_PROFILE_TABLE_SIZE - 1); i++)
if (allocations[i] > 0)
g_log (g_log_domain_glib, G_LOG_LEVEL_INFO,
"%lu allocations of %d bytes\n", allocations[i], i + 1);
- if (allocations[4095] > 0)
+ if (allocations[MEM_PROFILE_TABLE_SIZE - 1] > 0)
g_log (g_log_domain_glib, G_LOG_LEVEL_INFO,
- "%lu allocations of greater than 4095 bytes\n", allocations[4095]);
+ "%lu allocations of greater than %d bytes\n",
+ allocations[MEM_PROFILE_TABLE_SIZE - 1], MEM_PROFILE_TABLE_SIZE - 1);
g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "%lu bytes allocated\n", allocated_mem);
g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "%lu bytes freed\n", freed_mem);
g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "%lu bytes in use\n", allocated_mem - freed_mem);
diff --git a/gmessages.c b/gmessages.c
index 83d30732b..fa523111a 100644
--- a/gmessages.c
+++ b/gmessages.c
@@ -20,8 +20,25 @@
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
-#include <unistd.h>
#include "glib.h"
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef NATIVE_WIN32
+/* Just use stdio. If we're out of memroy, we're hosed anyway. */
+#undef write
+
+static inline int
+write (FILE *fd,
+ const char *buf,
+ int len)
+{
+ fwrite (buf, len, 1, fd);
+
+ return len;
+}
+#endif /* NATIVE_WIN32 */
/* --- structures --- */
@@ -334,7 +351,11 @@ g_log_default_handler (const gchar *log_domain,
const gchar *message,
gpointer unused_data)
{
+#ifdef NATIVE_WIN32
+ FILE *fd;
+#else
gint fd;
+#endif
gboolean in_recursion;
gboolean is_fatal;
@@ -345,7 +366,14 @@ g_log_default_handler (const gchar *log_domain,
if (!message)
message = "g_log_default_handler(): (NULL) message";
+#ifdef NATIVE_WIN32
+ /* Use just stdout as stderr is hard to get redirected from the
+ * DOS prompt.
+ */
+ fd = stdout;
+#else
fd = (log_level >= G_LOG_LEVEL_MESSAGE) ? 1 : 2;
+#endif
switch (log_level)
{
diff --git a/gmodule/ChangeLog b/gmodule/ChangeLog
index c40d261d6..ad6c76a44 100644
--- a/gmodule/ChangeLog
+++ b/gmodule/ChangeLog
@@ -1,3 +1,45 @@
+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-25 Raja R Harinath <harinath@cs.umn.edu>
* gmodule.h: Remove `#pragma }'.
diff --git a/gmodule/Makefile.am b/gmodule/Makefile.am
index 3cc594715..818f0a01f 100644
--- a/gmodule/Makefile.am
+++ b/gmodule/Makefile.am
@@ -5,8 +5,11 @@ DEFS += -DG_LOG_DOMAIN=g_log_domain_gmodule
EXTRA_DIST = \
gmoduleconf.h.in \
+ gmodule.def \
gmodule-dl.c \
- gmodule-dld.c
+ gmodule-dld.c \
+ gmodule-win32.c \
+ gmoduleconf.h.win32
BUILT_SOURCES = gmoduleconf.h
gmoduleconf.h: gmoduleconf.h.in
diff --git a/gmodule/gmodule-dl.c b/gmodule/gmodule-dl.c
index 4eb1b4a7d..034e94bf0 100644
--- a/gmodule/gmodule-dl.c
+++ b/gmodule/gmodule-dl.c
@@ -115,3 +115,13 @@ _g_module_symbol (gpointer handle,
return p;
}
+
+static gchar*
+_g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ if (directory)
+ return g_strconcat (directory, "/lib", module_name, ".so", NULL);
+ else
+ return g_strconcat ("lib", module_name, ".so", NULL);
+}
diff --git a/gmodule/gmodule-dld.c b/gmodule/gmodule-dld.c
index 552b8fad1..b1d68d7d3 100644
--- a/gmodule/gmodule-dld.c
+++ b/gmodule/gmodule-dld.c
@@ -112,3 +112,13 @@ _g_module_symbol (gpointer handle,
return p;
}
+
+static gchar*
+_g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ if (directory)
+ return g_strconcat (directory, "/", module_name, ".sl", NULL);
+ else
+ return g_strconcat (module_name, ".sl", NULL);
+}
diff --git a/gmodule/gmodule-win32.c b/gmodule/gmodule-win32.c
new file mode 100644
index 000000000..0cc1bacc3
--- /dev/null
+++ b/gmodule/gmodule-win32.c
@@ -0,0 +1,93 @@
+/* GMODULE - GLIB wrapper code for dynamic module loading
+ * Copyright (C) 1998 Tim Janik
+ * Copyright (C) 1998 Tor Lillqvist
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#include <stdio.h>
+#include <windows.h>
+
+/* --- functions --- */
+static gpointer
+_g_module_open (const gchar *file_name,
+ gboolean bind_lazy)
+{
+ HINSTANCE handle;
+
+ handle = LoadLibrary (file_name);
+ if (!handle)
+ {
+ char error[100];
+ sprintf (error, "Error code %d", GetLastError ());
+ g_module_set_error (error);
+ }
+
+ return handle;
+}
+
+static gpointer
+_g_module_self (void)
+{
+ HMODULE handle;
+
+ handle = GetModuleHandle (NULL);
+ if (!handle)
+ {
+ char error[100];
+ sprintf (error, "Error code %d", GetLastError ());
+ g_module_set_error (error);
+ }
+
+ return handle;
+}
+
+static void
+_g_module_close (gpointer handle,
+ gboolean is_unref)
+{
+ if (!FreeLibrary (handle))
+ {
+ char error[100];
+ sprintf (error, "Error code %d", GetLastError ());
+ g_module_set_error (error);
+ }
+}
+
+static gpointer
+_g_module_symbol (gpointer handle,
+ const gchar *symbol_name)
+{
+ gpointer p;
+
+ p = GetProcAddress (handle, symbol_name);
+ if (!p)
+ {
+ char error[100];
+ sprintf (error, "Error code %d", GetLastError ());
+ g_module_set_error (error);
+ }
+ return p;
+}
+
+static gchar*
+_g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ if (directory)
+ return g_strconcat (directory, "\\", module_name, ".dll", NULL);
+ else
+ return g_strconcat (module_name, ".dll", NULL);
+}
diff --git a/gmodule/gmodule.c b/gmodule/gmodule.c
index bb00ddef2..0bcc37306 100644
--- a/gmodule/gmodule.c
+++ b/gmodule/gmodule.c
@@ -51,6 +51,8 @@ static void _g_module_close (gpointer handle,
static gpointer _g_module_self (void);
static gpointer _g_module_symbol (gpointer handle,
const gchar *symbol_name);
+static gchar* _g_module_build_path (const gchar *directory,
+ const gchar *module_name);
static inline void g_module_set_error (const gchar *error);
static inline GModule* g_module_find_by_handle (gpointer handle);
static inline GModule* g_module_find_by_name (const gchar *name);
@@ -108,6 +110,8 @@ g_module_set_error (const gchar *error)
#include "gmodule-dl.c"
#elif (G_MODULE_IMPL == G_MODULE_IMPL_DLD)
#include "gmodule-dld.c"
+#elif (G_MODULE_IMPL == G_MODULE_IMPL_WIN32)
+#include "gmodule-win32.c"
#else
#undef CHECK_ERROR
#define CHECK_ERROR(rv) { g_module_set_error ("unsupported"); return rv; }
@@ -135,6 +139,16 @@ _g_module_symbol (gpointer handle,
}
#endif /* no implementation */
+#if defined (NATIVE_WIN32) && defined (__LCC__)
+int __stdcall
+LibMain (void *hinstDll,
+ unsigned long dwReason,
+ void *reserved)
+{
+ return 1;
+}
+#endif /* NATIVE_WIN32 && __LCC__ */
+
/* --- functions --- */
gboolean
@@ -354,3 +368,12 @@ g_module_name (GModule *module)
return module->file_name;
}
+
+gchar*
+g_module_build_path (const gchar *directory,
+ const gchar *module_name)
+{
+ g_return_val_if_fail (module_name != NULL, NULL);
+
+ return _g_module_build_path (directory, module_name);
+}
diff --git a/gmodule/gmodule.def b/gmodule/gmodule.def
new file mode 100644
index 000000000..966b86807
--- /dev/null
+++ b/gmodule/gmodule.def
@@ -0,0 +1,9 @@
+EXPORTS
+ g_log_domain_gmodule
+ g_module_close
+ g_module_error
+ g_module_make_resident
+ g_module_name
+ g_module_open
+ g_module_supported
+ g_module_symbol
diff --git a/gmodule/gmodule.h b/gmodule/gmodule.h
index 0e3fc2b1c..62fd16af6 100644
--- a/gmodule/gmodule.h
+++ b/gmodule/gmodule.h
@@ -28,12 +28,15 @@ extern const char *g_log_domain_gmodule;
#include <glib.h>
-/* exporting and importing functions,
- * we need autoconf support here to feature Windows dll stubs.
+/* exporting and importing functions, this is special cased
+ * to feature Windows dll stubs.
*/
#define G_MODULE_IMPORT extern
-#define G_MODULE_EXPORT
-
+#ifdef NATIVE_WIN32
+# define G_MODULE_EXPORT __declspec(dllexport)
+#else /* !NATIVE_WIN32 */
+# define G_MODULE_EXPORT
+#endif /* !NATIVE_WIN32 */
typedef enum
{
@@ -70,6 +73,20 @@ gboolean g_module_symbol (GModule *module,
gchar* g_module_name (GModule *module);
+/* Build the actual file name containing a module. `directory' is the
+ * directory where the module file is supposed to be, or NULL or empty
+ * in which case it should either be in the current directory or, on
+ * some operating systems, in some standard place, for instance on the
+ * PATH. Hence, to be absoultely sure to get the correct module,
+ * always pass in a directory. The file name consists of the directory,
+ * if supplied, and `module_name' suitably decorated accoring to
+ * the operating system's conventions (for instance lib*.so or *.dll).
+ *
+ * No checks are made that the file exists, or is of correct type.
+ */
+gchar* g_module_build_path (const gchar *directory,
+ const gchar *module_name);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/gmodule/gmoduleconf.h.in b/gmodule/gmoduleconf.h.in
index b0f393c7b..ee2aa5c3c 100644
--- a/gmodule/gmoduleconf.h.in
+++ b/gmodule/gmoduleconf.h.in
@@ -28,6 +28,7 @@ extern "C" {
#define G_MODULE_IMPL_NONE 0
#define G_MODULE_IMPL_DL 1
#define G_MODULE_IMPL_DLD 2
+#define G_MODULE_IMPL_WIN32 3
#define G_MODULE_IMPL @G_MODULE_IMPL@
#undef G_MODULE_HAVE_DLERROR
diff --git a/gmodule/libgplugin_a.c b/gmodule/libgplugin_a.c
index 1ed32b324..99e9e41fe 100644
--- a/gmodule/libgplugin_a.c
+++ b/gmodule/libgplugin_a.c
@@ -17,6 +17,17 @@
* Boston, MA 02111-1307, USA.
*/
#include <gmodule.h>
+#include <stdlib.h>
+
+#if defined (NATIVE_WIN32) && defined (__LCC__)
+int __stdcall
+LibMain(void *hinstDll,
+ unsigned long dwReason,
+ void *reserved)
+{
+ return 1;
+}
+#endif /* NATIVE_WIN32 && __LCC__ */
G_MODULE_EXPORT void
gplugin_a_func (void)
diff --git a/gmodule/libgplugin_b.c b/gmodule/libgplugin_b.c
index b6e752108..12e7fcb76 100644
--- a/gmodule/libgplugin_b.c
+++ b/gmodule/libgplugin_b.c
@@ -18,6 +18,16 @@
*/
#include <gmodule.h>
+#if defined (NATIVE_WIN32) && defined (__LCC__)
+int __stdcall
+LibMain(void *hinstDll,
+ unsigned long dwReason,
+ void *reserved)
+{
+ return 1;
+}
+#endif /* NATIVE_WIN32 && __LCC__ */
+
G_MODULE_EXPORT const gchar*
g_module_check_init (GModule *module)
{
diff --git a/gmodule/testgmodule.c b/gmodule/testgmodule.c
index 71e1ed9f8..ff7b4397e 100644
--- a/gmodule/testgmodule.c
+++ b/gmodule/testgmodule.c
@@ -20,7 +20,7 @@
#include <gmodule.h>
-void
+G_MODULE_EXPORT void
g_clash_func (void)
{
g_print ("GModule: Hello global clash\n");
@@ -44,8 +44,13 @@ main (int arg,
string = g_get_current_dir ();
g_print ("testgmodule (%s):\n", string);
+#ifdef NATIVE_WIN32
+ plugin_a = g_strconcat (string, "\\libgplugin_a.dll", NULL);
+ plugin_b = g_strconcat (string, "\\libgplugin_b.dll", NULL);
+#else /* !NATIVE_WIN32 */
plugin_a = g_strconcat (string, "/.libs/", "libgplugin_a.so", NULL);
plugin_b = g_strconcat (string, "/.libs/", "libgplugin_b.so", NULL);
+#endif /* NATIVE_WIN32 */
g_free (string);
/* module handles
diff --git a/gscanner.c b/gscanner.c
index b73ca4c1b..0372b1871 100644
--- a/gscanner.c
+++ b/gscanner.c
@@ -25,13 +25,16 @@
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
+#include "glib.h"
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
+#endif
#include <errno.h>
#include <sys/types.h> /* needed for sys/stat.h */
#include <sys/stat.h>
-#include "glib.h"
-
-
+#ifdef _MSC_VER
+#include <io.h> /* For _read() */
+#endif
/* --- defines --- */
#define to_lower(c) ( \
@@ -61,7 +64,7 @@ struct _GScannerKey
static GScannerConfig g_scanner_config_template =
{
(
- " \t\n"
+ " \t\r\n"
) /* cset_skip_characters */,
(
G_CSET_a_2_z
@@ -613,10 +616,15 @@ g_scanner_cur_value (GScanner *scanner)
{
GTokenValue v;
- v.v_int = 0;
g_return_val_if_fail (scanner != NULL, v);
+
+ /* MSC isn't capable of handling return scanner->value; ? */
+
+ v.v_int = 0;
- return scanner->value;
+ v = scanner->value;
+
+ return v;
}
guint
@@ -1064,9 +1072,11 @@ g_scanner_stat_mode (const gchar *filename)
gint st_mode;
stat_buf = g_new0 (struct stat, 1);
-
+#ifdef HAVE_LSTAT
lstat (filename, stat_buf);
-
+#else
+ stat (filename, stat_buf);
+#endif
st_mode = stat_buf->st_mode;
g_free (stat_buf);
diff --git a/gstrfuncs.c b/gstrfuncs.c
index 5b58c5446..37d3a8c90 100644
--- a/gstrfuncs.c
+++ b/gstrfuncs.c
@@ -951,6 +951,9 @@ g_strcasecmp (const gchar *s1,
#else
gint c1, c2;
+ g_return_val_if_fail (s1 != NULL, 0);
+ g_return_val_if_fail (s2 != NULL, 0);
+
while (*s1 && *s2)
{
/* According to A. Cox, some platforms have islower's that
@@ -988,6 +991,38 @@ g_strdelimit (gchar *string,
return string;
}
+gchar*
+g_strescape (gchar *string)
+{
+ gchar *q;
+ gchar *escaped;
+ guint backslashes = 0;
+ gchar *p = string;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ while (*p != '\000')
+ backslashes += (*p++ == '\\');
+
+ if (!backslashes)
+ return g_strdup (string);
+
+ escaped = g_new (gchar, strlen (string) + backslashes + 1);
+
+ p = string;
+ q = escaped;
+
+ while (*p != '\000')
+ {
+ if (*p == '\\')
+ *q++ = '\\';
+ *q++ = *p++;
+ }
+ *q = '\000';
+
+ return escaped;
+}
+
/* blame Elliot for these next five routines */
gchar*
g_strchug (gchar *string)
diff --git a/gtimer.c b/gtimer.c
index 47946b39b..a9ceed2d2 100644
--- a/gtimer.c
+++ b/gtimer.c
@@ -16,20 +16,32 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
-#include <sys/time.h>
-#include <unistd.h>
#include "glib.h"
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#ifndef NATIVE_WIN32
+#include <sys/time.h>
+#endif /* NATIVE_WIN32 */
+#ifdef NATIVE_WIN32
+#include <windows.h>
+#endif /* NATIVE_WIN32 */
typedef struct _GRealTimer GRealTimer;
struct _GRealTimer
{
+#ifdef NATIVE_WIN32
+ DWORD start;
+ DWORD end;
+#else /* !NATIVE_WIN32 */
struct timeval start;
struct timeval end;
- gint active;
-};
+#endif /* !NATIVE_WIN32 */
+ guint active : 1;
+};
GTimer*
g_timer_new (void)
@@ -39,7 +51,11 @@ g_timer_new (void)
timer = g_new (GRealTimer, 1);
timer->active = TRUE;
+#ifdef NATIVE_WIN32
+ timer->start = GetTickCount ();
+#else /* !NATIVE_WIN32 */
gettimeofday (&timer->start, NULL);
+#endif /* !NATIVE_WIN32 */
return ((GTimer*) timer);
}
@@ -60,8 +76,13 @@ g_timer_start (GTimer *timer)
g_assert (timer != NULL);
rtimer = (GRealTimer*) timer;
+ rtimer->active = TRUE;
+
+#ifdef NATIVE_WIN32
+ rtimer->start = GetTickCount ();
+#else /* !NATIVE_WIN32 */
gettimeofday (&rtimer->start, NULL);
- rtimer->active = 1;
+#endif /* !NATIVE_WIN32 */
}
void
@@ -72,8 +93,13 @@ g_timer_stop (GTimer *timer)
g_assert (timer != NULL);
rtimer = (GRealTimer*) timer;
+ rtimer->active = FALSE;
+
+#ifdef NATIVE_WIN32
+ rtimer->end = GetTickCount ();
+#else /* !NATIVE_WIN32 */
gettimeofday (&rtimer->end, NULL);
- rtimer->active = 0;
+#endif /* !NATIVE_WIN32 */
}
void
@@ -84,7 +110,12 @@ g_timer_reset (GTimer *timer)
g_assert (timer != NULL);
rtimer = (GRealTimer*) timer;
+
+#ifdef NATIVE_WIN32
+ rtimer->start = GetTickCount ();
+#else /* !NATIVE_WIN32 */
gettimeofday (&rtimer->start, NULL);
+#endif /* !NATIVE_WIN32 */
}
gdouble
@@ -92,13 +123,38 @@ g_timer_elapsed (GTimer *timer,
gulong *microseconds)
{
GRealTimer *rtimer;
- struct timeval elapsed;
gdouble total;
+#ifndef NATIVE_WIN32
+ struct timeval elapsed;
+#endif /* NATIVE_WIN32 */
- g_assert (timer != NULL);
+ g_return_val_if_fail (timer != NULL, 0);
rtimer = (GRealTimer*) timer;
+#ifdef NATIVE_WIN32
+ if (rtimer->active)
+ rtimer->end = GetTickCount ();
+
+ /* Check for wraparound, which happens every 49.7 days.
+ * No, Win95 machines probably are never running for that long,
+ * but NT machines are.
+ */
+ if (rtimer->end < rtimer->start)
+ total = (UINT_MAX - (rtimer->start - rtimer->end)) / 1000.0;
+ else
+ total = (rtimer->end - rtimer->start) / 1000.0;
+
+ if (microseconds)
+ {
+ if (rtimer->end < rtimer->start)
+ *microseconds =
+ ((UINT_MAX - (rtimer->start - rtimer->end)) % 1000) * 1000;
+ else
+ *microseconds =
+ ((rtimer->end - rtimer->start) % 1000) * 1000;
+ }
+#else /* !NATIVE_WIN32 */
if (rtimer->active)
gettimeofday (&rtimer->end, NULL);
@@ -115,6 +171,7 @@ g_timer_elapsed (GTimer *timer,
if (microseconds)
*microseconds = elapsed.tv_usec;
+#endif /* !NATIVE_WIN32 */
return total;
}
diff --git a/gutils.c b/gutils.c
index 6c2d4cfeb..dd42ef850 100644
--- a/gutils.c
+++ b/gutils.c
@@ -16,15 +16,34 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
+#include "glibconfig.h"
+
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
+#endif
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
+#ifdef HAVE_PWD_H
#include <pwd.h>
+#endif
#include <sys/types.h>
+#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
+#endif
+
+#ifdef NATIVE_WIN32
+# define STRICT /* Strict typing, please */
+# include <windows.h>
+# include <direct.h>
+# include <errno.h>
+# include <ctype.h>
+# ifdef _MSC_VER
+# include <io.h>
+# endif /* _MSC_VER */
+#endif /* NATIVE_WIN32 */
/* implement Glib's inline functions
*/
@@ -32,12 +51,29 @@
#define G_CAN_INLINE 1
#include "glib.h"
+#ifdef MAXPATHLEN
+#define G_PATH_LENGTH (MAXPATHLEN + 1)
+#elif defined (PATH_MAX)
+#define G_PATH_LENGTH (PATH_MAX + 1)
+#else /* !MAXPATHLEN */
+#define G_PATH_LENGTH (2048 + 1)
+#endif /* !MAXPATHLEN && !PATH_MAX */
+
const guint glib_major_version = GLIB_MAJOR_VERSION;
const guint glib_minor_version = GLIB_MINOR_VERSION;
const guint glib_micro_version = GLIB_MICRO_VERSION;
const guint glib_interface_age = GLIB_INTERFACE_AGE;
const guint glib_binary_age = GLIB_BINARY_AGE;
+#if defined (NATIVE_WIN32) && defined (__LCC__)
+int __stdcall
+LibMain (void *hinstDll,
+ unsigned long dwReason,
+ void *reserved)
+{
+ return 1;
+}
+#endif /* NATIVE_WIN32 && __LCC__ */
void
g_atexit (GVoidFunc func)
@@ -184,13 +220,50 @@ g_basename (const gchar *file_name)
g_return_val_if_fail (file_name != NULL, NULL);
- base = strrchr (file_name, '/');
+ base = strrchr (file_name, G_DIR_SEPARATOR);
if (base)
return base + 1;
+
+#ifdef NATIVE_WIN32
+ if (isalpha (file_name[0]) && file_name[1] == ':')
+ return (gchar*) file_name + 2;
+#endif /* NATIVE_WIN32 */
return (gchar*) file_name;
}
+gboolean
+g_path_is_absolute (const gchar *file_name)
+{
+ g_return_val_if_fail (file_name != NULL, FALSE);
+
+ if (file_name[0] == G_DIR_SEPARATOR)
+ return TRUE;
+
+#ifdef NATIVE_WIN32
+ if (isalpha (file_name[0]) && file_name[1] == ':' && file_name[2] == G_DIR_SEPARATOR)
+ return TRUE;
+#endif
+
+ return FALSE;
+}
+
+gchar*
+g_path_skip_root (gchar *file_name)
+{
+ g_return_val_if_fail (file_name != NULL, NULL);
+
+ if (file_name[0] == G_DIR_SEPARATOR)
+ return file_name + 1;
+
+#ifdef NATIVE_WIN32
+ if (isalpha (file_name[0]) && file_name[1] == ':' && file_name[2] == G_DIR_SEPARATOR)
+ return file_name + 3;
+#endif
+
+ return NULL;
+}
+
gchar*
g_dirname (const gchar *file_name)
{
@@ -199,10 +272,10 @@ g_dirname (const gchar *file_name)
g_return_val_if_fail (file_name != NULL, NULL);
- base = strrchr (file_name, '/');
+ base = strrchr (file_name, G_DIR_SEPARATOR);
if (!base)
return g_strdup (".");
- while (base > file_name && *base == '/')
+ while (base > file_name && *base == G_DIR_SEPARATOR)
base--;
len = (guint) 1 + base - file_name;
@@ -213,14 +286,6 @@ g_dirname (const gchar *file_name)
return base;
}
-#ifdef MAXPATHLEN
-#define G_PATH_LENGTH (MAXPATHLEN + 1)
-#elif defined (PATH_MAX)
-#define G_PATH_LENGTH (PATH_MAX + 1)
-#else /* !MAXPATHLEN */
-#define G_PATH_LENGTH (2048 + 1)
-#endif /* !MAXPATHLEN && !PATH_MAX */
-
gchar*
g_get_current_dir (void)
{
@@ -244,7 +309,7 @@ g_get_current_dir (void)
/* hm, should we g_error() out here?
* this can happen if e.g. "./" has mode \0000
*/
- buffer[0] = '/';
+ buffer[0] = G_DIR_SEPARATOR;
buffer[1] = 0;
}
@@ -254,6 +319,48 @@ g_get_current_dir (void)
return dir;
}
+gchar*
+g_getenv (const gchar *variable)
+{
+ g_return_val_if_fail (variable != NULL, NULL);
+
+#ifndef NATIVE_WIN32
+ return getenv (variable);
+#else
+ gchar *v;
+ guint l, k;
+ gchar *p;
+
+ v = getenv (variable);
+ if (!v)
+ return NULL;
+
+ /* On Windows NT, it is relatively typical that environment variables
+ * contain references to other environment variables. Handle that by
+ * calling ExpandEnvironmentStrings.
+ */
+
+ v = g_strdup (v);
+ l = 16;
+ do
+ {
+ p = g_new (gchar, l);
+
+ k = ExpandEnvironmentStrings (v, p, l);
+ if (k > l)
+ {
+ g_free (p);
+ l *= 2;
+ }
+ }
+ while (k > l);
+
+ g_free (v);
+
+ return p;
+#endif
+}
+
static gchar *g_tmp_dir = NULL;
static gchar *g_user_name = NULL;
static gchar *g_real_name = NULL;
@@ -264,18 +371,28 @@ g_get_any_init (void)
{
if (!g_tmp_dir)
{
+#ifdef HAVE_PWD_H
struct passwd *pw;
-
- g_tmp_dir = g_strdup (getenv ("TMPDIR"));
+#endif
+
+ g_tmp_dir = g_strdup (g_getenv ("TMPDIR"));
if (!g_tmp_dir)
- g_tmp_dir = g_strdup (getenv ("TMP"));
+ g_tmp_dir = g_strdup (g_getenv ("TMP"));
if (!g_tmp_dir)
- g_tmp_dir = g_strdup (getenv ("TEMP"));
+ g_tmp_dir = g_strdup (g_getenv ("TEMP"));
+
if (!g_tmp_dir)
- g_tmp_dir = g_strdup ("/tmp");
+ {
+#ifndef NATIVE_WIN32
+ g_tmp_dir = g_strdup (G_DIR_SEPARATOR_S "tmp");
+#else /* !NATIVE_WIN32 */
+ g_tmp_dir = g_strdup (".");
+#endif /* !NATIVE_WIN32 */
+ }
- g_home_dir = g_strdup (getenv ("HOME"));
+ g_home_dir = g_strdup (g_getenv ("HOME"));
+#ifdef HAVE_PWD_H
setpwent ();
pw = getpwuid (getuid ());
endpwent ();
@@ -287,7 +404,33 @@ g_get_any_init (void)
if (!g_home_dir)
g_home_dir = g_strdup (pw->pw_dir);
}
+#else /* !HAVE_PWD_H */
+# ifdef NATIVE_WIN32
+ {
+ guint len = 17;
+
+ g_user_name = g_new (gchar, len);
+
+ if (!GetUserName (g_user_name, &len))
+ {
+ g_free (g_user_name);
+ g_user_name = g_strdup ("somebody");
+ g_real_name = g_strdup ("Unknown");
+ }
+ else
+ g_real_name = g_strdup (g_user_name);
+ g_home_dir = NULL;
+ }
+# else /* !NATIVE_WIN32 */
+ g_user_name = g_strdup ("somebody");
+ g_real_name = g_strdup ("Unknown");
+ g_home_dir = NULL;
+# endif /* !NATIVE_WIN32 */
+#endif /* !HAVE_PWD_H */
}
+
+ if (!g_home_dir)
+ g_home_dir = g_strdup (g_tmp_dir);
}
gchar*
@@ -344,21 +487,23 @@ g_set_prgname (const gchar *prgname)
}
guint
-g_direct_hash(gconstpointer v)
+g_direct_hash (gconstpointer v)
{
return GPOINTER_TO_UINT (v);
}
gint
-g_direct_equal(gconstpointer v, gconstpointer v2)
+g_direct_equal (gconstpointer v1,
+ gconstpointer v2)
{
- return GPOINTER_TO_UINT (v) == GPOINTER_TO_UINT (v2);
+ return GPOINTER_TO_UINT (v1) == GPOINTER_TO_UINT (v2);
}
gint
-g_int_equal (gconstpointer v, gconstpointer v2)
+g_int_equal (gconstpointer v1,
+ gconstpointer v2)
{
- return *((const gint*) v) == *((const gint*) v2);
+ return *((const gint*) v1) == *((const gint*) v2);
}
guint
@@ -366,3 +511,228 @@ g_int_hash (gconstpointer v)
{
return *(const gint*) v;
}
+
+GIOChannel*
+g_iochannel_new (gint fd)
+{
+ GIOChannel *channel = g_new0 (GIOChannel, 1);
+
+ channel->fd = fd;
+
+#ifdef NATIVE_WIN32
+ channel->peer = 0;
+ channel->peer_fd = 0;
+ channel->offset = 0;
+ channel->peer_offset = 0;
+#endif /* NATIVE_WIN32 */
+
+ return channel;
+}
+
+void
+g_iochannel_free (GIOChannel *channel)
+{
+ g_return_if_fail (channel != NULL);
+
+ g_free (channel);
+}
+
+void
+g_iochannel_close_and_free (GIOChannel *channel)
+{
+ g_return_if_fail (channel != NULL);
+
+ close (channel->fd);
+
+ g_iochannel_free (channel);
+}
+
+#undef g_iochannel_wakeup_peer
+
+void
+g_iochannel_wakeup_peer (GIOChannel *channel)
+{
+ static guint message = 0;
+
+ g_return_if_fail (channel != NULL);
+
+#ifdef NATIVE_WIN32
+ if (message == 0)
+ message = RegisterWindowMessage ("gdk-pipe-readable");
+
+# if 0
+ g_print ("g_iochannel_wakeup_peer: calling PostThreadMessage (%#x, %d, %d, %d)\n",
+ channel->peer, message, channel->peer_fd, channel->offset);
+# endif
+ PostThreadMessage (channel->peer, message,
+ channel->peer_fd, channel->offset);
+#endif /* NATIVE_WIN32 */
+}
+
+
+#ifdef NATIVE_WIN32
+#ifdef _MSC_VER
+
+int
+gwin_ftruncate (gint fd,
+ guint size)
+{
+ HANDLE hfile;
+ guint curpos;
+
+ g_return_val_if_fail (fd >= 0, -1);
+
+ hfile = (HANDLE) _get_osfhandle (fd);
+ curpos = SetFilePointer (hfile, 0, NULL, FILE_CURRENT);
+ if (curpos == 0xFFFFFFFF
+ || SetFilePointer (hfile, size, NULL, FILE_BEGIN) == 0xFFFFFFFF
+ || !SetEndOfFile (hfile))
+ {
+ gint error = GetLastError ();
+
+ switch (error)
+ {
+ case ERROR_INVALID_HANDLE:
+ errno = EBADF;
+ break;
+ default:
+ errno = EIO;
+ break;
+ }
+
+ return -1;
+ }
+
+ return 0;
+}
+
+DIR*
+gwin_opendir (const char *dirname)
+{
+ DIR *result;
+ gchar *mask;
+ guint k;
+
+ g_return_val_if_fail (dirname != NULL, NULL);
+
+ result = g_new0 (DIR, 1);
+ result->find_file_data = g_new0 (WIN32_FIND_DATA, 1);
+ result->dir_name = g_strdup (dirname);
+
+ k = strlen (result->dir_name);
+ if (k && result->dir_name[k - 1] == '\\')
+ {
+ result->dir_name[k - 1] = '\0';
+ k--;
+ }
+ mask = g_strdup_printf ("%s\\*", result->dir_name);
+
+ result->find_file_handle = (guint) FindFirstFile (mask,
+ (LPWIN32_FIND_DATA) result->find_file_data);
+ g_free (mask);
+
+ if (result->find_file_handle == (guint) INVALID_HANDLE_VALUE)
+ {
+ int error = GetLastError ();
+
+ g_free (result->dir_name);
+ g_free (result->find_file_data);
+ g_free (result);
+ switch (error)
+ {
+ default:
+ errno = EIO;
+ return NULL;
+ }
+ }
+ result->just_opened = TRUE;
+
+ return result;
+}
+
+struct dirent*
+gwin_readdir (DIR *dir)
+{
+ static struct dirent result;
+
+ g_return_val_if_fail (dir != NULL, NULL);
+
+ if (dir->just_opened)
+ dir->just_opened = FALSE;
+ else
+ {
+ if (!FindNextFile ((HANDLE) dir->find_file_handle,
+ (LPWIN32_FIND_DATA) dir->find_file_data))
+ {
+ int error = GetLastError ();
+
+ switch (error)
+ {
+ case ERROR_NO_MORE_FILES:
+ return NULL;
+ default:
+ errno = EIO;
+ return NULL;
+ }
+ }
+ }
+ strcpy (result.d_name, g_basename (((LPWIN32_FIND_DATA) dir->find_file_data)->cFileName));
+
+ return &result;
+}
+
+void
+gwin_rewinddir (DIR *dir)
+{
+ gchar *mask;
+
+ g_return_if_fail (dir != NULL);
+
+ if (!FindClose ((HANDLE) dir->find_file_handle))
+ g_warning ("gwin_rewinddir(): FindClose() failed\n");
+
+ mask = g_strdup_printf ("%s\\*", dir->dir_name);
+ dir->find_file_handle = (guint) FindFirstFile (mask,
+ (LPWIN32_FIND_DATA) dir->find_file_data);
+ g_free (mask);
+
+ if (dir->find_file_handle == (guint) INVALID_HANDLE_VALUE)
+ {
+ int error = GetLastError ();
+
+ switch (error)
+ {
+ default:
+ errno = EIO;
+ return;
+ }
+ }
+ dir->just_opened = TRUE;
+}
+
+gint
+gwin_closedir (DIR *dir)
+{
+ g_return_val_if_fail (dir != NULL, -1);
+
+ if (!FindClose ((HANDLE) dir->find_file_handle))
+ {
+ int error = GetLastError ();
+
+ switch (error)
+ {
+ default:
+ errno = EIO; return -1;
+ }
+ }
+
+ g_free (dir->dir_name);
+ g_free (dir->find_file_data);
+ g_free (dir);
+
+ return 0;
+}
+
+#endif /* _MSC_VER */
+
+#endif /* NATIVE_WIN32 */
diff --git a/makefile.lcc b/makefile.lcc
new file mode 100644
index 000000000..546603594
--- /dev/null
+++ b/makefile.lcc
@@ -0,0 +1,99 @@
+## Makefile for building glib.dll and gmodule.dll with lcc
+## Use: make -f makefile.lcc
+## Note that testglib crashes when compiled with lcc...
+
+INSTALL = copy/y
+TOUCH = copy/y makefile.lcc
+
+CFLAGS = -I. -O
+CC = lcc
+LD = lcclnk
+
+BIN = C:\bin
+
+all : \
+ glibconfig.h \
+ glib.dll \
+ gmodule\gmoduleconf.h \
+ gmodule.dll \
+ testglib.exe \
+ testgmodule.exe
+
+install : all
+ $(INSTALL) glib.dll $(BIN)
+ $(INSTALL) gmodule.dll $(BIN)
+ $(TOUCH) install
+
+glib_OBJECTS = \
+ garray.obj \
+ gcache.obj \
+ gcompletion.obj \
+ gdataset.obj \
+ gerror.obj \
+ ghash.obj \
+ glist.obj \
+ gmem.obj \
+ gmessages.obj \
+ gnode.obj \
+ gprimes.obj \
+ gslist.obj \
+ gtimer.obj \
+ gtree.obj \
+ grel.obj \
+ gstring.obj \
+ gstrfuncs.obj \
+ gscanner.obj \
+ gutils.obj
+
+glib.dll : $(glib_OBJECTS)
+ $(LD) -dll -o glib.dll $(glib_OBJECTS)
+ implib glib.dll
+
+glibconfig.h: glibconfig.h.win32
+ copy glibconfig.h.win32 glibconfig.h
+
+.c.obj :
+ $(CC) $(CFLAGS) -DGLIB_COMPILATION -DG_LOG_DOMAIN=g_log_domain_glib $<
+
+gmodule_OBJECTS = \
+ gmodule.obj
+
+gmodule.dll : $(gmodule_OBJECTS)
+ $(LD) -dll -o gmodule.dll $(gmodule_OBJECTS) glib.lib
+ implib gmodule.dll
+
+gmodule.obj : gmodule\gmodule.c gmodule\gmodule-win32.c
+ $(CC) $(CFLAGS) -Igmodule -DCOMPILING_GMODULE -DG_LIB_DOMAIN=g_log_domain_gmodule gmodule\gmodule.c
+
+gmodule\gmoduleconf.h: gmodule\gmoduleconf.h.win32
+ copy gmodule\gmoduleconf.h.win32 gmodule\gmoduleconf.h
+
+testglib.exe : glib.dll testglib.obj
+ $(LD) -o testglib.exe testglib.obj glib.lib
+
+testglib.obj : testglib.c
+ $(CC) $(CFLAGS) testglib.c
+
+testgmodule.exe : glib.dll gmodule.dll testgmodule.obj libgplugin_a.dll libgplugin_b.dll
+ $(LD) -o testgmodule.exe testgmodule.obj testgmodule.def glib.lib gmodule.lib
+
+testgmodule.obj : gmodule\testgmodule.c
+ $(CC) $(CFLAGS) -Igmodule gmodule\testgmodule.c
+
+libgplugin_a.dll : libgplugin_a.obj
+ $(LD) -dll -o libgplugin_a.dll libgplugin_a.obj glib.lib gmodule.lib
+
+libgplugin_a.obj : gmodule\libgplugin_a.c
+ $(CC) $(CFLAGS) -Igmodule gmodule\libgplugin_a.c
+
+libgplugin_b.dll : libgplugin_b.obj
+ $(LD) -dll -o libgplugin_b.dll libgplugin_b.obj /link glib.lib gmodule.lib
+
+libgplugin_b.obj : gmodule\libgplugin_b.c
+ $(CC) $(CFLAGS) -Igmodule gmodule\libgplugin_b.c
+
+clean:
+ del *.exe
+ del *.obj
+ del *.dll
+ del *.lib
diff --git a/makefile.msc b/makefile.msc
new file mode 100644
index 000000000..b8980fd59
--- /dev/null
+++ b/makefile.msc
@@ -0,0 +1,110 @@
+## Makefile for building the GLib and gmodule dll with Microsoft C
+## Use: nmake -f makefile.msc install
+
+# Change this to wherever you want to install the dlls
+BIN = C:\bin
+
+# cl -? described the options
+CC = cl -G5 -GF -Ox -W3 -D_DLL -nologo
+
+LDFLAGS = /link /nodefaultlib:libc msvcrt.lib # /debug:full /debugtype:cv
+INSTALL = copy
+TOUCH = copy makefile.msc
+
+GLIB_VER = 1.1
+
+CFLAGS = -I.
+
+all : \
+ glibconfig.h \
+ glib-$(GLIB_VER).dll \
+ gmodule\gmoduleconf.h \
+ gmodule-$(GLIB_VER).dll \
+ testglib.exe \
+ testgmodule.exe
+
+install : all
+ $(INSTALL) glib-$(GLIB_VER).dll $(BIN)
+ $(INSTALL) gmodule-$(GLIB_VER).dll $(BIN)
+ $(TOUCH) install
+
+glib_OBJECTS = \
+ garray.obj \
+ gcache.obj \
+ gcompletion.obj \
+ gdataset.obj \
+ gerror.obj \
+ ghook.obj \
+ ghash.obj \
+ glist.obj \
+ gmem.obj \
+ gmessages.obj \
+ gnode.obj \
+ gprimes.obj \
+ gslist.obj \
+ gtimer.obj \
+ gtree.obj \
+ grel.obj \
+ gstring.obj \
+ gstrfuncs.obj \
+ gscanner.obj \
+ gutils.obj
+
+glib-$(GLIB_VER).dll : $(glib_OBJECTS)
+ $(CC) $(CFLAGS) -MD -LD -Feglib-$(GLIB_VER).dll $(glib_OBJECTS) user32.lib advapi32.lib $(LDFLAGS) /def:glib.def
+
+glibconfig.h: glibconfig.h.win32
+ copy glibconfig.h.win32 glibconfig.h
+
+.c.obj :
+ $(CC) $(CFLAGS) -GD -c -DGLIB_COMPILATION -DG_LOG_DOMAIN=g_log_domain_glib $<
+
+gmodule_OBJECTS = \
+ gmodule.obj
+
+gmodule-$(GLIB_VER).dll : $(gmodule_OBJECTS)
+ $(CC) $(CFLAGS) -MD -LD -Fegmodule-$(GLIB_VER).dll $(gmodule_OBJECTS) glib-$(GLIB_VER).lib $(LDFLAGS) /def:gmodule.def
+
+gmodule.obj : gmodule\gmodule.c gmodule\gmodule-win32.c
+ $(CC) $(CFLAGS) -Igmodule -c -DG_LIB_DOMAIN=g_log_domain_gmodule gmodule\gmodule.c
+
+gmodule\gmoduleconf.h: gmodule\gmoduleconf.h.win32
+ copy gmodule\gmoduleconf.h.win32 gmodule\gmoduleconf.h
+
+testglib.exe : glib-$(GLIB_VER).dll testglib.obj
+ $(CC) $(CFLAGS) -MD -Fetestglib.exe testglib.obj glib-$(GLIB_VER).lib $(LDFLAGS) /map
+
+testglib.obj : testglib.c
+ $(CC) -c $(CFLAGS) testglib.c
+
+testgmodule.exe : glib-$(GLIB_VER).dll gmodule-$(GLIB_VER).dll testgmodule.obj libgplugin_a.dll libgplugin_b.dll
+ $(CC) $(CFLAGS) -MD testgmodule.obj glib-$(GLIB_VER).lib gmodule-$(GLIB_VER).lib $(LDFLAGS)
+
+testgmodule.obj : gmodule\testgmodule.c
+ $(CC) $(CFLAGS) -Igmodule -c gmodule\testgmodule.c
+
+libgplugin_a.dll : libgplugin_a.obj
+ $(CC) $(CFLAGS) -MD -LD libgplugin_a.obj glib-$(GLIB_VER).lib gmodule-$(GLIB_VER).lib $(LDFLAGS)
+
+libgplugin_a.obj : gmodule\libgplugin_a.c
+ $(CC) $(CFLAGS) -Igmodule -c gmodule\libgplugin_a.c
+
+libgplugin_b.dll : libgplugin_b.obj
+ $(CC) $(CFLAGS) -MD -LD libgplugin_b.obj glib-$(GLIB_VER).lib gmodule-$(GLIB_VER).lib $(LDFLAGS)
+
+libgplugin_b.obj : gmodule\libgplugin_b.c
+ $(CC) $(CFLAGS) -Igmodule -c gmodule\libgplugin_b.c
+
+clean:
+ del *.exe
+ del *.obj
+ del *.dll
+ del *.lib
+ del *.err
+ del *.map
+ del *.sym
+ del *.exp
+ del *.lk1
+ del *.mk1
+ del *.pdb
+ del *.ilk
diff --git a/testglib.c b/testglib.c
index 1dd6efa80..e948a10af 100644
--- a/testglib.c
+++ b/testglib.c
@@ -295,6 +295,7 @@ main (int argc,
gchar *filename;
gchar *dirname;
} dirname_checks[] = {
+#ifndef NATIVE_WIN32
{ "/", "/" },
{ "////", "/" },
{ ".////", "." },
@@ -306,6 +307,18 @@ main (int argc,
{ "a/b", "a" },
{ "a/b/", "a/b" },
{ "c///", "c" },
+#else
+ { "\\", "\\" },
+ { ".\\\\\\\\", "." },
+ { ".", "." },
+ { "..", "." },
+ { "..\\", ".." },
+ { "..\\\\\\\\", ".." },
+ { "", "." },
+ { "a\\b", "a" },
+ { "a\\b\\", "a\\b" },
+ { "c\\\\\\", "c" },
+#endif
};
guint n_dirname_checks = sizeof (dirname_checks) / sizeof (dirname_checks[0]);
@@ -625,12 +638,32 @@ main (int argc,
for (i = 0; i < 10000; i++)
g_string_append_c (string1, 'a'+(i%26));
+#if !(defined (_MSC_VER) || defined (__LCC__))
+ /* MSVC and LCC use the same run-time C library, which doesn't like
+ the %10000.10000f format... */
g_string_sprintf (string2, "%s|%0100d|%s|%s|%0*d|%*.*f|%10000.10000f",
"this pete guy sure is a wuss, like he's the number ",
1,
" wuss. everyone agrees.\n",
string1->str,
10, 666, 15, 15, 666.666666666, 666.666666666);
+#else
+ g_string_sprintf (string2, "%s|%0100d|%s|%s|%0*d|%*.*f|%100.100f",
+ "this pete guy sure is a wuss, like he's the number ",
+ 1,
+ " wuss. everyone agrees.\n",
+ string1->str,
+ 10, 666, 15, 15, 666.666666666, 666.666666666);
+#endif
+
+ g_print ("string2 length = %d...\n", string2->len);
+ string2->str[70] = '\0';
+ g_print ("first 70 chars:\n%s\n", string2->str);
+ string2->str[141] = '\0';
+ g_print ("next 70 chars:\n%s\n", string2->str+71);
+ string2->str[212] = '\0';
+ g_print ("and next 70:\n%s\n", string2->str+142);
+ g_print ("last 70 chars:\n%s\n", string2->str+string2->len - 70);
g_print ("ok\n");
@@ -648,7 +681,23 @@ main (int argc,
g_print ("ok\n");
- g_print ("checking g_strcasecmp...\n");
+ g_print ("checking g_strcasecmp...");
+ g_assert (g_strcasecmp ("FroboZZ", "frobozz") == 0);
+ g_assert (g_strcasecmp ("frobozz", "frobozz") == 0);
+ g_assert (g_strcasecmp ("frobozz", "FROBOZZ") == 0);
+ g_assert (g_strcasecmp ("FROBOZZ", "froboz") != 0);
+ g_assert (g_strcasecmp ("", "") == 0);
+ g_assert (g_strcasecmp ("!#%&/()", "!#%&/()") == 0);
+ g_assert (g_strcasecmp ("a", "b") < 0);
+ g_assert (g_strcasecmp ("a", "B") < 0);
+ g_assert (g_strcasecmp ("A", "b") < 0);
+ g_assert (g_strcasecmp ("A", "B") < 0);
+ g_assert (g_strcasecmp ("b", "a") > 0);
+ g_assert (g_strcasecmp ("b", "A") > 0);
+ g_assert (g_strcasecmp ("B", "a") > 0);
+ g_assert (g_strcasecmp ("B", "A") > 0);
+
+ g_print ("ok\n");
/* g_debug (argv[0]); */
@@ -757,7 +806,7 @@ main (int argc,
g_print ("ok\n");
g_printerr ("g_log tests:");
- g_warning ("harmless warning");
+ g_warning ("harmless warning with parameters: %d %s %#x", 42, "Boo", 12345);
g_message ("the next warning is a test:");
string = NULL;
g_print (string);
diff --git a/tests/testglib.c b/tests/testglib.c
index 1dd6efa80..e948a10af 100644
--- a/tests/testglib.c
+++ b/tests/testglib.c
@@ -295,6 +295,7 @@ main (int argc,
gchar *filename;
gchar *dirname;
} dirname_checks[] = {
+#ifndef NATIVE_WIN32
{ "/", "/" },
{ "////", "/" },
{ ".////", "." },
@@ -306,6 +307,18 @@ main (int argc,
{ "a/b", "a" },
{ "a/b/", "a/b" },
{ "c///", "c" },
+#else
+ { "\\", "\\" },
+ { ".\\\\\\\\", "." },
+ { ".", "." },
+ { "..", "." },
+ { "..\\", ".." },
+ { "..\\\\\\\\", ".." },
+ { "", "." },
+ { "a\\b", "a" },
+ { "a\\b\\", "a\\b" },
+ { "c\\\\\\", "c" },
+#endif
};
guint n_dirname_checks = sizeof (dirname_checks) / sizeof (dirname_checks[0]);
@@ -625,12 +638,32 @@ main (int argc,
for (i = 0; i < 10000; i++)
g_string_append_c (string1, 'a'+(i%26));
+#if !(defined (_MSC_VER) || defined (__LCC__))
+ /* MSVC and LCC use the same run-time C library, which doesn't like
+ the %10000.10000f format... */
g_string_sprintf (string2, "%s|%0100d|%s|%s|%0*d|%*.*f|%10000.10000f",
"this pete guy sure is a wuss, like he's the number ",
1,
" wuss. everyone agrees.\n",
string1->str,
10, 666, 15, 15, 666.666666666, 666.666666666);
+#else
+ g_string_sprintf (string2, "%s|%0100d|%s|%s|%0*d|%*.*f|%100.100f",
+ "this pete guy sure is a wuss, like he's the number ",
+ 1,
+ " wuss. everyone agrees.\n",
+ string1->str,
+ 10, 666, 15, 15, 666.666666666, 666.666666666);
+#endif
+
+ g_print ("string2 length = %d...\n", string2->len);
+ string2->str[70] = '\0';
+ g_print ("first 70 chars:\n%s\n", string2->str);
+ string2->str[141] = '\0';
+ g_print ("next 70 chars:\n%s\n", string2->str+71);
+ string2->str[212] = '\0';
+ g_print ("and next 70:\n%s\n", string2->str+142);
+ g_print ("last 70 chars:\n%s\n", string2->str+string2->len - 70);
g_print ("ok\n");
@@ -648,7 +681,23 @@ main (int argc,
g_print ("ok\n");
- g_print ("checking g_strcasecmp...\n");
+ g_print ("checking g_strcasecmp...");
+ g_assert (g_strcasecmp ("FroboZZ", "frobozz") == 0);
+ g_assert (g_strcasecmp ("frobozz", "frobozz") == 0);
+ g_assert (g_strcasecmp ("frobozz", "FROBOZZ") == 0);
+ g_assert (g_strcasecmp ("FROBOZZ", "froboz") != 0);
+ g_assert (g_strcasecmp ("", "") == 0);
+ g_assert (g_strcasecmp ("!#%&/()", "!#%&/()") == 0);
+ g_assert (g_strcasecmp ("a", "b") < 0);
+ g_assert (g_strcasecmp ("a", "B") < 0);
+ g_assert (g_strcasecmp ("A", "b") < 0);
+ g_assert (g_strcasecmp ("A", "B") < 0);
+ g_assert (g_strcasecmp ("b", "a") > 0);
+ g_assert (g_strcasecmp ("b", "A") > 0);
+ g_assert (g_strcasecmp ("B", "a") > 0);
+ g_assert (g_strcasecmp ("B", "A") > 0);
+
+ g_print ("ok\n");
/* g_debug (argv[0]); */
@@ -757,7 +806,7 @@ main (int argc,
g_print ("ok\n");
g_printerr ("g_log tests:");
- g_warning ("harmless warning");
+ g_warning ("harmless warning with parameters: %d %s %#x", 42, "Boo", 12345);
g_message ("the next warning is a test:");
string = NULL;
g_print (string);