Annotation of src/usr.bin/locale/locale.c, Revision 1.5
1.5 ! guenther 1: /* $OpenBSD: locale.c,v 1.4 2013/06/16 18:09:47 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
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",
254: "uk_UA.KOI8-U",
255: "uk_UA.UTF-8",
256: "zh_CN.UTF-8",
257: "zh_TW.UTF-8",
258: NULL
259: };
260:
261: void
262: show_locales(void)
263: {
264: int i = 0;
265:
266: while (some_locales[i])
267: puts(some_locales[i++]);
268: }
269:
270: void
271: show_charsets(void)
272: {
273: char *charset;
274: char charsets[sizeof(LOCALE_CHARSETS)];
275: char *s = charsets;
276:
277: bcopy(LOCALE_CHARSETS, charsets, sizeof(charsets));
278: do {
279: charset = strsep(&s, " \t");
280: if (charset && charset[0])
281: printf("%s\n", charset);
282: } while (charset);
283: }
284:
285: void
286: usage(void)
287: {
288: fprintf(stderr, "usage: %s [-a | -m]\n", __progname);
289: exit(1);
290: }
291:
292: int
293: main(int argc, char *argv[])
294: {
295: int opt, aflag = 0, mflag = 0;
296:
297: setlocale(LC_ALL, "");
298:
299: if (argc == 1) {
300: show_current_locale();
301: return 0;
302: }
303:
304: while ((opt = getopt(argc, argv, "am")) != -1) {
305: switch (opt) {
306: case 'a':
307: aflag = 1;
308: break;
309: case 'm':
310: mflag = 1;
311: break;
312: default:
313: usage();
314: }
315: }
316: argc -= optind;
317: argv += optind;
318:
319: if (argc != 0 || (aflag && mflag))
320: usage();
321: else if (aflag)
322: show_locales();
323: else if (mflag)
324: show_charsets();
325:
326: return 0;
327: }