by implicitly appending a "C" entry, i.e., no translation
by implicitly appending a "C" entry, i.e. no translation
DCGETTEXT (domainname, msgid, category)     const char *domainname;     const char *msgid;     int category;{#ifndef HAVE_ALLOCA  struct block_list *block_list = NULL;#endif  struct loaded_l10nfile *domain;  struct binding *binding;  const char *categoryname;  const char *categoryvalue;  char *dirname, *xdomainname;  char *single_locale;  char *retval;  int saved_errno = errno;  /* If no real MSGID is given return NULL.  */  if (msgid == NULL)    return NULL;  /* If DOMAINNAME is NULL, we are interested in the default domain.  If     CATEGORY is not LC_MESSAGES this might not make much sense but the     defintion left this undefined.  */  if (domainname == NULL)    domainname = _nl_current_default_domain;  /* First find matching binding.  */  for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)    {      int compare = strcmp (domainname, binding->domainname);      if (compare == 0)	/* We found it!  */	break;      if (compare < 0)	{	  /* It is not in the list.  */	  binding = NULL;	  break;	}    }  if (binding == NULL)    dirname = (char *) _nl_default_dirname;  else if (binding->dirname[0] == '/')    dirname = binding->dirname;  else    {      /* We have a relative path.  Make it absolute now.  */      size_t dirname_len = strlen (binding->dirname) + 1;      size_t path_max;      char *ret;      path_max = (unsigned) PATH_MAX;      path_max += 2;		/* The getcwd docs say to do this.  */      dirname = (char *) alloca (path_max + dirname_len);      ADD_BLOCK (block_list, dirname);      __set_errno (0);      while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE)	{	  path_max += PATH_INCR;	  dirname = (char *) alloca (path_max + dirname_len);	  ADD_BLOCK (block_list, dirname);	  __set_errno (0);	}      if (ret == NULL)	{	  /* We cannot get the current working directory.  Don't signal an	     error but simply return the default string.  */	  FREE_BLOCKS (block_list);	  __set_errno (saved_errno);	  return (char *) msgid;	}      stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname);    }  /* Now determine the symbolic name of CATEGORY and its value.  */  categoryname = category_to_name (category);  categoryvalue = guess_category_value (category, categoryname);  xdomainname = (char *) alloca (strlen (categoryname)				 + strlen (domainname) + 5);  ADD_BLOCK (block_list, xdomainname);  stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),		  domainname),	  ".mo");  /* Creating working area.  */  single_locale = (char *) alloca (strlen (categoryvalue) + 1);  ADD_BLOCK (block_list, single_locale);  /* Search for the given string.  This is a loop because we perhaps     got an ordered list of languages to consider for th translation.  */  while (1)    {      /* Make CATEGORYVALUE point to the next element of the list.  */      while (categoryvalue[0] != '\0' && categoryvalue[0] == ':')	++categoryvalue;      if (categoryvalue[0] == '\0')	{	  /* The whole contents of CATEGORYVALUE has been searched but	     no valid entry has been found.  We solve this situation	     by implicitly appending a "C" entry, i.e., no translation	     will take place.  */	  single_locale[0] = 'C';	  single_locale[1] = '\0';	}      else	{	  char *cp = single_locale;	  while (categoryvalue[0] != '\0' && categoryvalue[0] != ':')	    *cp++ = *categoryvalue++;	  *cp = '\0';	}      /* If the current locale value is C (or POSIX) we don't load a	 domain.  Return the MSGID.  */      if (strcmp (single_locale, "C") == 0	  || strcmp (single_locale, "POSIX") == 0)	{	  FREE_BLOCKS (block_list);	  __set_errno (saved_errno);	  return (char *) msgid;	}      /* Find structure describing the message catalog matching the	 DOMAINNAME and CATEGORY.  */      domain = _nl_find_domain (dirname, single_locale, xdomainname);      if (domain != NULL)	{	  retval = find_msg (domain, msgid);	  if (retval == NULL)	    {	      int cnt;	      for (cnt = 0; domain->successor[cnt] != NULL; ++cnt)		{		  retval = find_msg (domain->successor[cnt], msgid);		  if (retval != NULL)		    break;		}	    }	  if (retval != NULL)	    {	      FREE_BLOCKS (block_list);	      __set_errno (saved_errno);	      return retval;	    }	}    }  /* NOTREACHED */}