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