Blame intl/explodename.c

Packit Service a721b1
/* Copyright (C) 1995-1998, 2000-2001, 2003, 2005, 2007 Free Software Foundation, Inc.
Packit Service a721b1
   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
Packit Service a721b1
Packit Service a721b1
   This program is free software; you can redistribute it and/or modify it
Packit Service a721b1
   under the terms of the GNU Library General Public License as published
Packit Service a721b1
   by the Free Software Foundation; either version 2, or (at your option)
Packit Service a721b1
   any later version.
Packit Service a721b1
Packit Service a721b1
   This program is distributed in the hope that it will be useful,
Packit Service a721b1
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service a721b1
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service a721b1
   Library General Public License for more details.
Packit Service a721b1
Packit Service a721b1
   You should have received a copy of the GNU Library General Public
Packit Service a721b1
   License along with this program; if not, write to the Free Software
Packit Service a721b1
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
Packit Service a721b1
   USA.  */
Packit Service a721b1
Packit Service a721b1
#ifdef HAVE_CONFIG_H
Packit Service a721b1
# include <config.h>
Packit Service a721b1
#endif
Packit Service a721b1
Packit Service a721b1
#include <stdlib.h>
Packit Service a721b1
#include <string.h>
Packit Service a721b1
#include <sys/types.h>
Packit Service a721b1
Packit Service a721b1
#include "loadinfo.h"
Packit Service a721b1
Packit Service a721b1
/* On some strange systems still no definition of NULL is found.  Sigh!  */
Packit Service a721b1
#ifndef NULL
Packit Service a721b1
# if defined __STDC__ && __STDC__
Packit Service a721b1
#  define NULL ((void *) 0)
Packit Service a721b1
# else
Packit Service a721b1
#  define NULL 0
Packit Service a721b1
# endif
Packit Service a721b1
#endif
Packit Service a721b1
Packit Service a721b1
/* @@ end of prolog @@ */
Packit Service a721b1
Packit Service a721b1
/* Split a locale name NAME into a leading language part and all the
Packit Service a721b1
   rest.  Return a pointer to the first character after the language,
Packit Service a721b1
   i.e. to the first byte of the rest.  */
Packit Service a721b1
static char *_nl_find_language (const char *name);
Packit Service a721b1
Packit Service a721b1
static char *
Packit Service a721b1
_nl_find_language (const char *name)
Packit Service a721b1
{
Packit Service a721b1
  while (name[0] != '\0' && name[0] != '_' && name[0] != '@' && name[0] != '.')
Packit Service a721b1
    ++name;
Packit Service a721b1
Packit Service a721b1
  return (char *) name;
Packit Service a721b1
}
Packit Service a721b1
Packit Service a721b1
Packit Service a721b1
int
Packit Service a721b1
_nl_explode_name (char *name,
Packit Service a721b1
		  const char **language, const char **modifier,
Packit Service a721b1
		  const char **territory, const char **codeset,
Packit Service a721b1
		  const char **normalized_codeset)
Packit Service a721b1
{
Packit Service a721b1
  char *cp;
Packit Service a721b1
  int mask;
Packit Service a721b1
Packit Service a721b1
  *modifier = NULL;
Packit Service a721b1
  *territory = NULL;
Packit Service a721b1
  *codeset = NULL;
Packit Service a721b1
  *normalized_codeset = NULL;
Packit Service a721b1
Packit Service a721b1
  /* Now we determine the single parts of the locale name.  First
Packit Service a721b1
     look for the language.  Termination symbols are `_', '.', and `@'.  */
Packit Service a721b1
  mask = 0;
Packit Service a721b1
  *language = cp = name;
Packit Service a721b1
  cp = _nl_find_language (*language);
Packit Service a721b1
Packit Service a721b1
  if (*language == cp)
Packit Service a721b1
    /* This does not make sense: language has to be specified.  Use
Packit Service a721b1
       this entry as it is without exploding.  Perhaps it is an alias.  */
Packit Service a721b1
    cp = strchr (*language, '\0');
Packit Service a721b1
  else
Packit Service a721b1
    {
Packit Service a721b1
      if (cp[0] == '_')
Packit Service a721b1
	{
Packit Service a721b1
	  /* Next is the territory.  */
Packit Service a721b1
	  cp[0] = '\0';
Packit Service a721b1
	  *territory = ++cp;
Packit Service a721b1
Packit Service a721b1
	  while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@')
Packit Service a721b1
	    ++cp;
Packit Service a721b1
Packit Service a721b1
	  mask |= XPG_TERRITORY;
Packit Service a721b1
	}
Packit Service a721b1
Packit Service a721b1
      if (cp[0] == '.')
Packit Service a721b1
	{
Packit Service a721b1
	  /* Next is the codeset.  */
Packit Service a721b1
	  cp[0] = '\0';
Packit Service a721b1
	  *codeset = ++cp;
Packit Service a721b1
Packit Service a721b1
	  while (cp[0] != '\0' && cp[0] != '@')
Packit Service a721b1
	    ++cp;
Packit Service a721b1
Packit Service a721b1
	  mask |= XPG_CODESET;
Packit Service a721b1
Packit Service a721b1
	  if (*codeset != cp && (*codeset)[0] != '\0')
Packit Service a721b1
	    {
Packit Service a721b1
	      *normalized_codeset = _nl_normalize_codeset (*codeset,
Packit Service a721b1
							   cp - *codeset);
Packit Service a721b1
	      if (*normalized_codeset == NULL)
Packit Service a721b1
		return -1;
Packit Service a721b1
	      else if (strcmp (*codeset, *normalized_codeset) == 0)
Packit Service a721b1
		free ((char *) *normalized_codeset);
Packit Service a721b1
	      else
Packit Service a721b1
		mask |= XPG_NORM_CODESET;
Packit Service a721b1
	    }
Packit Service a721b1
	}
Packit Service a721b1
    }
Packit Service a721b1
Packit Service a721b1
  if (cp[0] == '@')
Packit Service a721b1
    {
Packit Service a721b1
      /* Next is the modifier.  */
Packit Service a721b1
      cp[0] = '\0';
Packit Service a721b1
      *modifier = ++cp;
Packit Service a721b1
Packit Service a721b1
      if (cp[0] != '\0')
Packit Service a721b1
	mask |= XPG_MODIFIER;
Packit Service a721b1
    }
Packit Service a721b1
Packit Service a721b1
  if (*territory != NULL && (*territory)[0] == '\0')
Packit Service a721b1
    mask &= ~XPG_TERRITORY;
Packit Service a721b1
Packit Service a721b1
  if (*codeset != NULL && (*codeset)[0] == '\0')
Packit Service a721b1
    mask &= ~XPG_CODESET;
Packit Service a721b1
Packit Service a721b1
  return mask;
Packit Service a721b1
}