mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	* locale/findlocale.c (free_mem): We can remove NODELETE marked data, just not the C locale data. * intl/tst-gettext.c: Use setlocale() in addition to setting envvar. * intl/tst-gettext.sh: Copy locale data if necessary. * intl/Makefile (generated-dirs): Add localedir. * intl/dcigettext.c (guess_category_value): For libc always use the setlocale() method. * intl/Makefile: Add rules to build, run and, distribute tst-gettext2. * intl/tst-gettext2.c: New file. * intl/tst-gettext2.sh: New file. * intl/tstlang1.po: New file. * intl/tstlang2.po: New file. Patch by Andreas Jaeger <aj@suse.de>. 2000-10-26 GOTO Masanori <gotom@debian.or.jp> * intl/locale.alias: Add ja_JP.ujis alias. 2000-10-30 Ulrich Drepper <drepper@redhat.com>
		
			
				
	
	
		
			342 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			342 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Test of the gettext functions.
 | |
|    Copyright (C) 2000 Free Software Foundation, Inc.
 | |
|    Contributed by Ulrich Drepper <drepper@cygnus.com>, 2000.
 | |
| 
 | |
|    The GNU C Library is free software; you can redistribute it and/or
 | |
|    modify it under the terms of the GNU Library General Public License as
 | |
|    published by the Free Software Foundation; either version 2 of the
 | |
|    License, or (at your option) any later version.
 | |
| 
 | |
|    The GNU C Library is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|    Library General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU Library General Public
 | |
|    License along with the GNU C Library; see the file COPYING.LIB.  If not,
 | |
|    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 | |
|    Boston, MA 02111-1307, USA.  */
 | |
| 
 | |
| #include <libintl.h>
 | |
| #include <locale.h>
 | |
| #include <mcheck.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| 
 | |
| 
 | |
| const struct
 | |
| {
 | |
|   const char *msgid;
 | |
|   const char *msgstr;
 | |
| } msgs[] =
 | |
| {
 | |
| #define INPUT(Str) { Str,
 | |
| #define OUTPUT(Str) Str },
 | |
| #include TESTSTRS_H
 | |
| };
 | |
| 
 | |
| const char *catname[] =
 | |
| {
 | |
|   [LC_MESSAGES] = "LC_MESSAGES",
 | |
|   [LC_TIME] = "LC_TIME",
 | |
|   [LC_NUMERIC] = "LC_NUMERIC"
 | |
| };
 | |
| 
 | |
| 
 | |
| static int positive_gettext_test (void);
 | |
| static int negative_gettext_test (void);
 | |
| static int positive_dgettext_test (const char *domain);
 | |
| static int positive_dcgettext_test (const char *domain, int category);
 | |
| static int negative_dcgettext_test (const char *domain, int category);
 | |
| 
 | |
| 
 | |
| int
 | |
| main (int argc, char *argv[])
 | |
| {
 | |
|   int result = 0;
 | |
| 
 | |
|   /* For debugging.  */
 | |
|   mtrace ();
 | |
| 
 | |
|   /* This is the place where the .mo files are placed.  */
 | |
|   if (argc > 1)
 | |
|     {
 | |
|       bindtextdomain ("existing-domain", argv[1]);
 | |
|       bindtextdomain ("existing-time-domain", argv[1]);
 | |
|       bindtextdomain ("non-existing-domain", argv[1]);
 | |
|     }
 | |
| 
 | |
|   /* The locale the catalog is created for is "existing-category".  Now
 | |
|      set the various variables in question to this value and run the
 | |
|      test.  */
 | |
|   setenv ("LANGUAGE", "existing-locale", 1);
 | |
|   setenv ("LC_ALL", "non-existing-locale", 1);
 | |
|   setenv ("LC_MESSAGES", "non-existing-locale", 1);
 | |
|   setenv ("LC_CTYPE", "non-existing-locale", 1);
 | |
|   setenv ("LANG", "non-existing-locale", 1);
 | |
|   setlocale (LC_CTYPE, "de_DE.ISO-8859-1");
 | |
|   unsetenv ("OUTPUT_CHARSET");
 | |
|   /* This is the name of the existing domain with a catalog for the
 | |
|      LC_MESSAGES category.  */
 | |
|   textdomain ("existing-domain");
 | |
|   puts ("test `gettext' with LANGUAGE set");
 | |
|   if (positive_gettext_test () != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
|   /* This is the name of a non-existing domain with a catalog for the
 | |
|      LC_MESSAGES category.  We leave this value set for the `dgettext'
 | |
|      and `dcgettext' tests.  */
 | |
|   textdomain ("non-existing-domain");
 | |
|   puts ("test `gettext' with LANGUAGE set");
 | |
|   if (negative_gettext_test () != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
|   puts ("test `dgettext' with LANGUAGE set");
 | |
|   if (positive_dgettext_test ("existing-domain") != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
| 
 | |
|   /* Now the same tests with LC_ALL deciding.  */
 | |
|   unsetenv ("LANGUAGE");
 | |
|   setenv ("LC_ALL", "existing-locale", 1);
 | |
|   setlocale (LC_ALL, "");
 | |
|   puts ("test `gettext' with LC_ALL set");
 | |
|   /* This is the name of the existing domain with a catalog for the
 | |
|      LC_MESSAGES category.  */
 | |
|   textdomain ("existing-domain");
 | |
|   if (positive_gettext_test () != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
|   /* This is the name of a non-existing domain with a catalog for the
 | |
|      LC_MESSAGES category.  We leave this value set for the `dgettext'
 | |
|      and `dcgettext' tests.  */
 | |
|   textdomain ("non-existing-domain");
 | |
|   puts ("test `gettext' with LC_ALL deciding");
 | |
|   if (negative_gettext_test () != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
|   puts ("test `dgettext' with LC_ALL deciding");
 | |
|   if (positive_dgettext_test ("existing-domain") != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
| 
 | |
|   /* Now the same tests with LC_MESSAGES deciding.  */
 | |
|   unsetenv ("LC_ALL");
 | |
|   setenv ("LC_MESSAGES", "existing-locale", 1);
 | |
|   setlocale (LC_MESSAGES, "");
 | |
|   setenv ("LC_TIME", "existing-locale", 1);
 | |
|   setlocale (LC_TIME, "");
 | |
|   setenv ("LC_NUMERIC", "non-existing-locale", 1);
 | |
|   setlocale (LC_NUMERIC, "");
 | |
|   puts ("test `gettext' with LC_ALL set");
 | |
|   /* This is the name of the existing domain with a catalog for the
 | |
|      LC_MESSAGES category.  */
 | |
|   textdomain ("existing-domain");
 | |
|   if (positive_gettext_test () != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
|   /* This is the name of a non-existing domain with a catalog for the
 | |
|      LC_MESSAGES category.  We leave this value set for the `dgettext'
 | |
|      and `dcgettext' tests.  */
 | |
|   textdomain ("non-existing-domain");
 | |
|   puts ("test `gettext' with LC_xxx deciding");
 | |
|   if (negative_gettext_test () != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
|   puts ("test `dgettext' with LC_xxx deciding");
 | |
|   if (positive_dgettext_test ("existing-domain") != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
|   puts ("test `dcgettext' with category == LC_MESSAGES");
 | |
|   if (positive_dcgettext_test ("existing-domain", LC_MESSAGES) != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
|   /* Try a different category.  For this we also switch the domain.  */
 | |
|   puts ("test `dcgettext' with LANGUAGE == LC_TIME");
 | |
|   if (positive_dcgettext_test ("existing-time-domain", LC_TIME) != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
|   /* This time use a category for which there is no catalog.  */
 | |
|   puts ("test `dcgettext' with LANGUAGE == LC_NUMERIC");
 | |
|   if (negative_dcgettext_test ("existing-domain", LC_NUMERIC) != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
| 
 | |
|   /* Now the same tests with LANG deciding.  */
 | |
|   unsetenv ("LC_MESSAGES");
 | |
|   setenv ("LANG", "existing-locale", 1);
 | |
|   setlocale (LC_ALL, "");
 | |
|   /* This is the name of the existing domain with a catalog for the
 | |
|      LC_MESSAGES category.  */
 | |
|   textdomain ("existing-domain");
 | |
|   puts ("test `gettext' with LANG set");
 | |
|   if (positive_gettext_test () != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
|   /* This is the name of a non-existing domain with a catalog for the
 | |
|      LC_MESSAGES category.  We leave this value set for the `dgettext'
 | |
|      and `dcgettext' tests.  */
 | |
|   textdomain ("non-existing-domain");
 | |
|   puts ("test `gettext' with LANG set");
 | |
|   if (negative_gettext_test () != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
|   puts ("test `dgettext' with LANG set");
 | |
|   if (positive_dgettext_test ("existing-domain") != 0)
 | |
|     {
 | |
|       puts ("FAILED");
 | |
|       result = 1;
 | |
|     }
 | |
| 
 | |
|   setlocale (LC_ALL, "C");
 | |
| 
 | |
|   return result;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int
 | |
| positive_gettext_test (void)
 | |
| {
 | |
|   size_t cnt;
 | |
|   int result = 0;
 | |
| 
 | |
|   for (cnt = 0; cnt < sizeof (msgs) / sizeof (msgs[0]); ++cnt)
 | |
|     {
 | |
|       const char *found = gettext (msgs[cnt].msgid);
 | |
| 
 | |
|       if (found == NULL || strcmp (found, msgs[cnt].msgstr) != 0)
 | |
| 	{
 | |
| 	  /* Oops, shouldn't happen.  */
 | |
| 	  printf ("\
 | |
|   gettext (\"%s\") failed, returned \"%s\", expected \"%s\"\n",
 | |
| 		  msgs[cnt].msgid, found, msgs[cnt].msgstr);
 | |
| 	  result = 1;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|   return result;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int
 | |
| negative_gettext_test (void)
 | |
| {
 | |
|   size_t cnt;
 | |
|   int result = 0;
 | |
| 
 | |
|   for (cnt = 0; cnt < sizeof (msgs) / sizeof (msgs[0]); ++cnt)
 | |
|     {
 | |
|       const char *found = gettext (msgs[cnt].msgid);
 | |
| 
 | |
|       if (found != msgs[cnt].msgid)
 | |
| 	{
 | |
| 	  /* Oops, shouldn't happen.  */
 | |
| 	  printf ("  gettext (\"%s\") failed\n", msgs[cnt].msgid);
 | |
| 	  result = 1;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|   return result;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int
 | |
| positive_dgettext_test (const char *domain)
 | |
| {
 | |
|   size_t cnt;
 | |
|   int result = 0;
 | |
| 
 | |
|   for (cnt = 0; cnt < sizeof (msgs) / sizeof (msgs[0]); ++cnt)
 | |
|     {
 | |
|       const char *found = dgettext (domain, msgs[cnt].msgid);
 | |
| 
 | |
|       if (found == NULL || strcmp (found, msgs[cnt].msgstr) != 0)
 | |
| 	{
 | |
| 	  /* Oops, shouldn't happen.  */
 | |
| 	  printf ("\
 | |
|   dgettext (\"%s\", \"%s\") failed, returned \"%s\", expected \"%s\"\n",
 | |
| 		  domain, msgs[cnt].msgid, found, msgs[cnt].msgstr);
 | |
| 	  result = 1;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|   return result;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int
 | |
| positive_dcgettext_test (const char *domain, int category)
 | |
| {
 | |
|   size_t cnt;
 | |
|   int result = 0;
 | |
| 
 | |
|   for (cnt = 0; cnt < sizeof (msgs) / sizeof (msgs[0]); ++cnt)
 | |
|     {
 | |
|       const char *found = dcgettext (domain, msgs[cnt].msgid, category);
 | |
| 
 | |
|       if (found == NULL || strcmp (found, msgs[cnt].msgstr) != 0)
 | |
| 	{
 | |
| 	  /* Oops, shouldn't happen.  */
 | |
| 	  printf ("\
 | |
|   dcgettext (\"%s\", \"%s\", %s) failed, returned \"%s\", expected \"%s\"\n",
 | |
| 		  domain, msgs[cnt].msgid, catname[category], found,
 | |
| 		  msgs[cnt].msgstr);
 | |
| 	  result = 1;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|   return result;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int
 | |
| negative_dcgettext_test (const char *domain, int category)
 | |
| {
 | |
|   size_t cnt;
 | |
|   int result = 0;
 | |
| 
 | |
|   for (cnt = 0; cnt < sizeof (msgs) / sizeof (msgs[0]); ++cnt)
 | |
|     {
 | |
|       const char *found = dcgettext (domain, msgs[cnt].msgid, category);
 | |
| 
 | |
|       if (found != msgs[cnt].msgid)
 | |
| 	{
 | |
| 	  /* Oops, shouldn't happen.  */
 | |
| 	  printf ("  dcgettext (\"%s\", \"%s\", %s) failed\n",
 | |
| 		  domain, msgs[cnt].msgid, catname[category]);
 | |
| 	  result = 1;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|   return result;
 | |
| }
 |