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