da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * locale state implementation
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "lclib.h"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#include "lclang.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ctype.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Lc_numeric_t default_numeric = { '.', -1 };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Lc_t default_lc =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "C",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "POSIX",
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin &lc_languages[0],
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin &lc_territories[0],
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin &lc_charsets[0],
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 0,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin LC_default|LC_checked|LC_local,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 0,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, (void*)&default_numeric },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &default_lc, 0, 0 }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Lc_numeric_t debug_numeric = { ',', '.' };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Lc_t debug_lc =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "debug",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "debug",
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin &lc_languages[1],
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin &lc_territories[1],
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin &lc_charsets[0],
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 0,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin LC_debug|LC_checked|LC_local,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 0,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, (void*)&debug_numeric },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, 0 },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { &debug_lc, 0, 0 }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic Lc_t* lcs = &debug_lc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinLc_t* locales[] =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin &default_lc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return the internal category index for category
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlcindex(int category, int min)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (category)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_ALL: return min ? -1 : AST_LC_ALL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_ADDRESS: return AST_LC_ADDRESS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_COLLATE: return AST_LC_COLLATE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_CTYPE: return AST_LC_CTYPE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_IDENTIFICATION: return AST_LC_IDENTIFICATION;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case LC_LANG: return AST_LC_LANG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_MEASUREMENT: return AST_LC_MEASUREMENT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_MESSAGES: return AST_LC_MESSAGES;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_MONETARY: return AST_LC_MONETARY;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_NAME: return AST_LC_NAME;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_NUMERIC: return AST_LC_NUMERIC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_PAPER: return AST_LC_PAPER;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_TELEPHONE: return AST_LC_TELEPHONE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_TIME: return AST_LC_TIME;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case LC_XLITERATE: return AST_LC_XLITERATE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return the first category table entry
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinLc_category_t*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlccategories(void)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return (Lc_category_t*)&lc_categories[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return the current info for category
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinLc_info_t*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlcinfo(register int category)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((category = lcindex(category, 0)) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return LCINFO(category);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return 1 if s matches the alternation pattern p
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * if minimum!=0 then at least that many chars must match
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * if standard!=0 and s[0] is a digit leading non-digits are ignored in p
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmatch(const char* s, register const char* p, int minimum, int standard)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register const char* t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char* x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int w;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int z;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin z = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (standard)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (isdigit(*t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*p && !isdigit(*p))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (isdigit(*p))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*t && !isdigit(*t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin w = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x = p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*p && *p != '|')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!*t || *t == ',')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*t == *p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*ok*/;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*t == '-')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (standard && isdigit(*p))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*p && *p != '-')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!*p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*p == '-')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (standard && isdigit(*t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin w = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*t && *t != '-')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!*t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((!*t || *t == ',') && (!*p || *p == '|' || w))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return p - x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (minimum && z < (p - x) && (p - x) >= minimum)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin z = p - x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*p && *p != '|')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (*p++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return z;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return 1 if s matches the charset names in cp
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmatch_charset(register const char* s, register const Lc_charset_t* cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return match(s, cp->code, 0, 1) || match(s, cp->alternates, 3, 1) || cp->ms && match(s, cp->ms, 0, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * low level for lccanon
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic size_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincanonical(const Lc_language_t* lp, const Lc_territory_t* tp, const Lc_charset_t* cp, const Lc_attribute_list_t* ap, unsigned long flags, char* buf, size_t siz)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int u;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* e;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register const char* t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & (LC_abbreviated|LC_default|LC_local|LC_qualified|LC_verbose)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= LC_abbreviated;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = buf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin e = &buf[siz - 3];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (lp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (lp->flags & (LC_debug|LC_default))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (t = lp->code; s < e && (*s = *t++); s++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return s - buf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & LC_verbose)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin u = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = lp->name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (s < e && (c = *t++))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (u)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin u = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = toupper(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!isalnum(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin u = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (t = lp->code; s < e && (*s = *t++); s++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s < e)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (tp && tp != &lc_territories[0] && (!(flags & (LC_abbreviated|LC_default)) || !lp || !streq(lp->code, tp->code)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (lp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = '_';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & LC_verbose)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin u = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = tp->name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (s < e && (c = *t++) && c != '|')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (u)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin u = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = toupper(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!isalnum(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin u = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (t = tp->code; s < e && (*s = toupper(*t++)); s++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (lp && (!(flags & (LC_abbreviated|LC_default)) || cp != lp->charset) && s < e)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = '.';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (t = cp->code; s < e && (c = *t++); s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (islower(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = toupper(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (c = '@'; ap && s < e; ap = ap->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & (LC_abbreviated|LC_default|LC_verbose)) || !(ap->attribute->flags & LC_default))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = ',';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (t = ap->attribute->name; s < e && (*s = *t++); s++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return s - buf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * generate a canonical locale name in buf
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsize_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlccanon(Lc_t* lc, unsigned long flags, char* buf, size_t siz)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & LC_local) && (!lc->language || !(lc->language->flags & (LC_debug|LC_default))))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _WINIX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char lang[64];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char code[64];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char ctry[64];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (lc->index &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin GetLocaleInfo(lc->index, LOCALE_SENGLANGUAGE, lang, sizeof(lang)) &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin GetLocaleInfo(lc->index, LOCALE_SENGCOUNTRY, ctry, sizeof(ctry)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!GetLocaleInfo(lc->index, LOCALE_IDEFAULTANSICODEPAGE, code, sizeof(code)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin code[0] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!lc->charset || !lc->charset->ms)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return sfsprintf(buf, siz, "%s_%s", lang, ctry);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (streq(lc->charset->ms, code))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return sfsprintf(buf, siz, "%s_%s.%s", lang, ctry, code);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return sfsprintf(buf, siz, "%s_%s.%s,%s", lang, ctry, code, lc->charset->ms);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf[0] = '-';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf[1] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return canonical(lc->language, lc->territory, lc->charset, lc->attributes, flags, buf, siz);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * make an Lc_t from a locale name
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinLc_t*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlcmake(const char* name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* e;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register const char* t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char* a;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* w;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* language_name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* territory_name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* charset_name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* attributes_name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Lc_t* lc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const Lc_map_t* mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const Lc_language_t* lp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const Lc_territory_t* tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const Lc_territory_t* tpb;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const Lc_territory_t* primary;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const Lc_charset_t* cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const Lc_charset_t* ppa;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const Lc_attribute_t* ap;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Lc_attribute_list_t* ai;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Lc_attribute_list_t* al;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int z;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char buf[PATH_MAX / 2];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char tmp[PATH_MAX / 2];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(t = name) || !*t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return &default_lc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (lc = lcs; lc; lc = lc->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!strcasecmp(t, lc->code) || !strcasecmp(t, lc->name))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return lc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (mp = lc_maps; mp->code; mp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (streq(t, mp->code))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lp = mp->language;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp = mp->territory;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp = mp->charset;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!mp->attribute)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin al = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (al = newof(0, Lc_attribute_list_t, 1, 0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin al->attribute = mp->attribute;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto mapped;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin language_name = buf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin territory_name = charset_name = attributes_name = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = buf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin e = &buf[sizeof(buf)-2];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin a = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (s < e && (c = *t++))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (isspace(c) || (c == '(' || c == '-' && *t == '-') && ++n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((c = *t++) && (isspace(c) || (c == '-' || c == '(' || c == ')') && ++n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (isalnum(c) && !n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = '-';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!a)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin a = t - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c && c != '_' && c != '.' && c != '@')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = *t++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == '_' && !territory_name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin territory_name = s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == '.' && !charset_name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin charset_name = s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == '@' && !attributes_name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin attributes_name = s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (isupper(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = tolower(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((t = a) && s < e)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (attributes_name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = ',';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin attributes_name = s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (s < e && (c = *t++))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (isspace(c) || (c == '(' || c == ')' || c == '-' && *t == '-') && ++n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((c = *t++) && (isspace(c) || (c == '-' || c == '(' || c == ')') && ++n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (isalnum(c) && !n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = '-';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == '_' || c == '.' || c == '@')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (isupper(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = tolower(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp = ppa = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin al = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * language
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = strlen(s = language_name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n == 2)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (lp = lc_languages; lp->code && !streq(s, lp->code); lp++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (n == 3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (lp = lc_languages; lp->code && (!lp->alternates || !match(s, lp->alternates, n, 0)); lp++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!lp->code)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = s[2];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s[2] = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (lp = lc_languages; lp->code && !streq(s, lp->code); lp++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s[2] = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (lp->code)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lp = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!lp || !lp->code)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (lp = lc_languages; lp->code && !match(s, lp->name, 0, 0); lp++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!lp || !lp->code)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!territory_name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n == 2)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (tp = lc_territories; tp->code && !streq(s, tp->code); tp++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin z = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tpb = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (tp = lc_territories; tp->name; tp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((i = match(s, tp->name, 3, 0)) > z)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tpb = tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((z = i) == n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tpb)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp = tpb;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tp->code)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lp = tp->languages[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!lp || !lp->code)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * name not in the tables so let
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * _ast_setlocale() and/or setlocale()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * handle the validity checks
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = (char*)name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin z = strlen(s) + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(lp = newof(0, Lc_language_t, 1, z)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name = ((Lc_language_t*)lp)->code = ((Lc_language_t*)lp)->name = (const char*)(lp + 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcpy((char*)lp->code, s, z - 1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tp = &lc_territories[0];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = ((Lc_language_t*)lp)->charset = &lc_charsets[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin al = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto override;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * territory
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!tp || !tp->code)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(s = territory_name))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin primary = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (tp = lc_territories; tp->code; tp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tp->languages[0] == lp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tp->flags & LC_primary)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin primary = tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin primary = tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n == 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp = primary;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = (char*)lp->code;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!tp || !tp->code)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = strlen(s);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n == 2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (tp = lc_territories; tp->code; tp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (streq(s, tp->code))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < elementsof(tp->languages) && lp != tp->languages[i]; i++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i >= elementsof(tp->languages))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (tp = lc_territories; tp->code; tp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (match(s, tp->name, 3, 0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < elementsof(tp->languages) && lp != tp->languages[i]; i++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i < elementsof(tp->languages))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tp && !tp->code)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tp = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * attributes -- done here to catch misplaced charset references
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s = attributes_name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (w = s; *s && *s != ','; s++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = *s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(cp = lp->charset) || !match_charset(w, cp))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (cp = lc_charsets; cp->code; cp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (match_charset(w, cp))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppa = cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!cp->code)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < elementsof(lp->attributes) && (ap = lp->attributes[i]); i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (match(w, ap->name, 5, 0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ai = newof(0, Lc_attribute_list_t, 1, 0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ai->attribute = ap;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ai->next = al;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin al = ai;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i >= elementsof(lp->attributes) && (ap = newof(0, Lc_attribute_t, 1, sizeof(Lc_attribute_list_t) + s - w + 1)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ai = (Lc_attribute_list_t*)(ap + 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcpy((char*)(((Lc_attribute_t*)ap)->name = (const char*)(ai + 1)), w);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ai->attribute = ap;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ai->next = al;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin al = ai;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (*s++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * charset
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s = charset_name)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (cp = lc_charsets; cp->code; cp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (match_charset(s, cp))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!cp || !cp->code)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp = ppa ? ppa : lp->charset;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mapped:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin z = canonical(lp, tp, cp, al, 0, s = tmp, sizeof(tmp));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * add to the list of possibly active locales
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin override:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = strlen(name) + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(lc = newof(0, Lc_t, 1, n + z)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcpy((char*)(lc->name = (const char*)(lc + 1)), name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcpy((char*)(lc->code = lc->name + n), s);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin lc->language = lp ? lp : &lc_languages[0];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin lc->territory = tp ? tp : &lc_territories[0];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin lc->charset = cp ? cp : &lc_charsets[0];
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (!strcmp(lc->charset->code, "utf8"))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz lc->flags |= LC_utf8;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lc->attributes = al;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < elementsof(lc->info); i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lc->info[i].lc = lc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _WINIX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = SUBLANG_DEFAULT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < elementsof(tp->languages); i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (lp == tp->languages[i])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = tp->indices[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lc->index = MAKELCID(MAKELANGID(lp->index, n), SORT_DEFAULT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lc->next = lcs;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lcs = lc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return lc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return an Lc_t* for each locale in the tables
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * one Lc_t is allocated on the first call with lc==0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * this is freed when 0 returned
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * the return value is not part of the lcmake() cache
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct Lc_scan_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Lc_t lc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Lc_attribute_list_t list;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int territory;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int language;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int attribute;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char buf[256];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin} Lc_scan_t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinLc_t*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlcscan(Lc_t* lc)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Lc_scan_t* ls;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(ls = (Lc_scan_t*)lc))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(ls = newof(0, Lc_scan_t, 1, 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ls->lc.code = ls->lc.name = ls->buf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ls->territory = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ls->language = elementsof(ls->lc.territory->languages);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ls->attribute = elementsof(ls->lc.language->attributes);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (++ls->attribute >= elementsof(ls->lc.language->attributes) || !(ls->list.attribute = ls->lc.language->attributes[ls->attribute]))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (++ls->language >= elementsof(ls->lc.territory->languages) || !(ls->lc.language = ls->lc.territory->languages[ls->language]))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (!lc_territories[++ls->territory].code)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(ls);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ls->lc.territory = &lc_territories[ls->territory];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ls->lc.language = ls->lc.territory->languages[ls->language = 0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ls->lc.language)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ls->lc.charset = ls->lc.language->charset ? ls->lc.language->charset : &lc_charsets[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ls->list.attribute = ls->lc.language->attributes[ls->attribute = 0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ls->lc.charset = &lc_charsets[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ls->list.attribute = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ls->lc.attributes = ls->list.attribute ? &ls->list : (Lc_attribute_list_t*)0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _WINIX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!ls->lc.language || !ls->lc.language->index)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ls->lc.index = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((!ls->list.attribute || !(ls->lc.index = ls->list.attribute->index)) &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (!ls->lc.territory || !(ls->lc.index = ls->lc.territory->indices[ls->language])))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ls->lc.index = SUBLANG_DEFAULT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ls->lc.index = MAKELCID(MAKELANGID(ls->lc.language->index, ls->lc.index), SORT_DEFAULT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin canonical(ls->lc.language, ls->lc.territory, ls->lc.charset, ls->lc.attributes, 0, ls->buf, sizeof(ls->buf));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (Lc_t*)ls;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}