Back to index

courier  0.68.2
Defines | Functions
explodename.c File Reference
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include "loadinfo.h"

Go to the source code of this file.

Defines

#define NULL   0

Functions

static char * _nl_find_language (const char *name)
int _nl_explode_name (char *name, const char **language, const char **modifier, const char **territory, const char **codeset, const char **normalized_codeset)

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 
)

Definition at line 56 of file explodename.c.

{
  char *cp;
  int mask;

  *modifier = NULL;
  *territory = NULL;
  *codeset = NULL;
  *normalized_codeset = NULL;

  /* Now we determine the single parts of the locale name.  First
     look for the language.  Termination symbols are `_', '.', and `@'.  */
  mask = 0;
  *language = cp = name;
  cp = _nl_find_language (*language);

  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;

         mask |= XPG_TERRITORY;
       }

      if (cp[0] == '.')
       {
         /* Next is the codeset.  */
         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 (*normalized_codeset == NULL)
              return -1;
             else if (strcmp (*codeset, *normalized_codeset) == 0)
              free ((char *) *normalized_codeset);
             else
              mask |= XPG_NORM_CODESET;
           }
       }
    }

  if (cp[0] == '@')
    {
      /* Next is the modifier.  */
      cp[0] = '\0';
      *modifier = ++cp;

      if (cp[0] != '\0')
       mask |= XPG_MODIFIER;
    }

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

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

  return mask;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static char * _nl_find_language ( const char *  name) [static]

Definition at line 46 of file explodename.c.

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

  return (char *) name;
}

Here is the caller graph for this function: