summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--string/strcoll.c101
-rw-r--r--string/strxfrm.c141
-rw-r--r--wcsmbs/wcscoll.c24
-rw-r--r--wcsmbs/wcsxfrm.c28
5 files changed, 197 insertions, 105 deletions
diff --git a/ChangeLog b/ChangeLog
index 9fd1e69d5f..35b9f26830 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+1999-12-30 Ulrich Drepper <drepper@cygnus.com>
+
+ * wcsmbs/wcscoll.c: Use multibyte character version.
+ * wcsmbs/wcsxfrm.c: Likewise.
+ * string/strcoll.c: Prepare to be used for the wide character version.
+ * string/strxfrm.c: Likewise.
+ * locale/weightwc.h: New file.
+
1999-12-30 Geoff Keating <geoffk@cygnus.com>
* sysdeps/powerpc/fpu/bits/fenvinline.h (feraiseexcept): Remove
diff --git a/string/strcoll.c b/string/strcoll.c
index 0f0a45a2d1..32d9124421 100644
--- a/string/strcoll.c
+++ b/string/strcoll.c
@@ -24,24 +24,36 @@
#include <stdlib.h>
#include <string.h>
-#include "../locale/localeinfo.h"
-
-#ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# define STRCOLL __strcoll_l
-#else
-# define STRCOLL strcoll
+#ifndef STRING_TYPE
+# define STRING_TYPE char
+# define USTRING_TYPE unsigned char
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define STRCOLL __strcoll_l
+# else
+# define STRCOLL strcoll
+# endif
+# define STRCMP strcmp
+# define STRLEN strlen
+# define WEIGHT_H "../locale/weight.h"
+# define SUFFIX MB
+# define L(arg) arg
#endif
+#define CONCAT(a,b) CONCAT1(a,b)
+#define CONCAT1(a,b) a##b
+
+#include "../locale/localeinfo.h"
+
#ifndef USE_IN_EXTENDED_LOCALE_MODEL
int
STRCOLL (s1, s2)
- const char *s1;
- const char *s2;
+ const STRING_TYPE *s1;
+ const STRING_TYPE *s2;
#else
int
STRCOLL (s1, s2, l)
- const char *s1;
- const char *s2;
+ const STRING_TYPE *s1;
+ const STRING_TYPE *s2;
__locale_t l;
#endif
{
@@ -49,19 +61,19 @@ STRCOLL (s1, s2, l)
struct locale_data *current = l->__locales[LC_COLLATE];
uint_fast32_t nrules = *((uint32_t *) current->values[_NL_ITEM_INDEX (_NL_COLLATE_NRULES)].string);
#else
- uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
#endif
/* We don't assign the following values right away since it might be
unnecessary in case there are no rules. */
const unsigned char *rulesets;
const int32_t *table;
- const unsigned char *weights;
- const unsigned char *extra;
+ const USTRING_TYPE *weights;
+ const USTRING_TYPE *extra;
const int32_t *indirect;
uint_fast32_t pass;
int result = 0;
- const unsigned char *us1;
- const unsigned char *us2;
+ const USTRING_TYPE *us1;
+ const USTRING_TYPE *us2;
size_t s1len;
size_t s2len;
int32_t *idx1arr;
@@ -83,45 +95,62 @@ STRCOLL (s1, s2, l)
int position;
int seq1len;
int seq2len;
- int use_malloc = 0;
+ int use_malloc;
+#ifdef WIDE_CHAR_VERSION
+ size_t size;
+ size_t layers;
+ const wint_t *names;
+#endif
-#include "../locale/weight.h"
+#include WEIGHT_H
if (nrules == 0)
- return strcmp (s1, s2);
+ return STRCMP (s1, s2);
#ifdef USE_IN_EXTENDED_LOCALE_MODEL
rulesets = (const unsigned char *)
current->values[_NL_ITEM_INDEX (_NL_COLLATE_RULESETS)].string;
table = (const int32_t *)
- current->values[_NL_ITEM_INDEX (_NL_COLLATE_TABLEMB)].string;
- weights = (const unsigned char *)
- current->values[_NL_ITEM_INDEX (_NL_COLLATE_WEIGHTMB)].string;
- extra = (const unsigned char *)
- current->values[_NL_ITEM_INDEX (_NL_COLLATE_EXTRAMB)].string;
+ current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_TABLE,SUFFIX))].string;
+ weights = (const USTRING_TYPE *)
+ current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_WEIGHT,SUFFIX))].string;
+ extra = (const USTRING_TYPE *)
+ current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_EXTRA,SUFFIX))].string;
indirect = (const int32_t *)
- current->values[_NL_ITEM_INDEX (_NL_COLLATE_INDIRECTMB)].string;
+ current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_INDIRECT,SUFFIX))].string;
+# ifdef WIDE_CHAR_VERSION
+ names = (const wint_t *)
+ current->values[_NL_ITEM_INDEX (_NL_COLLATE_NAMES)].string;
+ size = current->values[_NL_ITEM_INDEX (_NL_COLLATE_HASH_SIZE)].word;
+ layers = current->values[_NL_ITEM_INDEX (_NL_COLLATE_HASH_LAYERS)].word;
+# endif
#else
rulesets = (const unsigned char *)
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_RULESETS);
table = (const int32_t *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
- weights = (const unsigned char *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
- extra = (const unsigned char *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+ _NL_CURRENT (LC_COLLATE, CONCAT(_NL_COLLATE_TABLE,SUFFIX));
+ weights = (const USTRING_TYPE *)
+ _NL_CURRENT (LC_COLLATE, CONCAT(_NL_COLLATE_WEIGHT,SUFFIX));
+ extra = (const USTRING_TYPE *)
+ _NL_CURRENT (LC_COLLATE, CONCAT(_NL_COLLATE_EXTRA,SUFFIX));
indirect = (const int32_t *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
+ _NL_CURRENT (LC_COLLATE, CONCAT(_NL_COLLATE_INDIRECT,SUFFIX));
+# ifdef WIDE_CHAR_VERSION
+ names = (const wint_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_NAMES);
+ size = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_HASH_SIZE);
+ layers = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_HASH_LAYERS);
+# endif
#endif
+ use_malloc = 0;
/* We need this a few times. */
- s1len = strlen (s1);
- s2len = strlen (s2);
+ s1len = STRLEN (s1);
+ s2len = STRLEN (s2);
/* We need the elements of the strings as unsigned values since they
are used as indeces. */
- us1 = (const unsigned char *) s1;
- us2 = (const unsigned char *) s2;
+ us1 = (const USTRING_TYPE *) s1;
+ us2 = (const USTRING_TYPE *) s2;
/* Perform the first pass over the string and while doing this find
and store the weights for each character. Since we want this to
@@ -204,7 +233,7 @@ STRCOLL (s1, s2, l)
{
backw1_stop = idx1max;
- while (*us1 != '\0')
+ while (*us1 != L('\0'))
{
int32_t tmp = findidx (&us1);
rule1arr[idx1max] = tmp >> 24;
@@ -263,7 +292,7 @@ STRCOLL (s1, s2, l)
{
backw2_stop = idx2max;
- while (*us2 != '\0')
+ while (*us2 != L('\0'))
{
int32_t tmp = findidx (&us2);
rule2arr[idx2max] = tmp >> 24;
diff --git a/string/strxfrm.c b/string/strxfrm.c
index 6fc795f9c8..9fd9526008 100644
--- a/string/strxfrm.c
+++ b/string/strxfrm.c
@@ -1,6 +1,6 @@
/* Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+ Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
@@ -23,15 +23,29 @@
#include <stdlib.h>
#include <string.h>
-#include "../locale/localeinfo.h"
-
-#ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# define STRXFRM __strxfrm_l
-#else
-# define STRXFRM strxfrm
+#ifndef STRING_TYPE
+# define STRING_TYPE char
+# define USTRING_TYPE unsigned char
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define STRXFRM __strxfrm_l
+# else
+# define STRXFRM strxfrm
+# endif
+# define STRCMP strcmp
+# define STRLEN strlen
+# define STPNCPY __stpncpy
+# define WEIGHT_H "../locale/weight.h"
+# define SUFFIX MB
+# define L(arg) arg
#endif
+#define CONCAT(a,b) CONCAT1(a,b)
+#define CONCAT1(a,b) a##b
+#include "../locale/localeinfo.h"
+
+
+#ifndef WIDE_CHAR_VERSION
/* These are definitions used by some of the functions for handling
UTF-8 encoding below. */
static const uint32_t encoding_mask[] =
@@ -79,14 +93,15 @@ utf8_encode (char *buf, int val)
return buf - startp;
}
+#endif
#ifndef USE_IN_EXTENDED_LOCALE_MODEL
size_t
-STRXFRM (char *dest, const char *src, size_t n)
+STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n)
#else
size_t
-STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
+STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l)
#endif
{
#ifdef USE_IN_EXTENDED_LOCALE_MODEL
@@ -99,25 +114,30 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
unnecessary in case there are no rules. */
const unsigned char *rulesets;
const int32_t *table;
- const unsigned char *weights;
- const unsigned char *extra;
+ const USTRING_TYPE *weights;
+ const USTRING_TYPE *extra;
const int32_t *indirect;
uint_fast32_t pass;
size_t needed;
- const unsigned char *usrc;
- size_t srclen = strlen (src);
+ const USTRING_TYPE *usrc;
+ size_t srclen = STRLEN (src);
int32_t *idxarr;
unsigned char *rulearr;
size_t idxmax;
size_t idxcnt;
- int use_malloc = 0;
+ int use_malloc;
+#ifdef WIDE_CHAR_VERSION
+ size_t size;
+ size_t layers;
+ const wint_t *names;
+#endif
-#include "../locale/weight.h"
+#include WEIGHT_H
if (nrules == 0)
{
if (n != 0)
- __stpncpy (dest, src, n);
+ STPNCPY (dest, src, n);
return srclen;
}
@@ -126,37 +146,49 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
rulesets = (const unsigned char *)
current->values[_NL_ITEM_INDEX (_NL_COLLATE_RULESETS)].string;
table = (const int32_t *)
- current->values[_NL_ITEM_INDEX (_NL_COLLATE_TABLEMB)].string;
- weights = (const unsigned char *)
- current->values[_NL_ITEM_INDEX (_NL_COLLATE_WEIGHTMB)].string;
- extra = (const unsigned char *)
- current->values[_NL_ITEM_INDEX (_NL_COLLATE_EXTRAMB)].string;
+ current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_TABLE,SUFFIX))].string;
+ weights = (const USTRING_TYPE *)
+ current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_WEIGHT,SUFFIX))].string;
+ extra = (const USTRING_TYPE *)
+ current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_EXTRA,SUFFIX))].string;
indirect = (const int32_t *)
- current->values[_NL_ITEM_INDEX (_NL_COLLATE_INDIRECTMB)].string;
+ current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_INDIRECT,SUFFIX))].string;
+# ifdef WIDE_CHAR_VERSION
+ names = (const wint_t *)
+ current->values[_NL_ITEM_INDEX (_NL_COLLATE_NAMES)].string;
+ size = current->values[_NL_ITEM_INDEX (_NL_COLLATE_HASH_SIZE)].word;
+ layers = current->values[_NL_ITEM_INDEX (_NL_COLLATE_HASH_LAYERS)].word;
+# endif
#else
rulesets = (const unsigned char *)
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_RULESETS);
table = (const int32_t *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
- weights = (const unsigned char *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
- extra = (const unsigned char *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+ _NL_CURRENT (LC_COLLATE, CONCAT(_NL_COLLATE_TABLE,SUFFIX));
+ weights = (const USTRING_TYPE *)
+ _NL_CURRENT (LC_COLLATE, CONCAT(_NL_COLLATE_WEIGHT,SUFFIX));
+ extra = (const USTRING_TYPE *)
+ _NL_CURRENT (LC_COLLATE, CONCAT(_NL_COLLATE_EXTRA,SUFFIX));
indirect = (const int32_t *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
+ _NL_CURRENT (LC_COLLATE, CONCAT(_NL_COLLATE_INDIRECT,SUFFIX));
+# ifdef WIDE_CHAR_VERSION
+ names = (const wint_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_NAMES);
+ size = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_HASH_SIZE);
+ layers = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_HASH_LAYERS);
+# endif
#endif
+ use_malloc = 0;
/* Handle an empty string as a special case. */
if (srclen == 0)
{
if (n != 0)
- *dest = '\0';
+ *dest = L('\0');
return 1;
}
/* We need the elements of the string as unsigned values since they
are used as indeces. */
- usrc = (const unsigned char *) src;
+ usrc = (const USTRING_TYPE *) src;
/* Perform the first pass over the string and while doing this find
and store the weights for each character. Since we want this to
@@ -195,7 +227,7 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
++idxmax;
}
- while (*usrc != '\0');
+ while (*usrc != L('\0'));
/* Now the passes over the weights. We now use the indeces we found
before. */
@@ -287,8 +319,10 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
else
{
int val = 1;
+#ifndef WIDE_CHAR_VERSION
char buf[7];
size_t buflen;
+#endif
size_t i;
for (idxcnt = 0; idxcnt < idxmax; ++idxcnt)
@@ -307,6 +341,16 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
len = weights[idxarr[backw]++];
if (len != 0)
{
+#ifdef WIDE_CHAR_VERSION
+ if (needed + 1 + len < n)
+ {
+ dest[needed] = val;
+ for (i = 0; i < len; ++i)
+ dest[needed + 1 + i] =
+ weights[idxarr[backw] + i];
+ }
+ needed += 1 + len;
+#else
buflen = utf8_encode (buf, val);
if (needed + buflen + len < n)
{
@@ -316,8 +360,9 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
dest[needed + buflen + i] =
weights[idxarr[backw] + i];
}
- idxarr[backw] += len;
needed += buflen + len;
+#endif
+ idxarr[backw] += len;
val = 1;
}
else
@@ -331,6 +376,16 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
len = weights[idxarr[idxcnt]++];
if (len != 0)
{
+#ifdef WIDE_CHAR_VERSION
+ if (needed + 1+ len < n)
+ {
+ dest[needed] = val;
+ for (i = 0; i < len; ++i)
+ dest[needed + 1 + i] =
+ weights[idxarr[idxcnt] + i];
+ }
+ needed += 1 + len;
+#else
buflen = utf8_encode (buf, val);
if (needed + buflen + len < n)
{
@@ -340,8 +395,9 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
dest[needed + buflen + i] =
weights[idxarr[idxcnt] + i];
}
- idxarr[idxcnt] += len;
needed += buflen + len;
+#endif
+ idxarr[idxcnt] += len;
val = 1;
}
else
@@ -370,6 +426,16 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
size_t len = weights[idxarr[--backw]++];
if (len != 0)
{
+#ifdef WIDE_CHAR_VERSION
+ if (needed + 1 + len < n)
+ {
+ dest[needed] = val;
+ for (i = 0; i < len; ++i)
+ dest[needed + 1 + i] =
+ weights[idxarr[backw] + i];
+ }
+ needed += 1 + len;
+#else
buflen = utf8_encode (buf, val);
if (needed + buflen + len < n)
{
@@ -379,8 +445,9 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
dest[needed + buflen + i] =
weights[idxarr[backw] + i];
}
- idxarr[backw] += len;
needed += buflen + len;
+#endif
+ idxarr[backw] += len;
val = 1;
}
else
@@ -392,7 +459,7 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
/* Finally store the byte to separate the passes or terminate
the string. */
if (needed < n)
- dest[needed] = pass + 1 < nrules ? '\1' : '\0';
+ dest[needed] = pass + 1 < nrules ? L('\1') : L('\0');
++needed;
}
@@ -400,11 +467,11 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
a `position' rule at the end and if no non-ignored character
is found the last \1 byte is immediately followed by a \0 byte
signalling this. We can avoid the \1 byte(s). */
- if (needed <= n && needed > 2 && dest[needed - 2] == '\1')
+ if (needed <= n && needed > 2 && dest[needed - 2] == L('\1'))
{
/* Remove the \1 byte. */
--needed;
- dest[needed - 1] = '\0';
+ dest[needed - 1] = L('\0');
}
/* Free the memory if needed. */
diff --git a/wcsmbs/wcscoll.c b/wcsmbs/wcscoll.c
index b5b6f5cb45..1dfe93918b 100644
--- a/wcsmbs/wcscoll.c
+++ b/wcsmbs/wcscoll.c
@@ -19,26 +19,18 @@
#include <wchar.h>
+#define STRING_TYPE wchar_t
+#define USTRING_TYPE wint_t
#ifdef USE_IN_EXTENDED_LOCALE_MODEL
# define STRCOLL __wcscoll_l
#else
# define STRCOLL wcscoll
#endif
#define STRCMP wcscmp
+#define STRLEN wcslen
+#define WEIGHT_H "../locale/weightwc.h"
+#define SUFFIX WC
+#define L(arg) L##arg
+#define WIDE_CHAR_VERSION 1
-
-#ifndef USE_IN_EXTENDED_LOCALE_MODEL
-int
-STRCOLL (s1, s2)
- const wchar_t *s1;
- const wchar_t *s2;
-#else
-int
-STRCOLL (s1, s2, l)
- const wchar_t *s1;
- const wchar_t *s2;
- __locale_t l;
-#endif
-{
- return STRCMP (s1, s2);
-}
+#include "../string/strcoll.c"
diff --git a/wcsmbs/wcsxfrm.c b/wcsmbs/wcsxfrm.c
index 99a359399e..c515657244 100644
--- a/wcsmbs/wcsxfrm.c
+++ b/wcsmbs/wcsxfrm.c
@@ -1,6 +1,6 @@
/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
@@ -19,23 +19,19 @@
#include <wchar.h>
+#define STRING_TYPE wchar_t
+#define USTRING_TYPE wint_t
#ifdef USE_IN_EXTENDED_LOCALE_MODEL
# define STRXFRM __wcsxfrm_l
#else
# define STRXFRM wcsxfrm
#endif
-
-
-#ifndef USE_IN_EXTENDED_LOCALE_MODEL
-size_t
-STRXFRM (wchar_t *dest, const wchar_t *src, size_t n)
-#else
-size_t
-STRXFRM (wchar_t *dest, const wchar_t *src, size_t n, __locale_t l)
-#endif
-{
- if (n != 0)
- __wcpncpy (dest, src, n);
-
- return __wcslen (src);
-}
+#define STRCMP wcscmp
+#define STRLEN wcslen
+#define STPNCPY __wcpncpy
+#define WEIGHT_H "../locale/weightwc.h"
+#define SUFFIX WC
+#define L(arg) L##arg
+#define WIDE_CHAR_VERSION 1
+
+#include "../string/strxfrm.c"