diff options
author | phantom <phantom@FreeBSD.org> | 2001-02-10 15:36:46 +0000 |
---|---|---|
committer | phantom <phantom@FreeBSD.org> | 2001-02-10 15:36:46 +0000 |
commit | d4e3ae3d2b0ba71baec8eaa715b2e04f155901bf (patch) | |
tree | f16898ec334a52d00a42f5c776a5e65c5fb55cf4 /lib/libc/locale/fix_grouping.c | |
parent | bab9f921621ed124781eef8abdf07b4bab79169a (diff) | |
download | FreeBSD-src-d4e3ae3d2b0ba71baec8eaa715b2e04f155901bf.zip FreeBSD-src-d4e3ae3d2b0ba71baec8eaa715b2e04f155901bf.tar.gz |
. Fix semantics of grouping (LC_MONETARY::mon_grouping,
LC_NUMERIC::grouping) values.
. Always set __XXX_changed flags then loading numeric & monetary locale
categories to allow localeconv() to use C locale also.
Diffstat (limited to 'lib/libc/locale/fix_grouping.c')
-rw-r--r-- | lib/libc/locale/fix_grouping.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/lib/libc/locale/fix_grouping.c b/lib/libc/locale/fix_grouping.c new file mode 100644 index 0000000..ab11655 --- /dev/null +++ b/lib/libc/locale/fix_grouping.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2001 Alexey Zelkin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include <limits.h> + +static const char nogrouping[] = { CHAR_MAX, '\0' }; + +/* + * "3;3;-1" -> "\003\003\177" + * NOTE: one digit numbers assumed! + */ + +const char * +__fix_locale_grouping_str(const char *str) { + + char *src, *dst; + + if (str == 0) { + return nogrouping; + } + for (src = (char*)str, dst = (char*)str; *src; src++) { + char cur; + + /* input string examples: "3;3", "3;2;-1" */ + if (*src == ';') + continue; + + if (*src == '-' && *(src+1) == '1') { + *dst++ = CHAR_MAX; + src++; + continue; + } + + if (!isdigit(*src)) { + /* broken grouping string */ + return nogrouping; + } + + *dst++ = *src - '0'; + } + *dst = '\0'; + return str; +} |