From 1146c6fbb37bb85f8c49f572cfae9469339f89ff Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Sat, 31 Jul 1999 21:45:21 +0000 Subject: [PATCH] New functions. * gstrfuncs.c (g_strccpy, g_strecpy): New functions. * glib.h: Declare and document them. Define the deprecated g_strescape as a macro that calls g_strecpy. * tests/strfunc-test.c (main): Test them. * makefile.{cygwin,msc}.in * tests/makefile.{cygwin,msc}.in: Remove gstack and its test program. * glib.def: Additions and removals. * README.win32: Improve gcc build instructions. * build-dll: Also build import library for MSVC. --- ChangeLog | 19 ++++++ ChangeLog.pre-2-0 | 19 ++++++ ChangeLog.pre-2-10 | 19 ++++++ ChangeLog.pre-2-12 | 19 ++++++ ChangeLog.pre-2-2 | 19 ++++++ ChangeLog.pre-2-4 | 19 ++++++ ChangeLog.pre-2-6 | 19 ++++++ ChangeLog.pre-2-8 | 19 ++++++ README.win32 | 67 +++++++------------- build-dll | 10 ++- glib.def | 33 +++++++--- glib.h | 16 +++++ glib/glib.def | 33 +++++++--- glib/glib.h | 16 +++++ glib/gstrfuncs.c | 131 +++++++++++++++++++++++++++++++++++++++ glib/makefile.msc.in | 1 - gstrfuncs.c | 131 +++++++++++++++++++++++++++++++++++++++ makefile.cygwin.in | 1 - makefile.msc.in | 1 - tests/makefile.cygwin.in | 3 +- tests/makefile.msc.in | 3 +- tests/strfunc-test.c | 11 ++++ 22 files changed, 535 insertions(+), 74 deletions(-) diff --git a/ChangeLog b/ChangeLog index c2cddd8f5..9f3113e3e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +1999-08-01 Tor Lillqvist + + * gstrfuncs.c (g_strccpy, g_strecpy): New functions. + + * glib.h: Declare and document them. Define the deprecated + g_strescape as a macro that calls g_strecpy. + + * tests/strfunc-test.c (main): Test them. + + * makefile.{cygwin,msc}.in + * tests/makefile.{cygwin,msc}.in: Remove gstack and its test + program. + + * glib.def: Additions and removals. + + * README.win32: Improve gcc build instructions. + + * build-dll: Also build import library for MSVC. + Sat Jul 24 20:11:35 1999 Tim Janik * merged GLib 1.3.0 with glib-1.2.3 from Fri Jul 16 22:18:36. diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index c2cddd8f5..9f3113e3e 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,22 @@ +1999-08-01 Tor Lillqvist + + * gstrfuncs.c (g_strccpy, g_strecpy): New functions. + + * glib.h: Declare and document them. Define the deprecated + g_strescape as a macro that calls g_strecpy. + + * tests/strfunc-test.c (main): Test them. + + * makefile.{cygwin,msc}.in + * tests/makefile.{cygwin,msc}.in: Remove gstack and its test + program. + + * glib.def: Additions and removals. + + * README.win32: Improve gcc build instructions. + + * build-dll: Also build import library for MSVC. + Sat Jul 24 20:11:35 1999 Tim Janik * merged GLib 1.3.0 with glib-1.2.3 from Fri Jul 16 22:18:36. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index c2cddd8f5..9f3113e3e 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,22 @@ +1999-08-01 Tor Lillqvist + + * gstrfuncs.c (g_strccpy, g_strecpy): New functions. + + * glib.h: Declare and document them. Define the deprecated + g_strescape as a macro that calls g_strecpy. + + * tests/strfunc-test.c (main): Test them. + + * makefile.{cygwin,msc}.in + * tests/makefile.{cygwin,msc}.in: Remove gstack and its test + program. + + * glib.def: Additions and removals. + + * README.win32: Improve gcc build instructions. + + * build-dll: Also build import library for MSVC. + Sat Jul 24 20:11:35 1999 Tim Janik * merged GLib 1.3.0 with glib-1.2.3 from Fri Jul 16 22:18:36. diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index c2cddd8f5..9f3113e3e 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,22 @@ +1999-08-01 Tor Lillqvist + + * gstrfuncs.c (g_strccpy, g_strecpy): New functions. + + * glib.h: Declare and document them. Define the deprecated + g_strescape as a macro that calls g_strecpy. + + * tests/strfunc-test.c (main): Test them. + + * makefile.{cygwin,msc}.in + * tests/makefile.{cygwin,msc}.in: Remove gstack and its test + program. + + * glib.def: Additions and removals. + + * README.win32: Improve gcc build instructions. + + * build-dll: Also build import library for MSVC. + Sat Jul 24 20:11:35 1999 Tim Janik * merged GLib 1.3.0 with glib-1.2.3 from Fri Jul 16 22:18:36. diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index c2cddd8f5..9f3113e3e 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,22 @@ +1999-08-01 Tor Lillqvist + + * gstrfuncs.c (g_strccpy, g_strecpy): New functions. + + * glib.h: Declare and document them. Define the deprecated + g_strescape as a macro that calls g_strecpy. + + * tests/strfunc-test.c (main): Test them. + + * makefile.{cygwin,msc}.in + * tests/makefile.{cygwin,msc}.in: Remove gstack and its test + program. + + * glib.def: Additions and removals. + + * README.win32: Improve gcc build instructions. + + * build-dll: Also build import library for MSVC. + Sat Jul 24 20:11:35 1999 Tim Janik * merged GLib 1.3.0 with glib-1.2.3 from Fri Jul 16 22:18:36. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index c2cddd8f5..9f3113e3e 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,22 @@ +1999-08-01 Tor Lillqvist + + * gstrfuncs.c (g_strccpy, g_strecpy): New functions. + + * glib.h: Declare and document them. Define the deprecated + g_strescape as a macro that calls g_strecpy. + + * tests/strfunc-test.c (main): Test them. + + * makefile.{cygwin,msc}.in + * tests/makefile.{cygwin,msc}.in: Remove gstack and its test + program. + + * glib.def: Additions and removals. + + * README.win32: Improve gcc build instructions. + + * build-dll: Also build import library for MSVC. + Sat Jul 24 20:11:35 1999 Tim Janik * merged GLib 1.3.0 with glib-1.2.3 from Fri Jul 16 22:18:36. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index c2cddd8f5..9f3113e3e 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,22 @@ +1999-08-01 Tor Lillqvist + + * gstrfuncs.c (g_strccpy, g_strecpy): New functions. + + * glib.h: Declare and document them. Define the deprecated + g_strescape as a macro that calls g_strecpy. + + * tests/strfunc-test.c (main): Test them. + + * makefile.{cygwin,msc}.in + * tests/makefile.{cygwin,msc}.in: Remove gstack and its test + program. + + * glib.def: Additions and removals. + + * README.win32: Improve gcc build instructions. + + * build-dll: Also build import library for MSVC. + Sat Jul 24 20:11:35 1999 Tim Janik * merged GLib 1.3.0 with glib-1.2.3 from Fri Jul 16 22:18:36. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index c2cddd8f5..9f3113e3e 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,22 @@ +1999-08-01 Tor Lillqvist + + * gstrfuncs.c (g_strccpy, g_strecpy): New functions. + + * glib.h: Declare and document them. Define the deprecated + g_strescape as a macro that calls g_strecpy. + + * tests/strfunc-test.c (main): Test them. + + * makefile.{cygwin,msc}.in + * tests/makefile.{cygwin,msc}.in: Remove gstack and its test + program. + + * glib.def: Additions and removals. + + * README.win32: Improve gcc build instructions. + + * build-dll: Also build import library for MSVC. + Sat Jul 24 20:11:35 1999 Tim Janik * merged GLib 1.3.0 with glib-1.2.3 from Fri Jul 16 22:18:36. diff --git a/README.win32 b/README.win32 index 36b9b5109..693fea448 100644 --- a/README.win32 +++ b/README.win32 @@ -10,12 +10,11 @@ library is used. To build GLib on Win32, you can use either the Microsoft compiler and tools, or gcc. Both the compiler from MSVC 5.0 and from MSVC 6.0 have -been used successfully. With gcc I mean the gcc-2.95 pre-release as -distributed by Mumit Khan, running under cygwin-b20.1. To successfully -use gcc, follow the instructions below. We want to use gcc --mno-cygwin, i.e. produce executables (.exe and .dll files) that do -*not* require the cygwin runtime library. This is sometimes called -"mingw32". +been used successfully. With gcc I mean gcc-2.95 as distributed by +Mumit Khan, running under cygwin-b20.1. To successfully use gcc, +follow the instructions below. We want to use gcc -mno-cygwin, +i.e. produce executables (.exe and .dll files) that do *not* require +the cygwin runtime library. This is sometimes called "mingw32". To test the GLib functions, go to the tests subdirectory and enter `nmake -f makefile.msc check` or `make -f makefile.cygwin check`. @@ -94,48 +93,24 @@ The gcc support was added quite recently, but seems to work. Debugging with gdb works. I use the latest and greatest gcc and mingw32. Somewhat earlier versions will also work, but you are on your own. -Fetch the gcc-2.95 developer snapshot from -ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/cygwin/snapshots/gcc-2.95-19990715/. -Install it somewhere, for instance \gcc-2.95. +Read and understand these instruction carefully. If you don't +understand or can't follow the instructions, you probably shouldn't +want to build glib (or gtk or gimp) yourself anyway. -Fetch the mingw runtime snapshot from 1999-07-15 from -ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/runtime/. You -must fix two bugs in it: +Fetch gcc-2.95 built for cygwin from +ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/cygwin/gcc-2.95/gcc-2.95-cygb20.tar.gz +Install it somewhere, for instance "C:\gcc-2.95" (/gcc-2.95 as seen +from cygwin). We call this directory $GCCDIR below. You will have +subdirectories "H-i586-cygwin32" and "include" under $GCCDIR. -1) Fix the prototype and call to __getmainargs() in init.c to include -one more parameter, an int *, which should be passed the address of a -zero int. Code snippets below: - -... -#ifdef __MSVCRT__ -extern void __getmainargs(int *, char***, char***, int, int *); -#else -... -#ifdef __MSVCRT__ - int newmode = 0; - (void) __getmainargs(&_argc, &_argv, &dummy_environ, _CRT_glob, &newmode); -#else -... - -2) Fix the type of the function __p___argv() in stdlib.h to be char***, -not char**. - -Build the mingw32 runtime and install the libraries in the -gcc-2.95\H-i586-cygwin32\lib directory, and the headers in the -gcc-2.95\H-i586-cygwin32\i586-cygwin32\include\mingw32 directory. -Remember to build and install also the w32api import libraries and -headers. - -I prefer to use the msvcrt runtime and not the default -crtdll. Especially, as the pthread library also uses msvcrt, using -crtdll would probably not be a good idea at all. Using msvcrt can be -achieved by applying a few changes to the specs file. - -The specs file is in gcc-2.95\H-i586-cygwin32\lib\gcc-lib\i586-cygwin32\2.95 - -The necessary changes are: replace -lcrtdll with -lmsvcrt, replace -crt1 with crt2, change -lmoldname to -lmoldname-msvc, and define -__MSVCRT__. +Next, you need to modify the gcc setup to use the msvcrt runtime +instead of crtdll. Also, the mingw32 and win32 API headers and import +libraries need to be added. I have collected all the necessary +additions in the file +http://www.iki.fi/tml/gimp/win32/gcc-2.95-additions.zip . Install that +in $GCCDIR. If you really want to do everything by yourself, follow +the instructions in +http://www.iki.fi/tml/gimp/win32/gcc-environment-setup.html Next, go back to the GLib directory and build using `make -f makefile.cygwin`. Building the dlls uses the script build-dll which diff --git a/build-dll b/build-dll index 958b45f30..ef3aa73b5 100644 --- a/build-dll +++ b/build-dll @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # Temporary hack until building dlls or executables with exported # entry points is easier with gcc -mno-cygwin ("mingw32"). @@ -36,4 +36,12 @@ $DLLTOOL --as=$AS --dllname $dllfile $defswitch --base-file $library.base --outp $GCC -mdll -mno-cygwin -Wl,$library.exp -o $dllfile $ldargs && $DLLTOOL --as=$AS --dllname $dllfile $defswitch --output-lib lib$libname.a $objs +# Finally, also build import libraries for the Microsoft linker. You +# will either need to have some decent version of MSVC, or get lib.exe +# (and link.exe) from the (freely downloadable) Microsoft Platform SDK. + +if type -p lib.exe && [ -n "$def" -a "$def" != '-' ]; then + lib -name:$libname.dll -def:$def -out:$libname.lib +fi + rm $library.base $library.exp 2>/dev/null diff --git a/glib.def b/glib.def index 7e6390722..fc6882b94 100644 --- a/glib.def +++ b/glib.def @@ -58,10 +58,10 @@ EXPORTS g_date_julian g_date_monday_week_of_year g_date_monday_weeks_in_year + g_date_month g_date_new g_date_new_dmy g_date_new_julian - g_date_month g_date_set_day g_date_set_dmy g_date_set_julian @@ -121,12 +121,12 @@ EXPORTS g_hook_get g_hook_insert_before g_hook_insert_sorted + g_hook_list_clear g_hook_list_init g_hook_list_invoke g_hook_list_invoke_check g_hook_list_marshal g_hook_list_marshal_check - g_hook_list_clear g_hook_next_valid g_hook_prepend g_hook_ref @@ -190,8 +190,8 @@ EXPORTS g_main_iteration g_main_new g_main_pending - g_main_remove_poll g_main_quit + g_main_remove_poll g_main_run g_main_set_poll_func g_malloc @@ -255,6 +255,19 @@ EXPORTS g_quark_from_string g_quark_to_string g_quark_try_string + g_queue_create + g_queue_free + g_queue_is_empty + g_queue_peek_head + g_queue_peek_tail + g_queue_pop_head + g_queue_pop_head_link + g_queue_pop_tail + g_queue_pop_tail_link + g_queue_push_head + g_queue_push_head_link + g_queue_push_tail + g_queue_push_tail_link g_rand_double g_rand_double_range g_rand_free @@ -331,7 +344,6 @@ EXPORTS g_slist_reverse g_slist_sort g_snprintf - g_spaced_primes_closest g_source_add g_source_remove g_source_remove_by_source_data @@ -355,12 +367,15 @@ EXPORTS g_strchomp g_strchug g_strconcat + g_strccpy g_strdelimit g_strdown g_strdup g_strdup_printf g_strdup_vprintf + g_strecpy g_strerror + g_strescape g_strfreev g_string_append g_string_append_c @@ -377,17 +392,12 @@ EXPORTS g_string_new g_string_prepend g_string_prepend_c - g_string_readline - g_string_readline_buffered g_string_sized_new g_string_sprintf g_string_sprintfa - g_string_tokenise - g_string_tokenise_free g_string_truncate g_string_up g_strjoinv - g_strescape g_strncasecmp g_strndup g_strnfill @@ -397,9 +407,11 @@ EXPORTS g_strtod g_strup g_thread_create + g_thread_functions_for_glib_use g_thread_join g_thread_self g_thread_set_priority + g_threads_got_initialized g_timeout_add g_timeout_add_full g_timer_destroy @@ -426,8 +438,9 @@ EXPORTS glib_major_version glib_micro_version glib_minor_version + gwin_closedir gwin_ftruncate gwin_opendir gwin_readdir gwin_rewinddir - gwin_closedir + g_spaced_primes_closest diff --git a/glib.h b/glib.h index d04499ad1..fb6948217 100644 --- a/glib.h +++ b/glib.h @@ -1515,9 +1515,25 @@ gchar* g_strconcat (const gchar *string1, ...); /* NULL terminated */ gchar* g_strjoin (const gchar *separator, ...); /* NULL terminated */ +/* Copy a string interpreting C string -style escape sequences. + * The recognized sequences are \b \f \n \r \t \\ \" and the octal format. + */ +gchar* g_strccpy (gchar *dest, + const gchar *source); +/* Copy a string escaping nonprintable characters like in C strings. + * Inverse of g_strccpy. The exceptions parameter if non-NULL points + * to a string containing characters that are not escaped. + */ +gchar* g_strecpy (gchar *dest, + const gchar *source, + const gchar *exceptions); + /* deprecated function */ gchar* g_strescape (gchar *string); +/* Define a macro for it */ +#define g_strescape(src) g_strecpy (g_malloc (strlen (src)*4+1), src, NULL) + gpointer g_memdup (gconstpointer mem, guint byte_size); diff --git a/glib/glib.def b/glib/glib.def index 7e6390722..fc6882b94 100644 --- a/glib/glib.def +++ b/glib/glib.def @@ -58,10 +58,10 @@ EXPORTS g_date_julian g_date_monday_week_of_year g_date_monday_weeks_in_year + g_date_month g_date_new g_date_new_dmy g_date_new_julian - g_date_month g_date_set_day g_date_set_dmy g_date_set_julian @@ -121,12 +121,12 @@ EXPORTS g_hook_get g_hook_insert_before g_hook_insert_sorted + g_hook_list_clear g_hook_list_init g_hook_list_invoke g_hook_list_invoke_check g_hook_list_marshal g_hook_list_marshal_check - g_hook_list_clear g_hook_next_valid g_hook_prepend g_hook_ref @@ -190,8 +190,8 @@ EXPORTS g_main_iteration g_main_new g_main_pending - g_main_remove_poll g_main_quit + g_main_remove_poll g_main_run g_main_set_poll_func g_malloc @@ -255,6 +255,19 @@ EXPORTS g_quark_from_string g_quark_to_string g_quark_try_string + g_queue_create + g_queue_free + g_queue_is_empty + g_queue_peek_head + g_queue_peek_tail + g_queue_pop_head + g_queue_pop_head_link + g_queue_pop_tail + g_queue_pop_tail_link + g_queue_push_head + g_queue_push_head_link + g_queue_push_tail + g_queue_push_tail_link g_rand_double g_rand_double_range g_rand_free @@ -331,7 +344,6 @@ EXPORTS g_slist_reverse g_slist_sort g_snprintf - g_spaced_primes_closest g_source_add g_source_remove g_source_remove_by_source_data @@ -355,12 +367,15 @@ EXPORTS g_strchomp g_strchug g_strconcat + g_strccpy g_strdelimit g_strdown g_strdup g_strdup_printf g_strdup_vprintf + g_strecpy g_strerror + g_strescape g_strfreev g_string_append g_string_append_c @@ -377,17 +392,12 @@ EXPORTS g_string_new g_string_prepend g_string_prepend_c - g_string_readline - g_string_readline_buffered g_string_sized_new g_string_sprintf g_string_sprintfa - g_string_tokenise - g_string_tokenise_free g_string_truncate g_string_up g_strjoinv - g_strescape g_strncasecmp g_strndup g_strnfill @@ -397,9 +407,11 @@ EXPORTS g_strtod g_strup g_thread_create + g_thread_functions_for_glib_use g_thread_join g_thread_self g_thread_set_priority + g_threads_got_initialized g_timeout_add g_timeout_add_full g_timer_destroy @@ -426,8 +438,9 @@ EXPORTS glib_major_version glib_micro_version glib_minor_version + gwin_closedir gwin_ftruncate gwin_opendir gwin_readdir gwin_rewinddir - gwin_closedir + g_spaced_primes_closest diff --git a/glib/glib.h b/glib/glib.h index d04499ad1..fb6948217 100644 --- a/glib/glib.h +++ b/glib/glib.h @@ -1515,9 +1515,25 @@ gchar* g_strconcat (const gchar *string1, ...); /* NULL terminated */ gchar* g_strjoin (const gchar *separator, ...); /* NULL terminated */ +/* Copy a string interpreting C string -style escape sequences. + * The recognized sequences are \b \f \n \r \t \\ \" and the octal format. + */ +gchar* g_strccpy (gchar *dest, + const gchar *source); +/* Copy a string escaping nonprintable characters like in C strings. + * Inverse of g_strccpy. The exceptions parameter if non-NULL points + * to a string containing characters that are not escaped. + */ +gchar* g_strecpy (gchar *dest, + const gchar *source, + const gchar *exceptions); + /* deprecated function */ gchar* g_strescape (gchar *string); +/* Define a macro for it */ +#define g_strescape(src) g_strecpy (g_malloc (strlen (src)*4+1), src, NULL) + gpointer g_memdup (gconstpointer mem, guint byte_size); diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c index 37df96315..1ed8a2df1 100644 --- a/glib/gstrfuncs.c +++ b/glib/gstrfuncs.c @@ -1072,6 +1072,137 @@ g_strdelimit (gchar *string, return string; } +gchar* +g_strccpy (gchar *dest, + const gchar *source) +{ + const gchar *p = source; + gchar *q = dest; + + g_return_val_if_fail (dest != NULL, NULL); + + 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; + while ((*p >= '0') && (*p <= '7')) + { + *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; + return dest; +} + +gchar * +g_strecpy (gchar *dest, + const gchar *src, + const gchar *exceptions) +{ + const guchar *p = (guchar *) src; + gchar *q = dest; + guchar excmap[256]; + + 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++ = '\\'; + *q++ = '0' + (((*p) >> 6)&07); + *q++ = '0' + (((*p) >> 3)&07); + *q++ = '0' + ((*p)&07); + } + else + *q++ = *p; + break; + } + } + p++; + } + *q = 0; + return dest; +} + gchar* g_strescape (gchar *string) { diff --git a/glib/makefile.msc.in b/glib/makefile.msc.in index 9776a7532..ecf6e1cc5 100644 --- a/glib/makefile.msc.in +++ b/glib/makefile.msc.in @@ -74,7 +74,6 @@ glib_OBJECTS = \ gqueue.obj \ grand.obj \ gslist.obj \ - gstack.obj \ gthread.obj \ gtimer.obj \ gtree.obj \ diff --git a/gstrfuncs.c b/gstrfuncs.c index 37df96315..1ed8a2df1 100644 --- a/gstrfuncs.c +++ b/gstrfuncs.c @@ -1072,6 +1072,137 @@ g_strdelimit (gchar *string, return string; } +gchar* +g_strccpy (gchar *dest, + const gchar *source) +{ + const gchar *p = source; + gchar *q = dest; + + g_return_val_if_fail (dest != NULL, NULL); + + 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; + while ((*p >= '0') && (*p <= '7')) + { + *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; + return dest; +} + +gchar * +g_strecpy (gchar *dest, + const gchar *src, + const gchar *exceptions) +{ + const guchar *p = (guchar *) src; + gchar *q = dest; + guchar excmap[256]; + + 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++ = '\\'; + *q++ = '0' + (((*p) >> 6)&07); + *q++ = '0' + (((*p) >> 3)&07); + *q++ = '0' + ((*p)&07); + } + else + *q++ = *p; + break; + } + } + p++; + } + *q = 0; + return dest; +} + gchar* g_strescape (gchar *string) { diff --git a/makefile.cygwin.in b/makefile.cygwin.in index f12e9be2a..11435d0af 100644 --- a/makefile.cygwin.in +++ b/makefile.cygwin.in @@ -67,7 +67,6 @@ glib_OBJECTS = \ gqueue.o \ grand.o \ gslist.o \ - gstack.o \ gthread.o \ gtimer.o \ gtree.o \ diff --git a/makefile.msc.in b/makefile.msc.in index 9776a7532..ecf6e1cc5 100644 --- a/makefile.msc.in +++ b/makefile.msc.in @@ -74,7 +74,6 @@ glib_OBJECTS = \ gqueue.obj \ grand.obj \ gslist.obj \ - gstack.obj \ gthread.obj \ gtimer.obj \ gtree.obj \ diff --git a/tests/makefile.cygwin.in b/tests/makefile.cygwin.in index 9f02e154e..641b7ceb6 100644 --- a/tests/makefile.cygwin.in +++ b/tests/makefile.cygwin.in @@ -24,9 +24,8 @@ TESTS = \ rand-test.exe \ relation-test.exe\ slist-test.exe \ - stack-test.exe \ - string-test.exe \ strfunc-test.exe\ + string-test.exe \ thread-test.exe \ tree-test.exe \ type-test.exe diff --git a/tests/makefile.msc.in b/tests/makefile.msc.in index 1a91929f7..0cff24af6 100644 --- a/tests/makefile.msc.in +++ b/tests/makefile.msc.in @@ -26,9 +26,8 @@ TESTS = \ rand-test.exe \ relation-test.exe\ slist-test.exe \ - stack-test.exe \ - string-test.exe \ strfunc-test.exe\ + string-test.exe \ thread-test.exe \ tree-test.exe \ type-test.exe diff --git a/tests/strfunc-test.c b/tests/strfunc-test.c index f50a03716..16d5584cf 100644 --- a/tests/strfunc-test.c +++ b/tests/strfunc-test.c @@ -99,6 +99,17 @@ main (int argc, g_assert (strcmp(string, "00021 test ") == 0); g_free (string); + g_assert (strcmp(g_strccpy(g_malloc(100), + "abc\\\\\\\"\\b\\f\\n\\r\\t\\003\\177\\234\\313"), + "abc\\\"\b\f\n\r\t\003\177\234\313") == 0); + g_assert (strcmp(g_strecpy(g_malloc(100), + "abc\\\"\b\f\n\r\t\003\177\234\313", + NULL), + "abc\\\\\\\"\\b\\f\\n\\r\\t\\003\\177\\234\\313") == 0); + g_assert (strcmp(g_strecpy(g_malloc(100),"abc\\\"\b\f\n\r\t\003\177\234\313", + "\b\f\001\002\003\004"), + "abc\\\\\\\"\b\f\\n\\r\\t\003\\177\\234\\313") == 0); + return 0; }