fix_grouping.c revision 72407
1190214Srpaulo/* 2190214Srpaulo * Copyright (c) 2001 Alexey Zelkin 3190214Srpaulo * All rights reserved. 4190214Srpaulo * 5190214Srpaulo * Redistribution and use in source and binary forms, with or without 6190214Srpaulo * modification, are permitted provided that the following conditions 7190214Srpaulo * are met: 8190214Srpaulo * 1. Redistributions of source code must retain the above copyright 9190214Srpaulo * notice, this list of conditions and the following disclaimer. 10190214Srpaulo * 2. Redistributions in binary form must reproduce the above copyright 11190214Srpaulo * notice, this list of conditions and the following disclaimer in the 12190214Srpaulo * documentation and/or other materials provided with the distribution. 13190214Srpaulo * 14190214Srpaulo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15190214Srpaulo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16190214Srpaulo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17190214Srpaulo * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18190214Srpaulo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19190214Srpaulo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20190214Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21190214Srpaulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22190214Srpaulo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23190214Srpaulo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24190214Srpaulo * SUCH DAMAGE. 25190214Srpaulo * 26190214Srpaulo * $FreeBSD: head/lib/libc/locale/fix_grouping.c 72407 2001-02-12 08:55:12Z phantom $ 27190214Srpaulo */ 28190214Srpaulo 29190214Srpaulo#include <ctype.h> 30190214Srpaulo#include <limits.h> 31190214Srpaulo#include <stddef.h> 32190214Srpaulo 33214518Srpaulostatic const char nogrouping[] = { CHAR_MAX, '\0' }; 34190214Srpaulo 35190214Srpaulo/* 36190214Srpaulo * "3;3;-1" -> "\003\003\177" 37190214Srpaulo */ 38190214Srpaulo 39251129Sdelphijconst char * 40251129Sdelphij__fix_locale_grouping_str(const char *str) { 41 42 char *src, *dst; 43 char n; 44 45 if (str == NULL || *str == '\0') { 46 return nogrouping; 47 } 48 49 for (src = (char*)str, dst = (char*)str; *src != '\0'; src++) { 50 51 /* input string examples: "3;3", "3;2;-1" */ 52 if (*src == ';') 53 continue; 54 55 if (*src == '-' && *(src+1) == '1') { 56 *dst++ = CHAR_MAX; 57 src++; 58 continue; 59 } 60 61 if (!isdigit((unsigned char)*src)) { 62 /* broken grouping string */ 63 return nogrouping; 64 } 65 66 for (n = 0; isdigit((unsigned char)*src); src++) { 67 n *= 10; 68 n += *src - '0'; 69 } 70 71 *dst++ = n; 72 } 73 *dst = '\0'; 74 return str; 75} 76