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