diff options
52 files changed, 3834 insertions, 170 deletions
@@ -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 } @@ -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 @@ -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 @@ -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) @@ -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; } @@ -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); |