1d81ac5339fcf9537a3731ebb5770238f4fa69d59Sebastian Wilhelmi#undef G_DISABLE_ASSERT
2d81ac5339fcf9537a3731ebb5770238f4fa69d59Sebastian Wilhelmi#undef G_LOG_DOMAIN
3d81ac5339fcf9537a3731ebb5770238f4fa69d59Sebastian Wilhelmi
44f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor#include <locale.h>
54f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor#include <stdlib.h>
64f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor#include <stdio.h>
74f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor#include <glib.h>
84f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor#include <string.h>
94f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
104f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylorint main (int argc, char **argv)
114f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor{
124f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  FILE *infile;
134f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  char buffer[1024];
144f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  char **strings;
154f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  char *srcdir = getenv ("srcdir");
164f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  char *filename;
174f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  const char *locale;
184f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  const char *test;
19994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen  const char *expected;
204f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  char *convert;
214f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  char *current_locale = setlocale (LC_CTYPE, NULL);
224f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  gint result = 0;
234f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
244f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  if (!srcdir)
254f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor    srcdir = ".";
264f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "casemap.txt", NULL);
274f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
284f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  infile = fopen (filename, "r");
294f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  if (!infile)
304f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor    {
314f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      fprintf (stderr, "Failed to open %s\n", filename );
324f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      exit (1);
334f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor    }
344f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
354f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  while (fgets (buffer, sizeof(buffer), infile))
364f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor    {
374f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      if (buffer[0] == '#')
384f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	continue;
394f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
404f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      strings = g_strsplit (buffer, "\t", -1);
414f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
424f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      locale = strings[0];
434f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
444f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      if (!locale[0])
454f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	locale = "C";
464f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
474f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      if (strcmp (locale, current_locale) != 0)
484f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	{
494f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	  setlocale (LC_CTYPE, locale);
504f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	  current_locale = setlocale (LC_CTYPE, NULL);
514f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
524f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	  if (strncmp (current_locale, locale, 2) != 0)
534f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	    {
544f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	      fprintf (stderr, "Cannot set locale to %s, skipping\n", locale);
554f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	      goto next;
564f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	    }
574f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	}
584f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
594f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      test = strings[1];
604f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
61994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen      /* gen-casemap-txt.pl uses an empty string when a single character
62994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen       * doesn't have an equivalent in a particular case; since that behavior
63994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen       * is nonsense for multicharacter strings, it would make more sense
64994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen       * to put the expected result .. the original character unchanged. But
65994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen       * for now, we just work around it here and take the empty string to mean
66994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen       * "same as original"
67994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen       */
68994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen
69f1f680b68c946a2d2f6af3c942ce1b4c034f1702Owen Taylor      convert = g_utf8_strup (test, -1);
70994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen      expected = strings[4][0] ? strings[4] : test;
71994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen      if (strcmp (convert, expected) != 0)
724f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	{
734f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	  fprintf (stderr, "Failure: toupper(%s) == %s, should have been %s\n",
74994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen		   test, convert, expected);
754f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	  result = 1;
764f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	}
774f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      g_free (convert);
784f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
79f1f680b68c946a2d2f6af3c942ce1b4c034f1702Owen Taylor      convert = g_utf8_strdown (test, -1);
80994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen      expected = strings[2][0] ? strings[2] : test;
81994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen      if (strcmp (convert, expected) != 0)
824f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	{
834f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	  fprintf (stderr, "Failure: tolower(%s) == %s, should have been %s\n",
84994d642cde899e1aaba90a2e01aef68cc719d784Matthias Clasen		   test, convert, expected);
854f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	  result = 1;
864f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	}
874f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      g_free (convert);
884f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
894f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor    next:
904f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      g_strfreev (strings);
914f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor    }
924f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
934f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  fclose (infile);
944f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
954f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  g_free (filename);
964f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "casefold.txt", NULL);
974f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
984f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  infile = fopen (filename, "r");
994f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  if (!infile)
1004f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor    {
1014f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      fprintf (stderr, "Failed to open %s\n", filename );
102a629b3f02dcdf29f52973f879f953e2ce409ab7aKjartan Maraas      g_free (filename);
1034f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      exit (1);
1044f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor    }
1054f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
1064f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  while (fgets (buffer, sizeof(buffer), infile))
1074f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor    {
1084f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      if (buffer[0] == '#')
1094f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	continue;
1104f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
1114f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      buffer[strlen(buffer) - 1] = '\0';
1124f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      strings = g_strsplit (buffer, "\t", -1);
1134f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
1144f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      test = strings[0];
1154f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
116f1f680b68c946a2d2f6af3c942ce1b4c034f1702Owen Taylor      convert = g_utf8_casefold (test, -1);
1174f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      if (strcmp (convert, strings[1]) != 0)
1184f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	{
1194f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	  fprintf (stderr, "Failure: casefold(%s) == '%s', should have been '%s'\n",
1204f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor		   test, convert, strings[1]);
1214f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	  result = 1;
1224f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor	}
1234f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      g_free (convert);
1244f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
1254f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor      g_strfreev (strings);
1264f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor    }
1274f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
1284f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  fclose (infile);
129a629b3f02dcdf29f52973f879f953e2ce409ab7aKjartan Maraas  g_free (filename);
1304f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor
1314f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor  return result;
1324f96a13cba0fc1d445c76d30a7cb90b2971de06aOwen Taylor}
133