Blame intl/explodename.c

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