Blame intl/l10nflist.c

Packit Service 72eb06
/* Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Packit Service 72eb06
   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
Packit Service 72eb06
Packit Service 72eb06
   This program is free software; you can redistribute it and/or modify it
Packit Service 72eb06
   under the terms of the GNU Library General Public License as published
Packit Service 72eb06
   by the Free Software Foundation; either version 2, or (at your option)
Packit Service 72eb06
   any later version.
Packit Service 72eb06
Packit Service 72eb06
   This program is distributed in the hope that it will be useful,
Packit Service 72eb06
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 72eb06
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 72eb06
   Library General Public License for more details.
Packit Service 72eb06
Packit Service 72eb06
   You should have received a copy of the GNU Library General Public
Packit Service 72eb06
   License along with this program; if not, write to the Free Software
Packit Service 72eb06
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
Packit Service 72eb06
   USA.  */
Packit Service 72eb06
Packit Service 72eb06
/* Tell glibc's <string.h> to provide a prototype for stpcpy().
Packit Service 72eb06
   This must come before <config.h> because <config.h> may include
Packit Service 72eb06
   <features.h>, and once <features.h> has been included, it's too late.  */
Packit Service 72eb06
#ifndef _GNU_SOURCE
Packit Service 72eb06
# define _GNU_SOURCE	1
Packit Service 72eb06
#endif
Packit Service 72eb06
Packit Service 72eb06
#ifdef HAVE_CONFIG_H
Packit Service 72eb06
# include <config.h>
Packit Service 72eb06
#endif
Packit Service 72eb06
Packit Service 72eb06
#include <string.h>
Packit Service 72eb06
Packit Service 72eb06
#if defined _LIBC || defined HAVE_ARGZ_H
Packit Service 72eb06
# include <argz.h>
Packit Service 72eb06
#endif
Packit Service 72eb06
#include <ctype.h>
Packit Service 72eb06
#include <sys/types.h>
Packit Service 72eb06
#include <stdlib.h>
Packit Service 72eb06
Packit Service 72eb06
#include "loadinfo.h"
Packit Service 72eb06
Packit Service 72eb06
/* On some strange systems still no definition of NULL is found.  Sigh!  */
Packit Service 72eb06
#ifndef NULL
Packit Service 72eb06
# if defined __STDC__ && __STDC__
Packit Service 72eb06
#  define NULL ((void *) 0)
Packit Service 72eb06
# else
Packit Service 72eb06
#  define NULL 0
Packit Service 72eb06
# endif
Packit Service 72eb06
#endif
Packit Service 72eb06
Packit Service 72eb06
/* @@ end of prolog @@ */
Packit Service 72eb06
Packit Service 72eb06
#ifdef _LIBC
Packit Service 72eb06
/* Rename the non ANSI C functions.  This is required by the standard
Packit Service 72eb06
   because some ANSI C functions will require linking with this object
Packit Service 72eb06
   file and the name space must not be polluted.  */
Packit Service 72eb06
# ifndef stpcpy
Packit Service 72eb06
#  define stpcpy(dest, src) __stpcpy(dest, src)
Packit Service 72eb06
# endif
Packit Service 72eb06
#else
Packit Service 72eb06
# ifndef HAVE_STPCPY
Packit Service 72eb06
static char *stpcpy PARAMS ((char *dest, const char *src));
Packit Service 72eb06
# endif
Packit Service 72eb06
#endif
Packit Service 72eb06
Packit Service 72eb06
/* Pathname support.
Packit Service 72eb06
   ISSLASH(C)           tests whether C is a directory separator character.
Packit Service 72eb06
   IS_ABSOLUTE_PATH(P)  tests whether P is an absolute path.  If it is not,
Packit Service 72eb06
                        it may be concatenated to a directory pathname.
Packit Service 72eb06
 */
Packit Service 72eb06
#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
Packit Service 72eb06
  /* Win32, OS/2, DOS */
Packit Service 72eb06
# define ISSLASH(C) ((C) == '/' || (C) == '\\')
Packit Service 72eb06
# define HAS_DEVICE(P) \
Packit Service 72eb06
    ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
Packit Service 72eb06
     && (P)[1] == ':')
Packit Service 72eb06
# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
Packit Service 72eb06
#else
Packit Service 72eb06
  /* Unix */
Packit Service 72eb06
# define ISSLASH(C) ((C) == '/')
Packit Service 72eb06
# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
Packit Service 72eb06
#endif
Packit Service 72eb06
Packit Service 72eb06
/* Define function which are usually not available.  */
Packit Service 72eb06
Packit Service 72eb06
#if !defined _LIBC && !defined HAVE___ARGZ_COUNT
Packit Service 72eb06
/* Returns the number of strings in ARGZ.  */
Packit Service 72eb06
static size_t argz_count__ PARAMS ((const char *argz, size_t len));
Packit Service 72eb06
Packit Service 72eb06
static size_t
Packit Service 72eb06
argz_count__ (argz, len)
Packit Service 72eb06
     const char *argz;
Packit Service 72eb06
     size_t len;
Packit Service 72eb06
{
Packit Service 72eb06
  size_t count = 0;
Packit Service 72eb06
  while (len > 0)
Packit Service 72eb06
    {
Packit Service 72eb06
      size_t part_len = strlen (argz);
Packit Service 72eb06
      argz += part_len + 1;
Packit Service 72eb06
      len -= part_len + 1;
Packit Service 72eb06
      count++;
Packit Service 72eb06
    }
Packit Service 72eb06
  return count;
Packit Service 72eb06
}
Packit Service 72eb06
# undef __argz_count
Packit Service 72eb06
# define __argz_count(argz, len) argz_count__ (argz, len)
Packit Service 72eb06
#else
Packit Service 72eb06
# ifdef _LIBC
Packit Service 72eb06
#  define __argz_count(argz, len) INTUSE(__argz_count) (argz, len)
Packit Service 72eb06
# endif
Packit Service 72eb06
#endif	/* !_LIBC && !HAVE___ARGZ_COUNT */
Packit Service 72eb06
Packit Service 72eb06
#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
Packit Service 72eb06
/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
Packit Service 72eb06
   except the last into the character SEP.  */
Packit Service 72eb06
static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep));
Packit Service 72eb06
Packit Service 72eb06
static void
Packit Service 72eb06
argz_stringify__ (argz, len, sep)
Packit Service 72eb06
     char *argz;
Packit Service 72eb06
     size_t len;
Packit Service 72eb06
     int sep;
Packit Service 72eb06
{
Packit Service 72eb06
  while (len > 0)
Packit Service 72eb06
    {
Packit Service 72eb06
      size_t part_len = strlen (argz);
Packit Service 72eb06
      argz += part_len;
Packit Service 72eb06
      len -= part_len + 1;
Packit Service 72eb06
      if (len > 0)
Packit Service 72eb06
	*argz++ = sep;
Packit Service 72eb06
    }
Packit Service 72eb06
}
Packit Service 72eb06
# undef __argz_stringify
Packit Service 72eb06
# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
Packit Service 72eb06
#else
Packit Service 72eb06
# ifdef _LIBC
Packit Service 72eb06
#  define __argz_stringify(argz, len, sep) \
Packit Service 72eb06
  INTUSE(__argz_stringify) (argz, len, sep)
Packit Service 72eb06
# endif
Packit Service 72eb06
#endif	/* !_LIBC && !HAVE___ARGZ_STRINGIFY */
Packit Service 72eb06
Packit Service 72eb06
#if !defined _LIBC && !defined HAVE___ARGZ_NEXT
Packit Service 72eb06
static char *argz_next__ PARAMS ((char *argz, size_t argz_len,
Packit Service 72eb06
				  const char *entry));
Packit Service 72eb06
Packit Service 72eb06
static char *
Packit Service 72eb06
argz_next__ (argz, argz_len, entry)
Packit Service 72eb06
     char *argz;
Packit Service 72eb06
     size_t argz_len;
Packit Service 72eb06
     const char *entry;
Packit Service 72eb06
{
Packit Service 72eb06
  if (entry)
Packit Service 72eb06
    {
Packit Service 72eb06
      if (entry < argz + argz_len)
Packit Service 72eb06
        entry = strchr (entry, '\0') + 1;
Packit Service 72eb06
Packit Service 72eb06
      return entry >= argz + argz_len ? NULL : (char *) entry;
Packit Service 72eb06
    }
Packit Service 72eb06
  else
Packit Service 72eb06
    if (argz_len > 0)
Packit Service 72eb06
      return argz;
Packit Service 72eb06
    else
Packit Service 72eb06
      return 0;
Packit Service 72eb06
}
Packit Service 72eb06
# undef __argz_next
Packit Service 72eb06
# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
Packit Service 72eb06
#endif	/* !_LIBC && !HAVE___ARGZ_NEXT */
Packit Service 72eb06
Packit Service 72eb06
Packit Service 72eb06
/* Return number of bits set in X.  */
Packit Service 72eb06
static int pop PARAMS ((int x));
Packit Service 72eb06
Packit Service 72eb06
static inline int
Packit Service 72eb06
pop (x)
Packit Service 72eb06
     int x;
Packit Service 72eb06
{
Packit Service 72eb06
  /* We assume that no more than 16 bits are used.  */
Packit Service 72eb06
  x = ((x & ~0x5555) >> 1) + (x & 0x5555);
Packit Service 72eb06
  x = ((x & ~0x3333) >> 2) + (x & 0x3333);
Packit Service 72eb06
  x = ((x >> 4) + x) & 0x0f0f;
Packit Service 72eb06
  x = ((x >> 8) + x) & 0xff;
Packit Service 72eb06
Packit Service 72eb06
  return x;
Packit Service 72eb06
}
Packit Service 72eb06
Packit Service 72eb06

Packit Service 72eb06
struct loaded_l10nfile *
Packit Service 72eb06
_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
Packit Service 72eb06
		    territory, codeset, normalized_codeset, modifier, special,
Packit Service 72eb06
		    sponsor, revision, filename, do_allocate)
Packit Service 72eb06
     struct loaded_l10nfile **l10nfile_list;
Packit Service 72eb06
     const char *dirlist;
Packit Service 72eb06
     size_t dirlist_len;
Packit Service 72eb06
     int mask;
Packit Service 72eb06
     const char *language;
Packit Service 72eb06
     const char *territory;
Packit Service 72eb06
     const char *codeset;
Packit Service 72eb06
     const char *normalized_codeset;
Packit Service 72eb06
     const char *modifier;
Packit Service 72eb06
     const char *special;
Packit Service 72eb06
     const char *sponsor;
Packit Service 72eb06
     const char *revision;
Packit Service 72eb06
     const char *filename;
Packit Service 72eb06
     int do_allocate;
Packit Service 72eb06
{
Packit Service 72eb06
  char *abs_filename;
Packit Service 72eb06
  struct loaded_l10nfile **lastp;
Packit Service 72eb06
  struct loaded_l10nfile *retval;
Packit Service 72eb06
  char *cp;
Packit Service 72eb06
  size_t dirlist_count;
Packit Service 72eb06
  size_t entries;
Packit Service 72eb06
  int cnt;
Packit Service 72eb06
Packit Service 72eb06
  /* If LANGUAGE contains an absolute directory specification, we ignore
Packit Service 72eb06
     DIRLIST.  */
Packit Service 72eb06
  if (IS_ABSOLUTE_PATH (language))
Packit Service 72eb06
    dirlist_len = 0;
Packit Service 72eb06
Packit Service 72eb06
  /* Allocate room for the full file name.  */
Packit Service 72eb06
  abs_filename = (char *) malloc (dirlist_len
Packit Service 72eb06
				  + strlen (language)
Packit Service 72eb06
				  + ((mask & TERRITORY) != 0
Packit Service 72eb06
				     ? strlen (territory) + 1 : 0)
Packit Service 72eb06
				  + ((mask & XPG_CODESET) != 0
Packit Service 72eb06
				     ? strlen (codeset) + 1 : 0)
Packit Service 72eb06
				  + ((mask & XPG_NORM_CODESET) != 0
Packit Service 72eb06
				     ? strlen (normalized_codeset) + 1 : 0)
Packit Service 72eb06
				  + (((mask & XPG_MODIFIER) != 0
Packit Service 72eb06
				      || (mask & CEN_AUDIENCE) != 0)
Packit Service 72eb06
				     ? strlen (modifier) + 1 : 0)
Packit Service 72eb06
				  + ((mask & CEN_SPECIAL) != 0
Packit Service 72eb06
				     ? strlen (special) + 1 : 0)
Packit Service 72eb06
				  + (((mask & CEN_SPONSOR) != 0
Packit Service 72eb06
				      || (mask & CEN_REVISION) != 0)
Packit Service 72eb06
				     ? (1 + ((mask & CEN_SPONSOR) != 0
Packit Service 72eb06
					     ? strlen (sponsor) : 0)
Packit Service 72eb06
					+ ((mask & CEN_REVISION) != 0
Packit Service 72eb06
					   ? strlen (revision) + 1 : 0)) : 0)
Packit Service 72eb06
				  + 1 + strlen (filename) + 1);
Packit Service 72eb06
Packit Service 72eb06
  if (abs_filename == NULL)
Packit Service 72eb06
    return NULL;
Packit Service 72eb06
Packit Service 72eb06
  /* Construct file name.  */
Packit Service 72eb06
  cp = abs_filename;
Packit Service 72eb06
  if (dirlist_len > 0)
Packit Service 72eb06
    {
Packit Service 72eb06
      memcpy (cp, dirlist, dirlist_len);
Packit Service 72eb06
      __argz_stringify (cp, dirlist_len, PATH_SEPARATOR);
Packit Service 72eb06
      cp += dirlist_len;
Packit Service 72eb06
      cp[-1] = '/';
Packit Service 72eb06
    }
Packit Service 72eb06
Packit Service 72eb06
  cp = stpcpy (cp, language);
Packit Service 72eb06
Packit Service 72eb06
  if ((mask & TERRITORY) != 0)
Packit Service 72eb06
    {
Packit Service 72eb06
      *cp++ = '_';
Packit Service 72eb06
      cp = stpcpy (cp, territory);
Packit Service 72eb06
    }
Packit Service 72eb06
  if ((mask & XPG_CODESET) != 0)
Packit Service 72eb06
    {
Packit Service 72eb06
      *cp++ = '.';
Packit Service 72eb06
      cp = stpcpy (cp, codeset);
Packit Service 72eb06
    }
Packit Service 72eb06
  if ((mask & XPG_NORM_CODESET) != 0)
Packit Service 72eb06
    {
Packit Service 72eb06
      *cp++ = '.';
Packit Service 72eb06
      cp = stpcpy (cp, normalized_codeset);
Packit Service 72eb06
    }
Packit Service 72eb06
  if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
Packit Service 72eb06
    {
Packit Service 72eb06
      /* This component can be part of both syntaces but has different
Packit Service 72eb06
	 leading characters.  For CEN we use `+', else `@'.  */
Packit Service 72eb06
      *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
Packit Service 72eb06
      cp = stpcpy (cp, modifier);
Packit Service 72eb06
    }
Packit Service 72eb06
  if ((mask & CEN_SPECIAL) != 0)
Packit Service 72eb06
    {
Packit Service 72eb06
      *cp++ = '+';
Packit Service 72eb06
      cp = stpcpy (cp, special);
Packit Service 72eb06
    }
Packit Service 72eb06
  if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0)
Packit Service 72eb06
    {
Packit Service 72eb06
      *cp++ = ',';
Packit Service 72eb06
      if ((mask & CEN_SPONSOR) != 0)
Packit Service 72eb06
	cp = stpcpy (cp, sponsor);
Packit Service 72eb06
      if ((mask & CEN_REVISION) != 0)
Packit Service 72eb06
	{
Packit Service 72eb06
	  *cp++ = '_';
Packit Service 72eb06
	  cp = stpcpy (cp, revision);
Packit Service 72eb06
	}
Packit Service 72eb06
    }
Packit Service 72eb06
Packit Service 72eb06
  *cp++ = '/';
Packit Service 72eb06
  stpcpy (cp, filename);
Packit Service 72eb06
Packit Service 72eb06
  /* Look in list of already loaded domains whether it is already
Packit Service 72eb06
     available.  */
Packit Service 72eb06
  lastp = l10nfile_list;
Packit Service 72eb06
  for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
Packit Service 72eb06
    if (retval->filename != NULL)
Packit Service 72eb06
      {
Packit Service 72eb06
	int compare = strcmp (retval->filename, abs_filename);
Packit Service 72eb06
	if (compare == 0)
Packit Service 72eb06
	  /* We found it!  */
Packit Service 72eb06
	  break;
Packit Service 72eb06
	if (compare < 0)
Packit Service 72eb06
	  {
Packit Service 72eb06
	    /* It's not in the list.  */
Packit Service 72eb06
	    retval = NULL;
Packit Service 72eb06
	    break;
Packit Service 72eb06
	  }
Packit Service 72eb06
Packit Service 72eb06
	lastp = &retval->next;
Packit Service 72eb06
      }
Packit Service 72eb06
Packit Service 72eb06
  if (retval != NULL || do_allocate == 0)
Packit Service 72eb06
    {
Packit Service 72eb06
      free (abs_filename);
Packit Service 72eb06
      return retval;
Packit Service 72eb06
    }
Packit Service 72eb06
Packit Service 72eb06
  dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1);
Packit Service 72eb06
Packit Service 72eb06
  /* Allocate a new loaded_l10nfile.  */
Packit Service 72eb06
  retval =
Packit Service 72eb06
    (struct loaded_l10nfile *)
Packit Service 72eb06
    malloc (sizeof (*retval)
Packit Service 72eb06
	    + (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0))
Packit Service 72eb06
	       * sizeof (struct loaded_l10nfile *)));
Packit Service 72eb06
  if (retval == NULL)
Packit Service 72eb06
    return NULL;
Packit Service 72eb06
Packit Service 72eb06
  retval->filename = abs_filename;
Packit Service 72eb06
Packit Service 72eb06
  /* We set retval->data to NULL here; it is filled in later.
Packit Service 72eb06
     Setting retval->decided to 1 here means that retval does not
Packit Service 72eb06
     correspond to a real file (dirlist_count > 1) or is not worth
Packit Service 72eb06
     looking up (if an unnormalized codeset was specified).  */
Packit Service 72eb06
  retval->decided = (dirlist_count > 1
Packit Service 72eb06
		     || ((mask & XPG_CODESET) != 0
Packit Service 72eb06
			 && (mask & XPG_NORM_CODESET) != 0));
Packit Service 72eb06
  retval->data = NULL;
Packit Service 72eb06
Packit Service 72eb06
  retval->next = *lastp;
Packit Service 72eb06
  *lastp = retval;
Packit Service 72eb06
Packit Service 72eb06
  entries = 0;
Packit Service 72eb06
  /* Recurse to fill the inheritance list of RETVAL.
Packit Service 72eb06
     If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL
Packit Service 72eb06
     entry does not correspond to a real file; retval->filename contains
Packit Service 72eb06
     colons.  In this case we loop across all elements of DIRLIST and
Packit Service 72eb06
     across all bit patterns dominated by MASK.
Packit Service 72eb06
     If the DIRLIST is a single directory or entirely redundant (i.e.
Packit Service 72eb06
     DIRLIST_COUNT == 1), we loop across all bit patterns dominated by
Packit Service 72eb06
     MASK, excluding MASK itself.
Packit Service 72eb06
     In either case, we loop down from MASK to 0.  This has the effect
Packit Service 72eb06
     that the extra bits in the locale name are dropped in this order:
Packit Service 72eb06
     first the modifier, then the territory, then the codeset, then the
Packit Service 72eb06
     normalized_codeset.  */
Packit Service 72eb06
  for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt)
Packit Service 72eb06
    if ((cnt & ~mask) == 0
Packit Service 72eb06
	&& ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
Packit Service 72eb06
	&& ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
Packit Service 72eb06
      {
Packit Service 72eb06
	if (dirlist_count > 1)
Packit Service 72eb06
	  {
Packit Service 72eb06
	    /* Iterate over all elements of the DIRLIST.  */
Packit Service 72eb06
	    char *dir = NULL;
Packit Service 72eb06
Packit Service 72eb06
	    while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
Packit Service 72eb06
		   != NULL)
Packit Service 72eb06
	      retval->successor[entries++]
Packit Service 72eb06
		= _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1,
Packit Service 72eb06
				      cnt, language, territory, codeset,
Packit Service 72eb06
				      normalized_codeset, modifier, special,
Packit Service 72eb06
				      sponsor, revision, filename, 1);
Packit Service 72eb06
	  }
Packit Service 72eb06
	else
Packit Service 72eb06
	  retval->successor[entries++]
Packit Service 72eb06
	    = _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len,
Packit Service 72eb06
				  cnt, language, territory, codeset,
Packit Service 72eb06
				  normalized_codeset, modifier, special,
Packit Service 72eb06
				  sponsor, revision, filename, 1);
Packit Service 72eb06
      }
Packit Service 72eb06
  retval->successor[entries] = NULL;
Packit Service 72eb06
Packit Service 72eb06
  return retval;
Packit Service 72eb06
}
Packit Service 72eb06

Packit Service 72eb06
/* Normalize codeset name.  There is no standard for the codeset
Packit Service 72eb06
   names.  Normalization allows the user to use any of the common
Packit Service 72eb06
   names.  The return value is dynamically allocated and has to be
Packit Service 72eb06
   freed by the caller.  */
Packit Service 72eb06
const char *
Packit Service 72eb06
_nl_normalize_codeset (codeset, name_len)
Packit Service 72eb06
     const char *codeset;
Packit Service 72eb06
     size_t name_len;
Packit Service 72eb06
{
Packit Service 72eb06
  int len = 0;
Packit Service 72eb06
  int only_digit = 1;
Packit Service 72eb06
  char *retval;
Packit Service 72eb06
  char *wp;
Packit Service 72eb06
  size_t cnt;
Packit Service 72eb06
Packit Service 72eb06
  for (cnt = 0; cnt < name_len; ++cnt)
Packit Service 72eb06
    if (isalnum ((unsigned char) codeset[cnt]))
Packit Service 72eb06
      {
Packit Service 72eb06
	++len;
Packit Service 72eb06
Packit Service 72eb06
	if (isalpha ((unsigned char) codeset[cnt]))
Packit Service 72eb06
	  only_digit = 0;
Packit Service 72eb06
      }
Packit Service 72eb06
Packit Service 72eb06
  retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
Packit Service 72eb06
Packit Service 72eb06
  if (retval != NULL)
Packit Service 72eb06
    {
Packit Service 72eb06
      if (only_digit)
Packit Service 72eb06
	wp = stpcpy (retval, "iso");
Packit Service 72eb06
      else
Packit Service 72eb06
	wp = retval;
Packit Service 72eb06
Packit Service 72eb06
      for (cnt = 0; cnt < name_len; ++cnt)
Packit Service 72eb06
	if (isalpha ((unsigned char) codeset[cnt]))
Packit Service 72eb06
	  *wp++ = tolower ((unsigned char) codeset[cnt]);
Packit Service 72eb06
	else if (isdigit ((unsigned char) codeset[cnt]))
Packit Service 72eb06
	  *wp++ = codeset[cnt];
Packit Service 72eb06
Packit Service 72eb06
      *wp = '\0';
Packit Service 72eb06
    }
Packit Service 72eb06
Packit Service 72eb06
  return (const char *) retval;
Packit Service 72eb06
}
Packit Service 72eb06
Packit Service 72eb06
Packit Service 72eb06
/* @@ begin of epilog @@ */
Packit Service 72eb06
Packit Service 72eb06
/* We don't want libintl.a to depend on any other library.  So we
Packit Service 72eb06
   avoid the non-standard function stpcpy.  In GNU C Library this
Packit Service 72eb06
   function is available, though.  Also allow the symbol HAVE_STPCPY
Packit Service 72eb06
   to be defined.  */
Packit Service 72eb06
#if !_LIBC && !HAVE_STPCPY
Packit Service 72eb06
static char *
Packit Service 72eb06
stpcpy (dest, src)
Packit Service 72eb06
     char *dest;
Packit Service 72eb06
     const char *src;
Packit Service 72eb06
{
Packit Service 72eb06
  while ((*dest++ = *src++) != '\0')
Packit Service 72eb06
    /* Do nothing. */ ;
Packit Service 72eb06
  return dest - 1;
Packit Service 72eb06
}
Packit Service 72eb06
#endif