[BACK]Return to locale.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / locale

Annotation of src/usr.bin/locale/locale.c, Revision 1.13

1.13    ! schwarze    1: /*     $OpenBSD: locale.c,v 1.12 2016/02/05 12:59:12 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:
1.12      jca        18: #include <err.h>
1.13    ! schwarze   19: #include <langinfo.h>
1.12      jca        20: #include <locale.h>
1.1       stsp       21: #include <stdio.h>
                     22: #include <stdlib.h>
                     23: #include <string.h>
1.8       millert    24: #include <unistd.h>
1.1       stsp       25:
                     26: extern char            *__progname;
                     27:
                     28: struct category_name {
                     29:        int category;
                     30:        const char *name;
                     31: } categories[] = {
                     32:        { LC_COLLATE,   "LC_COLLATE" },
                     33:        { LC_CTYPE,     "LC_CTYPE" },
                     34:        { LC_MONETARY,  "LC_MONETARY" },
                     35:        { LC_NUMERIC,   "LC_NUMERIC" },
                     36:        { LC_TIME,      "LC_TIME" },
                     37:        { LC_MESSAGES,  "LC_MESSAGES" },
                     38:        { 0,            NULL},
                     39: };
                     40:
1.7       deraadt    41: static void
1.5       guenther   42: put_assignment(const char *name, const char *value, int double_quoted)
                     43: {
                     44:        char c;
                     45:
                     46:        fputs(name, stdout);
                     47:        putchar('=');
                     48:        if (double_quoted)
                     49:                putchar('"');
                     50:        if (value != NULL)
                     51:                while ((c = *value++) != '\0')
                     52:                        switch (c) {
                     53:                        case ' ': case '\t': case '\n': case '\'':
                     54:                        case '(': case ')': case '<': case '>':
                     55:                        case '&': case ';': case '|': case '~':
                     56:                                if (!double_quoted)
                     57:                        case '"': case '\\': case '$': case '`':
                     58:                                        putchar('\\');
                     59:                        default:
                     60:                                putchar(c);
                     61:                                break;
                     62:                        }
                     63:        if (double_quoted)
                     64:                putchar('"');
                     65:        putchar('\n');
                     66: }
                     67:
1.7       deraadt    68: static void
                     69: show_current_locale(void)
1.1       stsp       70: {
1.3       jca        71:        char *lang, *lc_all;
1.1       stsp       72:        int i;
                     73:
1.3       jca        74:        lang = getenv("LANG");
                     75:        lc_all = getenv("LC_ALL");
                     76:
1.5       guenther   77:        put_assignment("LANG", lang, 0);
1.3       jca        78:        for (i = 0; categories[i].name != NULL; i++) {
                     79:                if (lc_all == NULL && getenv(categories[i].name))
1.5       guenther   80:                        put_assignment(categories[i].name,
                     81:                            getenv(categories[i].name), 0);
1.3       jca        82:                else
1.5       guenther   83:                        put_assignment(categories[i].name,
                     84:                            setlocale(categories[i].category, NULL), 1);
1.3       jca        85:        }
1.5       guenther   86:        put_assignment("LC_ALL", lc_all, 0);
1.1       stsp       87: }
                     88:
                     89: const char * const some_locales[] = {
                     90:        "C",
                     91:        "C.UTF-8",
                     92:        "POSIX",
                     93:        "POSIX.UTF-8",
1.4       jca        94:        "Pig.UTF-8",
1.1       stsp       95:        "ar_SD.UTF-8",
                     96:        "ar_SY.UTF-8",
                     97:        "ca_ES.UTF-8",
                     98:        "cs_CZ.UTF-8",
                     99:        "da_DK.UTF-8",
                    100:        "de_AT.UTF-8",
                    101:        "de_CH.UTF-8",
                    102:        "de_DE.UTF-8",
                    103:        "el_GR.UTF-8",
                    104:        "en_AU.UTF-8",
                    105:        "en_CA.UTF-8",
                    106:        "en_GB.UTF-8",
                    107:        "en_US.UTF-8",
                    108:        "es_AR.UTF-8",
                    109:        "es_BO.UTF-8",
                    110:        "es_CH.UTF-8",
                    111:        "es_CO.UTF-8",
                    112:        "es_CR.UTF-8",
                    113:        "es_CU.UTF-8",
                    114:        "es_DO.UTF-8",
                    115:        "es_EC.UTF-8",
                    116:        "es_ES.UTF-8",
                    117:        "es_GQ.UTF-8",
                    118:        "es_GT.UTF-8",
                    119:        "es_HN.UTF-8",
                    120:        "es_MX.UTF-8",
                    121:        "es_NI.UTF-8",
                    122:        "es_PA.UTF-8",
                    123:        "es_PE.UTF-8",
                    124:        "es_PR.UTF-8",
                    125:        "es_PY.UTF-8",
                    126:        "es_SV.UTF-8",
                    127:        "es_US.UTF-8",
                    128:        "es_UY.UTF-8",
                    129:        "es_VE.UTF-8",
                    130:        "fa_IR.UTF-8",
                    131:        "fi_FI.UTF-8",
                    132:        "fr_BE.UTF-8",
                    133:        "fr_CA.UTF-8",
                    134:        "fr_CH.UTF-8",
                    135:        "fr_FR.UTF-8",
                    136:        "hu_HU.UTF-8",
                    137:        "hy_AM.UTF-8",
                    138:        "is_IS.UTF-8",
                    139:        "it_CH.UTF-8",
                    140:        "it_IT.UTF-8",
                    141:        "ja_JP.UTF-8",
                    142:        "ko_KR.UTF-8",
                    143:        "lt_LT.UTF-8",
                    144:        "nl_BE.UTF-8",
                    145:        "nl_NL.UTF-8",
                    146:        "no_NO.UTF-8",
                    147:        "pl_PL.UTF-8",
                    148:        "pt_PT.UTF-8",
                    149:        "ro_RO.UTF-8",
                    150:        "ru_RU.UTF-8",
                    151:        "sk_SK.UTF-8",
                    152:        "sl_SI.UTF-8",
                    153:        "sv_SE.UTF-8",
1.6       fgsch     154:        "tr_TR.UTF-8",
1.1       stsp      155:        "uk_UA.UTF-8",
                    156:        "zh_CN.UTF-8",
                    157:        "zh_TW.UTF-8",
                    158:        NULL
                    159: };
                    160:
1.7       deraadt   161: static void
1.1       stsp      162: show_locales(void)
                    163: {
                    164:        int i = 0;
                    165:
                    166:        while (some_locales[i])
                    167:                puts(some_locales[i++]);
                    168: }
                    169:
1.7       deraadt   170: static void
1.1       stsp      171: usage(void)
                    172: {
1.13    ! schwarze  173:        fprintf(stderr, "usage: %s [-a | -m | charmap]\n", __progname);
1.1       stsp      174:        exit(1);
                    175: }
                    176:
                    177: int
                    178: main(int argc, char *argv[])
                    179: {
                    180:        int opt, aflag = 0, mflag = 0;
                    181:
                    182:        setlocale(LC_ALL, "");
1.10      deraadt   183:
1.11      jca       184:        if (pledge("stdio", NULL) == -1)
1.10      deraadt   185:                err(1, "pledge");
1.1       stsp      186:
                    187:        if (argc == 1) {
                    188:                show_current_locale();
                    189:                return 0;
                    190:        }
                    191:
                    192:        while ((opt = getopt(argc, argv, "am")) != -1) {
                    193:                switch (opt) {
                    194:                case 'a':
                    195:                        aflag = 1;
                    196:                        break;
                    197:                case 'm':
                    198:                        mflag = 1;
                    199:                        break;
                    200:                default:
                    201:                        usage();
                    202:                }
                    203:        }
                    204:        argc -= optind;
                    205:        argv += optind;
                    206:
1.13    ! schwarze  207:        if (aflag + mflag + argc > 1)
1.1       stsp      208:                usage();
                    209:        else if (aflag)
                    210:                show_locales();
                    211:        else if (mflag)
1.9       stsp      212:                printf("UTF-8\n");
1.13    ! schwarze  213:        else if (strcmp(*argv, "charmap") == 0)
        !           214:                printf("%s\n", nl_langinfo(CODESET));
        !           215:        else
        !           216:                usage();
1.1       stsp      217:
                    218:        return 0;
                    219: }