diff options
author | Roland McGrath <roland@gnu.org> | 1996-03-28 08:30:38 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 1996-03-28 08:30:38 +0000 |
commit | 19bc17a90548ee427035994bbc4b14395723ff1f (patch) | |
tree | e7a17eda196c2610ca4be26c9e7985815162eafb /locale/locale.c | |
parent | 53f770e0f9d405ea8d1888254c6f7ce431b04c6e (diff) | |
download | glibc-19bc17a90548ee427035994bbc4b14395723ff1f.tar glibc-19bc17a90548ee427035994bbc4b14395723ff1f.tar.gz glibc-19bc17a90548ee427035994bbc4b14395723ff1f.tar.bz2 glibc-19bc17a90548ee427035994bbc4b14395723ff1f.zip |
Thu Mar 28 03:25:10 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* intl/Makefile (copysrc): Add missing > in sed cmd.
Sat Mar 23 17:52:49 1996 Ulrich Drepper <drepper@gnu.ai.mit.edu>
* Makeconfig: Rename Makefile variable nlsdir to i18ndir and
change value to $(datadir)/i18n. `nls' is not an appropriate
name.
* Makefile (subdirs): Add new subdir wctype.
* ctype/ctype-info.c: Add new global variable __ctype_names
and initialize from _nl_C_LC_CTYPE.
* ctype/ctype.h: In P1003.3b/D11 `alnum' is a separate character
class. Use bit 11.
[_ISbit]: Protect definition of bitmasks because they are also
used in wctype.h.
* libio/genops.c (_IO_sputbackc, _IO_sungetc): Clear EOF flag
after successfully pushing back a character.
Fundamental changes in locale implementation. Almost nothing
from the old code is used anymore.
* locale/charmap.c, locale/collate.c, locale/config.h,
locale/ctypedump.c, locale/hash.h, locale/keyword.gperf,
locale/keyword.h, locale/loadlocale.c, locale/locale-ctype.c,
locale/locale.c locale/localeconv.c, locale/localedef.c,
locale/localedef.h, locale/locfile-hash.c, locale/locfile-lex.c,
locale/locfile-parse.c, locale/messages.c, locale/monetary.c,
locale/numeric.c, locale/setlocale.c, locale/token.h,
locale/xmalloc.c: Removed.
* locale/Makefile: Update for new locale implementation with
program source code distributed in subdir.
* locale/categories.def, locale/iso-4217.def: Updated file
for new locale implementation.
* locale/langinfo.h: Updated for new locale implementation.
(ERA_D_T_FMT, ERA_T_FMT): New official values according to
P1003.2b/D11.
(_NL_COLLATE_NRULES, _NL_COLLATE_RULES, _NL_COLLATE_HASH_SIZE,
_NL_COLLATE_HASH_LAYERS, _NL_COLLATE_TABLE_EB,
_NL_COLLATE_TABLE_EL, _NL_COLLATE_UNDEFINED, _NL_COLLATE_EXTRA_EB,
_NL_COLLATE_EXTRA_EL, _NL_CTYPE_NAMES_EB, _NL_CTYPE_NAMES_EL,
_NL_CTYPE_HASH_SIZE, _NL_CTYPE_HASH_LAYERS, _NL_CTYPE_CLASS_NAMES,
_NL_CTYPE_MAP_NAMES, _NL_CTYPE_WIDTH): New internal values for
extended LC_CTYPE and LC_COLLATE implementation.
* locale/simple-hash.c, locale/simple-hash.h, locale/xmalloc.c,
locale/xstrdup.c: Helper functions for locale related programs.
* locale/C-collate.c, locale/C-ctype.c,
locale/C-messages.c, locale/C-monetary.c,
locale/C-numeric.c, locale/C-time.c,
locale/lc-collate.c, locale/lc-ctype.c,
locale/lc-messages.c, locale/lc-monetary.c,
locale/lc-numeric.c, locale/lc-time.c: New implementation of locale
functions, and new generated "C" locale data.
* locale/loadlocale.c: Now handles word fields in locale binary
automatically by changing the endianess if necessary.
* locale/localeinfo.h (LIMAGIC): Changed magic number because
of incompatible changes.
(locale_data): Changed definition to allow word as a value type.
(coll_sort_rule): Values for collation sorting mode.
(_NL_CURRENT_WORD): New macro to access word value of locale entry.
(__collate_table, __collate_extra): Declare new global variables
for collation tables.
* locale/programs/charmap-kw.gperf, locale/programs/charmap-kw.h,
locale/programs/charmap.c, locale/programs/charset.c,
locale/programs/charset.h, locale/programs/config.h,
locale/programs/ctypedump.c, locale/programs/ld-collate.c,
locale/programs/ld-ctype.c, locale/programs/ld-messages.c,
locale/programs/ld-monetary.c, locale/programs/ld-numeric.c,
locale/programs/ld-time.c, locale/programs/linereader.c,
locale/programs/linereader.h, locale/programs/locale.c,
locale/programs/localedef.c, locale/programs/locales.h,
locale/programs/locfile-kw.gperf, locale/programs/locfile-kw.h,
locale/programs/locfile-token.h, locale/programs/locfile.c,
locale/programs/locfile.h, locale/programs/stringtrans.c,
locale/programs/stringtrans.h: Implementation of locale related
programs.
* locale/weight.h: Functions to access collation tables.
* posix/unistd.h: Define _POSIX2_LOCALEDEF.
* stdio-common/printf_fp.c: Fix bug with printing certain numbers
< 10^-1. Reported by Bill Metzenthen.
* stdio-common/tfformat.c: Add new test for above bug.
* string/strcoll.c, string/strxfrm.c: Real implementation of
string collation according to ISO C.
* wctype/Makefile, wctype/cname-lookup.h, wctype/iswctype.c,
wctype/test_wctype.c, wctype/towctrans.c, wctype/wcfuncs.c,
wctype/wctrans.c, wctype/wctype.c, wctype/wctype.h: New files.
Implementation of wide character classes and mapping.
Diffstat (limited to 'locale/locale.c')
-rw-r--r-- | locale/locale.c | 539 |
1 files changed, 0 insertions, 539 deletions
diff --git a/locale/locale.c b/locale/locale.c deleted file mode 100644 index fd2e392e80..0000000000 --- a/locale/locale.c +++ /dev/null @@ -1,539 +0,0 @@ -/* Copyright (C) 1995 Free Software Foundation, Inc. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -#include <dirent.h> -#include <getopt.h> -#include <langinfo.h> -#include <libintl.h> -#include <limits.h> -#include <locale.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <errno.h> - -#include "localedef.h" - - -/* If set dump C code describing the current locale. */ -static int do_dump; - -/* If set print the name of the category. */ -static int show_category_name; - -/* If set print the name of the item. */ -static int show_keyword_name; - -/* Long options. */ -static const struct option long_options[] = - { - { "all-locales", no_argument, NULL, 'a' }, - { "category-name", no_argument, &show_category_name, 1 }, - { "charmaps", no_argument, NULL, 'm' }, - { "dump", no_argument, &do_dump, 1 }, - { "help", no_argument, NULL, 'h' }, - { "keyword-name", no_argument, &show_keyword_name, 1 }, - { "version", no_argument, NULL, 'v' }, - { NULL, 0, NULL, 0 } - }; - - -/* We don't have these constants defined because we don't use them. Give - default values. */ -#define CTYPE_MB_CUR_MIN 0 -#define CTYPE_MB_CUR_MAX 0 -#define CTYPE_HASH_SIZE 0 -#define CTYPE_HASH_LAYERS 0 -#define CTYPE_CLASS 0 -#define CTYPE_TOUPPER_EB 0 -#define CTYPE_TOLOWER_EB 0 -#define CTYPE_TOUPPER_EL 0 -#define CTYPE_TOLOWER_EL 0 - - -/* We have all categories defined in `categories.def'. Now construct - the description and data structure used for all categories. */ -#define DEFINE_CATEGORY(category, name, items, postload, in, check, out) \ - static struct cat_item category##_desc[] = \ - { \ - NO_PAREN items \ - }; - -#include "categories.def" -#undef DEFINE_CATEGORY - -static struct category category[] = - { -#define DEFINE_CATEGORY(category, name, items, postload, in, check, out) \ - { _NL_NUM_##category, name, NELEMS (category##_desc) - 1, \ - category##_desc, NULL, NULL, NULL, out }, -#include "categories.def" -#undef DEFINE_CATEGORY - }; -#define NCATEGORIES NELEMS (category) - - -/* Prototypes for local functions. */ -static void usage (int status) __attribute__ ((noreturn)); -static void write_locales (void); -static void write_charmaps (void); -static void show_locale_vars (void); -static void show_info (const char *name); -static void dump_category (const char *name); - - -int -main (int argc, char *argv[]) -{ - int optchar; - int do_all = 0; - int do_help = 0; - int do_version = 0; - int do_charmaps = 0; - - /* Set initial values for global varaibles. */ - do_dump = 0; - show_category_name = 0; - show_keyword_name = 0; - - /* Set locale. Do not set LC_ALL because the other categories must - not be affected (acccording to POSIX.2). */ - setlocale (LC_CTYPE, ""); - setlocale (LC_MESSAGES, ""); - - /* Initialize the message catalog. */ - textdomain (PACKAGE); - - while ((optchar = getopt_long (argc, argv, "achkmv", long_options, NULL)) - != EOF) - switch (optchar) - { - case '\0': - break; - case 'a': - do_all = 1; - break; - case 'c': - show_category_name = 1; - break; - case 'h': - do_help = 1; - break; - case 'k': - show_keyword_name = 1; - break; - case 'm': - do_charmaps = 1; - break; - case 'v': - do_version = 1; - break; - default: - error (1, 0, gettext ("illegal option \"%s\""), optarg); - break; - } - - /* Version information is requested. */ - if (do_version) - { - fprintf (stderr, "GNU %s %s\n", PACKAGE, VERSION); - exit (EXIT_SUCCESS); - } - - /* Help is requested. */ - if (do_help) - usage (EXIT_SUCCESS); - - /* Dump C code. */ - if (do_dump) - { - printf ("\ -/* Generated by GNU %s %s. */\n\ -\n\ -#include \"localeinfo.h\"\n", program_invocation_name, VERSION); - - while (optind < argc) - dump_category (argv[optind++]); - - exit (EXIT_SUCCESS); - } - - /* `-a' requests the names of all available locales. */ - if (do_all != 0) - { - write_locales (); - exit (EXIT_SUCCESS); - } - - /* `m' requests the names of all available charmaps. The names can be - used for the -f argument to localedef(3). */ - if (do_charmaps != 0) - { - write_charmaps (); - exit (EXIT_SUCCESS); - } - - /* If no real argument is given we have to print the contents of the - current locale definition variables. These are LANG and the LC_*. */ - if (optind == argc && show_keyword_name == 0 && show_category_name == 0) - { - show_locale_vars (); - exit (EXIT_SUCCESS); - } - - /* Process all given names. */ - while (optind < argc) - show_info (argv[optind++]); - - exit (EXIT_SUCCESS); -} - - -/* Display usage information and exit. */ -static void -usage(int status) -{ - if (status != EXIT_SUCCESS) - fprintf (stderr, gettext ("Try `%s --help' for more information.\n"), - program_invocation_name); - else - printf(gettext ("\ -Usage: %s [OPTION]... name\n\ -Mandatory arguments to long options are mandatory for short options too.\n\ - -h, --help display this help and exit\n\ - -v, --version output version information and exit\n\ -\n\ - -a, --all-locales write names of available locales\n\ - -m, --charmaps write names of available charmaps\n\ -\n\ - -c, --category-name write names of selected categories\n\ - -k, --keyword-name write names of selected keywords\n\ -\n\ - --dump dump C code describing the current locale\n\ - (this code can be used in the C library)\n\ -"), program_invocation_name); - - exit (status); -} - - -/* Write the names of all available locales to stdout. */ -static void -write_locales (void) -{ - DIR *dir; - struct dirent *dirent; - - /* `POSIX' locale is always available (POSIX.2 4.34.3). */ - puts ("POSIX"); - - dir = opendir (LOCALE_PATH); - if (dir == NULL) - { - error (1, errno, gettext ("cannot read locale directory `%s'"), - LOCALE_PATH); - return; - } - - /* Now we can look for all files in the directory. */ - while ((dirent = readdir (dir)) != NULL) - if (strcmp (dirent->d_name, ".") != 0 - && strcmp (dirent->d_name, "..") != 0) - puts (dirent->d_name); - - closedir (dir); -} - - -/* Write the names of all available character maps to stdout. */ -static void -write_charmaps (void) -{ - DIR *dir; - struct dirent *dirent; - - dir = opendir (CHARMAP_PATH); - if (dir == NULL) - { - error (1, errno, gettext ("cannot read character map directory `%s'"), - CHARMAP_PATH); - return; - } - - /* Now we can look for all files in the directory. */ - while ((dirent = readdir (dir)) != NULL) - if (strcmp (dirent->d_name, ".") != 0 - && strcmp (dirent->d_name, "..") != 0) - puts (dirent->d_name); - - closedir (dir); -} - - -/* We have to show the contents of the environments determining the - locale. */ -static void -show_locale_vars (void) -{ - size_t cat_no; - const char *lcall = getenv ("LC_ALL"); - const char *lang = getenv ("LANG") ? : "POSIX"; - - void get_source (const char *name) - { - char *val = getenv (name); - - if (lcall != NULL || val == NULL) - printf ("%s=\"%s\"\n", name, lcall ? : lang); - else - printf ("%s=%s\n", name, val); - } - - /* LANG has to be the first value. */ - printf ("LANG=%s\n", lang); - - /* Now all categories in an unspecified order. */ - for (cat_no = 0; cat_no < NCATEGORIES; ++cat_no) - get_source (category[cat_no].name); - - /* The last is the LC_ALL value. */ - printf ("LC_ALL=%s\n", lcall ? : ""); -} - - -/* Show the information request for NAME. */ -static void -show_info (const char *name) -{ - size_t cat_no; - - void print_item (struct cat_item *item) - { - if (show_keyword_name != 0) - printf ("%s=", item->name); - - switch (item->value_type) - { - case string: - printf ("%s%s%s", show_keyword_name ? "\"" : "", - nl_langinfo (item->item_id) ? : "", - show_keyword_name ? "\"" : ""); - break; - case stringarray: - { - int cnt; - const char *val; - - if (show_keyword_name) - putchar ('"'); - - for (cnt = 0; cnt < item->max - 1; ++cnt) - { - val = nl_langinfo (item->item_id + cnt); - printf ("%s;", val ? : ""); - } - - val = nl_langinfo (item->item_id + cnt); - printf ("%s", val ? : ""); - - if (show_keyword_name) - putchar ('"'); - } - break; - case byte: - { - const char *val = nl_langinfo (item->item_id); - - if (val != NULL) - printf ("%d", *val == CHAR_MAX ? -1 : *val); - } - break; - case bytearray: - { - const char *val = nl_langinfo (item->item_id); - int cnt = val ? strlen (val) : 0; - - while (cnt > 1) - { - printf ("%d;", *val == CHAR_MAX ? -1 : *val); - --cnt; - ++val; - } - - printf ("%d", cnt == 0 || *val == CHAR_MAX ? -1 : *val); - } - break; - default: - } - putchar ('\n'); - } - - for (cat_no = 0; cat_no < NCATEGORIES; ++cat_no) - { - size_t item_no; - - if (category[cat_no].outfct != NULL) - /* Categories which need special handling of the output are - not written. This is especially for LC_CTYPE and LC_COLLATE. - It does not make sense to have this large number of cryptic - characters displayed. */ - continue; - - if (strcmp (name, category[cat_no].name) == 0) - /* Print the whole category. */ - { - if (show_category_name != 0) - puts (category[cat_no].name); - - for (item_no = 0; item_no < category[cat_no].number; ++item_no) - print_item (&category[cat_no].item_desc[item_no]); - - return; - } - - for (item_no = 0; item_no < category[cat_no].number; ++item_no) - if (strcmp (name, category[cat_no].item_desc[item_no].name) == 0) - { - if (show_category_name != 0) - puts (category[cat_no].name); - - print_item (&category[cat_no].item_desc[item_no]); - return; - } - } -} - - -static void -dump_category (const char *name) -{ - char *locname; - size_t cat_no, item_no, nstrings; - - for (cat_no = 0; cat_no < NCATEGORIES; ++cat_no) - if (strcmp (name, category[cat_no].name) == 0) - break; - - if (cat_no >= NCATEGORIES) - return; - - /* The NAME specifies a correct locale category. */ - if (category[cat_no].outfct != NULL) - { - category[cat_no].outfct (); - return; - } - - locname = (getenv ("LC_ALL") ?: getenv (name) ?: - getenv ("LANG") ?: (char *) "POSIX"); - - /* Determine the number of strings in advance. */ - nstrings = 0; - for (item_no = 0; item_no < category[cat_no].number; ++item_no) - switch (category[cat_no].item_desc[item_no].value_type) - { - case string: - case byte: - case bytearray: - ++nstrings; - break; - case stringarray: - nstrings += category[cat_no].item_desc[item_no].max; - default: - } - - printf ("\nconst struct locale_data _nl_%s_%s =\n{\n" - " NULL, 0, /* no file mapped */\n %Zu,\n {\n", - locname, name, nstrings); - - for (item_no = 0; item_no < category[cat_no].number; ++item_no) - switch (category[cat_no].item_desc[item_no].value_type) - { - case string: - { - const char *val = nl_langinfo ( - category[cat_no].item_desc[item_no].item_id); - - if (val != NULL) - printf (" \"%s\",\n", val); - else - puts (" NULL,"); - } - break; - case stringarray: - { - const char *val; - int cnt; - - for (cnt = 0; cnt < category[cat_no].item_desc[item_no].max; ++cnt) - { - val = nl_langinfo ( - category[cat_no].item_desc[item_no].item_id + cnt); - - if (val != NULL) - printf (" \"%s\",\n", val); - else - puts (" NULL,"); - } - } - break; - case byte: - { - const char *val = nl_langinfo ( - category[cat_no].item_desc[item_no].item_id); - - if (val != NULL) - printf (" \"\\%o\",\n", - *(unsigned char *) val ? : UCHAR_MAX); - else - puts (" NULL,"); - } - break; - case bytearray: - { - const char *bytes = nl_langinfo ( - category[cat_no].item_desc[item_no].item_id); - - if (bytes != NULL) - { - fputs (" \"", stdout); - if (*bytes != '\0') - do - printf ("\\%o", *(unsigned char *) bytes++); - while (*bytes != '\0'); - else - printf ("\\%o", UCHAR_MAX); - - puts ("\","); - } - else - puts (" NULL,"); - } - break; - default: - break; - } - - puts (" }\n};"); -} - -/* - * Local Variables: - * mode:c - * c-basic-offset:2 - * End: - */ |