* Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald
*
* This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser 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.
+ * Lesser General Public License for more details.
*
- * You should have received a copy of the GNU Library General Public
+ * You should have received a copy of the GNU Lesser 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.
*/
+/*
+ * Modified by the GLib Team and others 1997-2000. See the AUTHORS
+ * file for a list of people on the GLib Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
/*
* MT safe for the unix part, FIXME: make the win32 part MT safe as well.
*/
#include <config.h>
#endif
-#include "glibconfig.h"
-
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#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
*/
-#define G_INLINE_FUNC extern
-#define G_CAN_INLINE 1
+#define G_IMPLEMENT_INLINES 1
+#define __G_UTILS_C__
#include "glib.h"
#ifdef MAXPATHLEN
-#define G_PATH_LENGTH (MAXPATHLEN + 1)
+#define G_PATH_LENGTH MAXPATHLEN
#elif defined (PATH_MAX)
-#define G_PATH_LENGTH (PATH_MAX + 1)
-#else /* !MAXPATHLEN */
-#define G_PATH_LENGTH (2048 + 1)
-#endif /* !MAXPATHLEN && !PATH_MAX */
+#define G_PATH_LENGTH PATH_MAX
+#elif defined (_PC_PATH_MAX)
+#define G_PATH_LENGTH sysconf(_PC_PATH_MAX)
+#else
+#define G_PATH_LENGTH 2048
+#endif
+
+#ifdef G_OS_WIN32
+# define STRICT /* Strict typing, please */
+# include <windows.h>
+# include <ctype.h>
+# include <direct.h>
+# include <io.h>
+#endif /* G_OS_WIN32 */
+
+#ifdef HAVE_CODESET
+#include <langinfo.h>
+#endif
const guint glib_major_version = GLIB_MAJOR_VERSION;
const guint glib_minor_version = GLIB_MINOR_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)
+#if !defined (HAVE_MEMMOVE) && !defined (HAVE_WORKING_BCOPY)
+void
+g_memmove (gpointer dest, gconstpointer src, gulong len)
{
- return 1;
+ gchar* destptr = dest;
+ const gchar* srcptr = src;
+ if (src + len < dest || dest + len < src)
+ {
+ bcopy (src, dest, len);
+ return;
+ }
+ else if (dest <= src)
+ {
+ while (len--)
+ *(destptr++) = *(srcptr++);
+ }
+ else
+ {
+ destptr += len;
+ srcptr += len;
+ while (len--)
+ *(--destptr) = *(--srcptr);
+ }
}
-#endif /* NATIVE_WIN32 && __LCC__ */
+#endif /* !HAVE_MEMMOVE && !HAVE_WORKING_BCOPY */
void
g_atexit (GVoidFunc func)
g_error ("Could not register atexit() function: %s", error);
}
+/* Based on execvp() from GNU Libc.
+ * Some of this code is cut-and-pasted into gspawn.c
+ */
+
+static gchar*
+my_strchrnul (const gchar *str, gchar c)
+{
+ gchar *p = (gchar*)str;
+ while (*p && (*p != c))
+ ++p;
+
+ return p;
+}
+
+/**
+ * g_find_program_in_path:
+ * @program: a program name
+ *
+ * Locates the first executable named @program in the user's path, in the
+ * same way that execvp() would locate it. Returns an allocated string
+ * with the absolute path name, or NULL if the program is not found in
+ * the path. If @program is already an absolute path, returns a copy of
+ * @program if @program exists and is executable, and NULL otherwise.
+ *
+ * Return value: absolute path, or NULL
+ **/
+gchar*
+g_find_program_in_path (const gchar *program)
+{
+ gchar *path, *p, *name, *freeme;
+ size_t len;
+ size_t pathlen;
+
+ g_return_val_if_fail (program != NULL, NULL);
+
+ if (*program == '/')
+ {
+ if (g_file_test (program, G_FILE_TEST_IS_EXECUTABLE))
+ return g_strdup (program);
+ else
+ return NULL;
+ }
+
+ path = g_getenv ("PATH");
+ if (path == NULL)
+ {
+ /* There is no `PATH' in the environment. The default
+ * search path in GNU libc is the current directory followed by
+ * the path `confstr' returns for `_CS_PATH'.
+ */
+
+ /* In GLib we put . last, for security, and don't use the
+ * unportable confstr(); UNIX98 does not actually specify
+ * what to search if PATH is unset. POSIX may, dunno.
+ */
+
+ path = "/bin:/usr/bin:.";
+ }
+
+ len = strlen (program) + 1;
+ pathlen = strlen (path);
+ freeme = name = g_malloc (pathlen + len + 1);
+
+ /* Copy the file name at the top, including '\0' */
+ memcpy (name + pathlen + 1, program, len);
+ name = name + pathlen;
+ /* And add the slash before the filename */
+ *name = '/';
+
+ p = path;
+ do
+ {
+ char *startp;
+
+ path = p;
+ p = my_strchrnul (path, ':');
+
+ if (p == path)
+ /* Two adjacent colons, or a colon at the beginning or the end
+ * of `PATH' means to search the current directory.
+ */
+ startp = name + 1;
+ else
+ startp = memcpy (name - (p - path), path, p - path);
+
+ if (g_file_test (startp, G_FILE_TEST_IS_EXECUTABLE))
+ {
+ gchar *ret;
+ ret = g_strdup (startp);
+ g_free (freeme);
+ return ret;
+ }
+ }
+ while (*p++ != '\0');
+
+ g_free (freeme);
+
+ return NULL;
+}
+
gint
g_snprintf (gchar *str,
gulong n,
va_list args;
gint retval;
+ g_return_val_if_fail (str != NULL, 0);
+ g_return_val_if_fail (n > 0, 0);
+ g_return_val_if_fail (fmt != NULL, 0);
+
va_start (args, fmt);
retval = vsnprintf (str, n, fmt, args);
va_end (args);
-
+
+ if (retval < 0)
+ {
+ str[n-1] = '\0';
+ retval = strlen (str);
+ }
+
return retval;
#else /* !HAVE_VSNPRINTF */
gchar *printed;
va_list args;
+ g_return_val_if_fail (str != NULL, 0);
+ g_return_val_if_fail (n > 0, 0);
+ g_return_val_if_fail (fmt != NULL, 0);
+
va_start (args, fmt);
printed = g_strdup_vprintf (fmt, args);
va_end (args);
#ifdef HAVE_VSNPRINTF
gint retval;
+ g_return_val_if_fail (str != NULL, 0);
+ g_return_val_if_fail (n > 0, 0);
+ g_return_val_if_fail (fmt != NULL, 0);
+
retval = vsnprintf (str, n, fmt, args);
+ if (retval < 0)
+ {
+ str[n-1] = '\0';
+ retval = strlen (str);
+ }
+
return retval;
#else /* !HAVE_VSNPRINTF */
gchar *printed;
+ g_return_val_if_fail (str != NULL, 0);
+ g_return_val_if_fail (n > 0, 0);
+ g_return_val_if_fail (fmt != NULL, 0);
+
printed = g_strdup_vprintf (fmt, args);
strncpy (str, printed, n);
str[n-1] = '\0';
g_basename (const gchar *file_name)
{
register gchar *base;
+#ifdef G_ENABLE_DEBUG
+ static gboolean first_call = TRUE;
+
+ if (first_call)
+ {
+ g_warning("g_basename is deprecated. Use g_path_get_basename instead.");
+ g_warning("Watch out! You have to g_free the string returned by "
+ "g_path_get_basename.");
+ first_call = FALSE;
+ }
+#endif /* G_ENABLE_DEBUG */
g_return_val_if_fail (file_name != NULL, NULL);
if (base)
return base + 1;
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
if (isalpha (file_name[0]) && file_name[1] == ':')
return (gchar*) file_name + 2;
-#endif /* NATIVE_WIN32 */
+#endif /* G_OS_WIN32 */
return (gchar*) file_name;
}
+gchar*
+g_path_get_basename (const gchar *file_name)
+{
+ register gint base;
+ register gint last_nonslash;
+ guint len;
+ gchar *retval;
+
+ g_return_val_if_fail (file_name != NULL, NULL);
+
+ if (file_name[0] == '\0')
+ /* empty string */
+ return g_strdup (".");
+
+ last_nonslash = strlen (file_name) - 1;
+
+ while (last_nonslash >= 0 && file_name [last_nonslash] == G_DIR_SEPARATOR)
+ last_nonslash--;
+
+ if (last_nonslash == -1)
+ /* string only containing slashes */
+ return g_strdup (G_DIR_SEPARATOR_S);
+
+#ifdef G_OS_WIN32
+ if (last_nonslash == 1 && isalpha (file_name[0]) && file_name[1] == ':')
+ /* string only containing slashes and a drive */
+ return g_strdup (G_DIR_SEPARATOR_S);
+#endif /* G_OS_WIN32 */
+
+ base = last_nonslash;
+
+ while (base >=0 && file_name [base] != G_DIR_SEPARATOR)
+ base--;
+
+#ifdef G_OS_WIN32
+ if (base == -1 && isalpha (file_name[0]) && file_name[1] == ':')
+ base = 1;
+#endif /* G_OS_WIN32 */
+
+ len = last_nonslash - base;
+ retval = g_malloc (len + 1);
+ memcpy (retval, file_name + base + 1, len);
+ retval [len] = '\0';
+ return retval;
+}
+
gboolean
g_path_is_absolute (const gchar *file_name)
{
if (file_name[0] == G_DIR_SEPARATOR)
return TRUE;
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
if (isalpha (file_name[0]) && file_name[1] == ':' && file_name[2] == G_DIR_SEPARATOR)
return TRUE;
#endif
if (file_name[0] == G_DIR_SEPARATOR)
return file_name + 1;
-#ifdef NATIVE_WIN32
+#ifdef G_OS_WIN32
if (isalpha (file_name[0]) && file_name[1] == ':' && file_name[2] == G_DIR_SEPARATOR)
return file_name + 3;
#endif
}
gchar*
-g_dirname (const gchar *file_name)
+g_path_get_dirname (const gchar *file_name)
{
register gchar *base;
register guint len;
}
gchar*
+g_dirname (const gchar *file_name)
+{
+#ifdef G_ENABLE_DEBUG
+ static gboolean first_call = TRUE;
+
+ if (first_call)
+ {
+ g_warning("g_dirname is deprecated. Use g_path_get_dirname instead.");
+ first_call = FALSE;
+ }
+#endif /* G_ENABLE_DEBUG */
+
+ return g_path_get_dirname (file_name);
+}
+
+gchar*
g_get_current_dir (void)
{
- gchar *buffer;
- gchar *dir;
+ gchar *buffer = NULL;
+ gchar *dir = NULL;
+ static gulong max_len = 0;
- buffer = g_new (gchar, G_PATH_LENGTH);
- *buffer = 0;
+ if (max_len == 0)
+ max_len = (G_PATH_LENGTH == -1) ? 2048 : G_PATH_LENGTH;
/* We don't use getcwd(3) on SUNOS, because, it does a popen("pwd")
* and, if that wasn't bad enough, hangs in doing so.
*/
-#if defined (sun) && !defined (__SVR4)
+#if (defined (sun) && !defined (__SVR4)) || !defined(HAVE_GETCWD)
+ buffer = g_new (gchar, max_len + 1);
+ *buffer = 0;
dir = getwd (buffer);
-#else /* !sun */
- dir = getcwd (buffer, G_PATH_LENGTH - 1);
-#endif /* !sun */
+#else /* !sun || !HAVE_GETCWD */
+ while (max_len < G_MAXULONG / 2)
+ {
+ buffer = g_new (gchar, max_len + 1);
+ *buffer = 0;
+ dir = getcwd (buffer, max_len);
+
+ if (dir || errno != ERANGE)
+ break;
+
+ g_free (buffer);
+ max_len *= 2;
+ }
+#endif /* !sun || !HAVE_GETCWD */
if (!dir || !*buffer)
{
gchar*
g_getenv (const gchar *variable)
{
-#ifndef NATIVE_WIN32
+#ifndef G_OS_WIN32
g_return_val_if_fail (variable != NULL, NULL);
return getenv (variable);
#else
- gchar *v;
- guint k;
- static gchar *p = NULL;
- static gint l;
+ G_LOCK_DEFINE_STATIC (getenv);
+ struct env_struct
+ {
+ gchar *key;
+ gchar *value;
+ } *env;
+ static GArray *environs = NULL;
+ gchar *system_env;
+ guint length, i;
gchar dummy[2];
g_return_val_if_fail (variable != NULL, NULL);
- 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.
+ G_LOCK (getenv);
+
+ if (!environs)
+ environs = g_array_new (FALSE, FALSE, sizeof (struct env_struct));
+
+ /* First we try to find the envinronment variable inside the already
+ * found ones.
*/
- /* First check how much space we need */
- k = ExpandEnvironmentStrings (v, dummy, 2);
- /* Then allocate that much, and actualy do the expansion */
- if (p == NULL)
+ for (i = 0; i < environs->len; i++)
{
- p = g_malloc (k);
- l = k;
+ env = &g_array_index (environs, struct env_struct, i);
+ if (strcmp (env->key, variable) == 0)
+ {
+ g_assert (env->value);
+ G_UNLOCK (getenv);
+ return env->value;
+ }
}
- else if (k > l)
+
+ /* If not found, we ask the system */
+
+ system_env = getenv (variable);
+ if (!system_env)
{
- p = g_realloc (p, k);
- l = k;
+ G_UNLOCK (getenv);
+ return NULL;
}
- ExpandEnvironmentStrings (v, p, k);
- return p;
+
+ /* On Windows NT, it is relatively typical that environment variables
+ * contain references to other environment variables. Handle that by
+ * calling ExpandEnvironmentStrings.
+ */
+
+ g_array_set_size (environs, environs->len + 1);
+
+ env = &g_array_index (environs, struct env_struct, environs->len - 1);
+
+ /* First check how much space we need */
+ length = ExpandEnvironmentStrings (system_env, dummy, 2);
+
+ /* Then allocate that much, and actualy do the expansion and insert
+ * the new found pair into our buffer
+ */
+
+ env->value = g_malloc (length);
+ env->key = g_strdup (variable);
+
+ ExpandEnvironmentStrings (system_env, env->value, length);
+
+ G_UNLOCK (getenv);
+ return env->value;
#endif
}
-G_LOCK_DECLARE_STATIC (g_utils_global);
+
+G_LOCK_DEFINE_STATIC (g_utils_global);
static gchar *g_tmp_dir = NULL;
static gchar *g_user_name = NULL;
g_tmp_dir[k-1] = '\0';
}
#endif
+
if (!g_tmp_dir)
{
-#ifndef NATIVE_WIN32
+#ifndef G_OS_WIN32
g_tmp_dir = g_strdup ("/tmp");
-#else /* NATIVE_WIN32 */
+#else /* G_OS_WIN32 */
g_tmp_dir = g_strdup ("C:\\");
-#endif /* NATIVE_WIN32 */
+#endif /* G_OS_WIN32 */
}
-#ifdef NATIVE_WIN32
- /* The official way to specify a home directory on NT is
- * the HOMEDRIVE and HOMEPATH environment variables.
- *
- * This is inside #ifdef NATIVE_WIN32 because with the cygwin dll,
- * HOME should be a POSIX style pathname.
- */
+ if (!g_home_dir)
+ g_home_dir = g_strdup (g_getenv ("HOME"));
- if (getenv ("HOMEDRIVE") != NULL && getenv ("HOMEPATH") != NULL)
+#ifdef G_OS_WIN32
+ if (!g_home_dir)
{
- gchar *homedrive, *homepath;
-
- homedrive = g_strdup (g_getenv ("HOMEDRIVE"));
- homepath = g_strdup (g_getenv ("HOMEPATH"));
-
- g_home_dir = g_strconcat (homedrive, homepath, NULL);
- g_free (homedrive);
- g_free (homepath);
+ /* The official way to specify a home directory on NT is
+ * the HOMEDRIVE and HOMEPATH environment variables.
+ *
+ * This is inside #ifdef G_OS_WIN32 because with the cygwin dll,
+ * HOME should be a POSIX style pathname.
+ */
+
+ if (getenv ("HOMEDRIVE") != NULL && getenv ("HOMEPATH") != NULL)
+ {
+ gchar *homedrive, *homepath;
+
+ homedrive = g_strdup (g_getenv ("HOMEDRIVE"));
+ homepath = g_strdup (g_getenv ("HOMEPATH"));
+
+ g_home_dir = g_strconcat (homedrive, homepath, NULL);
+ g_free (homedrive);
+ g_free (homepath);
+ }
}
- if (!g_home_dir)
- g_home_dir = g_strdup (g_getenv ("HOME"));
-#else
- g_home_dir = g_strdup (g_getenv ("HOME"));
-#endif
+#endif /* G_OS_WIN32 */
#ifdef HAVE_PWD_H
{
- struct passwd *pw = NULL, pwd;
+ struct passwd *pw = NULL;
gpointer buffer = NULL;
- guint bufsize = sizeof (struct passwd);
-# ifdef HAVE_GETPWUID_R
- while (TRUE)
- {
- int error = 0;
- buffer = g_realloc (buffer, bufsize);
-# ifdef HAVE_GETPWUID_R_POSIX
+
+# if defined (HAVE_POSIX_GETPWUID_R) || defined (HAVE_NONPOSIX_GETPWUID_R)
+ struct passwd pwd;
+# ifdef _SC_GETPW_R_SIZE_MAX
+ /* This reurns the maximum length */
+ guint bufsize = sysconf (_SC_GETPW_R_SIZE_MAX);
+# else /* _SC_GETPW_R_SIZE_MAX */
+ guint bufsize = 64;
+# endif /* _SC_GETPW_R_SIZE_MAX */
+ gint error;
+
+ do
+ {
+ g_free (buffer);
+ buffer = g_malloc (bufsize);
+ errno = 0;
+
+# ifdef HAVE_POSIX_GETPWUID_R
error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
- if (error == 0)
- break;
-# else /* HAVE_GETPWUID_R_POSIX */
- pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
- if (pw)
- break;
- error = errno;
-# endif /* HAVE_GETPWUID_R_POSIX */
- if (error != ERANGE)
- g_error( "Could not read account information: %s",
- g_strerror (error));
- bufsize *= 2;
+ error = error < 0 ? errno : error;
+# else /* HAVE_NONPOSIX_GETPWUID_R */
+# ifdef _AIX
+ error = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+ pw = error == 0 ? &pwd : NULL;
+# else /* !_AIX */
+ pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+ error = pw ? 0 : errno;
+# endif /* !_AIX */
+# endif /* HAVE_NONPOSIX_GETPWUID_R */
+
+ if (!pw)
+ {
+ /* we bail out prematurely if the user id can't be found
+ * (should be pretty rare case actually), or if the buffer
+ * should be sufficiently big and lookups are still not
+ * successfull.
+ */
+ if (error == 0 || error == ENOENT)
+ {
+ g_warning ("getpwuid_r(): failed due to unknown user id (%lu)",
+ (gulong) getuid ());
+ break;
+ }
+ if (bufsize > 32 * 1024)
+ {
+ g_warning ("getpwuid_r(): failed due to: %s.",
+ g_strerror (error));
+ break;
+ }
+
+ bufsize *= 2;
+ }
}
-# else /* HAVE_GETPWUID_R */
-# if defined(G_THREADS_ENABLED) && defined(__GNUC__)
-# warning "the `g_get_(user_name|real_name|home_dir|tmp_dir)'"
-# warning "functions will not be MT-safe at their first call"
-# warning "because there is no `getpwuid_r' on your system."
-# endif
- setpwent ();
- pw = getpwuid (getuid ());
- endpwent ();
-# endif /* HAVE_GETPWUID_R */
+ while (!pw);
+# endif /* HAVE_POSIX_GETPWUID_R || HAVE_NONPOSIX_GETPWUID_R */
+ if (!pw)
+ {
+ setpwent ();
+ pw = getpwuid (getuid ());
+ endpwent ();
+ }
if (pw)
{
g_user_name = g_strdup (pw->pw_name);
}
g_free (buffer);
}
+
#else /* !HAVE_PWD_H */
-# ifdef NATIVE_WIN32
+
+# ifdef G_OS_WIN32
{
guint len = 17;
+ gchar buffer[17];
- g_user_name = g_new (gchar, len);
-
- if (!GetUserName (g_user_name, &len))
+ if (GetUserName ((LPTSTR) buffer, (LPDWORD) &len))
{
- g_free (g_user_name);
- g_user_name = g_strdup ("somebody");
- g_real_name = g_strdup ("Unknown");
+ g_user_name = g_strdup (buffer);
+ g_real_name = g_strdup (buffer);
}
- else
- g_real_name = g_strdup (g_user_name);
}
-# else /* !NATIVE_WIN32 */
- g_user_name = g_strdup ("somebody");
- g_real_name = g_strdup ("Unknown");
- g_home_dir = NULL;
-# endif /* !NATIVE_WIN32 */
+# endif /* G_OS_WIN32 */
+
#endif /* !HAVE_PWD_H */
- }
+
+#ifdef __EMX__
+ /* change '\\' in %HOME% to '/' */
+ g_strdelimit (g_home_dir, "\\",'/');
+#endif
+ if (!g_user_name)
+ g_user_name = g_strdup ("somebody");
+ if (!g_real_name)
+ g_real_name = g_strdup ("Unknown");
+ else
+ {
+ gchar *p;
+
+ for (p = g_real_name; *p; p++)
+ if (*p == ',')
+ {
+ *p = 0;
+ p = g_strdup (g_real_name);
+ g_free (g_real_name);
+ g_real_name = p;
+ break;
+ }
+ }
+ }
}
gchar*
return GPOINTER_TO_UINT (v);
}
-gint
+gboolean
g_direct_equal (gconstpointer v1,
gconstpointer v2)
{
- return GPOINTER_TO_UINT (v1) == GPOINTER_TO_UINT (v2);
+ return v1 == v2;
}
-gint
+gboolean
g_int_equal (gconstpointer v1,
gconstpointer v2)
{
return *(const gint*) v;
}
-#if 0 /* Old IO Channels */
-
-GIOChannel*
-g_iochannel_new (gint fd)
+/**
+ * g_get_codeset:
+ *
+ * Get the codeset for the current locale.
+ *
+ * Return value: a newly allocated string containing the name
+ * of the codeset. This string must be freed with g_free().
+ **/
+gchar *
+g_get_codeset (void)
{
- GIOChannel *channel = g_new (GIOChannel, 1);
-
- channel->fd = fd;
-
-#ifdef NATIVE_WIN32
- channel->peer = 0;
- channel->peer_fd = 0;
- channel->offset = 0;
- channel->need_wakeups = 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)
-{
-#ifdef NATIVE_WIN32
- static guint message = 0;
+#ifdef HAVE_CODESET
+ char *result = nl_langinfo (CODESET);
+ return g_strdup (result);
+#else
+#ifndef G_OS_WIN32
+ /* FIXME: Do something more intelligent based on setlocale (LC_CTYPE, NULL)
+ */
+ return g_strdup ("ISO-8859-1");
+#else
+ /* On Win32 we always use UTF-8. At least in GDK. SO should we
+ * therefore return that?
+ */
+ return g_strdup ("UTF-8");
+#endif
#endif
-
- 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 */
-}
-
-#endif /* Old IO Channels */
-
-#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 */