about summary refs log tree commit diff
path: root/string/strxfrm.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-12-26 19:11:05 +0000
committerUlrich Drepper <drepper@redhat.com>1999-12-26 19:11:05 +0000
commitc392db7c4be39bf2ad8668f6e75a1ec219da6b0e (patch)
tree3002f39e8c4095cfb1cd476bc242ae78fed0169f /string/strxfrm.c
parenta35766db1672710adfc5c2dae5335526d20abab4 (diff)
downloadglibc-c392db7c4be39bf2ad8668f6e75a1ec219da6b0e.tar.gz
glibc-c392db7c4be39bf2ad8668f6e75a1ec219da6b0e.tar.xz
glibc-c392db7c4be39bf2ad8668f6e75a1ec219da6b0e.zip
Update.
1999-12-26  Ulrich Drepper  <drepper@cygnus.com>

	* ld-collate.c (struct element_t): Add field is_character and use it
	to distinguish real character from collating elements and symbols.
	(new_element): Take new parameter to initialize is_character.  Change
	all callers.
	(handle_ellipsis): Use is_character field to make sure ellipsis is
	only used with characters.
	(collate_read): Fix reading of collating elements.

	* string/strxfrm.c: Correct loop end detection and memory access
	in the little optimization at the end.

	* locale/programs/ld-monetary.c (monetary_finish): Correct code to
	emit warnings.  Provide default value for mon_decimal_point.

	* locale/programs/ld-collate.c (collate_finish): Don't crash if this
	category wasn't defined.
	(collate_output): Likewise.

	* locale/programs/ld-address.c: Don't emit message about not defined
	category if be_quiet.
	* locale/programs/ld-ctype.c: Likewise.
	* locale/programs/ld-identification.c: Likewise.
	* locale/programs/ld-measurement.c: Likewise.
	* locale/programs/ld-messages.c: Likewise.
	* locale/programs/ld-monetary.c: Likewise.
	* locale/programs/ld-name.c: Likewise.
	* locale/programs/ld-numeric.c: Likewise.
	* locale/programs/ld-paper.c: Likewise.
	* locale/programs/ld-telephone.c: Likewise.

	* locale/programs/locfile.c (write_locale_data): Correct memory
	allocation for fname.
Diffstat (limited to 'string/strxfrm.c')
-rw-r--r--string/strxfrm.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/string/strxfrm.c b/string/strxfrm.c
index 67d15d5b4b..6fc795f9c8 100644
--- a/string/strxfrm.c
+++ b/string/strxfrm.c
@@ -267,9 +267,10 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
 	      /* Handle the pushed elements now.  */
 	      size_t backw;
 
-	      for (backw = idxcnt - 1; backw >= backw_stop; --backw)
+	      backw = idxcnt;
+	      while (backw > backw_stop)
 		{
-		  size_t len = weights[idxarr[backw]++];
+		  size_t len = weights[idxarr[--backw]++];
 
 		  if (needed + len < n)
 		    while (len-- > 0)
@@ -363,9 +364,10 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
 	      /* Handle the pushed elements now.  */
 	      size_t backw;
 
-	      for (backw = idxmax - 1; backw >= backw_stop; --backw)
+	      backw = idxmax - 1;
+	      while (backw > backw_stop)
 		{
-		  size_t len = weights[idxarr[backw]++];
+		  size_t len = weights[idxarr[--backw]++];
 		  if (len != 0)
 		    {
 		      buflen = utf8_encode (buf, val);
@@ -398,7 +400,7 @@ 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 > 2 && dest[needed - 2] == '\1')
+  if (needed <= n && needed > 2 && dest[needed - 2] == '\1')
     {
       /* Remove the \1 byte.  */
       --needed;