Back to index

plt-scheme  4.2.1
Defines | Functions
explodename.c File Reference
#include <stdlib.h>
#include <string.h>
#include "loadinfo.h"

Go to the source code of this file.

Defines

#define NULL   0

Functions

int _nl_explode_name (char *name, const char **language, const char **modifier, const char **territory, const char **codeset, const char **normalized_codeset, const char **special, const char **sponsor, const char **revision)

Define Documentation

#define NULL   0

Definition at line 34 of file explodename.c.


Function Documentation

int _nl_explode_name ( char *  name,
const char **  language,
const char **  modifier,
const char **  territory,
const char **  codeset,
const char **  normalized_codeset,
const char **  special,
const char **  sponsor,
const char **  revision 
)

Definition at line 41 of file explodename.c.

{
  enum { undecided, xpg, cen } syntax;
  char *cp;
  int mask;

  *modifier = NULL;
  *territory = NULL;
  *codeset = NULL;
  *normalized_codeset = NULL;
  *special = NULL;
  *sponsor = NULL;
  *revision = NULL;

  /* Now we determine the single parts of the locale name.  First
     look for the language.  Termination symbols are `_' and `@' if
     we use XPG4 style, and `_', `+', and `,' if we use CEN syntax.  */
  mask = 0;
  syntax = undecided;
  *language = cp = name;
  while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@'
        && cp[0] != '+' && cp[0] != ',')
    ++cp;

  if (*language == cp)
    /* This does not make sense: language has to be specified.  Use
       this entry as it is without exploding.  Perhaps it is an alias.  */
    cp = strchr (*language, '\0');
  else if (cp[0] == '_')
    {
      /* Next is the territory.  */
      cp[0] = '\0';
      *territory = ++cp;

      while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
            && cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
       ++cp;

      mask |= TERRITORY;

      if (cp[0] == '.')
       {
         /* Next is the codeset.  */
         syntax = xpg;
         cp[0] = '\0';
         *codeset = ++cp;

         while (cp[0] != '\0' && cp[0] != '@')
           ++cp;

         mask |= XPG_CODESET;

         if (*codeset != cp && (*codeset)[0] != '\0')
           {
             *normalized_codeset = _nl_normalize_codeset (*codeset,
                                                    cp - *codeset);
             if (strcmp (*codeset, *normalized_codeset) == 0)
              free ((char *) *normalized_codeset);
             else
              mask |= XPG_NORM_CODESET;
           }
       }
    }

  if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
    {
      /* Next is the modifier.  */
      syntax = cp[0] == '@' ? xpg : cen;
      cp[0] = '\0';
      *modifier = ++cp;

      while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
            && cp[0] != ',' && cp[0] != '_')
       ++cp;

      mask |= XPG_MODIFIER | CEN_AUDIENCE;
    }

  if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
    {
      syntax = cen;

      if (cp[0] == '+')
       {
         /* Next is special application (CEN syntax).  */
         cp[0] = '\0';
         *special = ++cp;

         while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
           ++cp;

         mask |= CEN_SPECIAL;
       }

      if (cp[0] == ',')
       {
         /* Next is sponsor (CEN syntax).  */
         cp[0] = '\0';
         *sponsor = ++cp;

         while (cp[0] != '\0' && cp[0] != '_')
           ++cp;

         mask |= CEN_SPONSOR;
       }

      if (cp[0] == '_')
       {
         /* Next is revision (CEN syntax).  */
         cp[0] = '\0';
         *revision = ++cp;

         mask |= CEN_REVISION;
       }
    }

  /* For CEN sytnax values it might be important to have the
     separator character in the file name, not for XPG syntax.  */
  if (syntax == xpg)
    {
      if (*territory != NULL && (*territory)[0] == '\0')
       mask &= ~TERRITORY;

      if (*codeset != NULL && (*codeset)[0] == '\0')
       mask &= ~XPG_CODESET;

      if (*modifier != NULL && (*modifier)[0] == '\0')
       mask &= ~XPG_MODIFIER;
    }

  return mask;
}

Here is the call graph for this function:

Here is the caller graph for this function: