(root)/
glibc-2.38/
locale/
nl_langinfo_l.c
       1  /* User interface for extracting locale-dependent parameters.
       2     Copyright (C) 1995-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <langinfo.h>
      20  #include <locale.h>
      21  #include <errno.h>
      22  #include <stddef.h>
      23  #include <stdlib.h>
      24  #include "localeinfo.h"
      25  
      26  
      27  /* Return a string with the data for locale-dependent parameter ITEM.  */
      28  
      29  char *
      30  __nl_langinfo_l (nl_item item, locale_t l)
      31  {
      32    int category = _NL_ITEM_CATEGORY (item);
      33    unsigned int index = _NL_ITEM_INDEX (item);
      34    const struct __locale_data *data;
      35  
      36    if (category < 0 || category == LC_ALL || category >= __LC_LAST)
      37      /* Bogus category: bogus item.  */
      38      return (char *) "";
      39  
      40    /* Special case value for NL_LOCALE_NAME (category).
      41       This is not a real item index in the string table.  */
      42    if (index == _NL_ITEM_INDEX (_NL_LOCALE_NAME (category)))
      43      return (char *) l->__names[category];
      44  
      45  #if defined NL_CURRENT_INDIRECT
      46    /* Make direct reference to every _nl_current_CATEGORY symbol,
      47       since we know only at runtime which categories are used.  */
      48    switch (category)
      49      {
      50  # define DEFINE_CATEGORY(category, category_name, items, a) \
      51        case category: data = *_nl_current_##category; break;
      52  # include "categories.def"
      53  # undef DEFINE_CATEGORY
      54      default:                   /* Should be impossible.  */
      55        abort();
      56      }
      57  #else
      58    data = l->__locales[category];
      59  #endif
      60  
      61    if (index >= data->nstrings)
      62      /* Bogus index for this category: bogus item.  */
      63      return (char *) "";
      64  
      65    /* Return the string for the specified item.  */
      66    return (char *) data->values[index].string;
      67  }
      68  libc_hidden_def (__nl_langinfo_l)
      69  weak_alias (__nl_langinfo_l, nl_langinfo_l)