summaryrefslogtreecommitdiff
path: root/string
diff options
context:
space:
mode:
Diffstat (limited to 'string')
-rw-r--r--string/bits/string2.h38
-rw-r--r--string/strings.h36
-rw-r--r--string/swab.c5
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)
{