Annotation of src/usr.bin/locale/locale.c, Revision 1.2
1.2 ! stsp 1: /* $OpenBSD: locale.c,v 1.1 2013/06/03 14:27:50 stsp Exp $ */
1.1 stsp 2: /*
3: * Copyright (c) 2013 Stefan Sperling <stsp@openbsd.org>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
8: *
9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16: */
17:
18: #include <stdio.h>
19: #include <stdlib.h>
20: #include <string.h>
21: #include <locale.h>
22:
23: extern char *__progname;
24:
25: struct category_name {
26: int category;
27: const char *name;
28: } categories[] = {
29: { LC_COLLATE, "LC_COLLATE" },
30: { LC_CTYPE, "LC_CTYPE" },
31: { LC_MONETARY, "LC_MONETARY" },
32: { LC_NUMERIC, "LC_NUMERIC" },
33: { LC_TIME, "LC_TIME" },
34: { LC_MESSAGES, "LC_MESSAGES" },
35: { LC_ALL, "LC_ALL" },
36: { 0, NULL},
37: };
38:
39: void
40: show_current_locale()
41: {
42: char *lang = getenv("LANG");
43: int i;
44:
45: printf("LANG=%s\n", lang ? lang : "");
46: for (i = 0; categories[i].name != NULL; i++)
47: printf("%s=%s\n", categories[i].name,
48: setlocale(categories[i].category, NULL));
49: }
50:
51: const char * const some_locales[] = {
52: "C",
53: "C.UTF-8",
54: "POSIX",
55: "POSIX.UTF-8",
1.2 ! stsp 56: "Pig.ISO8859-1",
! 57: "Pig.UTF-8",
1.1 stsp 58: "ar_SD.UTF-8",
59: "ar_SY.UTF-8",
60: "bg_BG.CP1251",
61: "ca_ES.ISO8859-1",
62: "ca_ES.ISO8859-15",
63: "ca_ES.UTF-8",
64: "cs_CZ.ISO8859-2",
65: "cs_CZ.UTF-8",
66: "da_DK.ISO8859-1",
67: "da_DK.ISO8859-15",
68: "da_DK.UTF-8",
69: "de_AT.ISO8859-1",
70: "de_AT.ISO8859-15",
71: "de_AT.UTF-8",
72: "de_CH.ISO8859-1",
73: "de_CH.ISO8859-15",
74: "de_CH.UTF-8",
75: "de_DE.ISO8859-1",
76: "de_DE.ISO8859-15",
77: "de_DE.UTF-8",
78: "el_GR.ISO8859-7",
79: "el_GR.UTF-8",
80: "en_AU.ISO8859-1",
81: "en_AU.ISO8859-15",
82: "en_AU.UTF-8",
83: "en_CA.ISO8859-1",
84: "en_CA.ISO8859-15",
85: "en_CA.UTF-8",
86: "en_GB.ISO8859-1",
87: "en_GB.ISO8859-15",
88: "en_GB.UTF-8",
89: "en_US.ISO8859-1",
90: "en_US.ISO8859-15",
91: "en_US.UTF-8",
92: "es_AR.ISO8859-1",
93: "es_AR.ISO8859-15",
94: "es_AR.UTF-8",
95: "es_BO.ISO8859-1",
96: "es_BO.ISO8859-15",
97: "es_BO.UTF-8",
98: "es_CH.ISO8859-1",
99: "es_CH.ISO8859-15",
100: "es_CH.UTF-8",
101: "es_CO.ISO8859-1",
102: "es_CO.ISO8859-15",
103: "es_CO.UTF-8",
104: "es_CR.ISO8859-1",
105: "es_CR.ISO8859-15",
106: "es_CR.UTF-8",
107: "es_CU.ISO8859-1",
108: "es_CU.ISO8859-15",
109: "es_CU.UTF-8",
110: "es_DO.ISO8859-1",
111: "es_DO.ISO8859-15",
112: "es_DO.UTF-8",
113: "es_EC.ISO8859-1",
114: "es_EC.ISO8859-15",
115: "es_EC.UTF-8",
116: "es_ES.ISO8859-1",
117: "es_ES.ISO8859-15",
118: "es_ES.UTF-8",
119: "es_GQ.ISO8859-1",
120: "es_GQ.ISO8859-15",
121: "es_GQ.UTF-8",
122: "es_GT.ISO8859-1",
123: "es_GT.ISO8859-15",
124: "es_GT.UTF-8",
125: "es_HN.ISO8859-1",
126: "es_HN.ISO8859-15",
127: "es_HN.UTF-8",
128: "es_MX.ISO8859-1",
129: "es_MX.ISO8859-15",
130: "es_MX.UTF-8",
131: "es_NI.ISO8859-1",
132: "es_NI.ISO8859-15",
133: "es_NI.UTF-8",
134: "es_PA.ISO8859-1",
135: "es_PA.ISO8859-15",
136: "es_PA.UTF-8",
137: "es_PE.ISO8859-1",
138: "es_PE.ISO8859-15",
139: "es_PE.UTF-8",
140: "es_PR.ISO8859-1",
141: "es_PR.ISO8859-15",
142: "es_PR.UTF-8",
143: "es_PY.ISO8859-1",
144: "es_PY.ISO8859-15",
145: "es_PY.UTF-8",
146: "es_SV.ISO8859-1",
147: "es_SV.ISO8859-15",
148: "es_SV.UTF-8",
149: "es_US.ISO8859-1",
150: "es_US.ISO8859-15",
151: "es_US.UTF-8",
152: "es_UY.ISO8859-1",
153: "es_UY.ISO8859-15",
154: "es_UY.UTF-8",
155: "es_VE.ISO8859-1",
156: "es_VE.ISO8859-15",
157: "es_VE.UTF-8",
158: "fa_IR.UTF-8",
159: "fi_FI.ISO8859-1",
160: "fi_FI.ISO8859-15",
161: "fi_FI.UTF-8",
162: "fr_BE.ISO8859-1",
163: "fr_BE.ISO8859-15",
164: "fr_BE.UTF-8",
165: "fr_CA.ISO8859-1",
166: "fr_CA.ISO8859-15",
167: "fr_CA.UTF-8",
168: "fr_CH.ISO8859-1",
169: "fr_CH.ISO8859-15",
170: "fr_CH.UTF-8",
171: "fr_FR.ISO8859-1",
172: "fr_FR.ISO8859-15",
173: "fr_FR.UTF-8",
174: "hr_HR.ISO8859-2",
175: "hu_HU.ISO8859-2",
176: "hu_HU.UTF-8",
177: "hy_AM.ARMSCII-8",
178: "hy_AM.UTF-8",
179: "is_IS.ISO8859-1",
180: "is_IS.ISO8859-15",
181: "is_IS.UTF-8",
182: "it_CH.ISO8859-1",
183: "it_CH.ISO8859-15",
184: "it_CH.UTF-8",
185: "it_IT.ISO8859-1",
186: "it_IT.ISO8859-15",
187: "it_IT.UTF-8",
188: "ja_JP.UTF-8",
189: "ko_KR.UTF-8",
190: "lt_LT.ISO8859-13",
191: "lt_LT.ISO8859-4",
192: "lt_LT.UTF-8",
193: "nl_BE.ISO8859-1",
194: "nl_BE.ISO8859-15",
195: "nl_BE.UTF-8",
196: "nl_NL.ISO8859-1",
197: "nl_NL.ISO8859-15",
198: "nl_NL.UTF-8",
199: "no_NO.ISO8859-1",
200: "no_NO.ISO8859-15",
201: "no_NO.UTF-8",
202: "pl_PL.ISO8859-2",
203: "pl_PL.UTF-8",
204: "pt_PT.ISO8859-1",
205: "pt_PT.ISO8859-15",
206: "pt_PT.UTF-8",
207: "ro_RO.UTF-8",
208: "ru_RU.CP866",
209: "ru_RU.ISO8859-5",
210: "ru_RU.KOI8-R",
211: "ru_RU.UTF-8",
212: "sk_SK.ISO8859-2",
213: "sk_SK.UTF-8",
214: "sl_SI.ISO8859-2",
215: "sl_SI.UTF-8",
216: "sv_SE.ISO8859-1",
217: "sv_SE.ISO8859-15",
218: "sv_SE.UTF-8",
219: "uk_UA.KOI8-U",
220: "uk_UA.UTF-8",
221: "zh_CN.UTF-8",
222: "zh_TW.UTF-8",
223: NULL
224: };
225:
226: void
227: show_locales(void)
228: {
229: int i = 0;
230:
231: while (some_locales[i])
232: puts(some_locales[i++]);
233: }
234:
235: void
236: show_charsets(void)
237: {
238: char *charset;
239: char charsets[sizeof(LOCALE_CHARSETS)];
240: char *s = charsets;
241:
242: bcopy(LOCALE_CHARSETS, charsets, sizeof(charsets));
243: do {
244: charset = strsep(&s, " \t");
245: if (charset && charset[0])
246: printf("%s\n", charset);
247: } while (charset);
248: }
249:
250: void
251: usage(void)
252: {
253: fprintf(stderr, "usage: %s [-a | -m]\n", __progname);
254: exit(1);
255: }
256:
257: int
258: main(int argc, char *argv[])
259: {
260: int opt, aflag = 0, mflag = 0;
261:
262: setlocale(LC_ALL, "");
263:
264: if (argc == 1) {
265: show_current_locale();
266: return 0;
267: }
268:
269: while ((opt = getopt(argc, argv, "am")) != -1) {
270: switch (opt) {
271: case 'a':
272: aflag = 1;
273: break;
274: case 'm':
275: mflag = 1;
276: break;
277: default:
278: usage();
279: }
280: }
281: argc -= optind;
282: argv += optind;
283:
284: if (argc != 0 || (aflag && mflag))
285: usage();
286: else if (aflag)
287: show_locales();
288: else if (mflag)
289: show_charsets();
290:
291: return 0;
292: }