if ((*name)[0] == '\0')
if ((*name)[0] == '\0'  || (__libc_enable_secure && memchr (*name, '/', _nl_find_language (*name) - *name) != NULL))
_nl_find_locale (const char *locale_path, size_t locale_path_len,		 int category, const char **name){  int mask;  /* Name of the locale for this category.  */  char *loc_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;  struct loaded_l10nfile *locale_file;  if ((*name)[0] == '\0')    {      /* The user decides which locale to use by setting environment	 variables.  */      *name = getenv ("LC_ALL");      if (*name == NULL || (*name)[0] == '\0')	*name = getenv (_nl_category_names[category]);      if (*name == NULL || (*name)[0] == '\0')	*name = getenv ("LANG");      if (*name == NULL || (*name)[0] == '\0')	*name = (char *) _nl_C_name;    }  if (strcmp (*name, _nl_C_name) == 0 || strcmp (*name, _nl_POSIX_name) == 0)    {      /* We need not load anything.  The needed data is contained in	 the library itself.  */      *name = (char *) _nl_C_name;      return _nl_C[category];    }  /* We really have to load some data.  First see whether the name is     an alias.  Please note that this makes it impossible to have "C"     or "POSIX" as aliases.  */  loc_name = (char *) _nl_expand_alias (*name);  if (loc_name == NULL)    /* It is no alias.  */    loc_name = (char *) *name;  /* Make a writable copy of the locale name.  */  loc_name = __strdup (loc_name);  /* LOCALE can consist of up to four recognized parts for the XPG syntax:		language[_territory[.codeset]][@modifier]     and six parts for the CEN syntax:	language[_territory][+audience][+special][,[sponsor][_revision]]     Beside the first all of them are allowed to be missing.  If the     full specified locale is not found, the less specific one are     looked for.  The various part will be stripped of according to     the following order:		(1) revision		(2) sponsor		(3) special		(4) codeset		(5) normalized codeset		(6) territory		(7) audience/modifier   */  mask = _nl_explode_name (loc_name, &language, &modifier, &territory,			   &codeset, &normalized_codeset, &special,			   &sponsor, &revision);  /* If exactly this locale was already asked for we have an entry with     the complete name.  */  locale_file = _nl_make_l10nflist (&locale_file_list[category],				    locale_path, locale_path_len, mask,				    language, territory, codeset,				    normalized_codeset, modifier, special,				    sponsor, revision,				    _nl_category_names[category], 0);  if (locale_file == NULL)    {      /* Find status record for addressed locale file.  We have to search	 through all directories in the locale path.  */      locale_file = _nl_make_l10nflist (&locale_file_list[category],					locale_path, locale_path_len, mask,					language, territory, codeset,					normalized_codeset, modifier, special,					sponsor, revision,					_nl_category_names[category], 1);      if (locale_file == NULL)	/* This means we are out of core.  */	return NULL;    }  else    /* If the addressed locale is already available it should be       freed.  If we would not do this switching back and force       between two locales would slowly eat up all memory.  */    free ((void *) loc_name);  if (locale_file->decided == 0)    _nl_load_locale (locale_file, category);  if (locale_file->data == NULL)    {      int cnt;      for (cnt = 0; locale_file->successor[cnt] != NULL; ++cnt)	{	  if (locale_file->successor[cnt]->decided == 0)	    _nl_load_locale (locale_file->successor[cnt], category);	  if (locale_file->successor[cnt]->data != NULL)	    break;	}      /* Move the entry we found (or NULL) to the first place of	 successors.  */      locale_file->successor[0] = locale_file->successor[cnt];      locale_file = locale_file->successor[cnt];    }  if (locale_file == NULL)    return NULL;  /* Determine the locale name for which loading succeeded.  This     information comes from the file name.  The form is     <path>/<locale>/LC_foo.  We must extract the <locale> part.  */  if (((struct locale_data *) locale_file->data)->name == NULL)    {      char *cp, *endp;      endp = strrchr (locale_file->filename, '/');      cp = endp - 1;      while (cp[-1] != '/')	--cp;      ((struct locale_data *) locale_file->data)->name = __strndup (cp,								    endp - cp);    }  *name = (char *) ((struct locale_data *) locale_file->data)->name;  /* Increment the usage count.  */  if (((struct locale_data *) locale_file->data)->usage_count      < MAX_USAGE_COUNT)    ++((struct locale_data *) locale_file->data)->usage_count;  return (struct locale_data *) locale_file->data;}