1998-07-10 07:51:57 +02:00
|
|
|
/* GLIB - Library of useful routines for C programming
|
|
|
|
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
2000-07-26 13:02:02 +02:00
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
1998-07-10 07:51:57 +02:00
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
2000-07-26 13:02:02 +02:00
|
|
|
* Lesser General Public License for more details.
|
1998-07-10 07:51:57 +02:00
|
|
|
*
|
2000-07-26 13:02:02 +02:00
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
1998-07-10 07:51:57 +02:00
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
1998-11-01 02:32:59 +01:00
|
|
|
|
1999-02-24 07:14:27 +01:00
|
|
|
/*
|
2000-07-26 13:02:02 +02:00
|
|
|
* Modified by the GLib Team and others 1997-2000. See the AUTHORS
|
1999-02-24 07:14:27 +01:00
|
|
|
* file for a list of people on the GLib Team. See the ChangeLog
|
|
|
|
* files for a list of changes. These files are distributed with
|
|
|
|
* GLib at ftp://ftp.gtk.org/pub/gtk/.
|
|
|
|
*/
|
|
|
|
|
1999-01-19 10:07:28 +01:00
|
|
|
/*
|
1998-12-15 06:28:02 +01:00
|
|
|
* MT safe
|
|
|
|
*/
|
|
|
|
|
2002-12-04 02:27:44 +01:00
|
|
|
#include "config.h"
|
1998-11-01 02:32:59 +01:00
|
|
|
|
2001-04-17 16:48:11 +02:00
|
|
|
#define _GNU_SOURCE /* For stpcpy */
|
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
#include <stdarg.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <locale.h>
|
2001-10-24 20:00:11 +02:00
|
|
|
#include <errno.h>
|
1998-07-10 07:51:57 +02:00
|
|
|
#include <ctype.h> /* For tolower() */
|
1999-01-25 13:45:51 +01:00
|
|
|
#if !defined (HAVE_STRSIGNAL) || !defined(NO_SYS_SIGLIST_DECL)
|
Merge in current Win32 version. Almost no Unix code touched.
* README.win32: More text.
* config.h.win32 glibconfig.h.win32: Update to match the
corresponding generated files on Unix.
* makefile.msc: Update with new source files, and gthread
library. Use the compiler flag -MD instead of using -D_DLL and
"/nodefaultlib:libc msvcrt.lib" in the link phase.
* glib.def: Include new functions, drop removed ones.
* glib.h: Add comments about main loop and polling on Win32. (In
general, it's only for the GIMP's use.) Add Win32 IO Channel
functions. Remove the obsoleted old IO Channel stuff (which was
in #if 0 already).
* giowin32.c: New file.
* gmain.c: Include config.h, conditionalize <sys/time.h>
inclusion. Add g_poll implementation for Win32 (only for the
GIMP's needs for now, it's hard or even impossible to be as clean
and generic as on Unix). Implement g_get_current_time on Win32. If
threads aren't supported, don't try to wake up main thread's
loop. On Win32, use a semaphore and not a pipe to wake up the main
loop.
* gmessages.c: On Win32, allocate a console window if the standard
output handle is invalid before writing to stdout, and reopen stdout
to that console window.
* giochannel.c: Conditionalize unistd.h inclusion. Some indentation
cleanup.
* gstrfuncs.c: Include <signal.h>.
* gutils.c: On Win32, also check the HOMEDRIVE and HOMEPATH
environment variables.
* gmodule-dl.c gmodule-dld.c: In
_g_module_build_path, don't add the "lib" prefix and
".so" or ".sl" suffix if already there.
* gmodule-win32.c: Likewise for the ".dll" suffix.
* gthread-posix.c: Conditionalize <sys/time.h> inclusion.
1999-01-17 00:46:42 +01:00
|
|
|
#include <signal.h>
|
1999-01-21 06:43:40 +01:00
|
|
|
#endif
|
2002-12-04 02:27:44 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
#include "glib.h"
|
2002-11-21 01:35:15 +01:00
|
|
|
#include "gprintfint.h"
|
2000-02-03 00:39:32 +01:00
|
|
|
|
|
|
|
#ifdef G_OS_WIN32
|
|
|
|
#include <windows.h>
|
|
|
|
#endif
|
|
|
|
|
1998-07-11 07:17:49 +02:00
|
|
|
/* do not include <unistd.h> in this place since it
|
1998-07-10 07:51:57 +02:00
|
|
|
* inteferes with g_strsignal() on some OSes
|
|
|
|
*/
|
|
|
|
|
2001-09-02 19:14:23 +02:00
|
|
|
static const guint16 ascii_table_data[256] = {
|
2001-08-26 00:29:40 +02:00
|
|
|
0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004,
|
|
|
|
0x004, 0x104, 0x104, 0x004, 0x104, 0x104, 0x004, 0x004,
|
|
|
|
0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004,
|
|
|
|
0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004,
|
|
|
|
0x140, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
|
|
|
|
0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
|
|
|
|
0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459,
|
|
|
|
0x459, 0x459, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
|
|
|
|
0x0d0, 0x653, 0x653, 0x653, 0x653, 0x653, 0x653, 0x253,
|
|
|
|
0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253,
|
|
|
|
0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253,
|
|
|
|
0x253, 0x253, 0x253, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
|
|
|
|
0x0d0, 0x473, 0x473, 0x473, 0x473, 0x473, 0x473, 0x073,
|
|
|
|
0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073,
|
|
|
|
0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073,
|
|
|
|
0x073, 0x073, 0x073, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x004
|
|
|
|
/* the upper 128 are all zeroes */
|
|
|
|
};
|
|
|
|
|
2001-09-04 07:09:35 +02:00
|
|
|
#if defined(G_PLATFORM_WIN32) && defined(__GNUC__)
|
|
|
|
__declspec(dllexport)
|
|
|
|
#endif
|
2001-09-02 19:14:23 +02:00
|
|
|
const guint16 * const g_ascii_table = ascii_table_data;
|
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
gchar*
|
|
|
|
g_strdup (const gchar *str)
|
|
|
|
{
|
|
|
|
gchar *new_str;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
if (str)
|
|
|
|
{
|
|
|
|
new_str = g_new (char, strlen (str) + 1);
|
|
|
|
strcpy (new_str, str);
|
|
|
|
}
|
1998-09-02 16:57:10 +02:00
|
|
|
else
|
|
|
|
new_str = NULL;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
return new_str;
|
|
|
|
}
|
|
|
|
|
1998-09-19 03:12:06 +02:00
|
|
|
gpointer
|
|
|
|
g_memdup (gconstpointer mem,
|
|
|
|
guint byte_size)
|
1998-09-18 20:32:59 +02:00
|
|
|
{
|
1998-09-19 03:12:06 +02:00
|
|
|
gpointer new_mem;
|
|
|
|
|
|
|
|
if (mem)
|
|
|
|
{
|
|
|
|
new_mem = g_malloc (byte_size);
|
|
|
|
memcpy (new_mem, mem, byte_size);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
new_mem = NULL;
|
|
|
|
|
|
|
|
return new_mem;
|
1998-09-18 20:32:59 +02:00
|
|
|
}
|
|
|
|
|
1998-08-19 03:24:13 +02:00
|
|
|
gchar*
|
1998-09-02 16:57:10 +02:00
|
|
|
g_strndup (const gchar *str,
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
gsize n)
|
1998-08-19 03:24:13 +02:00
|
|
|
{
|
1998-09-02 16:57:10 +02:00
|
|
|
gchar *new_str;
|
1998-08-19 03:24:13 +02:00
|
|
|
|
|
|
|
if (str)
|
|
|
|
{
|
1998-09-02 16:57:10 +02:00
|
|
|
new_str = g_new (gchar, n + 1);
|
1998-08-19 03:24:13 +02:00
|
|
|
strncpy (new_str, str, n);
|
|
|
|
new_str[n] = '\0';
|
|
|
|
}
|
1998-09-02 16:57:10 +02:00
|
|
|
else
|
|
|
|
new_str = NULL;
|
1998-08-19 03:24:13 +02:00
|
|
|
|
|
|
|
return new_str;
|
|
|
|
}
|
|
|
|
|
1998-09-02 16:57:10 +02:00
|
|
|
gchar*
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
g_strnfill (gsize length,
|
1998-09-02 16:57:10 +02:00
|
|
|
gchar fill_char)
|
|
|
|
{
|
2001-09-26 17:26:44 +02:00
|
|
|
gchar *str;
|
1998-09-02 16:57:10 +02:00
|
|
|
|
|
|
|
str = g_new (gchar, length + 1);
|
2001-09-26 17:26:44 +02:00
|
|
|
memset (str, (guchar)fill_char, length);
|
|
|
|
str[length] = '\0';
|
1998-09-02 16:57:10 +02:00
|
|
|
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
2001-03-26 20:35:34 +02:00
|
|
|
/**
|
|
|
|
* g_stpcpy:
|
2001-10-03 01:09:51 +02:00
|
|
|
* @dest: destination buffer.
|
|
|
|
* @src: source string.
|
2001-03-26 20:35:34 +02:00
|
|
|
*
|
|
|
|
* Copies a nul-terminated string into the dest buffer, include the
|
|
|
|
* trailing nul, and return a pointer to the trailing nul byte.
|
|
|
|
* This is useful for concatenating multiple strings together
|
|
|
|
* without having to repeatedly scan for the end.
|
|
|
|
*
|
|
|
|
* Return value: a pointer to trailing nul byte.
|
|
|
|
**/
|
|
|
|
gchar *
|
|
|
|
g_stpcpy (gchar *dest,
|
|
|
|
const gchar *src)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_STPCPY
|
|
|
|
g_return_val_if_fail (dest != NULL, NULL);
|
|
|
|
g_return_val_if_fail (src != NULL, NULL);
|
|
|
|
return stpcpy (dest, src);
|
|
|
|
#else
|
|
|
|
register gchar *d = dest;
|
|
|
|
register const gchar *s = src;
|
|
|
|
|
|
|
|
g_return_val_if_fail (dest != NULL, NULL);
|
|
|
|
g_return_val_if_fail (src != NULL, NULL);
|
|
|
|
do
|
|
|
|
*d++ = *s;
|
|
|
|
while (*s++ != '\0');
|
|
|
|
|
|
|
|
return d - 1;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
removed this function which was not publically exported in glib.h. to
Mon Aug 24 02:08:56 1998 Tim Janik <timj@gtk.org>
* glib.h:
* gstring.c:
* gstrfuncs.c:
(g_vsprintf): removed this function which was not publically
exported in glib.h. to export it, it should have been named
differently in the first place, since its semantics differ from
vsprintf(). apart from that, it was a possible cause for
problems since it worked on a previously allocated memory area and
was used in a lot places of glib. exporting it would have been a
guararant for problems with threaded programs.
(g_printf_string_upper_bound): exported this function to return
a string size, guarranteed to be big enough to hold the fully
expanded format+args string. added 'q', 'L' and 'll' flag handling.
in fact, the newly allocated area is in most cases much bigger than
required.
(g_strdup_vprintf()): new function returning a newly allocated string
containing the contents of *format and associated args (size is
calculated with g_printf_string_upper_bound()).
(g_strdup_printf): new function which wraps g_strdup_vprintf().
* configure.in: check for va_copy() or __va_copy() alternatively.
check whether va_lists can be copyied by value.
* glib.h: provide a definition for G_VA_COPY.
* glib.h:
* gmessages.c:
(g_logv):
(g_vsnprintf):
pass va_lists by value, not by reference, since this causes problems
on platforms that implement va_list as as arrays. internaly, use
G_VA_COPY (new_arg, org_arg); va_end (new_arg); to produce a second
va_list variable, if multiple passes are required. changed all
callers.
* glib.h:
* gerror.h:
renamed g_debug() to g_on_error_query(), cleaned up a bit.
renamed g_stack_trace() to g_on_error_stack_trace() since both
functions cluttered different namespaces.
there is an appropriate comment in glib.h now that explains the
unix and gdb specific dependencies of both functions.
removed g_attach_process().
g_on_error_stack_trace() should probably be handled with caution,
i've seem several different linux versions (2.0.x) become unstable
after invokation of this function.
1998-08-24 07:26:53 +02:00
|
|
|
gchar*
|
|
|
|
g_strdup_vprintf (const gchar *format,
|
|
|
|
va_list args1)
|
|
|
|
{
|
|
|
|
gchar *buffer;
|
2001-09-19 20:43:22 +02:00
|
|
|
#ifdef HAVE_VASPRINTF
|
2002-11-21 01:35:15 +01:00
|
|
|
if (_g_vasprintf (&buffer, format, args1) < 0)
|
2002-03-29 00:24:23 +01:00
|
|
|
buffer = NULL;
|
|
|
|
else if (!g_mem_is_system_malloc ())
|
2001-09-19 20:43:22 +02:00
|
|
|
{
|
|
|
|
gchar *buffer1 = g_strdup (buffer);
|
|
|
|
free (buffer);
|
|
|
|
buffer = buffer1;
|
|
|
|
}
|
|
|
|
#else
|
removed this function which was not publically exported in glib.h. to
Mon Aug 24 02:08:56 1998 Tim Janik <timj@gtk.org>
* glib.h:
* gstring.c:
* gstrfuncs.c:
(g_vsprintf): removed this function which was not publically
exported in glib.h. to export it, it should have been named
differently in the first place, since its semantics differ from
vsprintf(). apart from that, it was a possible cause for
problems since it worked on a previously allocated memory area and
was used in a lot places of glib. exporting it would have been a
guararant for problems with threaded programs.
(g_printf_string_upper_bound): exported this function to return
a string size, guarranteed to be big enough to hold the fully
expanded format+args string. added 'q', 'L' and 'll' flag handling.
in fact, the newly allocated area is in most cases much bigger than
required.
(g_strdup_vprintf()): new function returning a newly allocated string
containing the contents of *format and associated args (size is
calculated with g_printf_string_upper_bound()).
(g_strdup_printf): new function which wraps g_strdup_vprintf().
* configure.in: check for va_copy() or __va_copy() alternatively.
check whether va_lists can be copyied by value.
* glib.h: provide a definition for G_VA_COPY.
* glib.h:
* gmessages.c:
(g_logv):
(g_vsnprintf):
pass va_lists by value, not by reference, since this causes problems
on platforms that implement va_list as as arrays. internaly, use
G_VA_COPY (new_arg, org_arg); va_end (new_arg); to produce a second
va_list variable, if multiple passes are required. changed all
callers.
* glib.h:
* gerror.h:
renamed g_debug() to g_on_error_query(), cleaned up a bit.
renamed g_stack_trace() to g_on_error_stack_trace() since both
functions cluttered different namespaces.
there is an appropriate comment in glib.h now that explains the
unix and gdb specific dependencies of both functions.
removed g_attach_process().
g_on_error_stack_trace() should probably be handled with caution,
i've seem several different linux versions (2.0.x) become unstable
after invokation of this function.
1998-08-24 07:26:53 +02:00
|
|
|
va_list args2;
|
|
|
|
|
|
|
|
G_VA_COPY (args2, args1);
|
|
|
|
|
|
|
|
buffer = g_new (gchar, g_printf_string_upper_bound (format, args1));
|
|
|
|
|
2002-11-21 01:35:15 +01:00
|
|
|
_g_vsprintf (buffer, format, args2);
|
removed this function which was not publically exported in glib.h. to
Mon Aug 24 02:08:56 1998 Tim Janik <timj@gtk.org>
* glib.h:
* gstring.c:
* gstrfuncs.c:
(g_vsprintf): removed this function which was not publically
exported in glib.h. to export it, it should have been named
differently in the first place, since its semantics differ from
vsprintf(). apart from that, it was a possible cause for
problems since it worked on a previously allocated memory area and
was used in a lot places of glib. exporting it would have been a
guararant for problems with threaded programs.
(g_printf_string_upper_bound): exported this function to return
a string size, guarranteed to be big enough to hold the fully
expanded format+args string. added 'q', 'L' and 'll' flag handling.
in fact, the newly allocated area is in most cases much bigger than
required.
(g_strdup_vprintf()): new function returning a newly allocated string
containing the contents of *format and associated args (size is
calculated with g_printf_string_upper_bound()).
(g_strdup_printf): new function which wraps g_strdup_vprintf().
* configure.in: check for va_copy() or __va_copy() alternatively.
check whether va_lists can be copyied by value.
* glib.h: provide a definition for G_VA_COPY.
* glib.h:
* gmessages.c:
(g_logv):
(g_vsnprintf):
pass va_lists by value, not by reference, since this causes problems
on platforms that implement va_list as as arrays. internaly, use
G_VA_COPY (new_arg, org_arg); va_end (new_arg); to produce a second
va_list variable, if multiple passes are required. changed all
callers.
* glib.h:
* gerror.h:
renamed g_debug() to g_on_error_query(), cleaned up a bit.
renamed g_stack_trace() to g_on_error_stack_trace() since both
functions cluttered different namespaces.
there is an appropriate comment in glib.h now that explains the
unix and gdb specific dependencies of both functions.
removed g_attach_process().
g_on_error_stack_trace() should probably be handled with caution,
i've seem several different linux versions (2.0.x) become unstable
after invokation of this function.
1998-08-24 07:26:53 +02:00
|
|
|
va_end (args2);
|
2001-09-19 20:43:22 +02:00
|
|
|
#endif
|
removed this function which was not publically exported in glib.h. to
Mon Aug 24 02:08:56 1998 Tim Janik <timj@gtk.org>
* glib.h:
* gstring.c:
* gstrfuncs.c:
(g_vsprintf): removed this function which was not publically
exported in glib.h. to export it, it should have been named
differently in the first place, since its semantics differ from
vsprintf(). apart from that, it was a possible cause for
problems since it worked on a previously allocated memory area and
was used in a lot places of glib. exporting it would have been a
guararant for problems with threaded programs.
(g_printf_string_upper_bound): exported this function to return
a string size, guarranteed to be big enough to hold the fully
expanded format+args string. added 'q', 'L' and 'll' flag handling.
in fact, the newly allocated area is in most cases much bigger than
required.
(g_strdup_vprintf()): new function returning a newly allocated string
containing the contents of *format and associated args (size is
calculated with g_printf_string_upper_bound()).
(g_strdup_printf): new function which wraps g_strdup_vprintf().
* configure.in: check for va_copy() or __va_copy() alternatively.
check whether va_lists can be copyied by value.
* glib.h: provide a definition for G_VA_COPY.
* glib.h:
* gmessages.c:
(g_logv):
(g_vsnprintf):
pass va_lists by value, not by reference, since this causes problems
on platforms that implement va_list as as arrays. internaly, use
G_VA_COPY (new_arg, org_arg); va_end (new_arg); to produce a second
va_list variable, if multiple passes are required. changed all
callers.
* glib.h:
* gerror.h:
renamed g_debug() to g_on_error_query(), cleaned up a bit.
renamed g_stack_trace() to g_on_error_stack_trace() since both
functions cluttered different namespaces.
there is an appropriate comment in glib.h now that explains the
unix and gdb specific dependencies of both functions.
removed g_attach_process().
g_on_error_stack_trace() should probably be handled with caution,
i've seem several different linux versions (2.0.x) become unstable
after invokation of this function.
1998-08-24 07:26:53 +02:00
|
|
|
return buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
gchar*
|
|
|
|
g_strdup_printf (const gchar *format,
|
|
|
|
...)
|
|
|
|
{
|
|
|
|
gchar *buffer;
|
|
|
|
va_list args;
|
|
|
|
|
|
|
|
va_start (args, format);
|
|
|
|
buffer = g_strdup_vprintf (format, args);
|
|
|
|
va_end (args);
|
|
|
|
|
|
|
|
return buffer;
|
|
|
|
}
|
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
gchar*
|
|
|
|
g_strconcat (const gchar *string1, ...)
|
|
|
|
{
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
gsize l;
|
1998-07-10 07:51:57 +02:00
|
|
|
va_list args;
|
|
|
|
gchar *s;
|
|
|
|
gchar *concat;
|
2001-03-26 20:35:34 +02:00
|
|
|
gchar *ptr;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
g_return_val_if_fail (string1 != NULL, NULL);
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
l = 1 + strlen (string1);
|
|
|
|
va_start (args, string1);
|
|
|
|
s = va_arg (args, gchar*);
|
|
|
|
while (s)
|
|
|
|
{
|
|
|
|
l += strlen (s);
|
|
|
|
s = va_arg (args, gchar*);
|
|
|
|
}
|
|
|
|
va_end (args);
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
concat = g_new (gchar, l);
|
2001-03-26 20:35:34 +02:00
|
|
|
ptr = concat;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
2001-03-26 20:35:34 +02:00
|
|
|
ptr = g_stpcpy (ptr, string1);
|
1998-07-10 07:51:57 +02:00
|
|
|
va_start (args, string1);
|
|
|
|
s = va_arg (args, gchar*);
|
|
|
|
while (s)
|
|
|
|
{
|
2001-06-15 20:28:06 +02:00
|
|
|
ptr = g_stpcpy (ptr, s);
|
1998-07-10 07:51:57 +02:00
|
|
|
s = va_arg (args, gchar*);
|
|
|
|
}
|
|
|
|
va_end (args);
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
return concat;
|
|
|
|
}
|
|
|
|
|
2001-10-24 20:00:11 +02:00
|
|
|
/**
|
|
|
|
* g_strtod:
|
|
|
|
* @nptr: the string to convert to a numeric value.
|
2002-03-11 22:38:18 +01:00
|
|
|
* @endptr: if non-%NULL, it returns the character after
|
2001-10-24 20:00:11 +02:00
|
|
|
* the last character used in the conversion.
|
|
|
|
*
|
2002-03-11 22:38:18 +01:00
|
|
|
* Converts a string to a #gdouble value.
|
2001-10-24 20:00:11 +02:00
|
|
|
* It calls the standard strtod() function to handle the conversion, but
|
|
|
|
* if the string is not completely converted it attempts the conversion
|
2002-03-11 22:38:18 +01:00
|
|
|
* again with g_ascii_strtod(), and returns the best match.
|
2001-10-24 20:00:11 +02:00
|
|
|
*
|
2002-03-11 22:38:18 +01:00
|
|
|
* This function should seldomly be used. The normal situation when reading
|
|
|
|
* numbers not for human consumption is to use g_ascii_strtod(). Only when
|
|
|
|
* you know that you must expect both locale formatted and C formatted numbers
|
2001-10-24 20:00:11 +02:00
|
|
|
* should you use this. Make sure that you don't pass strings such as comma
|
|
|
|
* separated lists of values, since the commas may be interpreted as a decimal
|
|
|
|
* point in some locales, causing unexpected results.
|
|
|
|
*
|
2002-03-11 22:38:18 +01:00
|
|
|
* Return value: the #gdouble value.
|
2001-10-24 20:00:11 +02:00
|
|
|
**/
|
1998-07-10 07:51:57 +02:00
|
|
|
gdouble
|
|
|
|
g_strtod (const gchar *nptr,
|
2001-10-24 20:00:11 +02:00
|
|
|
gchar **endptr)
|
1998-07-10 07:51:57 +02:00
|
|
|
{
|
|
|
|
gchar *fail_pos_1;
|
|
|
|
gchar *fail_pos_2;
|
|
|
|
gdouble val_1;
|
|
|
|
gdouble val_2 = 0;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
g_return_val_if_fail (nptr != NULL, 0);
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
fail_pos_1 = NULL;
|
|
|
|
fail_pos_2 = NULL;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
val_1 = strtod (nptr, &fail_pos_1);
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
if (fail_pos_1 && fail_pos_1[0] != 0)
|
2001-10-24 20:00:11 +02:00
|
|
|
val_2 = g_ascii_strtod (nptr, &fail_pos_2);
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
if (!fail_pos_1 || fail_pos_1[0] == 0 || fail_pos_1 >= fail_pos_2)
|
|
|
|
{
|
|
|
|
if (endptr)
|
|
|
|
*endptr = fail_pos_1;
|
|
|
|
return val_1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (endptr)
|
|
|
|
*endptr = fail_pos_2;
|
|
|
|
return val_2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-10-24 20:00:11 +02:00
|
|
|
/**
|
|
|
|
* g_ascii_strtod:
|
|
|
|
* @nptr: the string to convert to a numeric value.
|
2002-03-11 22:38:18 +01:00
|
|
|
* @endptr: if non-%NULL, it returns the character after
|
2001-10-24 20:00:11 +02:00
|
|
|
* the last character used in the conversion.
|
|
|
|
*
|
2002-03-11 22:38:18 +01:00
|
|
|
* Converts a string to a #gdouble value.
|
2001-10-24 20:00:11 +02:00
|
|
|
* This function behaves like the standard strtod() function
|
|
|
|
* does in the C locale. It does this without actually
|
|
|
|
* changing the current locale, since that would not be
|
|
|
|
* thread-safe.
|
|
|
|
*
|
|
|
|
* This function is typically used when reading configuration
|
2002-10-12 21:37:48 +02:00
|
|
|
* files or other non-user input that should be locale independent.
|
2001-10-24 20:00:11 +02:00
|
|
|
* To handle input from the user you should normally use the
|
2002-03-11 22:38:18 +01:00
|
|
|
* locale-sensitive system strtod() function.
|
2001-10-24 20:00:11 +02:00
|
|
|
*
|
2002-03-11 22:38:18 +01:00
|
|
|
* To convert from a string to #gdouble in a locale-insensitive
|
|
|
|
* way, use g_ascii_dtostr().
|
2001-10-24 20:00:11 +02:00
|
|
|
*
|
2002-03-11 22:38:18 +01:00
|
|
|
* If the correct value would cause overflow, plus or minus %HUGE_VAL
|
|
|
|
* is returned (according to the sign of the value), and %ERANGE is
|
|
|
|
* stored in %errno. If the correct value would cause underflow,
|
|
|
|
* zero is returned and %ERANGE is stored in %errno.
|
2001-10-24 20:00:11 +02:00
|
|
|
*
|
2002-03-11 22:38:18 +01:00
|
|
|
* This function resets %errno before calling strtod() so that
|
2001-10-24 20:00:11 +02:00
|
|
|
* you can reliably detect overflow and underflow.
|
|
|
|
*
|
2002-03-11 22:38:18 +01:00
|
|
|
* Return value: the #gdouble value.
|
2001-10-24 20:00:11 +02:00
|
|
|
**/
|
|
|
|
gdouble
|
|
|
|
g_ascii_strtod (const gchar *nptr,
|
|
|
|
gchar **endptr)
|
|
|
|
{
|
|
|
|
gchar *fail_pos;
|
|
|
|
gdouble val;
|
|
|
|
struct lconv *locale_data;
|
|
|
|
const char *decimal_point;
|
|
|
|
int decimal_point_len;
|
|
|
|
const char *p, *decimal_point_pos;
|
|
|
|
const char *end = NULL; /* Silence gcc */
|
|
|
|
|
|
|
|
g_return_val_if_fail (nptr != NULL, 0);
|
|
|
|
|
|
|
|
fail_pos = NULL;
|
|
|
|
|
|
|
|
locale_data = localeconv ();
|
|
|
|
decimal_point = locale_data->decimal_point;
|
|
|
|
decimal_point_len = strlen (decimal_point);
|
|
|
|
|
|
|
|
g_assert (decimal_point_len != 0);
|
|
|
|
|
|
|
|
decimal_point_pos = NULL;
|
|
|
|
if (decimal_point[0] != '.' ||
|
|
|
|
decimal_point[1] != 0)
|
|
|
|
{
|
|
|
|
p = nptr;
|
|
|
|
/* Skip leading space */
|
2002-02-10 06:56:06 +01:00
|
|
|
while (g_ascii_isspace (*p))
|
2001-10-24 20:00:11 +02:00
|
|
|
p++;
|
|
|
|
|
|
|
|
/* Skip leading optional sign */
|
|
|
|
if (*p == '+' || *p == '-')
|
|
|
|
p++;
|
|
|
|
|
|
|
|
if (p[0] == '0' &&
|
|
|
|
(p[1] == 'x' || p[1] == 'X'))
|
|
|
|
{
|
|
|
|
p += 2;
|
|
|
|
/* HEX - find the (optional) decimal point */
|
|
|
|
|
2002-02-10 06:56:06 +01:00
|
|
|
while (g_ascii_isxdigit (*p))
|
2001-10-24 20:00:11 +02:00
|
|
|
p++;
|
|
|
|
|
|
|
|
if (*p == '.')
|
|
|
|
{
|
|
|
|
decimal_point_pos = p++;
|
|
|
|
|
2002-02-10 06:56:06 +01:00
|
|
|
while (g_ascii_isxdigit (*p))
|
2001-10-24 20:00:11 +02:00
|
|
|
p++;
|
|
|
|
|
|
|
|
if (*p == 'p' || *p == 'P')
|
|
|
|
p++;
|
|
|
|
if (*p == '+' || *p == '-')
|
|
|
|
p++;
|
2002-02-10 06:56:06 +01:00
|
|
|
while (g_ascii_isdigit (*p))
|
2001-10-24 20:00:11 +02:00
|
|
|
p++;
|
|
|
|
end = p;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-02-10 06:56:06 +01:00
|
|
|
while (g_ascii_isdigit (*p))
|
2001-10-24 20:00:11 +02:00
|
|
|
p++;
|
|
|
|
|
|
|
|
if (*p == '.')
|
|
|
|
{
|
|
|
|
decimal_point_pos = p++;
|
|
|
|
|
2002-02-10 06:56:06 +01:00
|
|
|
while (g_ascii_isdigit (*p))
|
2001-10-24 20:00:11 +02:00
|
|
|
p++;
|
|
|
|
|
|
|
|
if (*p == 'e' || *p == 'E')
|
|
|
|
p++;
|
|
|
|
if (*p == '+' || *p == '-')
|
|
|
|
p++;
|
2002-02-10 06:56:06 +01:00
|
|
|
while (g_ascii_isdigit (*p))
|
2001-10-24 20:00:11 +02:00
|
|
|
p++;
|
|
|
|
end = p;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* For the other cases, we need not convert the decimal point */
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Set errno to zero, so that we can distinguish zero results
|
|
|
|
and underflows */
|
|
|
|
errno = 0;
|
|
|
|
|
|
|
|
if (decimal_point_pos)
|
|
|
|
{
|
|
|
|
char *copy, *c;
|
|
|
|
|
|
|
|
/* We need to convert the '.' to the locale specific decimal point */
|
|
|
|
copy = g_malloc (end - nptr + 1 + decimal_point_len);
|
|
|
|
|
|
|
|
c = copy;
|
|
|
|
memcpy (c, nptr, decimal_point_pos - nptr);
|
|
|
|
c += decimal_point_pos - nptr;
|
|
|
|
memcpy (c, decimal_point, decimal_point_len);
|
|
|
|
c += decimal_point_len;
|
|
|
|
memcpy (c, decimal_point_pos + 1, end - (decimal_point_pos + 1));
|
|
|
|
c += end - (decimal_point_pos + 1);
|
|
|
|
*c = 0;
|
|
|
|
|
|
|
|
val = strtod (copy, &fail_pos);
|
|
|
|
|
|
|
|
if (fail_pos)
|
|
|
|
{
|
|
|
|
if (fail_pos > decimal_point_pos)
|
|
|
|
fail_pos = (char *)nptr + (fail_pos - copy) - (decimal_point_len - 1);
|
|
|
|
else
|
|
|
|
fail_pos = (char *)nptr + (fail_pos - copy);
|
|
|
|
}
|
|
|
|
|
|
|
|
g_free (copy);
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
val = strtod (nptr, &fail_pos);
|
|
|
|
|
|
|
|
if (endptr)
|
|
|
|
*endptr = fail_pos;
|
|
|
|
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
2002-10-12 21:37:48 +02:00
|
|
|
|
2001-10-24 20:00:11 +02:00
|
|
|
/**
|
|
|
|
* g_ascii_dtostr:
|
|
|
|
* @buffer: A buffer to place the resulting string in
|
|
|
|
* @buf_len: The length of the buffer.
|
2002-03-11 22:38:18 +01:00
|
|
|
* @d: The #gdouble to convert
|
2001-10-24 20:00:11 +02:00
|
|
|
*
|
2002-03-11 22:38:18 +01:00
|
|
|
* Converts a #gdouble to a string, using the '.' as
|
|
|
|
* decimal point.
|
2001-10-24 20:00:11 +02:00
|
|
|
*
|
|
|
|
* This functions generates enough precision that converting
|
2002-03-11 22:38:18 +01:00
|
|
|
* the string back using g_strtod() gives the same machine-number
|
2001-10-24 20:00:11 +02:00
|
|
|
* (on machines with IEEE compatible 64bit doubles). It is
|
|
|
|
* guaranteed that the size of the resulting string will never
|
|
|
|
* be larger than @G_ASCII_DTOSTR_BUF_SIZE bytes.
|
|
|
|
*
|
|
|
|
* Return value: The pointer to the buffer with the converted string.
|
|
|
|
**/
|
|
|
|
gchar *
|
|
|
|
g_ascii_dtostr (gchar *buffer,
|
|
|
|
gint buf_len,
|
|
|
|
gdouble d)
|
|
|
|
{
|
|
|
|
return g_ascii_formatd (buffer, buf_len, "%.17g", d);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_ascii_formatd:
|
|
|
|
* @buffer: A buffer to place the resulting string in
|
|
|
|
* @buf_len: The length of the buffer.
|
|
|
|
* @format: The printf-style format to use for the
|
|
|
|
* code to use for converting.
|
2002-03-11 22:38:18 +01:00
|
|
|
* @d: The #gdouble to convert
|
2001-10-24 20:00:11 +02:00
|
|
|
*
|
2002-03-11 22:38:18 +01:00
|
|
|
* Converts a #gdouble to a string, using the '.' as
|
|
|
|
* decimal point. To format the number you pass in
|
2001-10-24 20:00:11 +02:00
|
|
|
* a printf-style formating string. Allowed conversion
|
2002-03-11 22:38:18 +01:00
|
|
|
* specifiers are 'e', 'E', 'f', 'F', 'g' and 'G'.
|
2001-10-24 20:00:11 +02:00
|
|
|
*
|
|
|
|
* If you just want to want to serialize the value into a
|
2002-03-11 22:38:18 +01:00
|
|
|
* string, use g_ascii_dtostr().
|
2001-10-24 20:00:11 +02:00
|
|
|
*
|
|
|
|
* Return value: The pointer to the buffer with the converted string.
|
|
|
|
**/
|
|
|
|
gchar *
|
|
|
|
g_ascii_formatd (gchar *buffer,
|
|
|
|
gint buf_len,
|
|
|
|
const gchar *format,
|
|
|
|
gdouble d)
|
|
|
|
{
|
|
|
|
struct lconv *locale_data;
|
|
|
|
const char *decimal_point;
|
|
|
|
int decimal_point_len;
|
|
|
|
gchar *p;
|
|
|
|
int rest_len;
|
|
|
|
gchar format_char;
|
|
|
|
|
|
|
|
g_return_val_if_fail (buffer != NULL, NULL);
|
|
|
|
g_return_val_if_fail (format[0] == '%', NULL);
|
|
|
|
g_return_val_if_fail (strpbrk (format + 1, "'l%") == NULL, NULL);
|
|
|
|
|
|
|
|
format_char = format[strlen (format) - 1];
|
|
|
|
|
|
|
|
g_return_val_if_fail (format_char == 'e' || format_char == 'E' ||
|
|
|
|
format_char == 'f' || format_char == 'F' ||
|
|
|
|
format_char == 'g' || format_char == 'G',
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
if (format[0] != '%')
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (strpbrk (format + 1, "'l%"))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (!(format_char == 'e' || format_char == 'E' ||
|
|
|
|
format_char == 'f' || format_char == 'F' ||
|
|
|
|
format_char == 'g' || format_char == 'G'))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
2002-11-21 01:35:15 +01:00
|
|
|
_g_snprintf (buffer, buf_len, format, d);
|
2001-10-24 20:00:11 +02:00
|
|
|
|
|
|
|
locale_data = localeconv ();
|
|
|
|
decimal_point = locale_data->decimal_point;
|
|
|
|
decimal_point_len = strlen (decimal_point);
|
|
|
|
|
|
|
|
g_assert (decimal_point_len != 0);
|
|
|
|
|
|
|
|
if (decimal_point[0] != '.' ||
|
|
|
|
decimal_point[1] != 0)
|
|
|
|
{
|
|
|
|
p = buffer;
|
|
|
|
|
|
|
|
if (*p == '+' || *p == '-')
|
|
|
|
p++;
|
|
|
|
|
|
|
|
while (isdigit ((guchar)*p))
|
|
|
|
p++;
|
|
|
|
|
|
|
|
if (strncmp (p, decimal_point, decimal_point_len) == 0)
|
|
|
|
{
|
|
|
|
*p = '.';
|
|
|
|
p++;
|
|
|
|
if (decimal_point_len > 1) {
|
|
|
|
rest_len = strlen (p + (decimal_point_len-1));
|
|
|
|
memmove (p, p + (decimal_point_len-1),
|
|
|
|
rest_len);
|
|
|
|
p[rest_len] = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return buffer;
|
|
|
|
}
|
|
|
|
|
2002-10-12 21:37:48 +02:00
|
|
|
/**
|
|
|
|
* g_ascii_strtoull:
|
|
|
|
* @nptr: the string to convert to a numeric value.
|
|
|
|
* @endptr: if non-%NULL, it returns the character after
|
|
|
|
* the last character used in the conversion.
|
|
|
|
* @base: to be used for the conversion, 2..36 or 0
|
|
|
|
*
|
|
|
|
* Converts a string to a #guint64 value.
|
2002-11-19 20:42:05 +01:00
|
|
|
* This function behaves like the standard strtoull() function
|
2002-10-12 21:37:48 +02:00
|
|
|
* does in the C locale. It does this without actually
|
|
|
|
* changing the current locale, since that would not be
|
|
|
|
* thread-safe.
|
|
|
|
*
|
|
|
|
* This function is typically used when reading configuration
|
|
|
|
* files or other non-user input that should be locale independent.
|
|
|
|
* To handle input from the user you should normally use the
|
|
|
|
* locale-sensitive system strtoull() function.
|
|
|
|
*
|
|
|
|
* If the correct value would cause overflow, %G_MAXUINT64
|
|
|
|
* is returned, and %ERANGE is stored in %errno.
|
|
|
|
*
|
|
|
|
* Return value: the #guint64 value.
|
2002-11-29 00:11:58 +01:00
|
|
|
*
|
2002-11-29 20:35:10 +01:00
|
|
|
* Since: 2.2
|
2002-10-12 21:37:48 +02:00
|
|
|
**/
|
|
|
|
guint64
|
|
|
|
g_ascii_strtoull (const gchar *nptr,
|
|
|
|
gchar **endptr,
|
|
|
|
guint base)
|
|
|
|
{
|
2002-11-19 20:42:05 +01:00
|
|
|
/* this code is based on on the strtol(3) code from GNU libc released under
|
2002-10-12 21:37:48 +02:00
|
|
|
* the GNU Lesser General Public License.
|
2002-11-19 20:42:05 +01:00
|
|
|
*
|
|
|
|
* Copyright (C) 1991,92,94,95,96,97,98,99,2000,01,02
|
|
|
|
* Free Software Foundation, Inc.
|
2002-10-12 21:37:48 +02:00
|
|
|
*/
|
|
|
|
#define ISSPACE(c) ((c) == ' ' || (c) == '\f' || (c) == '\n' || \
|
|
|
|
(c) == '\r' || (c) == '\t' || (c) == '\v')
|
|
|
|
#define ISUPPER(c) ((c) >= 'A' && (c) <= 'Z')
|
|
|
|
#define ISLOWER(c) ((c) >= 'a' && (c) <= 'z')
|
|
|
|
#define ISALPHA(c) (ISUPPER (c) || ISLOWER (c))
|
|
|
|
#define TOUPPER(c) (ISLOWER (c) ? (c) - 'a' + 'A' : (c))
|
|
|
|
#define TOLOWER(c) (ISUPPER (c) ? (c) - 'A' + 'a' : (c))
|
|
|
|
gboolean negative, overflow;
|
|
|
|
guint64 cutoff;
|
|
|
|
guint64 cutlim;
|
|
|
|
guint64 ui64;
|
|
|
|
const gchar *s, *save;
|
|
|
|
guchar c;
|
|
|
|
|
|
|
|
g_return_val_if_fail (nptr != NULL, 0);
|
|
|
|
|
|
|
|
if (base == 1 || base > 36)
|
|
|
|
{
|
|
|
|
errno = EINVAL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
save = s = nptr;
|
|
|
|
|
|
|
|
/* Skip white space. */
|
|
|
|
while (ISSPACE (*s))
|
|
|
|
++s;
|
|
|
|
if (!*s)
|
|
|
|
goto noconv;
|
|
|
|
|
|
|
|
/* Check for a sign. */
|
|
|
|
negative = FALSE;
|
|
|
|
if (*s == '-')
|
|
|
|
{
|
|
|
|
negative = TRUE;
|
|
|
|
++s;
|
|
|
|
}
|
|
|
|
else if (*s == '+')
|
|
|
|
++s;
|
|
|
|
|
|
|
|
/* Recognize number prefix and if BASE is zero, figure it out ourselves. */
|
|
|
|
if (*s == '0')
|
|
|
|
{
|
|
|
|
if ((base == 0 || base == 16) && TOUPPER (s[1]) == 'X')
|
|
|
|
{
|
|
|
|
s += 2;
|
|
|
|
base = 16;
|
|
|
|
}
|
|
|
|
else if (base == 0)
|
|
|
|
base = 8;
|
|
|
|
}
|
|
|
|
else if (base == 0)
|
|
|
|
base = 10;
|
|
|
|
|
|
|
|
/* Save the pointer so we can check later if anything happened. */
|
|
|
|
save = s;
|
|
|
|
cutoff = G_MAXUINT64 / base;
|
|
|
|
cutlim = G_MAXUINT64 % base;
|
|
|
|
|
|
|
|
overflow = FALSE;
|
|
|
|
ui64 = 0;
|
|
|
|
c = *s;
|
|
|
|
for (; c; c = *++s)
|
|
|
|
{
|
|
|
|
if (c >= '0' && c <= '9')
|
|
|
|
c -= '0';
|
|
|
|
else if (ISALPHA (c))
|
|
|
|
c = TOUPPER (c) - 'A' + 10;
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
if (c >= base)
|
|
|
|
break;
|
|
|
|
/* Check for overflow. */
|
|
|
|
if (ui64 > cutoff || (ui64 == cutoff && c > cutlim))
|
|
|
|
overflow = TRUE;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ui64 *= base;
|
|
|
|
ui64 += c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check if anything actually happened. */
|
|
|
|
if (s == save)
|
|
|
|
goto noconv;
|
|
|
|
|
|
|
|
/* Store in ENDPTR the address of one character
|
|
|
|
past the last character we converted. */
|
|
|
|
if (endptr)
|
|
|
|
*endptr = (gchar*) s;
|
|
|
|
|
|
|
|
if (overflow)
|
|
|
|
{
|
|
|
|
errno = ERANGE;
|
|
|
|
return G_MAXUINT64;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return the result of the appropriate sign. */
|
|
|
|
return negative ? -ui64 : ui64;
|
|
|
|
|
|
|
|
noconv:
|
|
|
|
/* We must handle a special case here: the base is 0 or 16 and the
|
|
|
|
first two characters are '0' and 'x', but the rest are no
|
|
|
|
hexadecimal digits. This is no error case. We return 0 and
|
|
|
|
ENDPTR points to the `x`. */
|
|
|
|
if (endptr)
|
|
|
|
{
|
|
|
|
if (save - nptr >= 2 && TOUPPER (save[-1]) == 'X'
|
|
|
|
&& save[-2] == '0')
|
|
|
|
*endptr = (gchar*) &save[-1];
|
|
|
|
else
|
|
|
|
/* There was no number to convert. */
|
|
|
|
*endptr = (gchar*) nptr;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2001-10-24 20:00:11 +02:00
|
|
|
|
2001-02-18 00:30:48 +01:00
|
|
|
G_CONST_RETURN gchar*
|
1998-07-10 07:51:57 +02:00
|
|
|
g_strerror (gint errnum)
|
|
|
|
{
|
1999-01-19 10:07:28 +01:00
|
|
|
static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT;
|
1998-12-15 06:28:02 +01:00
|
|
|
char *msg;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
#ifdef HAVE_STRERROR
|
2002-03-08 16:50:54 +01:00
|
|
|
const char *msg_locale;
|
|
|
|
|
|
|
|
msg_locale = strerror (errnum);
|
|
|
|
if (g_get_charset (NULL))
|
|
|
|
return msg_locale;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gchar *msg_utf8 = g_locale_to_utf8 (msg_locale, -1, NULL, NULL, NULL);
|
|
|
|
if (msg_utf8)
|
|
|
|
{
|
|
|
|
/* Stick in the quark table so that we can return a static result
|
|
|
|
*/
|
|
|
|
GQuark msg_quark = g_quark_from_string (msg_utf8);
|
|
|
|
g_free (msg_utf8);
|
|
|
|
|
|
|
|
return g_quark_to_string (msg_quark);
|
|
|
|
}
|
|
|
|
}
|
1998-07-10 07:51:57 +02:00
|
|
|
#elif NO_SYS_ERRLIST
|
|
|
|
switch (errnum)
|
|
|
|
{
|
|
|
|
#ifdef E2BIG
|
|
|
|
case E2BIG: return "argument list too long";
|
|
|
|
#endif
|
|
|
|
#ifdef EACCES
|
|
|
|
case EACCES: return "permission denied";
|
|
|
|
#endif
|
|
|
|
#ifdef EADDRINUSE
|
|
|
|
case EADDRINUSE: return "address already in use";
|
|
|
|
#endif
|
|
|
|
#ifdef EADDRNOTAVAIL
|
|
|
|
case EADDRNOTAVAIL: return "can't assign requested address";
|
|
|
|
#endif
|
|
|
|
#ifdef EADV
|
|
|
|
case EADV: return "advertise error";
|
|
|
|
#endif
|
|
|
|
#ifdef EAFNOSUPPORT
|
|
|
|
case EAFNOSUPPORT: return "address family not supported by protocol family";
|
|
|
|
#endif
|
|
|
|
#ifdef EAGAIN
|
|
|
|
case EAGAIN: return "try again";
|
|
|
|
#endif
|
|
|
|
#ifdef EALIGN
|
|
|
|
case EALIGN: return "EALIGN";
|
|
|
|
#endif
|
|
|
|
#ifdef EALREADY
|
|
|
|
case EALREADY: return "operation already in progress";
|
|
|
|
#endif
|
|
|
|
#ifdef EBADE
|
|
|
|
case EBADE: return "bad exchange descriptor";
|
|
|
|
#endif
|
|
|
|
#ifdef EBADF
|
|
|
|
case EBADF: return "bad file number";
|
|
|
|
#endif
|
|
|
|
#ifdef EBADFD
|
|
|
|
case EBADFD: return "file descriptor in bad state";
|
|
|
|
#endif
|
|
|
|
#ifdef EBADMSG
|
|
|
|
case EBADMSG: return "not a data message";
|
|
|
|
#endif
|
|
|
|
#ifdef EBADR
|
|
|
|
case EBADR: return "bad request descriptor";
|
|
|
|
#endif
|
|
|
|
#ifdef EBADRPC
|
|
|
|
case EBADRPC: return "RPC structure is bad";
|
|
|
|
#endif
|
|
|
|
#ifdef EBADRQC
|
|
|
|
case EBADRQC: return "bad request code";
|
|
|
|
#endif
|
|
|
|
#ifdef EBADSLT
|
|
|
|
case EBADSLT: return "invalid slot";
|
|
|
|
#endif
|
|
|
|
#ifdef EBFONT
|
|
|
|
case EBFONT: return "bad font file format";
|
|
|
|
#endif
|
|
|
|
#ifdef EBUSY
|
|
|
|
case EBUSY: return "mount device busy";
|
|
|
|
#endif
|
|
|
|
#ifdef ECHILD
|
|
|
|
case ECHILD: return "no children";
|
|
|
|
#endif
|
|
|
|
#ifdef ECHRNG
|
|
|
|
case ECHRNG: return "channel number out of range";
|
|
|
|
#endif
|
|
|
|
#ifdef ECOMM
|
|
|
|
case ECOMM: return "communication error on send";
|
|
|
|
#endif
|
|
|
|
#ifdef ECONNABORTED
|
|
|
|
case ECONNABORTED: return "software caused connection abort";
|
|
|
|
#endif
|
|
|
|
#ifdef ECONNREFUSED
|
|
|
|
case ECONNREFUSED: return "connection refused";
|
|
|
|
#endif
|
|
|
|
#ifdef ECONNRESET
|
|
|
|
case ECONNRESET: return "connection reset by peer";
|
|
|
|
#endif
|
|
|
|
#if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK))
|
|
|
|
case EDEADLK: return "resource deadlock avoided";
|
|
|
|
#endif
|
|
|
|
#ifdef EDEADLOCK
|
|
|
|
case EDEADLOCK: return "resource deadlock avoided";
|
|
|
|
#endif
|
|
|
|
#ifdef EDESTADDRREQ
|
|
|
|
case EDESTADDRREQ: return "destination address required";
|
|
|
|
#endif
|
|
|
|
#ifdef EDIRTY
|
|
|
|
case EDIRTY: return "mounting a dirty fs w/o force";
|
|
|
|
#endif
|
|
|
|
#ifdef EDOM
|
|
|
|
case EDOM: return "math argument out of range";
|
|
|
|
#endif
|
|
|
|
#ifdef EDOTDOT
|
|
|
|
case EDOTDOT: return "cross mount point";
|
|
|
|
#endif
|
|
|
|
#ifdef EDQUOT
|
|
|
|
case EDQUOT: return "disk quota exceeded";
|
|
|
|
#endif
|
|
|
|
#ifdef EDUPPKG
|
|
|
|
case EDUPPKG: return "duplicate package name";
|
|
|
|
#endif
|
|
|
|
#ifdef EEXIST
|
|
|
|
case EEXIST: return "file already exists";
|
|
|
|
#endif
|
|
|
|
#ifdef EFAULT
|
|
|
|
case EFAULT: return "bad address in system call argument";
|
|
|
|
#endif
|
|
|
|
#ifdef EFBIG
|
|
|
|
case EFBIG: return "file too large";
|
|
|
|
#endif
|
|
|
|
#ifdef EHOSTDOWN
|
|
|
|
case EHOSTDOWN: return "host is down";
|
|
|
|
#endif
|
|
|
|
#ifdef EHOSTUNREACH
|
|
|
|
case EHOSTUNREACH: return "host is unreachable";
|
|
|
|
#endif
|
|
|
|
#ifdef EIDRM
|
|
|
|
case EIDRM: return "identifier removed";
|
|
|
|
#endif
|
|
|
|
#ifdef EINIT
|
|
|
|
case EINIT: return "initialization error";
|
|
|
|
#endif
|
|
|
|
#ifdef EINPROGRESS
|
|
|
|
case EINPROGRESS: return "operation now in progress";
|
|
|
|
#endif
|
|
|
|
#ifdef EINTR
|
|
|
|
case EINTR: return "interrupted system call";
|
|
|
|
#endif
|
|
|
|
#ifdef EINVAL
|
|
|
|
case EINVAL: return "invalid argument";
|
|
|
|
#endif
|
|
|
|
#ifdef EIO
|
|
|
|
case EIO: return "I/O error";
|
|
|
|
#endif
|
|
|
|
#ifdef EISCONN
|
|
|
|
case EISCONN: return "socket is already connected";
|
|
|
|
#endif
|
|
|
|
#ifdef EISDIR
|
2001-09-18 18:33:20 +02:00
|
|
|
case EISDIR: return "is a directory";
|
1998-07-10 07:51:57 +02:00
|
|
|
#endif
|
|
|
|
#ifdef EISNAME
|
|
|
|
case EISNAM: return "is a name file";
|
|
|
|
#endif
|
|
|
|
#ifdef ELBIN
|
|
|
|
case ELBIN: return "ELBIN";
|
|
|
|
#endif
|
|
|
|
#ifdef EL2HLT
|
|
|
|
case EL2HLT: return "level 2 halted";
|
|
|
|
#endif
|
|
|
|
#ifdef EL2NSYNC
|
|
|
|
case EL2NSYNC: return "level 2 not synchronized";
|
|
|
|
#endif
|
|
|
|
#ifdef EL3HLT
|
|
|
|
case EL3HLT: return "level 3 halted";
|
|
|
|
#endif
|
|
|
|
#ifdef EL3RST
|
|
|
|
case EL3RST: return "level 3 reset";
|
|
|
|
#endif
|
|
|
|
#ifdef ELIBACC
|
|
|
|
case ELIBACC: return "can not access a needed shared library";
|
|
|
|
#endif
|
|
|
|
#ifdef ELIBBAD
|
|
|
|
case ELIBBAD: return "accessing a corrupted shared library";
|
|
|
|
#endif
|
|
|
|
#ifdef ELIBEXEC
|
|
|
|
case ELIBEXEC: return "can not exec a shared library directly";
|
|
|
|
#endif
|
|
|
|
#ifdef ELIBMAX
|
|
|
|
case ELIBMAX: return "attempting to link in more shared libraries than system limit";
|
|
|
|
#endif
|
|
|
|
#ifdef ELIBSCN
|
|
|
|
case ELIBSCN: return ".lib section in a.out corrupted";
|
|
|
|
#endif
|
|
|
|
#ifdef ELNRNG
|
|
|
|
case ELNRNG: return "link number out of range";
|
|
|
|
#endif
|
|
|
|
#ifdef ELOOP
|
|
|
|
case ELOOP: return "too many levels of symbolic links";
|
|
|
|
#endif
|
|
|
|
#ifdef EMFILE
|
|
|
|
case EMFILE: return "too many open files";
|
|
|
|
#endif
|
|
|
|
#ifdef EMLINK
|
|
|
|
case EMLINK: return "too many links";
|
|
|
|
#endif
|
|
|
|
#ifdef EMSGSIZE
|
|
|
|
case EMSGSIZE: return "message too long";
|
|
|
|
#endif
|
|
|
|
#ifdef EMULTIHOP
|
|
|
|
case EMULTIHOP: return "multihop attempted";
|
|
|
|
#endif
|
|
|
|
#ifdef ENAMETOOLONG
|
|
|
|
case ENAMETOOLONG: return "file name too long";
|
|
|
|
#endif
|
|
|
|
#ifdef ENAVAIL
|
|
|
|
case ENAVAIL: return "not available";
|
|
|
|
#endif
|
|
|
|
#ifdef ENET
|
|
|
|
case ENET: return "ENET";
|
|
|
|
#endif
|
|
|
|
#ifdef ENETDOWN
|
|
|
|
case ENETDOWN: return "network is down";
|
|
|
|
#endif
|
|
|
|
#ifdef ENETRESET
|
|
|
|
case ENETRESET: return "network dropped connection on reset";
|
|
|
|
#endif
|
|
|
|
#ifdef ENETUNREACH
|
|
|
|
case ENETUNREACH: return "network is unreachable";
|
|
|
|
#endif
|
|
|
|
#ifdef ENFILE
|
|
|
|
case ENFILE: return "file table overflow";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOANO
|
|
|
|
case ENOANO: return "anode table overflow";
|
|
|
|
#endif
|
|
|
|
#if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR))
|
|
|
|
case ENOBUFS: return "no buffer space available";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOCSI
|
|
|
|
case ENOCSI: return "no CSI structure available";
|
|
|
|
#endif
|
|
|
|
#ifdef ENODATA
|
|
|
|
case ENODATA: return "no data available";
|
|
|
|
#endif
|
|
|
|
#ifdef ENODEV
|
|
|
|
case ENODEV: return "no such device";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOENT
|
|
|
|
case ENOENT: return "no such file or directory";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOEXEC
|
|
|
|
case ENOEXEC: return "exec format error";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOLCK
|
|
|
|
case ENOLCK: return "no locks available";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOLINK
|
|
|
|
case ENOLINK: return "link has be severed";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOMEM
|
|
|
|
case ENOMEM: return "not enough memory";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOMSG
|
|
|
|
case ENOMSG: return "no message of desired type";
|
|
|
|
#endif
|
|
|
|
#ifdef ENONET
|
|
|
|
case ENONET: return "machine is not on the network";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOPKG
|
|
|
|
case ENOPKG: return "package not installed";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOPROTOOPT
|
|
|
|
case ENOPROTOOPT: return "bad proocol option";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOSPC
|
|
|
|
case ENOSPC: return "no space left on device";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOSR
|
|
|
|
case ENOSR: return "out of stream resources";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOSTR
|
|
|
|
case ENOSTR: return "not a stream device";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOSYM
|
|
|
|
case ENOSYM: return "unresolved symbol name";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOSYS
|
|
|
|
case ENOSYS: return "function not implemented";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOTBLK
|
|
|
|
case ENOTBLK: return "block device required";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOTCONN
|
|
|
|
case ENOTCONN: return "socket is not connected";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOTDIR
|
|
|
|
case ENOTDIR: return "not a directory";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOTEMPTY
|
|
|
|
case ENOTEMPTY: return "directory not empty";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOTNAM
|
|
|
|
case ENOTNAM: return "not a name file";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOTSOCK
|
|
|
|
case ENOTSOCK: return "socket operation on non-socket";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOTTY
|
|
|
|
case ENOTTY: return "inappropriate device for ioctl";
|
|
|
|
#endif
|
|
|
|
#ifdef ENOTUNIQ
|
|
|
|
case ENOTUNIQ: return "name not unique on network";
|
|
|
|
#endif
|
|
|
|
#ifdef ENXIO
|
|
|
|
case ENXIO: return "no such device or address";
|
|
|
|
#endif
|
|
|
|
#ifdef EOPNOTSUPP
|
|
|
|
case EOPNOTSUPP: return "operation not supported on socket";
|
|
|
|
#endif
|
|
|
|
#ifdef EPERM
|
|
|
|
case EPERM: return "not owner";
|
|
|
|
#endif
|
|
|
|
#ifdef EPFNOSUPPORT
|
|
|
|
case EPFNOSUPPORT: return "protocol family not supported";
|
|
|
|
#endif
|
|
|
|
#ifdef EPIPE
|
|
|
|
case EPIPE: return "broken pipe";
|
|
|
|
#endif
|
|
|
|
#ifdef EPROCLIM
|
|
|
|
case EPROCLIM: return "too many processes";
|
|
|
|
#endif
|
|
|
|
#ifdef EPROCUNAVAIL
|
|
|
|
case EPROCUNAVAIL: return "bad procedure for program";
|
|
|
|
#endif
|
|
|
|
#ifdef EPROGMISMATCH
|
|
|
|
case EPROGMISMATCH: return "program version wrong";
|
|
|
|
#endif
|
|
|
|
#ifdef EPROGUNAVAIL
|
|
|
|
case EPROGUNAVAIL: return "RPC program not available";
|
|
|
|
#endif
|
|
|
|
#ifdef EPROTO
|
|
|
|
case EPROTO: return "protocol error";
|
|
|
|
#endif
|
|
|
|
#ifdef EPROTONOSUPPORT
|
|
|
|
case EPROTONOSUPPORT: return "protocol not suppored";
|
|
|
|
#endif
|
|
|
|
#ifdef EPROTOTYPE
|
|
|
|
case EPROTOTYPE: return "protocol wrong type for socket";
|
|
|
|
#endif
|
|
|
|
#ifdef ERANGE
|
|
|
|
case ERANGE: return "math result unrepresentable";
|
|
|
|
#endif
|
|
|
|
#if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED))
|
|
|
|
case EREFUSED: return "EREFUSED";
|
|
|
|
#endif
|
|
|
|
#ifdef EREMCHG
|
|
|
|
case EREMCHG: return "remote address changed";
|
|
|
|
#endif
|
|
|
|
#ifdef EREMDEV
|
|
|
|
case EREMDEV: return "remote device";
|
|
|
|
#endif
|
|
|
|
#ifdef EREMOTE
|
|
|
|
case EREMOTE: return "pathname hit remote file system";
|
|
|
|
#endif
|
|
|
|
#ifdef EREMOTEIO
|
|
|
|
case EREMOTEIO: return "remote i/o error";
|
|
|
|
#endif
|
|
|
|
#ifdef EREMOTERELEASE
|
|
|
|
case EREMOTERELEASE: return "EREMOTERELEASE";
|
|
|
|
#endif
|
|
|
|
#ifdef EROFS
|
|
|
|
case EROFS: return "read-only file system";
|
|
|
|
#endif
|
|
|
|
#ifdef ERPCMISMATCH
|
|
|
|
case ERPCMISMATCH: return "RPC version is wrong";
|
|
|
|
#endif
|
|
|
|
#ifdef ERREMOTE
|
|
|
|
case ERREMOTE: return "object is remote";
|
|
|
|
#endif
|
|
|
|
#ifdef ESHUTDOWN
|
|
|
|
case ESHUTDOWN: return "can't send afer socket shutdown";
|
|
|
|
#endif
|
|
|
|
#ifdef ESOCKTNOSUPPORT
|
|
|
|
case ESOCKTNOSUPPORT: return "socket type not supported";
|
|
|
|
#endif
|
|
|
|
#ifdef ESPIPE
|
|
|
|
case ESPIPE: return "invalid seek";
|
|
|
|
#endif
|
|
|
|
#ifdef ESRCH
|
|
|
|
case ESRCH: return "no such process";
|
|
|
|
#endif
|
|
|
|
#ifdef ESRMNT
|
|
|
|
case ESRMNT: return "srmount error";
|
|
|
|
#endif
|
|
|
|
#ifdef ESTALE
|
|
|
|
case ESTALE: return "stale remote file handle";
|
|
|
|
#endif
|
|
|
|
#ifdef ESUCCESS
|
|
|
|
case ESUCCESS: return "Error 0";
|
|
|
|
#endif
|
|
|
|
#ifdef ETIME
|
|
|
|
case ETIME: return "timer expired";
|
|
|
|
#endif
|
|
|
|
#ifdef ETIMEDOUT
|
|
|
|
case ETIMEDOUT: return "connection timed out";
|
|
|
|
#endif
|
|
|
|
#ifdef ETOOMANYREFS
|
|
|
|
case ETOOMANYREFS: return "too many references: can't splice";
|
|
|
|
#endif
|
|
|
|
#ifdef ETXTBSY
|
|
|
|
case ETXTBSY: return "text file or pseudo-device busy";
|
|
|
|
#endif
|
|
|
|
#ifdef EUCLEAN
|
|
|
|
case EUCLEAN: return "structure needs cleaning";
|
|
|
|
#endif
|
|
|
|
#ifdef EUNATCH
|
|
|
|
case EUNATCH: return "protocol driver not attached";
|
|
|
|
#endif
|
|
|
|
#ifdef EUSERS
|
|
|
|
case EUSERS: return "too many users";
|
|
|
|
#endif
|
|
|
|
#ifdef EVERSION
|
|
|
|
case EVERSION: return "version mismatch";
|
|
|
|
#endif
|
|
|
|
#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
|
|
|
|
case EWOULDBLOCK: return "operation would block";
|
|
|
|
#endif
|
|
|
|
#ifdef EXDEV
|
|
|
|
case EXDEV: return "cross-domain link";
|
|
|
|
#endif
|
|
|
|
#ifdef EXFULL
|
|
|
|
case EXFULL: return "message tables full";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
#else /* NO_SYS_ERRLIST */
|
|
|
|
extern int sys_nerr;
|
|
|
|
extern char *sys_errlist[];
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
if ((errnum > 0) && (errnum <= sys_nerr))
|
|
|
|
return sys_errlist [errnum];
|
|
|
|
#endif /* NO_SYS_ERRLIST */
|
1998-12-15 06:28:02 +01:00
|
|
|
|
|
|
|
msg = g_static_private_get (&msg_private);
|
1999-02-10 09:06:26 +01:00
|
|
|
if (!msg)
|
1998-12-15 06:28:02 +01:00
|
|
|
{
|
1999-02-10 09:06:26 +01:00
|
|
|
msg = g_new (gchar, 64);
|
1998-12-15 06:28:02 +01:00
|
|
|
g_static_private_set (&msg_private, msg, g_free);
|
|
|
|
}
|
|
|
|
|
2002-11-21 01:35:15 +01:00
|
|
|
_g_sprintf (msg, "unknown error (%d)", errnum);
|
1999-02-10 09:06:26 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
return msg;
|
|
|
|
}
|
|
|
|
|
2001-02-18 00:30:48 +01:00
|
|
|
G_CONST_RETURN gchar*
|
1998-07-10 07:51:57 +02:00
|
|
|
g_strsignal (gint signum)
|
|
|
|
{
|
1999-01-19 10:07:28 +01:00
|
|
|
static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT;
|
1998-12-15 06:28:02 +01:00
|
|
|
char *msg;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
#ifdef HAVE_STRSIGNAL
|
2002-03-08 16:50:54 +01:00
|
|
|
const char *msg_locale;
|
|
|
|
|
2001-01-29 22:33:37 +01:00
|
|
|
#if defined(G_OS_BEOS) || defined(G_WITH_CYGWIN)
|
2001-03-09 22:23:33 +01:00
|
|
|
extern const char *strsignal(int);
|
|
|
|
#else
|
1999-05-08 09:40:44 +02:00
|
|
|
/* this is declared differently (const) in string.h on BeOS */
|
1998-07-10 07:51:57 +02:00
|
|
|
extern char *strsignal (int sig);
|
2001-03-09 22:23:33 +01:00
|
|
|
#endif /* !G_OS_BEOS && !G_WITH_CYGWIN */
|
2002-03-08 16:50:54 +01:00
|
|
|
msg_locale = strsignal (signum);
|
|
|
|
if (g_get_charset (NULL))
|
|
|
|
return msg_locale;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gchar *msg_utf8 = g_locale_to_utf8 (msg_locale, -1, NULL, NULL, NULL);
|
|
|
|
if (msg_utf8)
|
|
|
|
{
|
|
|
|
/* Stick in the quark table so that we can return a static result
|
|
|
|
*/
|
|
|
|
GQuark msg_quark = g_quark_from_string (msg_utf8);
|
|
|
|
g_free (msg_utf8);
|
|
|
|
|
|
|
|
return g_quark_to_string (msg_quark);
|
|
|
|
}
|
|
|
|
}
|
1998-07-10 07:51:57 +02:00
|
|
|
#elif NO_SYS_SIGLIST
|
|
|
|
switch (signum)
|
|
|
|
{
|
|
|
|
#ifdef SIGHUP
|
|
|
|
case SIGHUP: return "Hangup";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGINT
|
|
|
|
case SIGINT: return "Interrupt";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGQUIT
|
|
|
|
case SIGQUIT: return "Quit";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGILL
|
|
|
|
case SIGILL: return "Illegal instruction";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGTRAP
|
|
|
|
case SIGTRAP: return "Trace/breakpoint trap";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGABRT
|
|
|
|
case SIGABRT: return "IOT trap/Abort";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGBUS
|
|
|
|
case SIGBUS: return "Bus error";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGFPE
|
|
|
|
case SIGFPE: return "Floating point exception";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGKILL
|
|
|
|
case SIGKILL: return "Killed";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGUSR1
|
|
|
|
case SIGUSR1: return "User defined signal 1";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGSEGV
|
|
|
|
case SIGSEGV: return "Segmentation fault";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGUSR2
|
|
|
|
case SIGUSR2: return "User defined signal 2";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGPIPE
|
|
|
|
case SIGPIPE: return "Broken pipe";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGALRM
|
|
|
|
case SIGALRM: return "Alarm clock";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGTERM
|
|
|
|
case SIGTERM: return "Terminated";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGSTKFLT
|
|
|
|
case SIGSTKFLT: return "Stack fault";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGCHLD
|
|
|
|
case SIGCHLD: return "Child exited";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGCONT
|
|
|
|
case SIGCONT: return "Continued";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGSTOP
|
|
|
|
case SIGSTOP: return "Stopped (signal)";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGTSTP
|
|
|
|
case SIGTSTP: return "Stopped";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGTTIN
|
|
|
|
case SIGTTIN: return "Stopped (tty input)";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGTTOU
|
|
|
|
case SIGTTOU: return "Stopped (tty output)";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGURG
|
|
|
|
case SIGURG: return "Urgent condition";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGXCPU
|
|
|
|
case SIGXCPU: return "CPU time limit exceeded";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGXFSZ
|
|
|
|
case SIGXFSZ: return "File size limit exceeded";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGVTALRM
|
|
|
|
case SIGVTALRM: return "Virtual time alarm";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGPROF
|
|
|
|
case SIGPROF: return "Profile signal";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGWINCH
|
|
|
|
case SIGWINCH: return "Window size changed";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGIO
|
|
|
|
case SIGIO: return "Possible I/O";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGPWR
|
|
|
|
case SIGPWR: return "Power failure";
|
|
|
|
#endif
|
|
|
|
#ifdef SIGUNUSED
|
|
|
|
case SIGUNUSED: return "Unused signal";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
#else /* NO_SYS_SIGLIST */
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1999-01-25 13:45:51 +01:00
|
|
|
#ifdef NO_SYS_SIGLIST_DECL
|
|
|
|
extern char *sys_siglist[]; /*(see Tue Jan 19 00:44:24 1999 in changelog)*/
|
1999-01-19 10:07:28 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
return (char*) /* this function should return const --josh */ sys_siglist [signum];
|
1998-07-10 07:51:57 +02:00
|
|
|
#endif /* NO_SYS_SIGLIST */
|
1998-12-15 06:28:02 +01:00
|
|
|
|
|
|
|
msg = g_static_private_get (&msg_private);
|
1999-02-10 09:06:26 +01:00
|
|
|
if (!msg)
|
1998-12-15 06:28:02 +01:00
|
|
|
{
|
1999-02-10 09:06:26 +01:00
|
|
|
msg = g_new (gchar, 64);
|
1998-12-15 06:28:02 +01:00
|
|
|
g_static_private_set (&msg_private, msg, g_free);
|
|
|
|
}
|
1999-01-19 10:07:28 +01:00
|
|
|
|
2002-11-21 01:35:15 +01:00
|
|
|
_g_sprintf (msg, "unknown signal (%d)", signum);
|
added g_strlcat() and g_strlcpy() wrappers, supplied by David Wheeler
Wed Jul 26 05:47:48 2000 Tim Janik <timj@gtk.org>
* configure.in:
* testglib.c:
* gstrfuncs.c:
* glib.h: added g_strlcat() and g_strlcpy() wrappers, supplied by
David Wheeler <dwheeler@ida.org>:
* glib.h, gstrfuncs.c: added g_strlcpy and g_strlcat to support
safe manipulation of fixed-length string buffers.
These functions were originally developed by Todd Miller to simplify
development of security-related programs, and
are available on many (but not all) Unix-like systems,
including OpenBSD, FreeBSD, and Solaris. See
ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3
and http://www.openbsd.org/security.html.
If there's a strlcpy/strlcat on the system, it's called, otherwise
an implementation is provided.
* testglib.c: Added tests for g_strlcpy, g_strlcat.
2000-07-26 05:51:07 +02:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
return msg;
|
|
|
|
}
|
|
|
|
|
added g_strlcat() and g_strlcpy() wrappers, supplied by David Wheeler
Wed Jul 26 05:47:48 2000 Tim Janik <timj@gtk.org>
* configure.in:
* testglib.c:
* gstrfuncs.c:
* glib.h: added g_strlcat() and g_strlcpy() wrappers, supplied by
David Wheeler <dwheeler@ida.org>:
* glib.h, gstrfuncs.c: added g_strlcpy and g_strlcat to support
safe manipulation of fixed-length string buffers.
These functions were originally developed by Todd Miller to simplify
development of security-related programs, and
are available on many (but not all) Unix-like systems,
including OpenBSD, FreeBSD, and Solaris. See
ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3
and http://www.openbsd.org/security.html.
If there's a strlcpy/strlcat on the system, it's called, otherwise
an implementation is provided.
* testglib.c: Added tests for g_strlcpy, g_strlcat.
2000-07-26 05:51:07 +02:00
|
|
|
/* Functions g_strlcpy and g_strlcat were originally developed by
|
|
|
|
* Todd C. Miller <Todd.Miller@courtesan.com> to simplify writing secure code.
|
|
|
|
* See ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3
|
|
|
|
* for more information.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_STRLCPY
|
|
|
|
/* Use the native ones, if available; they might be implemented in assembly */
|
|
|
|
gsize
|
|
|
|
g_strlcpy (gchar *dest,
|
|
|
|
const gchar *src,
|
|
|
|
gsize dest_size)
|
|
|
|
{
|
2000-07-27 05:16:15 +02:00
|
|
|
g_return_val_if_fail (dest != NULL, 0);
|
|
|
|
g_return_val_if_fail (src != NULL, 0);
|
added g_strlcat() and g_strlcpy() wrappers, supplied by David Wheeler
Wed Jul 26 05:47:48 2000 Tim Janik <timj@gtk.org>
* configure.in:
* testglib.c:
* gstrfuncs.c:
* glib.h: added g_strlcat() and g_strlcpy() wrappers, supplied by
David Wheeler <dwheeler@ida.org>:
* glib.h, gstrfuncs.c: added g_strlcpy and g_strlcat to support
safe manipulation of fixed-length string buffers.
These functions were originally developed by Todd Miller to simplify
development of security-related programs, and
are available on many (but not all) Unix-like systems,
including OpenBSD, FreeBSD, and Solaris. See
ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3
and http://www.openbsd.org/security.html.
If there's a strlcpy/strlcat on the system, it's called, otherwise
an implementation is provided.
* testglib.c: Added tests for g_strlcpy, g_strlcat.
2000-07-26 05:51:07 +02:00
|
|
|
|
|
|
|
return strlcpy (dest, src, dest_size);
|
|
|
|
}
|
|
|
|
|
|
|
|
gsize
|
|
|
|
g_strlcat (gchar *dest,
|
|
|
|
const gchar *src,
|
|
|
|
gsize dest_size)
|
|
|
|
{
|
2000-07-27 05:16:15 +02:00
|
|
|
g_return_val_if_fail (dest != NULL, 0);
|
|
|
|
g_return_val_if_fail (src != NULL, 0);
|
added g_strlcat() and g_strlcpy() wrappers, supplied by David Wheeler
Wed Jul 26 05:47:48 2000 Tim Janik <timj@gtk.org>
* configure.in:
* testglib.c:
* gstrfuncs.c:
* glib.h: added g_strlcat() and g_strlcpy() wrappers, supplied by
David Wheeler <dwheeler@ida.org>:
* glib.h, gstrfuncs.c: added g_strlcpy and g_strlcat to support
safe manipulation of fixed-length string buffers.
These functions were originally developed by Todd Miller to simplify
development of security-related programs, and
are available on many (but not all) Unix-like systems,
including OpenBSD, FreeBSD, and Solaris. See
ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3
and http://www.openbsd.org/security.html.
If there's a strlcpy/strlcat on the system, it's called, otherwise
an implementation is provided.
* testglib.c: Added tests for g_strlcpy, g_strlcat.
2000-07-26 05:51:07 +02:00
|
|
|
|
|
|
|
return strlcat (dest, src, dest_size);
|
|
|
|
}
|
|
|
|
|
|
|
|
#else /* ! HAVE_STRLCPY */
|
|
|
|
/* g_strlcpy
|
|
|
|
*
|
|
|
|
* Copy string src to buffer dest (of buffer size dest_size). At most
|
|
|
|
* dest_size-1 characters will be copied. Always NUL terminates
|
|
|
|
* (unless dest_size == 0). This function does NOT allocate memory.
|
|
|
|
* Unlike strncpy, this function doesn't pad dest (so it's often faster).
|
|
|
|
* Returns size of attempted result, strlen(src),
|
|
|
|
* so if retval >= dest_size, truncation occurred.
|
|
|
|
*/
|
|
|
|
gsize
|
|
|
|
g_strlcpy (gchar *dest,
|
|
|
|
const gchar *src,
|
|
|
|
gsize dest_size)
|
|
|
|
{
|
|
|
|
register gchar *d = dest;
|
|
|
|
register const gchar *s = src;
|
|
|
|
register gsize n = dest_size;
|
|
|
|
|
2000-07-26 17:39:44 +02:00
|
|
|
g_return_val_if_fail (dest != NULL, 0);
|
|
|
|
g_return_val_if_fail (src != NULL, 0);
|
added g_strlcat() and g_strlcpy() wrappers, supplied by David Wheeler
Wed Jul 26 05:47:48 2000 Tim Janik <timj@gtk.org>
* configure.in:
* testglib.c:
* gstrfuncs.c:
* glib.h: added g_strlcat() and g_strlcpy() wrappers, supplied by
David Wheeler <dwheeler@ida.org>:
* glib.h, gstrfuncs.c: added g_strlcpy and g_strlcat to support
safe manipulation of fixed-length string buffers.
These functions were originally developed by Todd Miller to simplify
development of security-related programs, and
are available on many (but not all) Unix-like systems,
including OpenBSD, FreeBSD, and Solaris. See
ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3
and http://www.openbsd.org/security.html.
If there's a strlcpy/strlcat on the system, it's called, otherwise
an implementation is provided.
* testglib.c: Added tests for g_strlcpy, g_strlcat.
2000-07-26 05:51:07 +02:00
|
|
|
|
|
|
|
/* Copy as many bytes as will fit */
|
|
|
|
if (n != 0 && --n != 0)
|
|
|
|
do
|
|
|
|
{
|
|
|
|
register gchar c = *s++;
|
|
|
|
|
|
|
|
*d++ = c;
|
|
|
|
if (c == 0)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
while (--n != 0);
|
|
|
|
|
|
|
|
/* If not enough room in dest, add NUL and traverse rest of src */
|
|
|
|
if (n == 0)
|
|
|
|
{
|
|
|
|
if (dest_size != 0)
|
|
|
|
*d = 0;
|
|
|
|
while (*s++)
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
|
|
|
return s - src - 1; /* count does not include NUL */
|
|
|
|
}
|
|
|
|
|
|
|
|
/* g_strlcat
|
|
|
|
*
|
|
|
|
* Appends string src to buffer dest (of buffer size dest_size).
|
|
|
|
* At most dest_size-1 characters will be copied.
|
|
|
|
* Unlike strncat, dest_size is the full size of dest, not the space left over.
|
|
|
|
* This function does NOT allocate memory.
|
|
|
|
* This always NUL terminates (unless siz == 0 or there were no NUL characters
|
|
|
|
* in the dest_size characters of dest to start with).
|
|
|
|
* Returns size of attempted result, which is
|
|
|
|
* MIN (dest_size, strlen (original dest)) + strlen (src),
|
|
|
|
* so if retval >= dest_size, truncation occurred.
|
|
|
|
*/
|
|
|
|
gsize
|
|
|
|
g_strlcat (gchar *dest,
|
|
|
|
const gchar *src,
|
|
|
|
gsize dest_size)
|
|
|
|
{
|
|
|
|
register gchar *d = dest;
|
|
|
|
register const gchar *s = src;
|
|
|
|
register gsize bytes_left = dest_size;
|
|
|
|
gsize dlength; /* Logically, MIN (strlen (d), dest_size) */
|
|
|
|
|
2000-07-26 17:39:44 +02:00
|
|
|
g_return_val_if_fail (dest != NULL, 0);
|
|
|
|
g_return_val_if_fail (src != NULL, 0);
|
added g_strlcat() and g_strlcpy() wrappers, supplied by David Wheeler
Wed Jul 26 05:47:48 2000 Tim Janik <timj@gtk.org>
* configure.in:
* testglib.c:
* gstrfuncs.c:
* glib.h: added g_strlcat() and g_strlcpy() wrappers, supplied by
David Wheeler <dwheeler@ida.org>:
* glib.h, gstrfuncs.c: added g_strlcpy and g_strlcat to support
safe manipulation of fixed-length string buffers.
These functions were originally developed by Todd Miller to simplify
development of security-related programs, and
are available on many (but not all) Unix-like systems,
including OpenBSD, FreeBSD, and Solaris. See
ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3
and http://www.openbsd.org/security.html.
If there's a strlcpy/strlcat on the system, it's called, otherwise
an implementation is provided.
* testglib.c: Added tests for g_strlcpy, g_strlcat.
2000-07-26 05:51:07 +02:00
|
|
|
|
|
|
|
/* Find the end of dst and adjust bytes left but don't go past end */
|
|
|
|
while (*d != 0 && bytes_left-- != 0)
|
|
|
|
d++;
|
|
|
|
dlength = d - dest;
|
|
|
|
bytes_left = dest_size - dlength;
|
|
|
|
|
|
|
|
if (bytes_left == 0)
|
|
|
|
return dlength + strlen (s);
|
|
|
|
|
|
|
|
while (*s != 0)
|
|
|
|
{
|
|
|
|
if (bytes_left != 1)
|
|
|
|
{
|
|
|
|
*d++ = *s;
|
|
|
|
bytes_left--;
|
|
|
|
}
|
|
|
|
s++;
|
|
|
|
}
|
|
|
|
*d = 0;
|
|
|
|
|
|
|
|
return dlength + (s - src); /* count does not include NUL */
|
|
|
|
}
|
|
|
|
#endif /* ! HAVE_STRLCPY */
|
|
|
|
|
2001-06-30 18:54:33 +02:00
|
|
|
/**
|
|
|
|
* g_ascii_strdown:
|
2001-10-03 01:09:51 +02:00
|
|
|
* @str: a string.
|
2001-09-25 17:55:39 +02:00
|
|
|
* @len: length of @str in bytes, or -1 if @str is nul-terminated.
|
2001-06-30 18:54:33 +02:00
|
|
|
*
|
|
|
|
* Converts all upper case ASCII letters to lower case ASCII letters.
|
|
|
|
*
|
2001-10-03 01:09:51 +02:00
|
|
|
* Return value: a newly-allocated string, with all the upper case
|
2001-09-25 17:55:39 +02:00
|
|
|
* characters in @str converted to lower case, with
|
2001-10-03 01:09:51 +02:00
|
|
|
* semantics that exactly match g_ascii_tolower(). (Note
|
|
|
|
* that this is unlike the old g_strdown(), which modified
|
2001-07-19 22:07:41 +02:00
|
|
|
* the string in place.)
|
2001-06-30 18:54:33 +02:00
|
|
|
**/
|
|
|
|
gchar*
|
2001-09-25 17:55:39 +02:00
|
|
|
g_ascii_strdown (const gchar *str,
|
2001-09-27 21:14:36 +02:00
|
|
|
gssize len)
|
2001-06-30 18:54:33 +02:00
|
|
|
{
|
|
|
|
gchar *result, *s;
|
|
|
|
|
2001-09-25 17:55:39 +02:00
|
|
|
g_return_val_if_fail (str != NULL, NULL);
|
|
|
|
|
|
|
|
if (len < 0)
|
|
|
|
len = strlen (str);
|
2001-06-30 18:54:33 +02:00
|
|
|
|
2001-09-25 17:55:39 +02:00
|
|
|
result = g_strndup (str, len);
|
2001-06-30 18:54:33 +02:00
|
|
|
for (s = result; *s; s++)
|
|
|
|
*s = g_ascii_tolower (*s);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_ascii_strup:
|
2001-10-03 01:09:51 +02:00
|
|
|
* @str: a string.
|
2001-09-25 17:55:39 +02:00
|
|
|
* @len: length of @str in bytes, or -1 if @str is nul-terminated.
|
2001-06-30 18:54:33 +02:00
|
|
|
*
|
|
|
|
* Converts all lower case ASCII letters to upper case ASCII letters.
|
|
|
|
*
|
|
|
|
* Return value: a newly allocated string, with all the lower case
|
2001-09-25 17:55:39 +02:00
|
|
|
* characters in @str converted to upper case, with
|
2001-10-03 01:09:51 +02:00
|
|
|
* semantics that exactly match g_ascii_toupper(). (Note
|
|
|
|
* that this is unlike the old g_strup(), which modified
|
2001-07-19 22:07:41 +02:00
|
|
|
* the string in place.)
|
2001-06-30 18:54:33 +02:00
|
|
|
**/
|
|
|
|
gchar*
|
2001-09-25 17:55:39 +02:00
|
|
|
g_ascii_strup (const gchar *str,
|
2001-09-27 21:14:36 +02:00
|
|
|
gssize len)
|
2001-06-30 18:54:33 +02:00
|
|
|
{
|
2001-06-30 19:19:20 +02:00
|
|
|
gchar *result, *s;
|
2001-06-30 18:54:33 +02:00
|
|
|
|
2001-09-25 17:55:39 +02:00
|
|
|
g_return_val_if_fail (str != NULL, NULL);
|
|
|
|
|
|
|
|
if (len < 0)
|
|
|
|
len = strlen (str);
|
2001-06-30 18:54:33 +02:00
|
|
|
|
2001-09-25 17:55:39 +02:00
|
|
|
result = g_strndup (str, len);
|
2001-06-30 18:54:33 +02:00
|
|
|
for (s = result; *s; s++)
|
|
|
|
*s = g_ascii_toupper (*s);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2002-11-28 21:46:29 +01:00
|
|
|
/**
|
|
|
|
* g_strdown:
|
|
|
|
* @string: the string to convert.
|
|
|
|
*
|
|
|
|
* Converts a string to lower case.
|
|
|
|
*
|
|
|
|
* Return value: the string
|
|
|
|
*
|
|
|
|
* Deprecated: This function is totally broken for the reasons discussed in
|
|
|
|
* the g_strncasecmp() docs - use g_ascii_strdown() or g_utf8_strdown()
|
|
|
|
* instead.
|
|
|
|
**/
|
2000-05-12 17:23:16 +02:00
|
|
|
gchar*
|
1999-07-24 20:50:58 +02:00
|
|
|
g_strdown (gchar *string)
|
1998-07-10 07:51:57 +02:00
|
|
|
{
|
1999-07-24 20:50:58 +02:00
|
|
|
register guchar *s;
|
added g_strlcat() and g_strlcpy() wrappers, supplied by David Wheeler
Wed Jul 26 05:47:48 2000 Tim Janik <timj@gtk.org>
* configure.in:
* testglib.c:
* gstrfuncs.c:
* glib.h: added g_strlcat() and g_strlcpy() wrappers, supplied by
David Wheeler <dwheeler@ida.org>:
* glib.h, gstrfuncs.c: added g_strlcpy and g_strlcat to support
safe manipulation of fixed-length string buffers.
These functions were originally developed by Todd Miller to simplify
development of security-related programs, and
are available on many (but not all) Unix-like systems,
including OpenBSD, FreeBSD, and Solaris. See
ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3
and http://www.openbsd.org/security.html.
If there's a strlcpy/strlcat on the system, it's called, otherwise
an implementation is provided.
* testglib.c: Added tests for g_strlcpy, g_strlcat.
2000-07-26 05:51:07 +02:00
|
|
|
|
2000-05-12 17:23:16 +02:00
|
|
|
g_return_val_if_fail (string != NULL, NULL);
|
added g_strlcat() and g_strlcpy() wrappers, supplied by David Wheeler
Wed Jul 26 05:47:48 2000 Tim Janik <timj@gtk.org>
* configure.in:
* testglib.c:
* gstrfuncs.c:
* glib.h: added g_strlcat() and g_strlcpy() wrappers, supplied by
David Wheeler <dwheeler@ida.org>:
* glib.h, gstrfuncs.c: added g_strlcpy and g_strlcat to support
safe manipulation of fixed-length string buffers.
These functions were originally developed by Todd Miller to simplify
development of security-related programs, and
are available on many (but not all) Unix-like systems,
including OpenBSD, FreeBSD, and Solaris. See
ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3
and http://www.openbsd.org/security.html.
If there's a strlcpy/strlcat on the system, it's called, otherwise
an implementation is provided.
* testglib.c: Added tests for g_strlcpy, g_strlcat.
2000-07-26 05:51:07 +02:00
|
|
|
|
2000-09-29 15:37:01 +02:00
|
|
|
s = (guchar *) string;
|
added g_strlcat() and g_strlcpy() wrappers, supplied by David Wheeler
Wed Jul 26 05:47:48 2000 Tim Janik <timj@gtk.org>
* configure.in:
* testglib.c:
* gstrfuncs.c:
* glib.h: added g_strlcat() and g_strlcpy() wrappers, supplied by
David Wheeler <dwheeler@ida.org>:
* glib.h, gstrfuncs.c: added g_strlcpy and g_strlcat to support
safe manipulation of fixed-length string buffers.
These functions were originally developed by Todd Miller to simplify
development of security-related programs, and
are available on many (but not all) Unix-like systems,
including OpenBSD, FreeBSD, and Solaris. See
ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3
and http://www.openbsd.org/security.html.
If there's a strlcpy/strlcat on the system, it's called, otherwise
an implementation is provided.
* testglib.c: Added tests for g_strlcpy, g_strlcat.
2000-07-26 05:51:07 +02:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
while (*s)
|
|
|
|
{
|
2001-06-04 22:06:14 +02:00
|
|
|
if (isupper (*s))
|
|
|
|
*s = tolower (*s);
|
1998-07-10 07:51:57 +02:00
|
|
|
s++;
|
|
|
|
}
|
added g_strlcat() and g_strlcpy() wrappers, supplied by David Wheeler
Wed Jul 26 05:47:48 2000 Tim Janik <timj@gtk.org>
* configure.in:
* testglib.c:
* gstrfuncs.c:
* glib.h: added g_strlcat() and g_strlcpy() wrappers, supplied by
David Wheeler <dwheeler@ida.org>:
* glib.h, gstrfuncs.c: added g_strlcpy and g_strlcat to support
safe manipulation of fixed-length string buffers.
These functions were originally developed by Todd Miller to simplify
development of security-related programs, and
are available on many (but not all) Unix-like systems,
including OpenBSD, FreeBSD, and Solaris. See
ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3
and http://www.openbsd.org/security.html.
If there's a strlcpy/strlcat on the system, it's called, otherwise
an implementation is provided.
* testglib.c: Added tests for g_strlcpy, g_strlcat.
2000-07-26 05:51:07 +02:00
|
|
|
|
2000-09-29 15:37:01 +02:00
|
|
|
return (gchar *) string;
|
1998-07-10 07:51:57 +02:00
|
|
|
}
|
|
|
|
|
2002-11-28 21:46:29 +01:00
|
|
|
/**
|
|
|
|
* g_strup:
|
|
|
|
* @string: the string to convert.
|
|
|
|
*
|
|
|
|
* Converts a string to upper case.
|
|
|
|
*
|
|
|
|
* Return value: the string
|
|
|
|
*
|
|
|
|
* Deprecated: This function is totally broken for the reasons discussed in
|
|
|
|
* the g_strncasecmp() docs - use g_ascii_strup() or g_utf8_strup() instead.
|
|
|
|
**/
|
2000-05-12 17:23:16 +02:00
|
|
|
gchar*
|
1999-07-24 20:50:58 +02:00
|
|
|
g_strup (gchar *string)
|
1998-07-10 07:51:57 +02:00
|
|
|
{
|
1999-07-24 20:50:58 +02:00
|
|
|
register guchar *s;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
2000-05-12 17:23:16 +02:00
|
|
|
g_return_val_if_fail (string != NULL, NULL);
|
1999-01-19 10:07:28 +01:00
|
|
|
|
2000-09-29 15:37:01 +02:00
|
|
|
s = (guchar *) string;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
while (*s)
|
|
|
|
{
|
2001-06-04 22:06:14 +02:00
|
|
|
if (islower (*s))
|
|
|
|
*s = toupper (*s);
|
1998-07-10 07:51:57 +02:00
|
|
|
s++;
|
|
|
|
}
|
2000-05-12 17:23:16 +02:00
|
|
|
|
2000-09-29 15:37:01 +02:00
|
|
|
return (gchar *) string;
|
1998-07-10 07:51:57 +02:00
|
|
|
}
|
|
|
|
|
2000-05-12 17:23:16 +02:00
|
|
|
gchar*
|
1999-07-24 20:50:58 +02:00
|
|
|
g_strreverse (gchar *string)
|
1998-07-10 07:51:57 +02:00
|
|
|
{
|
2000-05-12 17:23:16 +02:00
|
|
|
g_return_val_if_fail (string != NULL, NULL);
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
if (*string)
|
|
|
|
{
|
|
|
|
register gchar *h, *t;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
h = string;
|
|
|
|
t = string + strlen (string) - 1;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
while (h < t)
|
|
|
|
{
|
|
|
|
register gchar c;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
c = *h;
|
|
|
|
*h = *t;
|
|
|
|
h++;
|
|
|
|
*t = c;
|
|
|
|
t--;
|
|
|
|
}
|
|
|
|
}
|
2000-05-12 17:23:16 +02:00
|
|
|
|
|
|
|
return string;
|
1998-07-10 07:51:57 +02:00
|
|
|
}
|
|
|
|
|
2001-06-30 18:54:33 +02:00
|
|
|
/**
|
|
|
|
* g_ascii_tolower:
|
2001-10-03 01:09:51 +02:00
|
|
|
* @c: any character.
|
2001-06-30 18:54:33 +02:00
|
|
|
*
|
|
|
|
* Convert a character to ASCII lower case.
|
|
|
|
*
|
2001-10-03 01:09:51 +02:00
|
|
|
* Unlike the standard C library tolower() function, this only
|
2001-06-30 18:54:33 +02:00
|
|
|
* recognizes standard ASCII letters and ignores the locale, returning
|
|
|
|
* all non-ASCII characters unchanged, even if they are lower case
|
|
|
|
* letters in a particular character set. Also unlike the standard
|
|
|
|
* library function, this takes and returns a char, not an int, so
|
2001-10-03 01:09:51 +02:00
|
|
|
* don't call it on %EOF but no need to worry about casting to #guchar
|
2001-06-30 18:54:33 +02:00
|
|
|
* before passing a possibly non-ASCII character in.
|
|
|
|
*
|
|
|
|
* Return value: the result of converting @c to lower case.
|
|
|
|
* If @c is not an ASCII upper case letter,
|
|
|
|
* @c is returned unchanged.
|
|
|
|
**/
|
|
|
|
gchar
|
|
|
|
g_ascii_tolower (gchar c)
|
|
|
|
{
|
|
|
|
return g_ascii_isupper (c) ? c - 'A' + 'a' : c;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_ascii_toupper:
|
2001-10-03 01:09:51 +02:00
|
|
|
* @c: any character.
|
2001-06-30 18:54:33 +02:00
|
|
|
*
|
|
|
|
* Convert a character to ASCII upper case.
|
|
|
|
*
|
2001-10-03 01:09:51 +02:00
|
|
|
* Unlike the standard C library toupper() function, this only
|
2001-06-30 18:54:33 +02:00
|
|
|
* recognizes standard ASCII letters and ignores the locale, returning
|
|
|
|
* all non-ASCII characters unchanged, even if they are upper case
|
|
|
|
* letters in a particular character set. Also unlike the standard
|
|
|
|
* library function, this takes and returns a char, not an int, so
|
2001-10-03 01:09:51 +02:00
|
|
|
* don't call it on %EOF but no need to worry about casting to #guchar
|
2001-06-30 18:54:33 +02:00
|
|
|
* before passing a possibly non-ASCII character in.
|
|
|
|
*
|
|
|
|
* Return value: the result of converting @c to upper case.
|
|
|
|
* If @c is not an ASCII lower case letter,
|
|
|
|
* @c is returned unchanged.
|
|
|
|
**/
|
|
|
|
gchar
|
|
|
|
g_ascii_toupper (gchar c)
|
|
|
|
{
|
|
|
|
return g_ascii_islower (c) ? c - 'a' + 'A' : c;
|
|
|
|
}
|
|
|
|
|
2001-08-26 00:29:40 +02:00
|
|
|
/**
|
|
|
|
* g_ascii_digit_value:
|
2001-10-03 01:09:51 +02:00
|
|
|
* @c: an ASCII character.
|
2001-08-26 00:29:40 +02:00
|
|
|
*
|
|
|
|
* Determines the numeric value of a character as a decimal
|
2001-10-03 01:09:51 +02:00
|
|
|
* digit. Differs from g_unichar_digit_value() because it takes
|
2001-08-26 00:29:40 +02:00
|
|
|
* a char, so there's no worry about sign extension if characters
|
|
|
|
* are signed.
|
|
|
|
*
|
|
|
|
* Return value: If @c is a decimal digit (according to
|
2001-10-03 01:09:51 +02:00
|
|
|
* g_ascii_isdigit()), its numeric value. Otherwise, -1.
|
2001-08-26 00:29:40 +02:00
|
|
|
**/
|
|
|
|
int
|
|
|
|
g_ascii_digit_value (gchar c)
|
|
|
|
{
|
|
|
|
if (g_ascii_isdigit (c))
|
|
|
|
return c - '0';
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_ascii_xdigit_value:
|
2001-10-03 01:09:51 +02:00
|
|
|
* @c: an ASCII character.
|
2001-08-26 00:29:40 +02:00
|
|
|
*
|
|
|
|
* Determines the numeric value of a character as a hexidecimal
|
2001-10-03 01:09:51 +02:00
|
|
|
* digit. Differs from g_unichar_xdigit_value() because it takes
|
2001-08-26 00:29:40 +02:00
|
|
|
* a char, so there's no worry about sign extension if characters
|
|
|
|
* are signed.
|
|
|
|
*
|
|
|
|
* Return value: If @c is a hex digit (according to
|
2001-10-03 01:09:51 +02:00
|
|
|
* g_ascii_isxdigit()), its numeric value. Otherwise, -1.
|
2001-08-26 00:29:40 +02:00
|
|
|
**/
|
|
|
|
int
|
|
|
|
g_ascii_xdigit_value (gchar c)
|
|
|
|
{
|
|
|
|
if (c >= 'A' && c <= 'F')
|
|
|
|
return c - 'A' + 10;
|
|
|
|
if (c >= 'a' && c <= 'f')
|
|
|
|
return c - 'a' + 10;
|
|
|
|
return g_ascii_digit_value (c);
|
|
|
|
}
|
|
|
|
|
2001-06-30 18:54:33 +02:00
|
|
|
/**
|
|
|
|
* g_ascii_strcasecmp:
|
2001-10-03 01:09:51 +02:00
|
|
|
* @s1: string to compare with @s2.
|
|
|
|
* @s2: string to compare with @s1.
|
2001-06-30 18:54:33 +02:00
|
|
|
*
|
|
|
|
* Compare two strings, ignoring the case of ASCII characters.
|
|
|
|
*
|
2001-10-03 01:09:51 +02:00
|
|
|
* Unlike the BSD strcasecmp() function, this only recognizes standard
|
2001-06-30 18:54:33 +02:00
|
|
|
* ASCII letters and ignores the locale, treating all non-ASCII
|
|
|
|
* characters as if they are not letters.
|
|
|
|
*
|
|
|
|
* Return value: an integer less than, equal to, or greater than
|
|
|
|
* zero if @s1 is found, respectively, to be less than,
|
|
|
|
* to match, or to be greater than @s2.
|
|
|
|
**/
|
|
|
|
gint
|
|
|
|
g_ascii_strcasecmp (const gchar *s1,
|
|
|
|
const gchar *s2)
|
|
|
|
{
|
|
|
|
gint c1, c2;
|
|
|
|
|
|
|
|
g_return_val_if_fail (s1 != NULL, 0);
|
|
|
|
g_return_val_if_fail (s2 != NULL, 0);
|
|
|
|
|
|
|
|
while (*s1 && *s2)
|
|
|
|
{
|
|
|
|
c1 = (gint)(guchar) g_ascii_tolower (*s1);
|
|
|
|
c2 = (gint)(guchar) g_ascii_tolower (*s2);
|
|
|
|
if (c1 != c2)
|
|
|
|
return (c1 - c2);
|
|
|
|
s1++; s2++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (((gint)(guchar) *s1) - ((gint)(guchar) *s2));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_ascii_strncasecmp:
|
2001-10-03 01:09:51 +02:00
|
|
|
* @s1: string to compare with @s2.
|
|
|
|
* @s2: string to compare with @s1.
|
|
|
|
* @n: number of characters to compare.
|
2001-06-30 18:54:33 +02:00
|
|
|
*
|
|
|
|
* Compare @s1 and @s2, ignoring the case of ASCII characters and any
|
|
|
|
* characters after the first @n in each string.
|
|
|
|
*
|
2001-10-03 01:09:51 +02:00
|
|
|
* Unlike the BSD strcasecmp() function, this only recognizes standard
|
2001-06-30 18:54:33 +02:00
|
|
|
* ASCII letters and ignores the locale, treating all non-ASCII
|
|
|
|
* characters as if they are not letters.
|
|
|
|
*
|
|
|
|
* Return value: an integer less than, equal to, or greater than zero
|
|
|
|
* if the first @n bytes of @s1 is found, respectively,
|
|
|
|
* to be less than, to match, or to be greater than the
|
|
|
|
* first @n bytes of @s2.
|
|
|
|
**/
|
|
|
|
gint
|
|
|
|
g_ascii_strncasecmp (const gchar *s1,
|
|
|
|
const gchar *s2,
|
2001-09-29 11:42:20 +02:00
|
|
|
gsize n)
|
2001-06-30 18:54:33 +02:00
|
|
|
{
|
|
|
|
gint c1, c2;
|
|
|
|
|
|
|
|
g_return_val_if_fail (s1 != NULL, 0);
|
|
|
|
g_return_val_if_fail (s2 != NULL, 0);
|
|
|
|
|
|
|
|
while (n && *s1 && *s2)
|
|
|
|
{
|
|
|
|
n -= 1;
|
|
|
|
c1 = (gint)(guchar) g_ascii_tolower (*s1);
|
|
|
|
c2 = (gint)(guchar) g_ascii_tolower (*s2);
|
|
|
|
if (c1 != c2)
|
|
|
|
return (c1 - c2);
|
|
|
|
s1++; s2++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (n)
|
|
|
|
return (((gint) (guchar) *s1) - ((gint) (guchar) *s2));
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-11-28 21:46:29 +01:00
|
|
|
/**
|
|
|
|
* g_strcasecmp:
|
|
|
|
* @s1: a string.
|
|
|
|
* @s2: a string to compare with @s1.
|
|
|
|
*
|
|
|
|
* A case-insensitive string comparison, corresponding to the standard
|
|
|
|
* strcasecmp() function on platforms which support it.
|
|
|
|
*
|
|
|
|
* Return value: 0 if the strings match, a negative value if @s1 < @s2,
|
|
|
|
* or a positive value if @s1 > @s2.
|
|
|
|
*
|
|
|
|
* Deprecated: See g_strncasecmp() for a discussion of why this function is
|
|
|
|
* deprecated and how to replace it.
|
|
|
|
**/
|
1998-07-10 07:51:57 +02:00
|
|
|
gint
|
|
|
|
g_strcasecmp (const gchar *s1,
|
|
|
|
const gchar *s2)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_STRCASECMP
|
1999-07-24 20:50:58 +02:00
|
|
|
g_return_val_if_fail (s1 != NULL, 0);
|
|
|
|
g_return_val_if_fail (s2 != NULL, 0);
|
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
return strcasecmp (s1, s2);
|
|
|
|
#else
|
|
|
|
gint c1, c2;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
removed dummy structure definitions for struct _GCache, _GTree, _GTimer,
Tue Oct 27 03:00:50 1998 Tim Janik <timj@gtk.org>
* glib.h: removed dummy structure definitions for struct _GCache,
_GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk.
* gutils.c: implement glib's inline functions _after_ all include
statements have been processed.
removed Tor's MAXPATHLEN check since there already was one supplied
further down in this file.
(LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32,
since lcc maybe used on other platforms as well. why in hell is this
stuff required?
(g_get_any_init): for windows, if the user name is supplied, use it as
realname also.
in general, if there is no homedir specified, use the tmpdir that
we already figured.
* gtimer.c (g_timer_elapsed): changed a g_assert() statement to
g_return_if_fail().
* applied glib-tml-981020-0.patch for WIN32 portability, added some
comments and g_return_if_fail() statements, minor indentation fixes.
ChangeLog entry from Tor Lillqvist is appended.
* glib.h (struct dirent): use lower case structure members.
* glib.h:
* makefile.lcc:
* makefile.msc:
s/COMPILING_GLIB/GLIB_COMPILATION/
1998-10-20: Tor Lillqvist <tml@iki.fi>
* README.win32 glib.def gmodule.def
* glibconfig.h.win32 gmodule/gmoduleconf.h.win32:
New files for the Windows port. The .def files list exported
symbols for the Microsoft linker and compatibles.
* configure.in:
Added checks for some platform-dependent headers: pwd.h sys/param.h
sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat.
* gerror.c:
Conditionalized inclusion of system-dependent headers. Changes
for Windows: no gdb to do a stack trace. Just call abort().
* glib.h:
Changes for Windows:
Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for
platform-dependent file name syntax elements. Added macros
G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for
platform-dependent search path syntax conventions.
Added pragmas for Microsoft C to make it more pedantic.
Marked GLib's global variables for export from DLL.
Added the function g_strescape that escapes backslashes.
Added functions g_path_is_absolute and g_path_skip_root to
handle platform-dependent file name syntax.
Added the function g_getenv that expands environment variables
that contain references to other environment variables, as is
typical on Windows NT.
Added the GIOChannel structure which is used to encapsulate the
IPC mechanism used by the GIMP's plug-ins, and possibly other
things later. On Unix a GIOChannel encapsulates just a file
descriptor. On Windows it contains a file handle from _pipe() and a
few other things related to the implementation of gdk_input_add
and GIMP plug-in communication. Subject to change.
Removed duplicate declarations of the version variables.
For the Microsoft compiler, declare own implementation of
ftruncate and the <dirent.h> functions.
* gmem.c:
Define a symbolic name for the profiling table size.
* gmessages.c:
Conditionalized inclusion of unistd.h. On Windows, output using
stdio to stdout.
* gscanner.c:
Conditionalized inclusion of unistd.h. Added changes for
Microsoft C. Added CR to the skipped character set. Added small
workaround for MSC compiler bug in g_scanner_cur_value.
* gstrfuncs.c:
Added the function g_strescape, which escapes the backslash
character. Needed especially when printing Windows filenames.
* gtimer.c:
Conditionalized inclusion of unistd.h and sys/time.h. Added
implementations for Windows.
* gutils.c:
Conditionalized inclusion of platform-dependent headers. Use
the platform-independent file name syntax macros.
Conditionalize code on platform-dependent features. Added the
functions g_path_is_absolute g_path_skip_root and g_getenv.
Added the GIOChannel-related functions. Added
compiler-dependent Unix compatibility functions for Windows.
* makefile.lcc makefile.msc:
New files. Compiler-specific makefiles for LCC-Win32 and
Microsoft C. Only Microsoft C is actually supported currently.
* testglib.c:
Added pathname check cases for Windows. Added workaround for
bug in the Microsoft runtime library. Improved some tests a bit.
Tue Oct 27 04:00:11 1998 Tim Janik <timj@gtk.org>
* testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32,
this needs to be more constistent throughout the code, do we go for
NATIVE_WIN32 or WIN32?
* gmodule.c (LibMain): special cased the #ifdef __LCC__ case for
NATIVE_WIN32, since lcc maybe used on other platforms as well.
* libgplugin_a.c (LibMain):
* libgplugin_b.c (LibMain):
likewise. not sure i like this special requirement for lcc in here.
* gmodule-dl.c (_g_module_build_path):
feature empty "" directories and prepend the module name with "lib".
* gmodule-dld.c (_g_module_build_path):
* gmodule-win32.c (_g_module_build_path):
feature empty "" directories.
* we need some more magic in the _g_module_build_path variants
so we don't append/prepend lib and .so, .sl or .dll for those names
that already contain it.
* applied patch from Tor Lillqvist for g_module_build_path() and
windows support.
1998-10-20: Tor Lillqvist <tml@iki.fi>
* gmodule/gmodule-win32.c:
New file.
* gmodule/gmodule.c gmodule/gmodule.h:
Added the funcion g_module_build_path that builds the path to
a module file, decorating the name according to the system's
conventions. Added the Windows implementation.
* gmodule/libgplugin_a.c gmodule/libgplugin_b.c:
Added LibMain for LCC-Win32.
* gmodule/testgmodule.c:
Handle Windows dll names.
1998-10-27 05:11:34 +01:00
|
|
|
g_return_val_if_fail (s1 != NULL, 0);
|
|
|
|
g_return_val_if_fail (s2 != NULL, 0);
|
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
while (*s1 && *s2)
|
|
|
|
{
|
|
|
|
/* According to A. Cox, some platforms have islower's that
|
|
|
|
* don't work right on non-uppercase
|
|
|
|
*/
|
|
|
|
c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1;
|
|
|
|
c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2;
|
|
|
|
if (c1 != c2)
|
1998-07-25 05:03:01 +02:00
|
|
|
return (c1 - c2);
|
1998-07-10 07:51:57 +02:00
|
|
|
s1++; s2++;
|
|
|
|
}
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
return (((gint)(guchar) *s1) - ((gint)(guchar) *s2));
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2002-11-28 21:46:29 +01:00
|
|
|
/**
|
|
|
|
* g_strncasecmp:
|
|
|
|
* @s1: a string.
|
|
|
|
* @s2: a string to compare with @s1.
|
|
|
|
* @n: the maximum number of characters to compare.
|
|
|
|
*
|
|
|
|
* A case-insensitive string comparison, corresponding to the standard
|
|
|
|
* strncasecmp() function on platforms which support it.
|
|
|
|
* It is similar to g_strcasecmp() except it only compares the first @n
|
|
|
|
* characters of the strings.
|
|
|
|
*
|
|
|
|
* Return value: 0 if the strings match, a negative value if @s1 < @s2,
|
|
|
|
* or a positive value if @s1 > @s2.
|
|
|
|
*
|
|
|
|
* Deprecated: The problem with g_strncasecmp() is that it does the
|
|
|
|
* comparison by calling toupper()/tolower(). These functions are
|
|
|
|
* locale-specific and operate on single bytes. However, it is impossible
|
|
|
|
* to handle things correctly from an I18N standpoint by operating on
|
|
|
|
* bytes, since characters may be multibyte. Thus g_strncasecmp() is
|
|
|
|
* broken if your string is guaranteed to be ASCII, since it's
|
|
|
|
* locale-sensitive, and it's broken if your string is localized, since
|
|
|
|
* it doesn't work on many encodings at all, including UTF-8, EUC-JP,
|
|
|
|
* etc.
|
|
|
|
* There are therefore two replacement functions: g_ascii_strncasecmp(),
|
|
|
|
* which only works on ASCII and is not locale-sensitive, and
|
|
|
|
* g_utf8_casefold(), which is good for case-insensitive sorting of UTF-8.
|
|
|
|
**/
|
1998-11-05 02:36:36 +01:00
|
|
|
gint
|
|
|
|
g_strncasecmp (const gchar *s1,
|
|
|
|
const gchar *s2,
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
gsize n)
|
1998-11-05 02:36:36 +01:00
|
|
|
{
|
|
|
|
#ifdef HAVE_STRNCASECMP
|
|
|
|
return strncasecmp (s1, s2, n);
|
|
|
|
#else
|
|
|
|
gint c1, c2;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-11-05 02:36:36 +01:00
|
|
|
g_return_val_if_fail (s1 != NULL, 0);
|
|
|
|
g_return_val_if_fail (s2 != NULL, 0);
|
|
|
|
|
2000-07-15 09:18:19 +02:00
|
|
|
while (n && *s1 && *s2)
|
1998-11-05 02:36:36 +01:00
|
|
|
{
|
2000-07-15 09:18:19 +02:00
|
|
|
n -= 1;
|
1998-11-05 02:36:36 +01:00
|
|
|
/* According to A. Cox, some platforms have islower's that
|
|
|
|
* don't work right on non-uppercase
|
|
|
|
*/
|
|
|
|
c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1;
|
|
|
|
c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2;
|
|
|
|
if (c1 != c2)
|
|
|
|
return (c1 - c2);
|
|
|
|
s1++; s2++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (n)
|
2000-07-15 09:18:19 +02:00
|
|
|
return (((gint) (guchar) *s1) - ((gint) (guchar) *s2));
|
1998-11-05 02:36:36 +01:00
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
gchar*
|
1998-07-25 05:03:01 +02:00
|
|
|
g_strdelimit (gchar *string,
|
1998-07-10 07:51:57 +02:00
|
|
|
const gchar *delimiters,
|
1998-07-25 05:03:01 +02:00
|
|
|
gchar new_delim)
|
1998-07-10 07:51:57 +02:00
|
|
|
{
|
|
|
|
register gchar *c;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
g_return_val_if_fail (string != NULL, NULL);
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
if (!delimiters)
|
|
|
|
delimiters = G_STR_DELIMITERS;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-07-10 07:51:57 +02:00
|
|
|
for (c = string; *c; c++)
|
|
|
|
{
|
|
|
|
if (strchr (delimiters, *c))
|
|
|
|
*c = new_delim;
|
|
|
|
}
|
1998-10-21 19:18:22 +02:00
|
|
|
|
|
|
|
return string;
|
1998-07-10 07:51:57 +02:00
|
|
|
}
|
1998-10-20 23:41:55 +02:00
|
|
|
|
2000-05-12 17:23:16 +02:00
|
|
|
gchar*
|
|
|
|
g_strcanon (gchar *string,
|
|
|
|
const gchar *valid_chars,
|
2001-04-16 22:05:25 +02:00
|
|
|
gchar substitutor)
|
2000-05-12 17:23:16 +02:00
|
|
|
{
|
|
|
|
register gchar *c;
|
|
|
|
|
|
|
|
g_return_val_if_fail (string != NULL, NULL);
|
|
|
|
g_return_val_if_fail (valid_chars != NULL, NULL);
|
|
|
|
|
|
|
|
for (c = string; *c; c++)
|
|
|
|
{
|
|
|
|
if (!strchr (valid_chars, *c))
|
2001-04-16 22:05:25 +02:00
|
|
|
*c = substitutor;
|
2000-05-12 17:23:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return string;
|
|
|
|
}
|
|
|
|
|
1999-07-31 23:45:21 +02:00
|
|
|
gchar*
|
1999-08-03 01:16:32 +02:00
|
|
|
g_strcompress (const gchar *source)
|
1999-07-31 23:45:21 +02:00
|
|
|
{
|
1999-08-03 01:16:32 +02:00
|
|
|
const gchar *p = source, *octal;
|
|
|
|
gchar *dest = g_malloc (strlen (source) + 1);
|
1999-07-31 23:45:21 +02:00
|
|
|
gchar *q = dest;
|
2000-05-12 17:23:16 +02:00
|
|
|
|
1999-07-31 23:45:21 +02:00
|
|
|
while (*p)
|
|
|
|
{
|
|
|
|
if (*p == '\\')
|
|
|
|
{
|
|
|
|
p++;
|
|
|
|
switch (*p)
|
|
|
|
{
|
|
|
|
case '0': case '1': case '2': case '3': case '4':
|
|
|
|
case '5': case '6': case '7':
|
|
|
|
*q = 0;
|
1999-08-03 01:16:32 +02:00
|
|
|
octal = p;
|
|
|
|
while ((p < octal + 3) && (*p >= '0') && (*p <= '7'))
|
1999-07-31 23:45:21 +02:00
|
|
|
{
|
|
|
|
*q = (*q * 8) + (*p - '0');
|
|
|
|
p++;
|
|
|
|
}
|
|
|
|
q++;
|
|
|
|
p--;
|
|
|
|
break;
|
|
|
|
case 'b':
|
|
|
|
*q++ = '\b';
|
|
|
|
break;
|
|
|
|
case 'f':
|
|
|
|
*q++ = '\f';
|
|
|
|
break;
|
|
|
|
case 'n':
|
|
|
|
*q++ = '\n';
|
|
|
|
break;
|
|
|
|
case 'r':
|
|
|
|
*q++ = '\r';
|
|
|
|
break;
|
|
|
|
case 't':
|
|
|
|
*q++ = '\t';
|
|
|
|
break;
|
|
|
|
default: /* Also handles \" and \\ */
|
|
|
|
*q++ = *p;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
*q++ = *p;
|
|
|
|
p++;
|
|
|
|
}
|
|
|
|
*q = 0;
|
2000-05-12 17:23:16 +02:00
|
|
|
|
1999-07-31 23:45:21 +02:00
|
|
|
return dest;
|
|
|
|
}
|
|
|
|
|
|
|
|
gchar *
|
1999-08-03 01:16:32 +02:00
|
|
|
g_strescape (const gchar *source,
|
|
|
|
const gchar *exceptions)
|
1999-07-31 23:45:21 +02:00
|
|
|
{
|
2000-09-10 18:04:33 +02:00
|
|
|
const guchar *p;
|
|
|
|
gchar *dest;
|
|
|
|
gchar *q;
|
1999-07-31 23:45:21 +02:00
|
|
|
guchar excmap[256];
|
2000-09-10 18:04:33 +02:00
|
|
|
|
|
|
|
g_return_val_if_fail (source != NULL, NULL);
|
|
|
|
|
|
|
|
p = (guchar *) source;
|
|
|
|
/* Each source byte needs maximally four destination chars (\777) */
|
|
|
|
q = dest = g_malloc (strlen (source) * 4 + 1);
|
1999-07-31 23:45:21 +02:00
|
|
|
|
|
|
|
memset (excmap, 0, 256);
|
|
|
|
if (exceptions)
|
|
|
|
{
|
|
|
|
guchar *e = (guchar *) exceptions;
|
|
|
|
|
|
|
|
while (*e)
|
|
|
|
{
|
|
|
|
excmap[*e] = 1;
|
|
|
|
e++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
while (*p)
|
|
|
|
{
|
|
|
|
if (excmap[*p])
|
|
|
|
*q++ = *p;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
switch (*p)
|
|
|
|
{
|
|
|
|
case '\b':
|
|
|
|
*q++ = '\\';
|
|
|
|
*q++ = 'b';
|
|
|
|
break;
|
|
|
|
case '\f':
|
|
|
|
*q++ = '\\';
|
|
|
|
*q++ = 'f';
|
|
|
|
break;
|
|
|
|
case '\n':
|
|
|
|
*q++ = '\\';
|
|
|
|
*q++ = 'n';
|
|
|
|
break;
|
|
|
|
case '\r':
|
|
|
|
*q++ = '\\';
|
|
|
|
*q++ = 'r';
|
|
|
|
break;
|
|
|
|
case '\t':
|
|
|
|
*q++ = '\\';
|
|
|
|
*q++ = 't';
|
|
|
|
break;
|
|
|
|
case '\\':
|
|
|
|
*q++ = '\\';
|
|
|
|
*q++ = '\\';
|
|
|
|
break;
|
|
|
|
case '"':
|
|
|
|
*q++ = '\\';
|
|
|
|
*q++ = '"';
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if ((*p < ' ') || (*p >= 0177))
|
|
|
|
{
|
|
|
|
*q++ = '\\';
|
1999-08-01 02:54:14 +02:00
|
|
|
*q++ = '0' + (((*p) >> 6) & 07);
|
|
|
|
*q++ = '0' + (((*p) >> 3) & 07);
|
|
|
|
*q++ = '0' + ((*p) & 07);
|
1999-07-31 23:45:21 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
*q++ = *p;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
p++;
|
|
|
|
}
|
|
|
|
*q = 0;
|
|
|
|
return dest;
|
|
|
|
}
|
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
gchar*
|
|
|
|
g_strchug (gchar *string)
|
1998-10-20 23:41:55 +02:00
|
|
|
{
|
1999-07-24 20:50:58 +02:00
|
|
|
guchar *start;
|
1998-10-20 23:41:55 +02:00
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
g_return_val_if_fail (string != NULL, NULL);
|
1998-10-20 23:41:55 +02:00
|
|
|
|
2001-09-02 19:14:23 +02:00
|
|
|
for (start = (guchar*) string; *start && g_ascii_isspace (*start); start++)
|
1998-10-21 19:18:22 +02:00
|
|
|
;
|
1998-10-20 23:41:55 +02:00
|
|
|
|
2000-09-29 15:37:01 +02:00
|
|
|
g_memmove (string, start, strlen ((gchar *) start) + 1);
|
1998-10-20 23:41:55 +02:00
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
return string;
|
1998-10-20 23:41:55 +02:00
|
|
|
}
|
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
gchar*
|
|
|
|
g_strchomp (gchar *string)
|
1998-10-20 23:41:55 +02:00
|
|
|
{
|
2002-11-26 16:04:06 +01:00
|
|
|
gsize len;
|
1998-10-20 23:41:55 +02:00
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
g_return_val_if_fail (string != NULL, NULL);
|
1998-10-20 23:41:55 +02:00
|
|
|
|
2002-11-26 16:04:06 +01:00
|
|
|
len = strlen (string);
|
|
|
|
while (len--)
|
|
|
|
{
|
|
|
|
if (g_ascii_isspace ((guchar) string[len]))
|
|
|
|
string[len] = '\0';
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
1998-10-20 23:41:55 +02:00
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
return string;
|
1998-10-20 23:41:55 +02:00
|
|
|
}
|
|
|
|
|
2001-08-24 17:27:23 +02:00
|
|
|
/**
|
|
|
|
* g_strsplit:
|
|
|
|
* @string: a string to split.
|
|
|
|
* @delimiter: a string which specifies the places at which to split the string.
|
|
|
|
* The delimiter is not included in any of the resulting strings, unless
|
2001-10-03 01:09:51 +02:00
|
|
|
* @max_tokens is reached.
|
2001-08-24 17:27:23 +02:00
|
|
|
* @max_tokens: the maximum number of pieces to split @string into. If this is
|
|
|
|
* less than 1, the string is split completely.
|
|
|
|
*
|
|
|
|
* Splits a string into a maximum of @max_tokens pieces, using the given
|
|
|
|
* @delimiter. If @max_tokens is reached, the remainder of @string is appended
|
|
|
|
* to the last token.
|
|
|
|
*
|
|
|
|
* As a special case, the result of splitting the empty string "" is an empty
|
|
|
|
* vector, not a vector containing a single string. The reason for this
|
|
|
|
* special case is that being able to represent a empty vector is typically
|
|
|
|
* more useful than consistent handling of empty elements. If you do need
|
|
|
|
* to represent empty elements, you'll need to check for the empty string
|
|
|
|
* before calling g_strsplit().
|
|
|
|
*
|
2001-10-03 01:09:51 +02:00
|
|
|
* Return value: a newly-allocated %NULL-terminated array of strings. Use
|
|
|
|
* g_strfreev() to free it.
|
2001-08-24 17:27:23 +02:00
|
|
|
**/
|
1998-10-21 19:18:22 +02:00
|
|
|
gchar**
|
1998-10-25 07:44:49 +01:00
|
|
|
g_strsplit (const gchar *string,
|
|
|
|
const gchar *delimiter,
|
|
|
|
gint max_tokens)
|
1998-10-20 23:41:55 +02:00
|
|
|
{
|
1998-10-21 19:18:22 +02:00
|
|
|
GSList *string_list = NULL, *slist;
|
1998-10-21 22:14:16 +02:00
|
|
|
gchar **str_array, *s;
|
2001-08-24 17:27:23 +02:00
|
|
|
guint n = 0;
|
|
|
|
const gchar *remainder;
|
1998-10-20 23:41:55 +02:00
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
g_return_val_if_fail (string != NULL, NULL);
|
|
|
|
g_return_val_if_fail (delimiter != NULL, NULL);
|
2001-07-19 22:07:41 +02:00
|
|
|
g_return_val_if_fail (delimiter[0] != '\0', NULL);
|
1998-10-20 23:41:55 +02:00
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
if (max_tokens < 1)
|
|
|
|
max_tokens = G_MAXINT;
|
1998-10-20 23:41:55 +02:00
|
|
|
|
2001-08-24 17:27:23 +02:00
|
|
|
remainder = string;
|
|
|
|
s = strstr (remainder, delimiter);
|
1998-10-21 19:18:22 +02:00
|
|
|
if (s)
|
|
|
|
{
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
gsize delimiter_len = strlen (delimiter);
|
1999-01-19 10:07:28 +01:00
|
|
|
|
2001-11-13 01:02:30 +01:00
|
|
|
while (--max_tokens && s)
|
1998-10-21 19:18:22 +02:00
|
|
|
{
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
gsize len;
|
1998-10-21 19:18:22 +02:00
|
|
|
gchar *new_string;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
2001-08-24 17:27:23 +02:00
|
|
|
len = s - remainder;
|
1998-10-21 19:18:22 +02:00
|
|
|
new_string = g_new (gchar, len + 1);
|
2001-08-24 17:27:23 +02:00
|
|
|
strncpy (new_string, remainder, len);
|
1998-10-21 19:18:22 +02:00
|
|
|
new_string[len] = 0;
|
|
|
|
string_list = g_slist_prepend (string_list, new_string);
|
|
|
|
n++;
|
2001-08-24 17:27:23 +02:00
|
|
|
remainder = s + delimiter_len;
|
|
|
|
s = strstr (remainder, delimiter);
|
1998-10-21 19:18:22 +02:00
|
|
|
}
|
|
|
|
}
|
2001-08-24 17:27:23 +02:00
|
|
|
if (*string)
|
|
|
|
{
|
|
|
|
n++;
|
|
|
|
string_list = g_slist_prepend (string_list, g_strdup (remainder));
|
|
|
|
}
|
1998-10-21 22:14:16 +02:00
|
|
|
|
2000-10-26 15:00:18 +02:00
|
|
|
str_array = g_new (gchar*, n + 1);
|
1998-10-21 22:14:16 +02:00
|
|
|
|
2000-10-26 15:00:18 +02:00
|
|
|
str_array[n--] = NULL;
|
1998-10-21 19:18:22 +02:00
|
|
|
for (slist = string_list; slist; slist = slist->next)
|
2000-10-26 15:00:18 +02:00
|
|
|
str_array[n--] = slist->data;
|
1998-10-21 22:14:16 +02:00
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
g_slist_free (string_list);
|
1998-10-20 23:41:55 +02:00
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
return str_array;
|
1998-10-20 23:41:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1998-10-25 07:44:49 +01:00
|
|
|
g_strfreev (gchar **str_array)
|
1998-10-20 23:41:55 +02:00
|
|
|
{
|
1998-10-21 19:18:22 +02:00
|
|
|
if (str_array)
|
|
|
|
{
|
1998-10-21 22:14:16 +02:00
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; str_array[i] != NULL; i++)
|
|
|
|
g_free(str_array[i]);
|
1998-10-20 23:41:55 +02:00
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
g_free (str_array);
|
|
|
|
}
|
1998-10-20 23:41:55 +02:00
|
|
|
}
|
|
|
|
|
2000-12-07 05:48:37 +01:00
|
|
|
/**
|
|
|
|
* g_strdupv:
|
2001-10-03 01:09:51 +02:00
|
|
|
* @str_array: %NULL-terminated array of strings.
|
2000-12-07 05:48:37 +01:00
|
|
|
*
|
|
|
|
* Copies %NULL-terminated array of strings. The copy is a deep copy;
|
|
|
|
* the new array should be freed by first freeing each string, then
|
|
|
|
* the array itself. g_strfreev() does this for you. If called
|
|
|
|
* on a %NULL value, g_strdupv() simply returns %NULL.
|
|
|
|
*
|
2001-10-03 01:09:51 +02:00
|
|
|
* Return value: a new %NULL-terminated array of strings.
|
2000-12-07 05:48:37 +01:00
|
|
|
**/
|
|
|
|
gchar**
|
|
|
|
g_strdupv (gchar **str_array)
|
|
|
|
{
|
|
|
|
if (str_array)
|
|
|
|
{
|
|
|
|
gint i;
|
|
|
|
gchar **retval;
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
while (str_array[i])
|
|
|
|
++i;
|
|
|
|
|
|
|
|
retval = g_new (gchar*, i + 1);
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
while (str_array[i])
|
|
|
|
{
|
|
|
|
retval[i] = g_strdup (str_array[i]);
|
|
|
|
++i;
|
|
|
|
}
|
|
|
|
retval[i] = NULL;
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
gchar*
|
1998-10-25 07:44:49 +01:00
|
|
|
g_strjoinv (const gchar *separator,
|
|
|
|
gchar **str_array)
|
1998-10-20 23:41:55 +02:00
|
|
|
{
|
1998-10-21 19:18:22 +02:00
|
|
|
gchar *string;
|
2001-03-26 20:35:34 +02:00
|
|
|
gchar *ptr;
|
1999-01-19 10:07:28 +01:00
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
g_return_val_if_fail (str_array != NULL, NULL);
|
1998-10-21 22:14:16 +02:00
|
|
|
|
1999-07-24 20:50:58 +02:00
|
|
|
if (separator == NULL)
|
1998-10-21 22:14:16 +02:00
|
|
|
separator = "";
|
1998-10-20 23:41:55 +02:00
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
if (*str_array)
|
|
|
|
{
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
gint i;
|
|
|
|
gsize len;
|
|
|
|
gsize separator_len;
|
1998-10-21 22:14:16 +02:00
|
|
|
|
|
|
|
separator_len = strlen (separator);
|
2001-03-26 20:35:34 +02:00
|
|
|
/* First part, getting length */
|
1998-10-21 22:14:16 +02:00
|
|
|
len = 1 + strlen (str_array[0]);
|
2001-03-26 20:35:34 +02:00
|
|
|
for (i = 1; str_array[i] != NULL; i++)
|
|
|
|
len += strlen (str_array[i]);
|
|
|
|
len += separator_len * (i - 1);
|
1999-01-19 10:07:28 +01:00
|
|
|
|
2001-03-26 20:35:34 +02:00
|
|
|
/* Second part, building string */
|
1998-10-21 19:18:22 +02:00
|
|
|
string = g_new (gchar, len);
|
2001-03-26 20:35:34 +02:00
|
|
|
ptr = g_stpcpy (string, *str_array);
|
1998-10-21 22:14:16 +02:00
|
|
|
for (i = 1; str_array[i] != NULL; i++)
|
1998-10-21 19:18:22 +02:00
|
|
|
{
|
2001-03-26 20:35:34 +02:00
|
|
|
ptr = g_stpcpy (ptr, separator);
|
|
|
|
ptr = g_stpcpy (ptr, str_array[i]);
|
1998-10-21 19:18:22 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
string = g_strdup ("");
|
1998-10-20 23:41:55 +02:00
|
|
|
|
1998-10-21 19:18:22 +02:00
|
|
|
return string;
|
1998-10-20 23:41:55 +02:00
|
|
|
}
|
1998-10-21 22:14:16 +02:00
|
|
|
|
|
|
|
gchar*
|
1998-10-25 07:44:49 +01:00
|
|
|
g_strjoin (const gchar *separator,
|
|
|
|
...)
|
1998-10-21 22:14:16 +02:00
|
|
|
{
|
|
|
|
gchar *string, *s;
|
|
|
|
va_list args;
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
gsize len;
|
|
|
|
gsize separator_len;
|
2001-03-26 20:35:34 +02:00
|
|
|
gchar *ptr;
|
1998-10-21 22:14:16 +02:00
|
|
|
|
1999-07-24 20:50:58 +02:00
|
|
|
if (separator == NULL)
|
1998-10-21 22:14:16 +02:00
|
|
|
separator = "";
|
|
|
|
|
|
|
|
separator_len = strlen (separator);
|
|
|
|
|
1999-07-24 20:50:58 +02:00
|
|
|
va_start (args, separator);
|
1998-10-21 22:14:16 +02:00
|
|
|
|
1999-07-24 20:50:58 +02:00
|
|
|
s = va_arg (args, gchar*);
|
1998-10-21 22:14:16 +02:00
|
|
|
|
1999-07-24 20:50:58 +02:00
|
|
|
if (s)
|
|
|
|
{
|
2001-03-26 20:35:34 +02:00
|
|
|
/* First part, getting length */
|
|
|
|
len = 1 + strlen (s);
|
1998-10-21 22:14:16 +02:00
|
|
|
|
1999-07-24 20:50:58 +02:00
|
|
|
s = va_arg (args, gchar*);
|
|
|
|
while (s)
|
|
|
|
{
|
|
|
|
len += separator_len + strlen (s);
|
|
|
|
s = va_arg (args, gchar*);
|
|
|
|
}
|
|
|
|
va_end (args);
|
1998-10-21 22:14:16 +02:00
|
|
|
|
2001-03-26 20:35:34 +02:00
|
|
|
/* Second part, building string */
|
|
|
|
string = g_new (gchar, len);
|
1998-10-21 22:14:16 +02:00
|
|
|
|
1999-07-24 20:50:58 +02:00
|
|
|
va_start (args, separator);
|
1998-10-21 22:14:16 +02:00
|
|
|
|
1999-07-24 20:50:58 +02:00
|
|
|
s = va_arg (args, gchar*);
|
2001-03-26 20:35:34 +02:00
|
|
|
ptr = g_stpcpy (string, s);
|
1998-10-21 22:14:16 +02:00
|
|
|
|
1999-07-24 20:50:58 +02:00
|
|
|
s = va_arg (args, gchar*);
|
|
|
|
while (s)
|
|
|
|
{
|
2001-03-26 20:35:34 +02:00
|
|
|
ptr = g_stpcpy (ptr, separator);
|
|
|
|
ptr = g_stpcpy (ptr, s);
|
1999-07-24 20:50:58 +02:00
|
|
|
s = va_arg (args, gchar*);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
string = g_strdup ("");
|
1998-10-21 22:14:16 +02:00
|
|
|
|
1999-07-24 20:50:58 +02:00
|
|
|
va_end (args);
|
1998-10-21 22:14:16 +02:00
|
|
|
|
|
|
|
return string;
|
|
|
|
}
|
2001-06-09 01:14:03 +02:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_strstr_len:
|
2001-10-03 01:09:51 +02:00
|
|
|
* @haystack: a string.
|
|
|
|
* @haystack_len: the maximum length of @haystack.
|
|
|
|
* @needle: the string to search for.
|
2001-06-09 01:14:03 +02:00
|
|
|
*
|
2001-10-03 01:09:51 +02:00
|
|
|
* Searches the string @haystack for the first occurrence
|
|
|
|
* of the string @needle, limiting the length of the search
|
|
|
|
* to @haystack_len.
|
2001-06-09 01:14:03 +02:00
|
|
|
*
|
2001-10-03 01:09:51 +02:00
|
|
|
* Return value: a pointer to the found occurrence, or
|
|
|
|
* %NULL if not found.
|
2001-06-09 01:14:03 +02:00
|
|
|
**/
|
|
|
|
gchar *
|
|
|
|
g_strstr_len (const gchar *haystack,
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
gssize haystack_len,
|
2001-06-09 01:14:03 +02:00
|
|
|
const gchar *needle)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (haystack != NULL, NULL);
|
|
|
|
g_return_val_if_fail (needle != NULL, NULL);
|
|
|
|
|
|
|
|
if (haystack_len < 0)
|
|
|
|
return strstr (haystack, needle);
|
|
|
|
else
|
|
|
|
{
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
const gchar *p = haystack;
|
|
|
|
gsize needle_len = strlen (needle);
|
|
|
|
const gchar *end;
|
|
|
|
gsize i;
|
|
|
|
|
2001-06-09 01:14:03 +02:00
|
|
|
if (needle_len == 0)
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
return (gchar *)haystack;
|
2001-06-09 01:14:03 +02:00
|
|
|
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
if (haystack_len < needle_len)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
end = haystack + haystack_len - needle_len;
|
|
|
|
|
2001-06-09 01:14:03 +02:00
|
|
|
while (*p && p <= end)
|
|
|
|
{
|
|
|
|
for (i = 0; i < needle_len; i++)
|
|
|
|
if (p[i] != needle[i])
|
|
|
|
goto next;
|
|
|
|
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
return (gchar *)p;
|
2001-06-09 01:14:03 +02:00
|
|
|
|
|
|
|
next:
|
|
|
|
p++;
|
|
|
|
}
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
|
|
|
|
return NULL;
|
2001-06-09 01:14:03 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2001-10-03 01:09:51 +02:00
|
|
|
* g_strrstr:
|
|
|
|
* @haystack: a nul-terminated string.
|
|
|
|
* @needle: the nul-terminated string to search for.
|
2001-06-09 01:14:03 +02:00
|
|
|
*
|
2001-10-03 01:09:51 +02:00
|
|
|
* Searches the string @haystack for the last occurrence
|
|
|
|
* of the string @needle.
|
2001-06-09 01:14:03 +02:00
|
|
|
*
|
2001-10-03 01:09:51 +02:00
|
|
|
* Return value: a pointer to the found occurrence, or
|
|
|
|
* %NULL if not found.
|
2001-06-09 01:14:03 +02:00
|
|
|
**/
|
|
|
|
gchar *
|
|
|
|
g_strrstr (const gchar *haystack,
|
|
|
|
const gchar *needle)
|
|
|
|
{
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
gsize i;
|
|
|
|
gsize needle_len;
|
|
|
|
gsize haystack_len;
|
|
|
|
const gchar *p;
|
2001-06-09 01:14:03 +02:00
|
|
|
|
|
|
|
g_return_val_if_fail (haystack != NULL, NULL);
|
|
|
|
g_return_val_if_fail (needle != NULL, NULL);
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
|
|
|
|
needle_len = strlen (needle);
|
|
|
|
haystack_len = strlen (haystack);
|
|
|
|
|
2001-06-09 01:14:03 +02:00
|
|
|
if (needle_len == 0)
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
return (gchar *)haystack;
|
|
|
|
|
|
|
|
if (haystack_len < needle_len)
|
|
|
|
return NULL;
|
2001-06-09 01:14:03 +02:00
|
|
|
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
p = haystack + haystack_len - needle_len;
|
|
|
|
|
2001-06-09 01:14:03 +02:00
|
|
|
while (p >= haystack)
|
|
|
|
{
|
|
|
|
for (i = 0; i < needle_len; i++)
|
|
|
|
if (p[i] != needle[i])
|
|
|
|
goto next;
|
|
|
|
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
return (gchar *)p;
|
2001-06-09 01:14:03 +02:00
|
|
|
|
|
|
|
next:
|
|
|
|
p--;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_strrstr_len:
|
2001-10-03 01:09:51 +02:00
|
|
|
* @haystack: a nul-terminated string.
|
|
|
|
* @haystack_len: the maximum length of @haystack.
|
|
|
|
* @needle: the nul-terminated string to search for.
|
2001-06-09 01:14:03 +02:00
|
|
|
*
|
2001-10-03 01:09:51 +02:00
|
|
|
* Searches the string @haystack for the last occurrence
|
|
|
|
* of the string @needle, limiting the length of the search
|
|
|
|
* to @haystack_len.
|
2001-06-09 01:14:03 +02:00
|
|
|
*
|
2001-10-03 01:09:51 +02:00
|
|
|
* Return value: a pointer to the found occurrence, or
|
|
|
|
* %NULL if not found.
|
2001-06-09 01:14:03 +02:00
|
|
|
**/
|
|
|
|
gchar *
|
|
|
|
g_strrstr_len (const gchar *haystack,
|
2001-07-12 11:23:38 +02:00
|
|
|
gssize haystack_len,
|
2001-06-09 01:14:03 +02:00
|
|
|
const gchar *needle)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (haystack != NULL, NULL);
|
|
|
|
g_return_val_if_fail (needle != NULL, NULL);
|
|
|
|
|
|
|
|
if (haystack_len < 0)
|
|
|
|
return g_strrstr (haystack, needle);
|
|
|
|
else
|
|
|
|
{
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
gsize needle_len = strlen (needle);
|
|
|
|
const gchar *haystack_max = haystack + haystack_len;
|
|
|
|
const gchar *p = haystack;
|
|
|
|
gsize i;
|
2001-06-09 01:14:03 +02:00
|
|
|
|
|
|
|
while (p < haystack_max && *p)
|
|
|
|
p++;
|
|
|
|
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
if (p < haystack + needle_len)
|
|
|
|
return NULL;
|
|
|
|
|
2001-06-09 01:14:03 +02:00
|
|
|
p -= needle_len;
|
|
|
|
|
|
|
|
while (p >= haystack)
|
|
|
|
{
|
|
|
|
for (i = 0; i < needle_len; i++)
|
|
|
|
if (p[i] != needle[i])
|
|
|
|
goto next;
|
|
|
|
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
return (gchar *)p;
|
2001-06-09 01:14:03 +02:00
|
|
|
|
|
|
|
next:
|
|
|
|
p--;
|
|
|
|
}
|
|
|
|
|
Changes for 64-bit cleanliness, loosely based on patch from Mark Murnane.
Wed Jun 20 12:00:54 2001 Owen Taylor <otaylor@redhat.com>
Changes for 64-bit cleanliness, loosely based on patch
from Mark Murnane.
* gconvert.c (g_convert/g_convert_with_fallback): Remove
workarounds for since-fixed GNU libc bugs. Minor
doc fix.
* gconvert.[ch]: Change gint to gsize/gssize as
appropriate.
* gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect
computation of bytes_read / bytes_written.
* gfileutils.[ch] (g_file_get_contents): Make length
out parameter 'gsize *len'.
* ghook.c (g_hook_compare_ids): Don't compare a
and b as 'a - b'.
* gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE,
GSIZE_TO_POINTER.
* gmain.c (g_timeout_prepare): Rewrite to avoid
overflows. (Fixes bug when system clock skews
backwards more than 24 days.)
* gmarkup.[ch]: Make lengths passed to callbacks
gsize, length for g_markup_parse-context_parse(),
g_markup_escape_text() gssize.
* gmessages.[ch] (g_printf_string_upper_bound): Change
return value to gsize.
* gmessages.c (printf_string_upper_bound): Remove
a ridiculous use of 'inline' on a 300 line function.
* gstring.[ch]: Represent size of string as a gsize,
not gint. Make parameters to functions take gsize,
or gssize where -1 is allowed.
* gstring.c (g_string_erase): Make
g_string_erase (string, pos, -1) a synonym for
g_string_truncate for consistency with other G*
APIs.
* gstrfuncs.[ch]: Make all functions taking a string
length, take a gsize, or gssize if -1 is allowed.
(g_strstr_len, g_strrstr_len). Also fix some boundary
conditions in g_str[r]str[_len].
* gutf8.c tests/unicode-encoding.c: Make parameters that
are byte lengths gsize, gssize as appropriate. Make
character offsets, other counts, glong.
* gasyncqueue.c gcompletion.c
timeloop.c timeloop-basic.c gutils.c gspawn.c.
Small 64 bit cleanliness fixups.
* glist.c (g_list_sort2, g_list_sort_real): Fix functions
that should have been static.
* gdate.c (g_date_fill_parse_tokens): Fix extra
declaration that was shadowing another.
* tests/module-test.c: Include string.h
Mon Jun 18 15:43:29 2001 Owen Taylor <otaylor@redhat.com>
* gutf8.c (g_get_charset): Make argument
G_CONST_RETURN char **.
2001-06-23 15:55:09 +02:00
|
|
|
return NULL;
|
|
|
|
}
|
2001-06-09 01:14:03 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-05-14 20:49:50 +02:00
|
|
|
/**
|
|
|
|
* g_str_has_suffix:
|
|
|
|
* @str: a nul-terminated string.
|
|
|
|
* @suffix: the nul-terminated suffix to look for.
|
|
|
|
*
|
|
|
|
* Looks whether the string @str ends with @suffix.
|
|
|
|
*
|
2002-11-06 23:17:12 +01:00
|
|
|
* Return value: %TRUE if @str end with @suffix, %FALSE otherwise.
|
2002-11-28 01:15:45 +01:00
|
|
|
*
|
|
|
|
* Since: 2.2
|
2002-05-14 20:49:50 +02:00
|
|
|
**/
|
|
|
|
gboolean
|
|
|
|
g_str_has_suffix (const gchar *str,
|
|
|
|
const gchar *suffix)
|
|
|
|
{
|
|
|
|
int str_len;
|
|
|
|
int suffix_len;
|
|
|
|
|
|
|
|
g_return_val_if_fail (str != NULL, FALSE);
|
|
|
|
g_return_val_if_fail (suffix != NULL, FALSE);
|
|
|
|
|
|
|
|
str_len = strlen (str);
|
|
|
|
suffix_len = strlen (suffix);
|
|
|
|
|
|
|
|
if (str_len < suffix_len)
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return strcmp (str + str_len - suffix_len, suffix) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* g_str_has_prefix:
|
|
|
|
* @str: a nul-terminated string.
|
|
|
|
* @prefix: the nul-terminated prefix to look for.
|
|
|
|
*
|
|
|
|
* Looks whether the string @str begins with @prefix.
|
|
|
|
*
|
2002-11-06 23:17:12 +01:00
|
|
|
* Return value: %TRUE if @str begins with @prefix, %FALSE otherwise.
|
2002-11-28 01:15:45 +01:00
|
|
|
*
|
|
|
|
* Since: 2.2
|
2002-05-14 20:49:50 +02:00
|
|
|
**/
|
|
|
|
gboolean
|
|
|
|
g_str_has_prefix (const gchar *str,
|
|
|
|
const gchar *prefix)
|
|
|
|
{
|
|
|
|
int str_len;
|
|
|
|
int prefix_len;
|
|
|
|
|
|
|
|
g_return_val_if_fail (str != NULL, FALSE);
|
|
|
|
g_return_val_if_fail (prefix != NULL, FALSE);
|
|
|
|
|
|
|
|
str_len = strlen (str);
|
|
|
|
prefix_len = strlen (prefix);
|
|
|
|
|
|
|
|
if (str_len < prefix_len)
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return strncmp (str, prefix, prefix_len) == 0;
|
|
|
|
}
|
|
|
|
|