1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26: #include <stdio.h>
27: #include <stdlib.h>
28: #include <wctype.h>
29: #include <locale.h>
30: #include <sys/stat.h>
31: #include <unistd.h>
32: #include <errno.h>
33:
34: static const char *program_name = "dump-ctype";
35: static const char *locale;
36:
37: static const char *class_names[] =
38: {
39: "alnum", "alpha", "blank", "cntrl", "digit", "graph", "lower",
40: "print", "punct", "space", "upper", "xdigit"
41: };
42:
43: static const char *map_names[] =
44: {
45: "tolower", "toupper", "totitle"
46: };
47:
48: static void dump_class (const char *class_name)
49: {
50: wctype_t class;
51: FILE *f;
52: unsigned int ch;
53:
54: class = wctype (class_name);
55: if (class == (wctype_t) 0)
56: {
57: fprintf (stderr, "%s %s: noexistent class %s\n", program_name,
58: locale, class_name);
59: return;
60: }
61:
62: f = fopen (class_name, "w");
63: if (f == NULL)
64: {
65: fprintf (stderr, "%s %s: cannot open file %s/%s\n", program_name,
66: locale, locale, class_name);
67: exit (1);
68: }
69:
70: for (ch = 0; ch < 0x10000; ch++)
71: if (iswctype (ch, class))
72: fprintf (f, "0x%04X\n", ch);
73:
74: if (ferror (f) || fclose (f))
75: {
76: fprintf (stderr, "%s %s: I/O error on file %s/%s\n", program_name,
77: locale, locale, class_name);
78: exit (1);
79: }
80: }
81:
82: static void dump_map (const char *map_name)
83: {
84: wctrans_t map;
85: FILE *f;
86: unsigned int ch;
87:
88: map = wctrans (map_name);
89: if (map == (wctrans_t) 0)
90: {
91: fprintf (stderr, "%s %s: noexistent map %s\n", program_name,
92: locale, map_name);
93: return;
94: }
95:
96: f = fopen (map_name, "w");
97: if (f == NULL)
98: {
99: fprintf (stderr, "%s %s: cannot open file %s/%s\n", program_name,
100: locale, locale, map_name);
101: exit (1);
102: }
103:
104: for (ch = 0; ch < 0x10000; ch++)
105: if (towctrans (ch, map) != ch)
106: fprintf (f, "0x%04X\t0x%04X\n", ch, towctrans (ch, map));
107:
108: if (ferror (f) || fclose (f))
109: {
110: fprintf (stderr, "%s %s: I/O error on file %s/%s\n", program_name,
111: locale, locale, map_name);
112: exit (1);
113: }
114: }
115:
116: int
117: main (int argc, char *argv[])
118: {
119: size_t i;
120:
121: if (argc != 2)
122: {
123: fprintf (stderr, "Usage: dump-ctype locale\n");
124: exit (1);
125: }
126: locale = argv[1];
127:
128: if (setlocale (LC_ALL, locale) == NULL)
129: {
130: fprintf (stderr, "%s: setlocale cannot switch to locale %s\n",
131: program_name, locale);
132: exit (1);
133: }
134:
135: if (mkdir (locale, 0777) < 0)
136: {
137: char buf[100];
138: int save_errno = errno;
139:
140: sprintf (buf, "%s: cannot create directory %s", program_name, locale);
141: errno = save_errno;
142: perror (buf);
143: exit (1);
144: }
145:
146: if (chdir (locale) < 0)
147: {
148: char buf[100];
149: int save_errno = errno;
150:
151: sprintf (buf, "%s: cannot chdir to %s", program_name, locale);
152: errno = save_errno;
153: perror (buf);
154: exit (1);
155: }
156:
157: for (i = 0; i < sizeof (class_names) / sizeof (class_names[0]); i++)
158: dump_class (class_names[i]);
159:
160: for (i = 0; i < sizeof (map_names) / sizeof (map_names[0]); i++)
161: dump_map (map_names[i]);
162:
163: return 0;
164: }