Back to index

glibc  2.9
Functions
catgets.c File Reference
#include <alloca.h>
#include <errno.h>
#include <locale.h>
#include <nl_types.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include "catgetsinfo.h"

Go to the source code of this file.

Functions

nl_catd catopen (const char *cat_name, int flag)
char * catgets (nl_catd catalog_desc, int set, int message, const char *string)
int catclose (nl_catd catalog_desc)

Function Documentation

int catclose ( nl_catd  catalog_desc)

Definition at line 116 of file catgets.c.

{
  __nl_catd catalog;

  /* Be generous if catalog which failed to be open is used.  */
  if (catalog_desc == (nl_catd) -1)
    {
      __set_errno (EBADF);
      return -1;
    }

  catalog = (__nl_catd) catalog_desc;

#ifdef _POSIX_MAPPED_FILES
  if (catalog->status == mmapped)
    __munmap ((void *) catalog->file_ptr, catalog->file_size);
  else
#endif /* _POSIX_MAPPED_FILES */
    if (catalog->status == malloced)
      free ((void *) catalog->file_ptr);
    else
      {
       __set_errno (EBADF);
       return -1;
      }

  free ((void *) catalog);

  return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

char* catgets ( nl_catd  catalog_desc,
int  set,
int  message,
const char *  string 
)

Definition at line 85 of file catgets.c.

{
  __nl_catd catalog;
  size_t idx;
  size_t cnt;

  /* Be generous if catalog which failed to be open is used.  */
  if (catalog_desc == (nl_catd) -1 || ++set <= 0 || message < 0)
    return (char *) string;

  catalog = (__nl_catd) catalog_desc;

  idx = ((set * message) % catalog->plane_size) * 3;
  cnt = 0;
  do
    {
      if (catalog->name_ptr[idx + 0] == (u_int32_t) set
         && catalog->name_ptr[idx + 1] == (u_int32_t) message)
       return (char *) &catalog->strings[catalog->name_ptr[idx + 2]];

      idx += catalog->plane_size * 3;
    }
  while (++cnt < catalog->plane_depth);

  __set_errno (ENOMSG);
  return (char *) string;
}

Here is the caller graph for this function:

nl_catd catopen ( const char *  cat_name,
int  flag 
)

Definition at line 34 of file catgets.c.

{
  __nl_catd result;
  const char *env_var = NULL;
  const char *nlspath = NULL;

  if (strchr (cat_name, '/') == NULL)
    {
      if (flag == NL_CAT_LOCALE)
       /* Use the current locale setting for LC_MESSAGES.  */
       env_var = setlocale (LC_MESSAGES, NULL);
      else
       /* Use the LANG environment variable.  */
       env_var = getenv ("LANG");

      if (env_var == NULL || *env_var == '\0'
         || (__libc_enable_secure && strchr (env_var, '/') != NULL))
       env_var = "C";

      nlspath = getenv ("NLSPATH");
      if (nlspath != NULL && *nlspath != '\0')
       {
         /* Append the system dependent directory.  */
         size_t len = strlen (nlspath) + 1 + sizeof NLSPATH;
         char *tmp = alloca (len);

         __stpcpy (__stpcpy (__stpcpy (tmp, nlspath), ":"), NLSPATH);
         nlspath = tmp;
       }
      else
       nlspath = NLSPATH;
    }

  result = (__nl_catd) malloc (sizeof (*result));
  if (result == NULL)
    /* We cannot get enough memory.  */
    return (nl_catd) -1;

  if (__open_catalog (cat_name, nlspath, env_var, result) != 0)
    {
      /* Couldn't open the file.  */
      free ((void *) result);
      return (nl_catd) -1;
    }

  return (nl_catd) result;
}

Here is the call graph for this function:

Here is the caller graph for this function: