OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [start/] [insight/] [intl/] [explodename.c] - Diff between revs 579 and 1765

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 579 Rev 1765
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   the Free Software Foundation; either version 2, or (at your option)
   any later version.
   any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software Foundation,
   along with this program; if not, write to the Free Software Foundation,
   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 
#ifdef HAVE_CONFIG_H
#ifdef HAVE_CONFIG_H
# include <config.h>
# include <config.h>
#endif
#endif
 
 
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <sys/types.h>
#include <sys/types.h>
 
 
#include "loadinfo.h"
#include "loadinfo.h"
 
 
/* On some strange systems still no definition of NULL is found.  Sigh!  */
/* On some strange systems still no definition of NULL is found.  Sigh!  */
#ifndef NULL
#ifndef NULL
# if defined __STDC__ && __STDC__
# if defined __STDC__ && __STDC__
#  define NULL ((void *) 0)
#  define NULL ((void *) 0)
# else
# else
#  define NULL 0
#  define NULL 0
# endif
# endif
#endif
#endif
 
 
/* @@ end of prolog @@ */
/* @@ end of prolog @@ */
 
 
int
int
_nl_explode_name (name, language, modifier, territory, codeset,
_nl_explode_name (name, language, modifier, territory, codeset,
                  normalized_codeset, special, sponsor, revision)
                  normalized_codeset, special, sponsor, revision)
     char *name;
     char *name;
     const char **language;
     const char **language;
     const char **modifier;
     const char **modifier;
     const char **territory;
     const char **territory;
     const char **codeset;
     const char **codeset;
     const char **normalized_codeset;
     const char **normalized_codeset;
     const char **special;
     const char **special;
     const char **sponsor;
     const char **sponsor;
     const char **revision;
     const char **revision;
{
{
  enum { undecided, xpg, cen } syntax;
  enum { undecided, xpg, cen } syntax;
  char *cp;
  char *cp;
  int mask;
  int mask;
 
 
  *modifier = NULL;
  *modifier = NULL;
  *territory = NULL;
  *territory = NULL;
  *codeset = NULL;
  *codeset = NULL;
  *normalized_codeset = NULL;
  *normalized_codeset = NULL;
  *special = NULL;
  *special = NULL;
  *sponsor = NULL;
  *sponsor = NULL;
  *revision = NULL;
  *revision = NULL;
 
 
  /* Now we determine the single parts of the locale name.  First
  /* Now we determine the single parts of the locale name.  First
     look for the language.  Termination symbols are `_' and `@' if
     look for the language.  Termination symbols are `_' and `@' if
     we use XPG4 style, and `_', `+', and `,' if we use CEN syntax.  */
     we use XPG4 style, and `_', `+', and `,' if we use CEN syntax.  */
  mask = 0;
  mask = 0;
  syntax = undecided;
  syntax = undecided;
  *language = cp = name;
  *language = cp = name;
  while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@'
  while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@'
         && cp[0] != '+' && cp[0] != ',')
         && cp[0] != '+' && cp[0] != ',')
    ++cp;
    ++cp;
 
 
  if (*language == cp)
  if (*language == cp)
    /* This does not make sense: language has to be specified.  Use
    /* This does not make sense: language has to be specified.  Use
       this entry as it is without exploding.  Perhaps it is an alias.  */
       this entry as it is without exploding.  Perhaps it is an alias.  */
    cp = strchr (*language, '\0');
    cp = strchr (*language, '\0');
  else if (cp[0] == '_')
  else if (cp[0] == '_')
    {
    {
      /* Next is the territory.  */
      /* Next is the territory.  */
      cp[0] = '\0';
      cp[0] = '\0';
      *territory = ++cp;
      *territory = ++cp;
 
 
      while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
      while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
             && cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
             && cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
        ++cp;
        ++cp;
 
 
      mask |= TERRITORY;
      mask |= TERRITORY;
 
 
      if (cp[0] == '.')
      if (cp[0] == '.')
        {
        {
          /* Next is the codeset.  */
          /* Next is the codeset.  */
          syntax = xpg;
          syntax = xpg;
          cp[0] = '\0';
          cp[0] = '\0';
          *codeset = ++cp;
          *codeset = ++cp;
 
 
          while (cp[0] != '\0' && cp[0] != '@')
          while (cp[0] != '\0' && cp[0] != '@')
            ++cp;
            ++cp;
 
 
          mask |= XPG_CODESET;
          mask |= XPG_CODESET;
 
 
          if (*codeset != cp && (*codeset)[0] != '\0')
          if (*codeset != cp && (*codeset)[0] != '\0')
            {
            {
              *normalized_codeset = _nl_normalize_codeset (*codeset,
              *normalized_codeset = _nl_normalize_codeset (*codeset,
                                                           cp - *codeset);
                                                           cp - *codeset);
              if (strcmp (*codeset, *normalized_codeset) == 0)
              if (strcmp (*codeset, *normalized_codeset) == 0)
                free ((char *) *normalized_codeset);
                free ((char *) *normalized_codeset);
              else
              else
                mask |= XPG_NORM_CODESET;
                mask |= XPG_NORM_CODESET;
            }
            }
        }
        }
    }
    }
 
 
  if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
  if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
    {
    {
      /* Next is the modifier.  */
      /* Next is the modifier.  */
      syntax = cp[0] == '@' ? xpg : cen;
      syntax = cp[0] == '@' ? xpg : cen;
      cp[0] = '\0';
      cp[0] = '\0';
      *modifier = ++cp;
      *modifier = ++cp;
 
 
      while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
      while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
             && cp[0] != ',' && cp[0] != '_')
             && cp[0] != ',' && cp[0] != '_')
        ++cp;
        ++cp;
 
 
      mask |= XPG_MODIFIER | CEN_AUDIENCE;
      mask |= XPG_MODIFIER | CEN_AUDIENCE;
    }
    }
 
 
  if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
  if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
    {
    {
      syntax = cen;
      syntax = cen;
 
 
      if (cp[0] == '+')
      if (cp[0] == '+')
        {
        {
          /* Next is special application (CEN syntax).  */
          /* Next is special application (CEN syntax).  */
          cp[0] = '\0';
          cp[0] = '\0';
          *special = ++cp;
          *special = ++cp;
 
 
          while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
          while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
            ++cp;
            ++cp;
 
 
          mask |= CEN_SPECIAL;
          mask |= CEN_SPECIAL;
        }
        }
 
 
      if (cp[0] == ',')
      if (cp[0] == ',')
        {
        {
          /* Next is sponsor (CEN syntax).  */
          /* Next is sponsor (CEN syntax).  */
          cp[0] = '\0';
          cp[0] = '\0';
          *sponsor = ++cp;
          *sponsor = ++cp;
 
 
          while (cp[0] != '\0' && cp[0] != '_')
          while (cp[0] != '\0' && cp[0] != '_')
            ++cp;
            ++cp;
 
 
          mask |= CEN_SPONSOR;
          mask |= CEN_SPONSOR;
        }
        }
 
 
      if (cp[0] == '_')
      if (cp[0] == '_')
        {
        {
          /* Next is revision (CEN syntax).  */
          /* Next is revision (CEN syntax).  */
          cp[0] = '\0';
          cp[0] = '\0';
          *revision = ++cp;
          *revision = ++cp;
 
 
          mask |= CEN_REVISION;
          mask |= CEN_REVISION;
        }
        }
    }
    }
 
 
  /* For CEN syntax values it might be important to have the
  /* For CEN syntax values it might be important to have the
     separator character in the file name, not for XPG syntax.  */
     separator character in the file name, not for XPG syntax.  */
  if (syntax == xpg)
  if (syntax == xpg)
    {
    {
      if (*territory != NULL && (*territory)[0] == '\0')
      if (*territory != NULL && (*territory)[0] == '\0')
        mask &= ~TERRITORY;
        mask &= ~TERRITORY;
 
 
      if (*codeset != NULL && (*codeset)[0] == '\0')
      if (*codeset != NULL && (*codeset)[0] == '\0')
        mask &= ~XPG_CODESET;
        mask &= ~XPG_CODESET;
 
 
      if (*modifier != NULL && (*modifier)[0] == '\0')
      if (*modifier != NULL && (*modifier)[0] == '\0')
        mask &= ~XPG_MODIFIER;
        mask &= ~XPG_MODIFIER;
    }
    }
 
 
  return mask;
  return mask;
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.