diff options
Diffstat (limited to 'string')
-rw-r--r-- | string/bits/string2.h | 38 | ||||
-rw-r--r-- | string/strings.h | 36 | ||||
-rw-r--r-- | string/swab.c | 5 |
3 files changed, 64 insertions, 15 deletions
diff --git a/string/bits/string2.h b/string/bits/string2.h index 8555d677ab..e0a8e75311 100644 --- a/string/bits/string2.h +++ b/string/bits/string2.h @@ -369,18 +369,40 @@ __STRING2_COPY_TYPE (8); #ifndef _HAVE_STRING_ARCH_strcmp # define strcmp(s1, s2) \ (__extension__ (__builtin_constant_p (s1) && __builtin_constant_p (s2) \ - && (sizeof (s1)[0] != 1 || strlen (s1) >= 4) \ - && (sizeof (s2)[0] != 1 || strlen (s2) >= 4) \ + && (sizeof ((s1)[0]) != 1 || strlen (s1) >= 4) \ + && (sizeof ((s2)[0]) != 1 || strlen (s2) >= 4) \ ? memcmp (s1, s2, (strlen (s1) < strlen (s2) \ ? strlen (s1) : strlen (s2)) + 1) \ - : (__builtin_constant_p (s1) && sizeof (s1)[0] == 1 \ - && sizeof (s2)[0] == 1 && strlen (s1) < 4 \ - ? __strcmp_cg (s1, s2, strlen (s1)) \ - : (__builtin_constant_p (s2) && sizeof (s1)[0] == 1 \ - && sizeof (s2)[0] == 1 && strlen (s2) < 4 \ - ? __strcmp_gc (s1, s2, strlen (s2)) \ + : (__builtin_constant_p (s1) && sizeof ((s1)[0]) == 1 \ + && sizeof ((s2)[0]) == 1 && strlen (s1) < 4 \ + ? (__builtin_constant_p (s2) \ + ? __strcmp_cc (s1, s2, strlen (s1)) \ + : __strcmp_cg (s1, s2, strlen (s1))) \ + : (__builtin_constant_p (s2) && sizeof ((s1)[0]) == 1 \ + && sizeof ((s2)[0]) == 1 && strlen (s2) < 4 \ + ? (__builtin_constant_p (s1) \ + ? __strcmp_cc (s1, s2, strlen (s2)) \ + : __strcmp_gc (s1, s2, strlen (s2))) \ : strcmp (s1, s2))))) +# define __strcmp_cc(s1, s2, l) \ + (__extension__ ({ register int __result = ((unsigned char) (s1)[0] \ + - (unsigned char) (s2)[0]); \ + if (l > 0 && __result == 0) \ + { \ + __result = ((unsigned char) (s1)[1] \ + - (unsigned char) (s2)[1]); \ + if (l > 1 && __result == 0) \ + { \ + __result = ((unsigned char) (s1)[2] \ + - (unsigned char) (s2)[2]); \ + if (l > 2 && __result == 0) \ + __result = ((unsigned char) (s1)[3] \ + - (unsigned char) (s2)[3]); \ + } \ + } \ + __result; })) + # define __strcmp_cg(s1, s2, l1) \ (__extension__ ({ __const unsigned char *__s2 = (unsigned char *) (s2); \ register int __result = (unsigned char) (s1)[0] - __s2[0];\ diff --git a/string/strings.h b/string/strings.h index 701132992a..20a1af1d84 100644 --- a/string/strings.h +++ b/string/strings.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1992, 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,17 +16,41 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* Compatibility with BSD string(3). */ - #ifndef _STRINGS_H #define _STRINGS_H 1 #include <features.h> +#define __need_size_t +#include <stddef.h> + +__BEGIN_DECLS + +/* Compare N bytes of S1 and S2 (same as memcmp). */ +extern int bcmp __P ((__const __ptr_t __s1, __const __ptr_t __s2, size_t __n)); + +/* Copy N bytes of SRC to DEST (like memmove, but args reversed). */ +extern void bcopy __P ((__const __ptr_t __src, __ptr_t __dest, size_t __n)); + +/* Set N bytes of S to 0. */ +extern void bzero __P ((__ptr_t __s, size_t __n)); + +/* Return the position of the first bit set in I, or 0 if none are set. + The least-significant bit is position 1, the most-significant 32. */ +extern int ffs __P ((int __i)); + +/* Find the first occurrence of C in S (same as strchr). */ +extern char *index __P ((__const char *__s, int __c)); + +/* Find the last occurrence of C in S (same as strrchr). */ +extern char *rindex __P ((__const char *__s, int __c)); +/* Compare S1 and S2, ignoring case. */ +extern int strcasecmp __P ((__const char *__s1, __const char *__s2)); -#ifndef _STRING_H -#include <string.h> -#endif /* string.h */ +/* Compare no more than N chars of S1 and S2, ignoring case. */ +extern int strncasecmp __P ((__const char *__s1, __const char *__s2, + size_t __n)); +__END_DECLS #endif /* strings.h */ diff --git a/string/swab.c b/string/swab.c index c9cf7004ea..325ead5a93 100644 --- a/string/swab.c +++ b/string/swab.c @@ -19,8 +19,11 @@ #include <unistd.h> void -swab (const char *from, char *to, ssize_t n) +swab (const void *bfrom, void *bto, ssize_t n) { + const char *from = (const char *) bfrom; + char *to = (char *) bto; + n &= ~((ssize_t) 1); while (n > 1) { |