1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-08 17:42:12 +03:00
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.
This commit is contained in:
Ulrich Drepper
1999-12-26 19:11:05 +00:00
parent a35766db16
commit c392db7c4b
3 changed files with 67 additions and 17 deletions

View File

@@ -1,3 +1,38 @@
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.
1999-12-25 Ulrich Drepper <drepper@cygnus.com> 1999-12-25 Ulrich Drepper <drepper@cygnus.com>
* locale/programs/ld-collate.c (read_directions): Fix a few messages. * locale/programs/ld-collate.c (read_directions): Fix a few messages.

View File

@@ -88,6 +88,9 @@ struct element_t
we changed if necessary but I doubt this is necessary. */ we changed if necessary but I doubt this is necessary. */
unsigned int used_in_level; unsigned int used_in_level;
/* Nonzero if this is a real character definition. */
int is_character;
struct element_list_t *weights; struct element_list_t *weights;
/* Where does the definition come from. */ /* Where does the definition come from. */
@@ -243,7 +246,8 @@ make_seclist_elem (struct locale_collate_t *collate, const char *string,
static struct element_t * static struct element_t *
new_element (struct locale_collate_t *collate, const char *mbs, size_t mbslen, new_element (struct locale_collate_t *collate, const char *mbs, size_t mbslen,
const uint32_t *wcs, const char *name, size_t namelen) const uint32_t *wcs, const char *name, size_t namelen,
int is_character)
{ {
struct element_t *newp; struct element_t *newp;
@@ -278,6 +282,7 @@ new_element (struct locale_collate_t *collate, const char *mbs, size_t mbslen,
newp->mborder = NULL; newp->mborder = NULL;
newp->wcorder = 0; newp->wcorder = 0;
newp->used_in_level = 0; newp->used_in_level = 0;
newp->is_character = is_character;
/* Will be allocated later. */ /* Will be allocated later. */
newp->weights = NULL; newp->weights = NULL;
@@ -547,14 +552,14 @@ find_element (struct linereader *ldfile, struct locale_collate_t *collate,
if (result == NULL) if (result == NULL)
result = sym->order = new_element (collate, NULL, 0, NULL, result = sym->order = new_element (collate, NULL, 0, NULL,
NULL, 0); NULL, 0, 0);
} }
else if (find_entry (&collate->elem_table, str, len, else if (find_entry (&collate->elem_table, str, len,
(void **) &result) != 0) (void **) &result) != 0)
{ {
/* It's also no collation element. So it is a character /* It's also no collation element. So it is a character
element defined later. */ element defined later. */
result = new_element (collate, NULL, 0, NULL, str, len); result = new_element (collate, NULL, 0, NULL, str, len, 1);
if (result != NULL) if (result != NULL)
/* Insert it into the sequence table. */ /* Insert it into the sequence table. */
insert_entry (&collate->seq_table, str, len, result); insert_entry (&collate->seq_table, str, len, result);
@@ -839,7 +844,8 @@ insert_value (struct linereader *ldfile, struct token *arg,
elem = sym->order; elem = sym->order;
if (elem == NULL) if (elem == NULL)
elem = sym->order = new_element (collate, NULL, 0, NULL, NULL, 0); elem = sym->order = new_element (collate, NULL, 0, NULL, NULL, 0,
0);
} }
else if (find_entry (&collate->elem_table, arg->val.str.startmb, else if (find_entry (&collate->elem_table, arg->val.str.startmb,
arg->val.str.lenmb, (void **) &elem) != 0) arg->val.str.lenmb, (void **) &elem) != 0)
@@ -859,8 +865,8 @@ insert_value (struct linereader *ldfile, struct token *arg,
/* We have to allocate an entry. */ /* We have to allocate an entry. */
elem = new_element (collate, seq != NULL ? seq->bytes : NULL, elem = new_element (collate, seq != NULL ? seq->bytes : NULL,
seq != NULL ? seq->nbytes : 0, seq != NULL ? seq->nbytes : 0, wcs,
wcs, arg->val.str.startmb, arg->val.str.lenmb); arg->val.str.startmb, arg->val.str.lenmb, 1);
/* And add it to the table. */ /* And add it to the table. */
if (insert_entry (&collate->seq_table, arg->val.str.startmb, if (insert_entry (&collate->seq_table, arg->val.str.startmb,
@@ -937,8 +943,8 @@ handle_ellipsis (struct linereader *ldfile, struct token *arg,
assert (arg == NULL || endp != NULL); assert (arg == NULL || endp != NULL);
/* Both, the start and the end symbol, must stand for characters. */ /* Both, the start and the end symbol, must stand for characters. */
if ((startp == NULL || startp->name == NULL) if ((startp != NULL && (startp->name == NULL || ! startp->is_character))
|| (endp == NULL || endp->name == NULL)) || (endp != NULL && (endp->name == NULL|| ! endp->is_character)))
{ {
lr_error (ldfile, _("\ lr_error (ldfile, _("\
%s: the start end the end symbol of a range must stand for characters"), %s: the start end the end symbol of a range must stand for characters"),
@@ -1045,7 +1051,7 @@ sequence is not lower than that of the last character"), "LC_COLLATE");
/* We have to allocate an entry. */ /* We have to allocate an entry. */
elem = new_element (collate, mbcnt, len, wcs, seq->name, elem = new_element (collate, mbcnt, len, wcs, seq->name,
namelen); namelen, 1);
/* And add it to the table. */ /* And add it to the table. */
if (insert_entry (&collate->seq_table, seq->name, if (insert_entry (&collate->seq_table, seq->name,
@@ -1241,7 +1247,7 @@ order for `%.*s' already defined at %s:%zu"),
seq != NULL ? seq->nbytes : 0, seq != NULL ? seq->nbytes : 0,
wc == ILLEGAL_CHAR_VALUE wc == ILLEGAL_CHAR_VALUE
? NULL : wcs, ? NULL : wcs,
buf, lenfrom); buf, lenfrom, 1);
} }
else else
{ {
@@ -2103,10 +2109,14 @@ collate_read (struct linereader *ldfile, struct localedef_t *result,
} }
ldfile->return_widestr = 1; ldfile->return_widestr = 1;
ldfile->translate_strings = 1;
/* Finally the string with the replacement. */ /* Finally the string with the replacement. */
arg = lr_token (ldfile, charmap, repertoire); arg = lr_token (ldfile, charmap, repertoire);
ldfile->return_widestr = 0; ldfile->return_widestr = 0;
ldfile->translate_strings = 0;
if (arg->tok != tok_string) if (arg->tok != tok_string)
goto err_label; goto err_label;
@@ -2139,8 +2149,11 @@ collate_read (struct linereader *ldfile, struct localedef_t *result,
if (insert_entry (&collate->elem_table, if (insert_entry (&collate->elem_table,
symbol, symbol_len, symbol, symbol_len,
new_element (collate, new_element (collate,
NULL, 0, NULL, symbol, arg->val.str.startmb,
symbol_len)) < 0) arg->val.str.lenmb - 1,
arg->val.str.startwc,
symbol, symbol_len, 0))
< 0)
lr_error (ldfile, _("\ lr_error (ldfile, _("\
error while adding collating element")); error while adding collating element"));
} }

View File

@@ -267,9 +267,10 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
/* Handle the pushed elements now. */ /* Handle the pushed elements now. */
size_t backw; 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) if (needed + len < n)
while (len-- > 0) while (len-- > 0)
@@ -363,9 +364,10 @@ STRXFRM (char *dest, const char *src, size_t n, __locale_t l)
/* Handle the pushed elements now. */ /* Handle the pushed elements now. */
size_t backw; 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) if (len != 0)
{ {
buflen = utf8_encode (buf, val); 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 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 is found the last \1 byte is immediately followed by a \0 byte
signalling this. We can avoid the \1 byte(s). */ 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. */ /* Remove the \1 byte. */
--needed; --needed;