mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-24 14:36:13 +01:00
Added a g_memmove replacement for platforms without memmove, where bcopy
1999-07-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de> * configure.in, acconfig.h, gutils.c: Added a g_memmove replacement for platforms without memmove, where bcopy can't handle overlapping copies and the corresponding checks, which is taken form the PERL Configure routine. * glib.h: Updated the commentary about g_memmove to be right and more GLib-like. * configure.in: Removed test for rand_r, as it isn't used anymore.
This commit is contained in:
parent
f80d6cc540
commit
d610460c22
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
||||
1999-07-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* configure.in, acconfig.h, gutils.c: Added a g_memmove
|
||||
replacement for platforms without memmove, where bcopy can't
|
||||
handle overlapping copies and the corresponding checks, which is
|
||||
taken form the PERL Configure routine.
|
||||
|
||||
* glib.h: Updated the commentary about g_memmove to be right and
|
||||
more GLib-like.
|
||||
|
||||
* configure.in: Removed test for rand_r, as it isn't used anymore.
|
||||
|
||||
1999-06-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* glib.h, grand.c: Finally removed the g_random_normal and
|
||||
|
@ -1,3 +1,15 @@
|
||||
1999-07-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* configure.in, acconfig.h, gutils.c: Added a g_memmove
|
||||
replacement for platforms without memmove, where bcopy can't
|
||||
handle overlapping copies and the corresponding checks, which is
|
||||
taken form the PERL Configure routine.
|
||||
|
||||
* glib.h: Updated the commentary about g_memmove to be right and
|
||||
more GLib-like.
|
||||
|
||||
* configure.in: Removed test for rand_r, as it isn't used anymore.
|
||||
|
||||
1999-06-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* glib.h, grand.c: Finally removed the g_random_normal and
|
||||
|
@ -1,3 +1,15 @@
|
||||
1999-07-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* configure.in, acconfig.h, gutils.c: Added a g_memmove
|
||||
replacement for platforms without memmove, where bcopy can't
|
||||
handle overlapping copies and the corresponding checks, which is
|
||||
taken form the PERL Configure routine.
|
||||
|
||||
* glib.h: Updated the commentary about g_memmove to be right and
|
||||
more GLib-like.
|
||||
|
||||
* configure.in: Removed test for rand_r, as it isn't used anymore.
|
||||
|
||||
1999-06-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* glib.h, grand.c: Finally removed the g_random_normal and
|
||||
|
@ -1,3 +1,15 @@
|
||||
1999-07-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* configure.in, acconfig.h, gutils.c: Added a g_memmove
|
||||
replacement for platforms without memmove, where bcopy can't
|
||||
handle overlapping copies and the corresponding checks, which is
|
||||
taken form the PERL Configure routine.
|
||||
|
||||
* glib.h: Updated the commentary about g_memmove to be right and
|
||||
more GLib-like.
|
||||
|
||||
* configure.in: Removed test for rand_r, as it isn't used anymore.
|
||||
|
||||
1999-06-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* glib.h, grand.c: Finally removed the g_random_normal and
|
||||
|
@ -1,3 +1,15 @@
|
||||
1999-07-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* configure.in, acconfig.h, gutils.c: Added a g_memmove
|
||||
replacement for platforms without memmove, where bcopy can't
|
||||
handle overlapping copies and the corresponding checks, which is
|
||||
taken form the PERL Configure routine.
|
||||
|
||||
* glib.h: Updated the commentary about g_memmove to be right and
|
||||
more GLib-like.
|
||||
|
||||
* configure.in: Removed test for rand_r, as it isn't used anymore.
|
||||
|
||||
1999-06-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* glib.h, grand.c: Finally removed the g_random_normal and
|
||||
|
@ -1,3 +1,15 @@
|
||||
1999-07-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* configure.in, acconfig.h, gutils.c: Added a g_memmove
|
||||
replacement for platforms without memmove, where bcopy can't
|
||||
handle overlapping copies and the corresponding checks, which is
|
||||
taken form the PERL Configure routine.
|
||||
|
||||
* glib.h: Updated the commentary about g_memmove to be right and
|
||||
more GLib-like.
|
||||
|
||||
* configure.in: Removed test for rand_r, as it isn't used anymore.
|
||||
|
||||
1999-06-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* glib.h, grand.c: Finally removed the g_random_normal and
|
||||
|
@ -1,3 +1,15 @@
|
||||
1999-07-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* configure.in, acconfig.h, gutils.c: Added a g_memmove
|
||||
replacement for platforms without memmove, where bcopy can't
|
||||
handle overlapping copies and the corresponding checks, which is
|
||||
taken form the PERL Configure routine.
|
||||
|
||||
* glib.h: Updated the commentary about g_memmove to be right and
|
||||
more GLib-like.
|
||||
|
||||
* configure.in: Removed test for rand_r, as it isn't used anymore.
|
||||
|
||||
1999-06-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* glib.h, grand.c: Finally removed the g_random_normal and
|
||||
|
@ -1,3 +1,15 @@
|
||||
1999-07-01 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* configure.in, acconfig.h, gutils.c: Added a g_memmove
|
||||
replacement for platforms without memmove, where bcopy can't
|
||||
handle overlapping copies and the corresponding checks, which is
|
||||
taken form the PERL Configure routine.
|
||||
|
||||
* glib.h: Updated the commentary about g_memmove to be right and
|
||||
more GLib-like.
|
||||
|
||||
* configure.in: Removed test for rand_r, as it isn't used anymore.
|
||||
|
||||
1999-06-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* glib.h, grand.c: Finally removed the g_random_normal and
|
||||
|
@ -69,6 +69,7 @@
|
||||
#undef HAVE_VALUES_H
|
||||
#undef HAVE_WCHAR_H
|
||||
#undef HAVE_WCTYPE_H
|
||||
#undef HAVE_WORKING_BCOPY
|
||||
|
||||
#undef NO_FD_SET
|
||||
#undef NO_SYS_ERRLIST
|
||||
|
39
configure.in
39
configure.in
@ -306,6 +306,31 @@ AC_CHECK_HEADERS(values.h, AC_DEFINE(HAVE_VALUES_H))
|
||||
# Check for some functions
|
||||
AC_CHECK_FUNCS(lstat strerror strsignal memmove vsnprintf strcasecmp strncasecmp poll)
|
||||
|
||||
# Check if bcopy can be used for overlapping copies, if memmove isn't found.
|
||||
# The check is borrowed from the PERL Configure script.
|
||||
if test "$ac_cv_func_memmove" != "yes"; then
|
||||
AC_CACHE_CHECK(whether bcopy can handle overlapping copies,
|
||||
glib_cv_working_bcopy,[AC_TRY_RUN([
|
||||
int main() {
|
||||
char buf[128], abc[128], *b;
|
||||
int len, off, align;
|
||||
bcopy("abcdefghijklmnopqrstuvwxyz0123456789", abc, 36);
|
||||
for (align = 7; align >= 0; align--) {
|
||||
for (len = 36; len; len--) {
|
||||
b = buf+align; bcopy(abc, b, len);
|
||||
for (off = 1; off <= len; off++) {
|
||||
bcopy(b, b+off, len); bcopy(b+off, b, len);
|
||||
if (bcmp(b, abc, len)) return(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}],glib_cv_working_bcopy=yes,glib_cv_working_bcopy=no)])
|
||||
if test "$glib_cv_working_bcopy" == "yes"; then
|
||||
AC_DEFINE(HAVE_WORKING_BCOPY)
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check for sys_errlist
|
||||
AC_MSG_CHECKING(for sys_errlist)
|
||||
AC_TRY_LINK(, [
|
||||
@ -787,7 +812,7 @@ if test x"$enable_threads" = xyes; then
|
||||
# to always be linked with the thread libs on some platforms.
|
||||
# LIBS="$LIBS $G_THREAD_LIBS"
|
||||
CFLAGS="$CFLAGS $G_THREAD_CFLAGS"
|
||||
AC_CHECK_FUNCS(localtime_r rand_r)
|
||||
AC_CHECK_FUNCS(localtime_r)
|
||||
if test "$ac_cv_header_pwd_h" = "yes"; then
|
||||
AC_MSG_CHECKING([for getpwuid_r])
|
||||
AC_CACHE_VAL(ac_cv_func_getpwuid_r,
|
||||
@ -1330,12 +1355,16 @@ x$ac_cv_func_memmove)
|
||||
glib_memmove='
|
||||
#define g_memmove(d,s,n) G_STMT_START { memmove ((d), (s), (n)); } G_STMT_END'
|
||||
;;
|
||||
x$glib_cv_working_bcopy)
|
||||
glib_memmove="
|
||||
/* memmove isn't available, but bcopy can copy overlapping memory regions */
|
||||
#define g_memmove(d,s,n) G_STMT_START { bcopy ((s), (d), (n)); } G_STMT_END"
|
||||
;;
|
||||
*)
|
||||
glib_memmove="
|
||||
/* We make the assumption that if memmove isn't available, then
|
||||
* bcopy will do the job. This isn't safe everywhere. (bcopy can't
|
||||
* necessarily handle overlapping copies) */
|
||||
#define g_memmove(d,s,n) G_STMT_START { bcopy ((s), (d), (n)); } G_STMT_END"
|
||||
/* memmove isn't found and bcopy can't copy overlapping memory regions,
|
||||
* so we have to roll our own copy routine. */
|
||||
void g_memmove (void* dest, const void * src, unsigned long len);"
|
||||
;;
|
||||
esac
|
||||
|
||||
|
2
glib.h
2
glib.h
@ -58,7 +58,7 @@
|
||||
* To register hooks which are executed on exit().
|
||||
* Usually a wrapper for STDC atexit.
|
||||
*
|
||||
* void *g_memmove(void *dest, const void *src, guint count);
|
||||
* void g_memmove(gpointer dest, gconstpointer void *src, gulong count);
|
||||
* A wrapper for STDC memmove, or an implementation, if memmove doesn't
|
||||
* exist. The prototype looks like the above, give or take a const,
|
||||
* or size_t.
|
||||
|
@ -58,7 +58,7 @@
|
||||
* To register hooks which are executed on exit().
|
||||
* Usually a wrapper for STDC atexit.
|
||||
*
|
||||
* void *g_memmove(void *dest, const void *src, guint count);
|
||||
* void g_memmove(gpointer dest, gconstpointer void *src, gulong count);
|
||||
* A wrapper for STDC memmove, or an implementation, if memmove doesn't
|
||||
* exist. The prototype looks like the above, give or take a const,
|
||||
* or size_t.
|
||||
|
@ -81,6 +81,32 @@ const guint glib_micro_version = GLIB_MICRO_VERSION;
|
||||
const guint glib_interface_age = GLIB_INTERFACE_AGE;
|
||||
const guint glib_binary_age = GLIB_BINARY_AGE;
|
||||
|
||||
#if !defined (HAVE_MEMMOVE) && !defined (HAVE_WORKING_BCOPY)
|
||||
void
|
||||
g_memmove (gpointer dest, gconstpointer src, gulong len)
|
||||
{
|
||||
gchar* destptr = dest;
|
||||
const gchar* srcptr = src;
|
||||
if (src + len < dest || dest + len < src)
|
||||
{
|
||||
bcopy (src, dest, len);
|
||||
return;
|
||||
}
|
||||
else if (dest <= src)
|
||||
{
|
||||
while (len--)
|
||||
*(destptr++) = *(srcptr++);
|
||||
}
|
||||
else
|
||||
{
|
||||
destptr += len;
|
||||
srcptr += len;
|
||||
while (len--)
|
||||
*(--destptr) = *(--srcptr);
|
||||
}
|
||||
}
|
||||
#endif /* !HAVE_MEMMOVE && !HAVE_WORKING_BCOPY */
|
||||
|
||||
void
|
||||
g_atexit (GVoidFunc func)
|
||||
{
|
||||
|
26
gutils.c
26
gutils.c
@ -81,6 +81,32 @@ const guint glib_micro_version = GLIB_MICRO_VERSION;
|
||||
const guint glib_interface_age = GLIB_INTERFACE_AGE;
|
||||
const guint glib_binary_age = GLIB_BINARY_AGE;
|
||||
|
||||
#if !defined (HAVE_MEMMOVE) && !defined (HAVE_WORKING_BCOPY)
|
||||
void
|
||||
g_memmove (gpointer dest, gconstpointer src, gulong len)
|
||||
{
|
||||
gchar* destptr = dest;
|
||||
const gchar* srcptr = src;
|
||||
if (src + len < dest || dest + len < src)
|
||||
{
|
||||
bcopy (src, dest, len);
|
||||
return;
|
||||
}
|
||||
else if (dest <= src)
|
||||
{
|
||||
while (len--)
|
||||
*(destptr++) = *(srcptr++);
|
||||
}
|
||||
else
|
||||
{
|
||||
destptr += len;
|
||||
srcptr += len;
|
||||
while (len--)
|
||||
*(--destptr) = *(--srcptr);
|
||||
}
|
||||
}
|
||||
#endif /* !HAVE_MEMMOVE && !HAVE_WORKING_BCOPY */
|
||||
|
||||
void
|
||||
g_atexit (GVoidFunc func)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user