Annotation of src/usr.bin/locale/locale.c, Revision 1.4
1.4 ! jca 1: /* $OpenBSD: locale.c,v 1.3 2013/06/16 15:09:03 jca 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: { 0, NULL},
36: };
37:
38: void
39: show_current_locale()
40: {
1.3 jca 41: char *lang, *lc_all;
1.1 stsp 42: int i;
43:
1.3 jca 44: lang = getenv("LANG");
45: lc_all = getenv("LC_ALL");
46:
1.1 stsp 47: printf("LANG=%s\n", lang ? lang : "");
1.3 jca 48: for (i = 0; categories[i].name != NULL; i++) {
49: if (lc_all == NULL && getenv(categories[i].name))
50: printf("%s=%s\n", categories[i].name,
51: getenv(categories[i].name));
52: else
53: printf("%s=\"%s\"\n", categories[i].name,
54: setlocale(categories[i].category, NULL));
55: }
56: printf("LC_ALL=%s\n", lc_all ? lc_all : "");
1.1 stsp 57: }
58:
59: const char * const some_locales[] = {
60: "C",
61: "C.UTF-8",
62: "POSIX",
63: "POSIX.UTF-8",
1.4 ! jca 64: "Pig.ISO8859-1",
! 65: "Pig.UTF-8",
1.1 stsp 66: "ar_SD.UTF-8",
67: "ar_SY.UTF-8",
68: "bg_BG.CP1251",
69: "ca_ES.ISO8859-1",
70: "ca_ES.ISO8859-15",
71: "ca_ES.UTF-8",
72: "cs_CZ.ISO8859-2",
73: "cs_CZ.UTF-8",
74: "da_DK.ISO8859-1",
75: "da_DK.ISO8859-15",
76: "da_DK.UTF-8",
77: "de_AT.ISO8859-1",
78: "de_AT.ISO8859-15",
79: "de_AT.UTF-8",
80: "de_CH.ISO8859-1",
81: "de_CH.ISO8859-15",
82: "de_CH.UTF-8",
83: "de_DE.ISO8859-1",
84: "de_DE.ISO8859-15",
85: "de_DE.UTF-8",
86: "el_GR.ISO8859-7",
87: "el_GR.UTF-8",
88: "en_AU.ISO8859-1",
89: "en_AU.ISO8859-15",
90: "en_AU.UTF-8",
91: "en_CA.ISO8859-1",
92: "en_CA.ISO8859-15",
93: "en_CA.UTF-8",
94: "en_GB.ISO8859-1",
95: "en_GB.ISO8859-15",
96: "en_GB.UTF-8",
97: "en_US.ISO8859-1",
98: "en_US.ISO8859-15",
99: "en_US.UTF-8",
100: "es_AR.ISO8859-1",
101: "es_AR.ISO8859-15",
102: "es_AR.UTF-8",
103: "es_BO.ISO8859-1",
104: "es_BO.ISO8859-15",
105: "es_BO.UTF-8",
106: "es_CH.ISO8859-1",
107: "es_CH.ISO8859-15",
108: "es_CH.UTF-8",
109: "es_CO.ISO8859-1",
110: "es_CO.ISO8859-15",
111: "es_CO.UTF-8",
112: "es_CR.ISO8859-1",
113: "es_CR.ISO8859-15",
114: "es_CR.UTF-8",
115: "es_CU.ISO8859-1",
116: "es_CU.ISO8859-15",
117: "es_CU.UTF-8",
118: "es_DO.ISO8859-1",
119: "es_DO.ISO8859-15",
120: "es_DO.UTF-8",
121: "es_EC.ISO8859-1",
122: "es_EC.ISO8859-15",
123: "es_EC.UTF-8",
124: "es_ES.ISO8859-1",
125: "es_ES.ISO8859-15",
126: "es_ES.UTF-8",
127: "es_GQ.ISO8859-1",
128: "es_GQ.ISO8859-15",
129: "es_GQ.UTF-8",
130: "es_GT.ISO8859-1",
131: "es_GT.ISO8859-15",
132: "es_GT.UTF-8",
133: "es_HN.ISO8859-1",
134: "es_HN.ISO8859-15",
135: "es_HN.UTF-8",
136: "es_MX.ISO8859-1",
137: "es_MX.ISO8859-15",
138: "es_MX.UTF-8",
139: "es_NI.ISO8859-1",
140: "es_NI.ISO8859-15",
141: "es_NI.UTF-8",
142: "es_PA.ISO8859-1",
143: "es_PA.ISO8859-15",
144: "es_PA.UTF-8",
145: "es_PE.ISO8859-1",
146: "es_PE.ISO8859-15",
147: "es_PE.UTF-8",
148: "es_PR.ISO8859-1",
149: "es_PR.ISO8859-15",
150: "es_PR.UTF-8",
151: "es_PY.ISO8859-1",
152: "es_PY.ISO8859-15",
153: "es_PY.UTF-8",
154: "es_SV.ISO8859-1",
155: "es_SV.ISO8859-15",
156: "es_SV.UTF-8",
157: "es_US.ISO8859-1",
158: "es_US.ISO8859-15",
159: "es_US.UTF-8",
160: "es_UY.ISO8859-1",
161: "es_UY.ISO8859-15",
162: "es_UY.UTF-8",
163: "es_VE.ISO8859-1",
164: "es_VE.ISO8859-15",
165: "es_VE.UTF-8",
166: "fa_IR.UTF-8",
167: "fi_FI.ISO8859-1",
168: "fi_FI.ISO8859-15",
169: "fi_FI.UTF-8",
170: "fr_BE.ISO8859-1",
171: "fr_BE.ISO8859-15",
172: "fr_BE.UTF-8",
173: "fr_CA.ISO8859-1",
174: "fr_CA.ISO8859-15",
175: "fr_CA.UTF-8",
176: "fr_CH.ISO8859-1",
177: "fr_CH.ISO8859-15",
178: "fr_CH.UTF-8",
179: "fr_FR.ISO8859-1",
180: "fr_FR.ISO8859-15",
181: "fr_FR.UTF-8",
182: "hr_HR.ISO8859-2",
183: "hu_HU.ISO8859-2",
184: "hu_HU.UTF-8",
185: "hy_AM.ARMSCII-8",
186: "hy_AM.UTF-8",
187: "is_IS.ISO8859-1",
188: "is_IS.ISO8859-15",
189: "is_IS.UTF-8",
190: "it_CH.ISO8859-1",
191: "it_CH.ISO8859-15",
192: "it_CH.UTF-8",
193: "it_IT.ISO8859-1",
194: "it_IT.ISO8859-15",
195: "it_IT.UTF-8",
196: "ja_JP.UTF-8",
197: "ko_KR.UTF-8",
198: "lt_LT.ISO8859-13",
199: "lt_LT.ISO8859-4",
200: "lt_LT.UTF-8",
201: "nl_BE.ISO8859-1",
202: "nl_BE.ISO8859-15",
203: "nl_BE.UTF-8",
204: "nl_NL.ISO8859-1",
205: "nl_NL.ISO8859-15",
206: "nl_NL.UTF-8",
207: "no_NO.ISO8859-1",
208: "no_NO.ISO8859-15",
209: "no_NO.UTF-8",
210: "pl_PL.ISO8859-2",
211: "pl_PL.UTF-8",
212: "pt_PT.ISO8859-1",
213: "pt_PT.ISO8859-15",
214: "pt_PT.UTF-8",
215: "ro_RO.UTF-8",
216: "ru_RU.CP866",
217: "ru_RU.ISO8859-5",
218: "ru_RU.KOI8-R",
219: "ru_RU.UTF-8",
220: "sk_SK.ISO8859-2",
221: "sk_SK.UTF-8",
222: "sl_SI.ISO8859-2",
223: "sl_SI.UTF-8",
224: "sv_SE.ISO8859-1",
225: "sv_SE.ISO8859-15",
226: "sv_SE.UTF-8",
227: "uk_UA.KOI8-U",
228: "uk_UA.UTF-8",
229: "zh_CN.UTF-8",
230: "zh_TW.UTF-8",
231: NULL
232: };
233:
234: void
235: show_locales(void)
236: {
237: int i = 0;
238:
239: while (some_locales[i])
240: puts(some_locales[i++]);
241: }
242:
243: void
244: show_charsets(void)
245: {
246: char *charset;
247: char charsets[sizeof(LOCALE_CHARSETS)];
248: char *s = charsets;
249:
250: bcopy(LOCALE_CHARSETS, charsets, sizeof(charsets));
251: do {
252: charset = strsep(&s, " \t");
253: if (charset && charset[0])
254: printf("%s\n", charset);
255: } while (charset);
256: }
257:
258: void
259: usage(void)
260: {
261: fprintf(stderr, "usage: %s [-a | -m]\n", __progname);
262: exit(1);
263: }
264:
265: int
266: main(int argc, char *argv[])
267: {
268: int opt, aflag = 0, mflag = 0;
269:
270: setlocale(LC_ALL, "");
271:
272: if (argc == 1) {
273: show_current_locale();
274: return 0;
275: }
276:
277: while ((opt = getopt(argc, argv, "am")) != -1) {
278: switch (opt) {
279: case 'a':
280: aflag = 1;
281: break;
282: case 'm':
283: mflag = 1;
284: break;
285: default:
286: usage();
287: }
288: }
289: argc -= optind;
290: argv += optind;
291:
292: if (argc != 0 || (aflag && mflag))
293: usage();
294: else if (aflag)
295: show_locales();
296: else if (mflag)
297: show_charsets();
298:
299: return 0;
300: }