diff -x CVS -ru3 -N /home/src/gnomecvs/glib/ChangeLog ./ChangeLog --- /home/src/gnomecvs/glib/ChangeLog Thu Oct 8 10:54:11 1998 +++ ./ChangeLog Tue Oct 20 22:51:30 1998 @@ -1,3 +1,101 @@ +1998-10-20: Tor Lillqvist + + * 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 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. + + * 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. + + * 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. + Thu Oct 8 06:47:27 1998 Tim Janik * glib.h: diff -x CVS -ru3 -N /home/src/gnomecvs/glib/README.win32 ./README.win32 --- /home/src/gnomecvs/glib/README.win32 Thu Jan 1 02:00:00 1970 +++ ./README.win32 Tue Oct 20 21:36:24 1998 @@ -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 -x CVS -ru3 -N /home/src/gnomecvs/glib/acconfig.h ./acconfig.h --- /home/src/gnomecvs/glib/acconfig.h Wed Sep 9 10:55:54 1998 +++ ./acconfig.h Tue Oct 20 21:07:38 1998 @@ -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 @@ -73,6 +78,9 @@ #undef GLIB_MICRO_VERSION #undef GLIB_INTERFACE_AGE #undef GLIB_BINARY_AGE + +#undef WIN32 +#undef NATIVE_WIN32 /* #undef PACKAGE */ /* #undef VERSION */ diff -x CVS -ru3 -N /home/src/gnomecvs/glib/configure.in ./configure.in --- /home/src/gnomecvs/glib/configure.in Sun Oct 18 09:13:49 1998 +++ ./configure.in Wed Oct 21 00:24:23 1998 @@ -217,10 +217,16 @@ 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 -x CVS -ru3 -N /home/src/gnomecvs/glib/gerror.c ./gerror.c --- /home/src/gnomecvs/glib/gerror.c Wed Sep 9 10:55:55 1998 +++ ./gerror.c Mon Oct 12 20:27:06 1998 @@ -20,13 +20,19 @@ #include #include #include +#include "glib.h" +#ifdef HAVE_SYS_TIME_H #include +#endif +#ifdef HAVE_SYS_TIMES_H #include +#endif #include #include +#ifdef HAVE_UNISTD_H #include -#include "glib.h" +#endif #ifdef HAVE_SYS_SELECT_H #include @@ -36,6 +42,9 @@ #include /* for bzero on BSD systems */ #endif +#ifdef _MSC_VER +#include /* For _getpid() */ +#endif #ifndef NO_FD_SET # define SELECT_MASK fd_set @@ -115,6 +124,7 @@ 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 @@ while (glib_on_error_halt) ; glib_on_error_halt = TRUE; +#else + abort (); +#endif } static gboolean stack_trace_done = FALSE; @@ -155,6 +168,7 @@ static void stack_trace (char **args) { +#ifndef NATIVE_WIN32 pid_t pid; int in_fd[2]; int out_fd[2]; @@ -249,4 +263,7 @@ close (out_fd[0]); close (out_fd[1]); _exit (0); +#else + abort (); +#endif } diff -x CVS -ru3 -N /home/src/gnomecvs/glib/glib.def ./glib.def --- /home/src/gnomecvs/glib/glib.def Thu Jan 1 02:00:00 1970 +++ ./glib.def Wed Oct 21 00:47:18 1998 @@ -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_closedir + 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_ftruncate + 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_opendir + 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_readdir + 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_rewinddir + 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 diff -x CVS -ru3 -N /home/src/gnomecvs/glib/glib.h ./glib.h --- /home/src/gnomecvs/glib/glib.h Thu Oct 8 10:54:11 1998 +++ ./glib.h Tue Oct 20 23:01:10 1998 @@ -34,6 +34,52 @@ #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 @@ -552,12 +598,21 @@ /* 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; +#ifdef NATIVE_WIN32 +#ifdef COMPILING_GLIB +#define GUTILS_C_VAR __declspec(dllexport) +#else +#define GUTILS_C_VAR __declspec(dllimport) +#endif +#else +#define GUTILS_C_VAR extern +#endif +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. */ @@ -586,7 +641,7 @@ typedef struct _GTree GTree; typedef struct _GTuples GTuples; typedef union _GTokenValue GTokenValue; - +typedef struct _GIOChannel GIOChannel; typedef enum { @@ -1124,7 +1179,7 @@ /* 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, @@ -1314,6 +1369,7 @@ void g_strreverse (gchar *string); gpointer g_memdup (gconstpointer mem, guint byte_size); +gchar * g_strescape (gchar *string); /* calculate a string size, guarranteed to fit format + args. */ @@ -1345,10 +1401,15 @@ 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 @@ -1430,7 +1491,6 @@ } #endif /* G_CAN_INLINE */ - /* String Chunks */ GStringChunk* g_string_chunk_new (gint size); @@ -1922,11 +1982,115 @@ 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 +{ + int 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 + +#ifdef NATIVE_WIN32 + +#define MAXPATHLEN 1024 + +#if defined (_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 + * every now and then...). + * + * You still need to include the appropriate headers to get the + * prototypes, or . */ -extern const guint glib_major_version; -extern const guint glib_minor_version; -extern const guint glib_micro_version; +#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 + +/* MSC doesn't have ftrunctate, we emulate it */ +#define ftruncate(fd, size) g_ftruncate (fd, size) +extern int g_ftruncate (int f, unsigned int size); + +/* MSC needs our own opendir/readdir/closedir emulation routines */ + +#define NAME_MAX 255 + +typedef struct { + char *dir_name; + void *lpFindFileData; + guint hFindFile; + gboolean just_opened; +} DIR; + +struct dirent { + char d_name[NAME_MAX+1]; +}; + +#define opendir g_opendir +#define readdir g_readdir +#define rewinddir g_rewinddir +#define closedir g_closedir + +DIR *opendir (const char *dirname); +struct dirent *readdir (DIR *dir); +void rewinddir (DIR *dir); +int 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 -x CVS -ru3 -N /home/src/gnomecvs/glib/glibconfig.h.in ./glibconfig.h.in --- /home/src/gnomecvs/glib/glibconfig.h.in Wed Sep 9 10:55:56 1998 +++ ./glibconfig.h.in Wed Oct 21 00:30:59 1998 @@ -21,9 +21,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 @@ -67,6 +72,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 @@ -93,3 +101,9 @@ /* Define if you have the header file. */ #undef HAVE_VALUES_H + +/* Define if this is Win32, possibly using the GNU-Win32 emulation layer. */ +#undef WIN32 + +/* Define if this is Win32 without GNU-Win32. */ +#undef NATIVE_WIN32 1 diff -x CVS -ru3 -N /home/src/gnomecvs/glib/glibconfig.h.win32 ./glibconfig.h.win32 --- /home/src/gnomecvs/glib/glibconfig.h.win32 Thu Jan 1 02:00:00 1970 +++ ./glibconfig.h.win32 Tue Oct 20 22:42:38 1998 @@ -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 header file. */ +#ifdef _MSC_VER +#define HAVE_FLOAT_H 1 +#else +/* #undef HAVE_FLOAT_H */ +#endif + +/* Define if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_VALUES_H */ + +/* Define if this is Win32, possibly using the GNU-Win32 emulation layer. */ +#define WIN32 1 + +/* Define if this is Win32 without GNU-Win32. */ +#define NATIVE_WIN32 1 diff -x CVS -ru3 -N /home/src/gnomecvs/glib/gmem.c ./gmem.c --- /home/src/gnomecvs/glib/gmem.c Tue Oct 6 21:31:24 1998 +++ ./gmem.c Tue Oct 20 22:46:14 1998 @@ -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 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 @@ # 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 } @@ -201,7 +202,7 @@ return NULL; -#if defined (ENABLE_MEM_PROFILE) || defined (ENABLE_MEM_CHECK) +#if defined(ENABLE_MEM_PROFILE) || defined (ENABLE_MEM_CHECK) size += SIZEOF_LONG; #endif /* ENABLE_MEM_PROFILE || ENABLE_MEM_CHECK */ @@ -234,10 +235,10 @@ # 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 @@ #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 @@ #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 -x CVS -ru3 -N /home/src/gnomecvs/glib/gmessages.c ./gmessages.c --- /home/src/gnomecvs/glib/gmessages.c Wed Sep 9 10:55:56 1998 +++ ./gmessages.c Tue Oct 20 22:47:00 1998 @@ -20,8 +20,24 @@ #include #include #include -#include #include "glib.h" +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef NATIVE_WIN32 + +/* Just use stdio. If we're out of memroy, we're hosed anyway. */ +#undef write + +static int +write (FILE *fd, const char *buf, int len) +{ + fwrite (buf, len, 1, fd); + return len; +} + +#endif /* --- structures --- */ @@ -334,7 +350,11 @@ const gchar *message, gpointer unused_data) { +#ifdef NATIVE_WIN32 + FILE *fd; +#else gint fd; +#endif gboolean in_recursion; gboolean is_fatal; @@ -345,7 +365,13 @@ 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 -x CVS -ru3 -N /home/src/gnomecvs/glib/gmodule/gmodule-dl.c ./gmodule/gmodule-dl.c --- /home/src/gnomecvs/glib/gmodule/gmodule-dl.c Wed Sep 9 10:55:58 1998 +++ ./gmodule/gmodule-dl.c Tue Oct 20 22:48:30 1998 @@ -115,3 +115,13 @@ return p; } + +static gchar * +_g_module_build_path (const gchar *directory, + const gchar *module_name) +{ + if (directory != NULL && directory[0] != '\0') + return g_strdup_printf ("%s/%s.so", directory, module_name); + else + return g_strdup_printf ("%s.so", module_name); +} diff -x CVS -ru3 -N /home/src/gnomecvs/glib/gmodule/gmodule-dld.c ./gmodule/gmodule-dld.c --- /home/src/gnomecvs/glib/gmodule/gmodule-dld.c Wed Sep 9 10:55:58 1998 +++ ./gmodule/gmodule-dld.c Tue Oct 20 22:48:36 1998 @@ -112,3 +112,13 @@ return p; } + +static gchar * +_g_module_build_path (const gchar *directory, + const gchar *module_name) +{ + if (directory != NULL && directory[0] != '\0') + return g_strdup_printf ("%s/%s.sl", directory, module_name); + else + return g_strdup_printf ("%s.sl", module_name); +} diff -x CVS -ru3 -N /home/src/gnomecvs/glib/gmodule/gmodule-win32.c ./gmodule/gmodule-win32.c --- /home/src/gnomecvs/glib/gmodule/gmodule-win32.c Thu Jan 1 02:00:00 1970 +++ ./gmodule/gmodule-win32.c Tue Oct 20 22:48:40 1998 @@ -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 +#include + +/* --- 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 != NULL && directory[0] != '\0') + return g_strdup_printf ("%s\\%s.dll", directory, module_name); + else + return g_strdup_printf ("%s.dll", module_name); +} diff -x CVS -ru3 -N /home/src/gnomecvs/glib/gmodule/gmodule.c ./gmodule/gmodule.c --- /home/src/gnomecvs/glib/gmodule/gmodule.c Mon Sep 21 10:25:39 1998 +++ ./gmodule/gmodule.c Tue Oct 20 21:24:54 1998 @@ -51,6 +51,8 @@ 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 @@ #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,18 @@ } #endif /* no implementation */ +#ifdef __LCC__ + +int __stdcall +LibMain(void *hinstDll, + unsigned long dwReason, + void *reserved) +{ + return(1); +} + +#endif + /* --- functions --- */ gboolean @@ -350,3 +366,13 @@ 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 -x CVS -ru3 -N /home/src/gnomecvs/glib/gmodule/gmodule.h ./gmodule/gmodule.h --- /home/src/gnomecvs/glib/gmodule/gmodule.h Mon Sep 21 10:25:39 1998 +++ ./gmodule/gmodule.h Tue Oct 20 21:25:40 1998 @@ -33,8 +33,11 @@ * we need autoconf support here to feature Windows dll stubs. */ #define G_MODULE_IMPORT extern +#ifdef NATIVE_WIN32 +#define G_MODULE_EXPORT __declspec(dllexport) +#else #define G_MODULE_EXPORT - +#endif typedef enum { @@ -70,6 +73,20 @@ /* retrive the file name from an existing 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 } diff -x CVS -ru3 -N /home/src/gnomecvs/glib/gmodule/gmoduleconf.h.in ./gmodule/gmoduleconf.h.in --- /home/src/gnomecvs/glib/gmodule/gmoduleconf.h.in Wed Sep 9 10:55:58 1998 +++ ./gmodule/gmoduleconf.h.in Wed Oct 21 00:30:14 1998 @@ -29,6 +29,7 @@ #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 -x CVS -ru3 -N /home/src/gnomecvs/glib/gmodule/gmoduleconf.h.win32 ./gmodule/gmoduleconf.h.win32 --- /home/src/gnomecvs/glib/gmodule/gmoduleconf.h.win32 Thu Jan 1 02:00:00 1970 +++ ./gmodule/gmoduleconf.h.win32 Fri Aug 21 23:27:36 1998 @@ -0,0 +1,46 @@ +/* GMODULE - GLIB wrapper code for dynamic module loading + * Copyright (C) 1998 Tim Janik + * + * 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. + */ +#ifndef __G_MODULE_CONF_H__ +#define __G_MODULE_CONF_H__ + + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + + +#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_WIN32 +#undef G_MODULE_HAVE_DLERROR + +#ifdef __LCC__ +#define G_MODULE_NEED_USCORE +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __G_MODULE_CONF_H__ */ diff -x CVS -ru3 -N /home/src/gnomecvs/glib/gmodule/libgplugin_a.c ./gmodule/libgplugin_a.c --- /home/src/gnomecvs/glib/gmodule/libgplugin_a.c Wed Sep 9 10:55:58 1998 +++ ./gmodule/libgplugin_a.c Sun Oct 4 00:24:46 1998 @@ -17,6 +17,18 @@ * Boston, MA 02111-1307, USA. */ #include +#include + +#ifdef __LCC__ + +int __stdcall +LibMain(void *hinstDll, + unsigned long dwReason, + void *reserved) +{ + return(1); +} +#endif G_MODULE_EXPORT void gplugin_a_func (void) diff -x CVS -ru3 -N /home/src/gnomecvs/glib/gmodule/libgplugin_b.c ./gmodule/libgplugin_b.c --- /home/src/gnomecvs/glib/gmodule/libgplugin_b.c Mon Sep 21 10:25:39 1998 +++ ./gmodule/libgplugin_b.c Thu Oct 15 13:29:20 1998 @@ -18,6 +18,18 @@ */ #include +#ifdef __LCC__ + +int __stdcall +LibMain(void *hinstDll, + unsigned long dwReason, + void *reserved) +{ + return(1); +} + +#endif + G_MODULE_EXPORT const gchar* g_module_check_init (GModule *module) { diff -x CVS -ru3 -N /home/src/gnomecvs/glib/gmodule/testgmodule.c ./gmodule/testgmodule.c --- /home/src/gnomecvs/glib/gmodule/testgmodule.c Wed Sep 9 10:55:58 1998 +++ ./gmodule/testgmodule.c Fri Aug 28 09:15:08 1998 @@ -20,7 +20,7 @@ #include -void +G_MODULE_EXPORT void g_clash_func (void) { g_print ("GModule: Hello global clash\n"); @@ -44,8 +44,13 @@ string = g_get_current_dir (); g_print ("testgmodule (%s):\n", string); +#ifdef WIN32 + plugin_a = g_strconcat (string, "\\libgplugin_a.dll", NULL); + plugin_b = g_strconcat (string, "\\libgplugin_b.dll", NULL); +#else plugin_a = g_strconcat (string, "/.libs/", "libgplugin_a.so", NULL); plugin_b = g_strconcat (string, "/.libs/", "libgplugin_b.so", NULL); +#endif g_free (string); /* module handles diff -x CVS -ru3 -N /home/src/gnomecvs/glib/gmodule.def ./gmodule.def --- /home/src/gnomecvs/glib/gmodule.def Thu Jan 1 02:00:00 1970 +++ ./gmodule.def Wed Oct 21 00:47:36 1998 @@ -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 -x CVS -ru3 -N /home/src/gnomecvs/glib/gscanner.c ./gscanner.c --- /home/src/gnomecvs/glib/gscanner.c Fri Sep 25 12:46:44 1998 +++ ./gscanner.c Tue Oct 20 22:52:16 1998 @@ -25,13 +25,16 @@ #include #include #include +#include "glib.h" +#ifdef HAVE_UNISTD_H #include +#endif #include #include /* needed for sys/stat.h */ #include -#include "glib.h" - - +#ifdef _MSC_VER +#include /* For _read() */ +#endif /* --- defines --- */ #define to_lower(c) ( \ @@ -61,7 +64,7 @@ static GScannerConfig g_scanner_config_template = { ( - " \t\n" + " \t\r\n" ) /* cset_skip_characters */, ( G_CSET_a_2_z @@ -616,7 +619,8 @@ v.v_int = 0; g_return_val_if_fail (scanner != NULL, v); - return scanner->value; + v = scanner->value; + return v; } guint @@ -1064,9 +1068,11 @@ 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 -x CVS -ru3 -N /home/src/gnomecvs/glib/gstrfuncs.c ./gstrfuncs.c --- /home/src/gnomecvs/glib/gstrfuncs.c Mon Sep 21 10:25:39 1998 +++ ./gstrfuncs.c Tue Oct 20 21:13:34 1998 @@ -985,3 +985,32 @@ *c = new_delim; } } + +gchar * +g_strescape (gchar *string) +{ + gint backslashes = 0; + gchar *p = string; + gchar *q; + gchar *escaped; + + while (*p != '\000') + backslashes += (*p++ == '\\'); + + if (backslashes == 0) + return g_strdup (string); + + escaped = g_malloc (strlen (string) + backslashes + 1); + + p = string; + q = escaped; + + while (*p != '\000') + { + if (*p == '\\') + *q++ = '\\'; + *q++ = *p++; + } + *q = '\000'; + return escaped; +} diff -x CVS -ru3 -N /home/src/gnomecvs/glib/gtimer.c ./gtimer.c --- /home/src/gnomecvs/glib/gtimer.c Wed Sep 9 10:55:57 1998 +++ ./gtimer.c Thu Oct 15 13:52:24 1998 @@ -16,21 +16,32 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#include -#include #include "glib.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#ifndef NATIVE_WIN32 +#include +#endif +#ifdef NATIVE_WIN32 +#include +#endif typedef struct _GRealTimer GRealTimer; struct _GRealTimer { +#ifdef NATIVE_WIN32 + DWORD start; + DWORD end; +#else struct timeval start; struct timeval end; +#endif gint active; }; - GTimer* g_timer_new (void) { @@ -39,8 +50,11 @@ timer = g_new (GRealTimer, 1); timer->active = TRUE; +#ifdef NATIVE_WIN32 + timer->start = GetTickCount (); +#else gettimeofday (&timer->start, NULL); - +#endif return ((GTimer*) timer); } @@ -60,7 +74,11 @@ g_assert (timer != NULL); rtimer = (GRealTimer*) timer; +#ifdef NATIVE_WIN32 + rtimer->start = GetTickCount (); +#else gettimeofday (&rtimer->start, NULL); +#endif rtimer->active = 1; } @@ -72,7 +90,11 @@ g_assert (timer != NULL); rtimer = (GRealTimer*) timer; +#ifdef NATIVE_WIN32 + rtimer->end = GetTickCount (); +#else gettimeofday (&rtimer->end, NULL); +#endif rtimer->active = 0; } @@ -84,7 +106,11 @@ g_assert (timer != NULL); rtimer = (GRealTimer*) timer; +#ifdef NATIVE_WIN32 + rtimer->start = GetTickCount (); +#else gettimeofday (&rtimer->start, NULL); +#endif } gdouble @@ -92,13 +118,36 @@ gulong *microseconds) { GRealTimer *rtimer; +#ifndef NATIVE_WIN32 struct timeval elapsed; +#endif gdouble total; g_assert (timer != NULL); 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 if (rtimer->active) gettimeofday (&rtimer->end, NULL); @@ -115,6 +164,6 @@ if (microseconds) *microseconds = elapsed.tv_usec; - +#endif return total; } diff -x CVS -ru3 -N /home/src/gnomecvs/glib/gutils.c ./gutils.c --- /home/src/gnomecvs/glib/gutils.c Wed Sep 9 10:55:57 1998 +++ ./gutils.c Tue Oct 20 23:22:58 1998 @@ -16,15 +16,23 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ +#include "glibconfig.h" + +#ifdef HAVE_UNISTD_H #include +#endif #include #include #include #include #include +#ifdef HAVE_PWD_H #include +#endif #include +#ifdef HAVE_SYS_PARAM_H #include +#endif /* implement Glib's inline functions */ @@ -32,12 +40,43 @@ #define G_CAN_INLINE 1 #include "glib.h" +#ifdef NATIVE_WIN32 +#define STRICT /* Strict typing, please */ +#include +#include +#include +#include + +#ifdef _MSC_VER +#include +#endif +#endif + +#ifndef MAXPATHLEN +#ifdef PATH_MAX +#define MAXPATHLEN PATH_MAX +#else +#define MAXPATHLEN 1024 +#endif +#endif + 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; +#ifdef __LCC__ + +int __stdcall +LibMain(void *hinstDll, + unsigned long dwReason, + void *reserved) +{ + return(1); +} + +#endif void g_atexit (GVoidFunc func) @@ -184,13 +223,41 @@ 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 return (gchar*) file_name; } +gboolean +g_path_is_absolute (const gchar *file_name) +{ + 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) +{ + 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 +266,10 @@ 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; @@ -244,7 +311,7 @@ /* 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 +321,42 @@ return dir; } +gchar * +g_getenv (const gchar *variable) +{ +#ifndef NATIVE_WIN32 + return getenv (variable); +#else + char *v; + int l = 100, k; + char *p; + + if ((v = getenv (variable)) == NULL) + 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_malloc (l); + + if ((k = ExpandEnvironmentStrings (v, p, l)) > 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,22 +367,29 @@ { 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 + g_tmp_dir = g_strdup ("."); +#endif - g_home_dir = g_strdup (getenv ("HOME")); + g_home_dir = g_strdup (g_getenv ("HOME")); +#ifdef HAVE_PWD_H setpwent (); pw = getpwuid (getuid ()); endpwent (); - + if (pw) { g_user_name = g_strdup (pw->pw_name); @@ -287,6 +397,25 @@ if (!g_home_dir) g_home_dir = g_strdup (pw->pw_dir); } +#else +#ifdef NATIVE_WIN32 + { + DWORD nSize = 17; + g_user_name = g_malloc (nSize); + + if (!GetUserName (g_user_name, &nSize)) + { + g_free (g_user_name); + g_user_name = g_strdup ("somebody"); + } + g_real_name = g_strdup ("Unknown"); + } +#else + g_user_name = g_strdup ("somebody"); + g_real_name = g_strdup ("Unknown"); + g_home_dir = NULL; +#endif +#endif } } @@ -366,3 +495,203 @@ { return *(const gint*) v; } + +GIOChannel * +g_iochannel_new (gint fd) +{ + GIOChannel *channel = g_new (GIOChannel, 1); + + channel->fd = fd; + +#ifdef NATIVE_WIN32 + channel->peer = 0; + channel->peer_fd = 0; + channel->offset = 0; + channel->peer_offset = 0; +#endif + + return channel; +} + +void +g_iochannel_free (GIOChannel *channel) +{ + g_free (channel); +} + +void +g_iochannel_close_and_free (GIOChannel *channel) +{ + close (channel->fd); + + g_iochannel_free (channel); +} + +#undef g_iochannel_wakeup_peer + +void +g_iochannel_wakeup_peer (GIOChannel *channel) +{ +#ifdef NATIVE_WIN32 + static guint message = 0; + + 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 +} + +#ifdef NATIVE_WIN32 + +#ifdef _MSC_VER + +int +g_ftruncate (int fd, + unsigned int size) +{ + HANDLE hfile; + DWORD curpos; + + hfile = (HANDLE)_get_osfhandle (fd); + if ((curpos = SetFilePointer (hfile, 0, NULL, FILE_CURRENT)) == 0xFFFFFFFF + || SetFilePointer (hfile, size, NULL, FILE_BEGIN) == 0xFFFFFFFF + || !SetEndOfFile (hfile)) + { + int error = GetLastError (); + switch (error) + { + case ERROR_INVALID_HANDLE: + errno = EBADF; break; + default: + errno = EIO; break; + } + return -1; + } + + return 0; +} + +DIR * +g_opendir (const char *dirname) +{ + DIR *result; + char *mask; + int k; + + result = g_new (DIR, 1); + result->lpFindFileData = g_new (WIN32_FIND_DATA, 1); + result->dir_name = g_strdup (dirname); + + k = strlen (result->dir_name); + if (result->dir_name[k-1] == '\\') + { + result->dir_name[k-1] = '\0'; + k--; + } + mask = g_strdup_printf ("%s\\*", result->dir_name); + + result->hFindFile = + (guint) FindFirstFile (mask, + (LPWIN32_FIND_DATA) result->lpFindFileData); + g_free (mask); + if (result->hFindFile == (guint) INVALID_HANDLE_VALUE) + { + int error = GetLastError (); + + g_free (result->dir_name); + g_free (result->lpFindFileData); + g_free (result); + switch (error) + { + default: errno = EIO; return NULL; + } + } + result->just_opened = TRUE; + + return result; +} + +struct dirent * +g_readdir (DIR *dir) +{ + static struct dirent result; + + if (dir->just_opened) + { + dir->just_opened = FALSE; + } + else + { + if (!FindNextFile ((HANDLE) dir->hFindFile, + (LPWIN32_FIND_DATA) dir->lpFindFileData)) + { + 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->lpFindFileData)->cFileName)); + + return &result; +} + +void +g_rewinddir (DIR *dir) +{ + char *mask; + + if (!FindClose ((HANDLE) dir->hFindFile)) + g_warning ("FindClose failed\n"); + mask = g_strdup_printf ("%s\\*", dir->dir_name); + dir->hFindFile = + (guint) FindFirstFile (mask, + (LPWIN32_FIND_DATA) dir->lpFindFileData); + g_free (mask); + + if (dir->hFindFile == (guint) INVALID_HANDLE_VALUE) + { + int error = GetLastError (); + switch (error) + { + default: errno = EIO; return; + } + } + dir->just_opened = TRUE; +} + +int +g_closedir (DIR *dir) +{ + if (!FindClose ((HANDLE) dir->hFindFile)) + { + int error = GetLastError (); + + switch (error) + { + default: + errno = EIO; return -1; + } + } + + g_free (dir->dir_name); + g_free (dir->lpFindFileData); + g_free (dir); + + return 0; +} + +#endif /* _MSC_VER */ + +#endif /* NATIVE_WIN32 */ diff -x CVS -ru3 -N /home/src/gnomecvs/glib/makefile.lcc ./makefile.lcc --- /home/src/gnomecvs/glib/makefile.lcc Thu Jan 1 02:00:00 1970 +++ ./makefile.lcc Sun Aug 30 11:54:46 1998 @@ -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) -DCOMPILING_GLIB -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 -x CVS -ru3 -N /home/src/gnomecvs/glib/makefile.msc ./makefile.msc --- /home/src/gnomecvs/glib/makefile.msc Thu Jan 1 02:00:00 1970 +++ ./makefile.msc Tue Oct 20 21:18:30 1998 @@ -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 -DCOMPILING_GLIB -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 -x CVS -ru3 -N /home/src/gnomecvs/glib/testglib.c ./testglib.c --- /home/src/gnomecvs/glib/testglib.c Mon Sep 21 10:25:39 1998 +++ ./testglib.c Thu Oct 15 13:27:38 1998 @@ -295,6 +295,7 @@ gchar *filename; gchar *dirname; } dirname_checks[] = { +#ifndef NATIVE_WIN32 { "/", "/" }, { "////", "/" }, { ".////", "." }, @@ -306,6 +307,18 @@ { "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 @@ 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 @@ 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 @@ 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);