119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Copyright (C) 1995-1998, 2000-2001, 2003 Free Software Foundation, Inc. 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project This program is free software; you can redistribute it and/or modify it 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project under the terms of the GNU Library General Public License as published 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project by the Free Software Foundation; either version 2, or (at your option) 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project any later version. 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project This program is distributed in the hope that it will be useful, 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project but WITHOUT ANY WARRANTY; without even the implied warranty of 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project Library General Public License for more details. 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project You should have received a copy of the GNU Library General Public 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project License along with this program; if not, write to the Free Software 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project USA. */ 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_CONFIG_H 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# include <config.h> 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h> 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h> 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "loadinfo.h" 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* On some strange systems still no definition of NULL is found. Sigh! */ 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifndef NULL 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# if defined __STDC__ && __STDC__ 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define NULL ((void *) 0) 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# else 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define NULL 0 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# endif 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* @@ end of prolog @@ */ 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectchar * 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project_nl_find_language (const char *name) 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (name[0] != '\0' && name[0] != '_' && name[0] != '@' 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project && name[0] != '+' && name[0] != ',') 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ++name; 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return (char *) name; 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project_nl_explode_name (char *name, 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char **language, const char **modifier, 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char **territory, const char **codeset, 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char **normalized_codeset, const char **special, 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char **sponsor, const char **revision) 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project enum { undecided, xpg, cen } syntax; 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *cp; 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int mask; 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *modifier = NULL; 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *territory = NULL; 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *codeset = NULL; 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *normalized_codeset = NULL; 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *special = NULL; 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *sponsor = NULL; 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *revision = NULL; 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Now we determine the single parts of the locale name. First 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project look for the language. Termination symbols are `_' and `@' if 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mask = 0; 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project syntax = undecided; 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *language = cp = name; 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cp = _nl_find_language (*language); 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*language == cp) 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* This does not make sense: language has to be specified. Use 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project this entry as it is without exploding. Perhaps it is an alias. */ 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cp = strchr (*language, '\0'); 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (cp[0] == '_') 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Next is the territory. */ 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cp[0] = '\0'; 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *territory = ++cp; 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ++cp; 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mask |= TERRITORY; 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (cp[0] == '.') 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Next is the codeset. */ 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project syntax = xpg; 9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cp[0] = '\0'; 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *codeset = ++cp; 10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (cp[0] != '\0' && cp[0] != '@') 10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ++cp; 10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mask |= XPG_CODESET; 10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*codeset != cp && (*codeset)[0] != '\0') 10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *normalized_codeset = _nl_normalize_codeset (*codeset, 10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cp - *codeset); 11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (strcmp (*codeset, *normalized_codeset) == 0) 11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project free ((char *) *normalized_codeset); 11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mask |= XPG_NORM_CODESET; 11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) 11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Next is the modifier. */ 12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project syntax = cp[0] == '@' ? xpg : cen; 12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cp[0] = '\0'; 12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *modifier = ++cp; 12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (syntax == cen && cp[0] != '\0' && cp[0] != '+' 12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project && cp[0] != ',' && cp[0] != '_') 12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ++cp; 12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mask |= XPG_MODIFIER | CEN_AUDIENCE; 13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) 13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project syntax = cen; 13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (cp[0] == '+') 13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Next is special application (CEN syntax). */ 13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cp[0] = '\0'; 14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *special = ++cp; 14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') 14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ++cp; 14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mask |= CEN_SPECIAL; 14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (cp[0] == ',') 14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Next is sponsor (CEN syntax). */ 15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cp[0] = '\0'; 15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *sponsor = ++cp; 15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (cp[0] != '\0' && cp[0] != '_') 15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ++cp; 15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mask |= CEN_SPONSOR; 15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 15919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (cp[0] == '_') 16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 16219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Next is revision (CEN syntax). */ 16319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project cp[0] = '\0'; 16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *revision = ++cp; 16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mask |= CEN_REVISION; 16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* For CEN syntax values it might be important to have the 17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project separator character in the file name, not for XPG syntax. */ 17219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (syntax == xpg) 17319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 17419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*territory != NULL && (*territory)[0] == '\0') 17519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mask &= ~TERRITORY; 17619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*codeset != NULL && (*codeset)[0] == '\0') 17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mask &= ~XPG_CODESET; 17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*modifier != NULL && (*modifier)[0] == '\0') 18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mask &= ~XPG_MODIFIER; 18219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 18419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return mask; 18519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 186