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