1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

Fri Jul 26 04:41:28 1996 Ulrich Drepper <drepper@cygnus.com>

* intl/libintl.h: Define optimizing macros if __OPTIMIZE__ is
	defined, not __OPTIMIZED.
	(_nl_msg_cat_cntr): Move declaration outside macro definition
	to prevent "nested extern" warning.
	(dcgettext): Rename local variable `result' to `__result'.

Thu Jul 25 22:46:30 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>

	* locale/programs/localedef.c (__progname): Remove decl.
	(main): Use program_invocation_short_name instead of __progname.
	(usage): Use program_invocation_name instead of __progname.

Fri Jul 26 03:46:08 1996  Ulrich Drepper  <drepper@cygnus.com>

	* catgets/gencat.c: Use "libc" instead of PACKAGE.
	* locale/localedef.c: Ditto.
	* locale/locale.c: Ditto.

	* locale/findlocale.c (_nl_find_locale): Little optimization.
	Use new function `strndup'.

	* locale/loadlocale.c: Little optimization.  Use constant value
	from `_nl_category_num_items' instead of byte-order dependend
	value from file.

	* locale/programs/ld-time.c (time_add): Correct string constant.

	* locale/programs/locale-spec.c: New file.
	* locale/programs/locale.c: Call `locale_special' function if
	no other field matches.

	* locale/programs/localedef.c: No need to define `program_name'.
	Use global variable `__progname'.

	* locale/programs/locfile.c (write_locale_data): Always write
	LC_MESSAGES data in LC_MESSAGES/SYS_LC_MESSAGES file.  This is
	necessary since message catalogs are also installed in the
	LC_MESSAGES/ directory.

	* locale/programs/stringtrans.c (ADDC): Correctly use `encode_char'
	function instead of writing single bytes.
	(encode_char): Also handle little endian.

	* locale/setlocale.c (new_composite_name): Little optimization.
	Use return value of `memcpy'.

	* misc/ttyent.h: Pretty print prototypes, add missing parameter
	names, prepend parameter names with __  and use `__const' instead
	of `const'.
	* posix/unistd.h: Ditto.
	* stdlib/stdlib.h: Ditto.
	* string/string.h: Ditto.

	* posix/getconf.c: De-ASNI-fy.  Recognize POSIX.2 constant names.
	Use `error' function instead of doing it by hand.
	* sysdeps/posix/sysconf.c: De-ANSI-fy.
	Handle _SC_COLL_WEIGHTS_MAX.
	* sysdeps/stub/sysconf.c: Handle _SC_CHARCLASS_NAME_MAX,
	_SC_COLL_WEIGHTS_MAX, _SC_EQUIV_CLASS_MAX, _SC_2_LOCALEDEF
	since these do depend on the platform.
	Add POSIX.4 symbols.

	* posix/posix2_lim.h: Add missing definition of
	_POSIX2_COLL_WEIGHTS_MAX.
	Change _POSIX2_EQUIV_CLASS_MAX and _POSIX2_CHARCLASS_NAME_MAX
	to high values since we have no fixed limit.

	* sysdeps/generic/confname.h: Add _SC_PAGE_SIZE as alias for
	_SC_PAGESIZE for buggy systems (= HP UX) out there.

	* wcsmbs/Makefile (routines): Add mbsnrtowcs and wcsnrtombs.
	* wcsmbs/mbsnrtowcs.c: New file.  Non-standard implementation.
	* wcsmbs/wcsnrtombs.c: Ditto.
	* wcsmbs/wchar.h [__USE_GNU]: Add prototypes for mbsnrtowcs and
	wcsnrtombs.

Thu Jul 25 00:25:54  Richard Henderson  <rth@tamu.edu>

	* nss/nss_db/db-XXX.c: Kill trailing ; from lock defn as a matter of
	course.
	* nss/getXXent_r.c: Likewise.
	* nss/nsswitch.c: Likewise.
	* nss/nss_files/files-XXX.c: Likewise.
	* sysdeps/mach/hurd/dirstream.h (struct __dirstream): Likewise.
	* sysdeps/unix/bsd/telldir.c (struct record): Likewise.
	* sysdeps/unix/dirstream.h (struct __dirstream): Likewise.
This commit is contained in:
Roland McGrath
1996-07-26 04:35:31 +00:00
parent 1e16111cf1
commit 036cc82fbc
26 changed files with 756 additions and 199 deletions

View File

@ -1,3 +1,92 @@
Fri Jul 26 04:41:28 1996 Ulrich Drepper <drepper@cygnus.com>
* intl/libintl.h: Define optimizing macros if __OPTIMIZE__ is
defined, not __OPTIMIZED.
(_nl_msg_cat_cntr): Move declaration outside macro definition
to prevent "nested extern" warning.
(dcgettext): Rename local variable `result' to `__result'.
Thu Jul 25 22:46:30 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* locale/programs/localedef.c (__progname): Remove decl.
(main): Use program_invocation_short_name instead of __progname.
(usage): Use program_invocation_name instead of __progname.
Fri Jul 26 03:46:08 1996 Ulrich Drepper <drepper@cygnus.com>
* catgets/gencat.c: Use "libc" instead of PACKAGE.
* locale/localedef.c: Ditto.
* locale/locale.c: Ditto.
* locale/findlocale.c (_nl_find_locale): Little optimization.
Use new function `strndup'.
* locale/loadlocale.c: Little optimization. Use constant value
from `_nl_category_num_items' instead of byte-order dependend
value from file.
* locale/programs/ld-time.c (time_add): Correct string constant.
* locale/programs/locale-spec.c: New file.
* locale/programs/locale.c: Call `locale_special' function if
no other field matches.
* locale/programs/localedef.c: No need to define `program_name'.
Use global variable `__progname'.
* locale/programs/locfile.c (write_locale_data): Always write
LC_MESSAGES data in LC_MESSAGES/SYS_LC_MESSAGES file. This is
necessary since message catalogs are also installed in the
LC_MESSAGES/ directory.
* locale/programs/stringtrans.c (ADDC): Correctly use `encode_char'
function instead of writing single bytes.
(encode_char): Also handle little endian.
* locale/setlocale.c (new_composite_name): Little optimization.
Use return value of `memcpy'.
* misc/ttyent.h: Pretty print prototypes, add missing parameter
names, prepend parameter names with __ and use `__const' instead
of `const'.
* posix/unistd.h: Ditto.
* stdlib/stdlib.h: Ditto.
* string/string.h: Ditto.
* posix/getconf.c: De-ASNI-fy. Recognize POSIX.2 constant names.
Use `error' function instead of doing it by hand.
* sysdeps/posix/sysconf.c: De-ANSI-fy.
Handle _SC_COLL_WEIGHTS_MAX.
* sysdeps/stub/sysconf.c: Handle _SC_CHARCLASS_NAME_MAX,
_SC_COLL_WEIGHTS_MAX, _SC_EQUIV_CLASS_MAX, _SC_2_LOCALEDEF
since these do depend on the platform.
Add POSIX.4 symbols.
* posix/posix2_lim.h: Add missing definition of
_POSIX2_COLL_WEIGHTS_MAX.
Change _POSIX2_EQUIV_CLASS_MAX and _POSIX2_CHARCLASS_NAME_MAX
to high values since we have no fixed limit.
* sysdeps/generic/confname.h: Add _SC_PAGE_SIZE as alias for
_SC_PAGESIZE for buggy systems (= HP UX) out there.
* wcsmbs/Makefile (routines): Add mbsnrtowcs and wcsnrtombs.
* wcsmbs/mbsnrtowcs.c: New file. Non-standard implementation.
* wcsmbs/wcsnrtombs.c: Ditto.
* wcsmbs/wchar.h [__USE_GNU]: Add prototypes for mbsnrtowcs and
wcsnrtombs.
Thu Jul 25 00:25:54 Richard Henderson <rth@tamu.edu>
* nss/nss_db/db-XXX.c: Kill trailing ; from lock defn as a matter of
course.
* nss/getXXent_r.c: Likewise.
* nss/nsswitch.c: Likewise.
* nss/nss_files/files-XXX.c: Likewise.
* sysdeps/mach/hurd/dirstream.h (struct __dirstream): Likewise.
* sysdeps/unix/bsd/telldir.c (struct record): Likewise.
* sysdeps/unix/dirstream.h (struct __dirstream): Likewise.
Thu Jul 25 00:53:06 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> Thu Jul 25 00:53:06 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* sysdeps/unix/sysv/linux/configure.in (LIBC_LINUX_VERSION): New * sysdeps/unix/sysv/linux/configure.in (LIBC_LINUX_VERSION): New

View File

@ -165,7 +165,7 @@ main (int argc, char *argv[])
if (do_version) if (do_version)
{ {
fprintf (stderr, "%s - GNU %s %s\n", program_invocation_name, fprintf (stderr, "%s - GNU %s %s\n", program_invocation_name,
PACKAGE, VERSION); "libc", VERSION);
exit (EXIT_SUCCESS); exit (EXIT_SUCCESS);
} }

View File

@ -1,6 +1,6 @@
/* libgettext.h -- Message catalogs for internationalization. /* libintl.h -- Message catalogs for internationalization.
Copyright (C) 1995 Free Software Foundation, Inc. Copyright (C) 1995, 1996 Free Software Foundation, Inc.
Contributed by Ulrich Drepper. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
This file is derived from the file libgettext.h in the GNU gettext package. This file is derived from the file libgettext.h in the GNU gettext package.
This file is part of the GNU C Library. Its master source is NOT part of This file is part of the GNU C Library. Its master source is NOT part of
@ -22,14 +22,10 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */ Cambridge, MA 02139, USA. */
#ifndef _LIBINTL_H #ifndef _LIBINTL_H
#define _LIBINTL_H 1 #define _LIBINTL_H 1
#include <features.h> #include <features.h>
#include <locale.h>
#define __need_NULL
#include <stddef.h>
/* We define an additional symbol to signal that we use the GNU /* We define an additional symbol to signal that we use the GNU
implementation of gettext. */ implementation of gettext. */
#define __USE_GNU_GETTEXT 1 #define __USE_GNU_GETTEXT 1
@ -72,8 +68,16 @@ extern char *__bindtextdomain __P ((__const char *__domainname,
/* Optimized version of the function above. */ /* Optimized version of the function above. */
#if defined __OPTIMIZED #if defined __OPTIMIZE__
/* These must be a macro. Inlined functions are useless because the
/* We need NULL for `gettext'. */
#define __need_NULL
#include <stddef.h>
/* We need LC_MESSAGES for `dgettext'. */
# include <locale.h>
/* These must be macros. Inlined functions are useless because the
`__builtin_constant_p' predicate in dcgettext would always return `__builtin_constant_p' predicate in dcgettext would always return
false. */ false. */
@ -83,13 +87,16 @@ extern char *__bindtextdomain __P ((__const char *__domainname,
dcgettext (domainname, msgid, LC_MESSAGES) dcgettext (domainname, msgid, LC_MESSAGES)
# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) # if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
/* Variable defined in loadmsgcat.c which gets incremented every time a
new catalog is loaded. */
extern int _nl_msg_cat_cntr;
# define dcgettext(domainname, msgid, category) \ # define dcgettext(domainname, msgid, category) \
(__extension__ \ (__extension__ \
({ \ ({ \
char *result; \ char *__result; \
if (__builtin_constant_p (msgid)) \ if (__builtin_constant_p (msgid)) \
{ \ { \
extern int _nl_msg_cat_cntr; \
static char *__translation__; \ static char *__translation__; \
static int __catalog_counter__; \ static int __catalog_counter__; \
if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \ if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \
@ -98,11 +105,11 @@ extern char *__bindtextdomain __P ((__const char *__domainname,
__dcgettext ((domainname), (msgid), (category)); \ __dcgettext ((domainname), (msgid), (category)); \
__catalog_counter__ = _nl_msg_cat_cntr; \ __catalog_counter__ = _nl_msg_cat_cntr; \
} \ } \
result = __translation__; \ __result = __translation__; \
} \ } \
else \ else \
result = __dcgettext ((domainname), (msgid), (category)); \ __result = __dcgettext ((domainname), (msgid), (category)); \
result; \ __result; \
})) }))
# endif # endif
#endif /* Optimizing. */ #endif /* Optimizing. */

View File

@ -170,21 +170,17 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
/* Determine the locale name for which loading succeeded. This /* Determine the locale name for which loading succeeded. This
information comes from the file name. The form is information comes from the file name. The form is
<path>/<locale>/LC_foo. We must extract this <locale> part. */ <path>/<locale>/LC_foo. We must extract the <locale> part. */
if (((struct locale_data *) locale_file->data)->name == NULL) if (((struct locale_data *) locale_file->data)->name == NULL)
{ {
char *newp, *cp, *endp; char *cp, *endp;
endp = strrchr (locale_file->filename, '/'); endp = strrchr (locale_file->filename, '/');
cp = endp - 1; cp = endp - 1;
while (cp[-1] != '/') while (cp[-1] != '/')
--cp; --cp;
newp = (char *) malloc (endp - cp + 1); ((struct locale_data *) locale_file->data)->name = __strndup (cp,
if (newp == NULL) endp - cp);
return NULL;
memcpy (newp, cp, endp - cp);
newp[endp - cp] = '\0';
((struct locale_data *) locale_file->data)->name = newp;
} }
*name = (char *) ((struct locale_data *) locale_file->data)->name; *name = (char *) ((struct locale_data *) locale_file->data)->name;

View File

@ -189,14 +189,15 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
} }
newdata = malloc (sizeof *newdata + newdata = malloc (sizeof *newdata +
W (filedata->nstrings) * sizeof (union locale_data_value)); (_nl_category_num_items[category]
* sizeof (union locale_data_value)));
if (! newdata) if (! newdata)
goto puntmap; goto puntmap;
newdata->name = NULL; /* This will be filled if necessary in findlocale.c. */ newdata->name = NULL; /* This will be filled if necessary in findlocale.c. */
newdata->filedata = (void *) filedata; newdata->filedata = (void *) filedata;
newdata->filesize = st.st_size; newdata->filesize = st.st_size;
newdata->nstrings = W (filedata->nstrings); newdata->nstrings = _nl_category_num_items[category];
for (cnt = 0; cnt < newdata->nstrings; ++cnt) for (cnt = 0; cnt < newdata->nstrings; ++cnt)
{ {
off_t idx = W (filedata->strindex[cnt]); off_t idx = W (filedata->strindex[cnt]);
@ -234,5 +235,3 @@ _nl_free_locale (const struct locale_data *data)
} }
free ((void *) data); free ((void *) data);
} }

View File

@ -257,7 +257,7 @@ time_add (struct linereader *lr, struct localedef_t *locale,
#define STRARR_ELEM(cat, max) \ #define STRARR_ELEM(cat, max) \
case tok_##cat: \ case tok_##cat: \
if (time->cur_num_##cat >= max) \ if (time->cur_num_##cat >= max) \
lr_error (lr, _(" \ lr_error (lr, _("\
too many values for field `%s' in category `LC_TIME'"), \ too many values for field `%s' in category `LC_TIME'"), \
#cat, "LC_TIME"); \ #cat, "LC_TIME"); \
else if (code->val.str.start == NULL) \ else if (code->val.str.start == NULL) \

View File

@ -0,0 +1,95 @@
/* Handle special requests.
Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdio.h>
#include <string.h>
#include <wchar.h>
#include "localeinfo.h"
/* We provide support for some special names. This helps debugging
and may be useful for advanced usage of the provided information
outside C. */
void
locale_special (const char *name, int show_category_name,
int show_keyword_name)
{
/* "collate-elements": print collation elements of locale. */
if (strcmp (name, "collate-elements") == 0)
{
size_t nelem = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_ELEM_HASH_SIZE);
if (show_category_name)
puts ("LC_COLLATE");
if (show_keyword_name)
fputs ("collate-elements=", stdout);
if (nelem != 0)
{
int first = 1;
size_t cnt;
for (cnt = 0; cnt < nelem; ++cnt)
if (__collate_element_hash[2 * cnt] != (~((u_int32_t) 0)))
{
size_t idx = __collate_element_hash[2 * cnt];
printf ("%s<%s>", first ? "" : ";",
&__collate_element_strings[idx]);
#if 0
/* We don't print the string. This is only confusing
because only the programs have to know the
encoding. The code is left in place because it
shows how to get the information. */
{
const wchar_t *wp;
idx = __collate_element_hash[2 * cnt + 1];
wp = &__collate_element_values[idx];
while (*wp != L'\0')
{
/********************************************\
|* XXX The element values are really wide *|
|* chars. But we are currently not able to *|
|* print these so fake here. *|
\********************************************/
int ch = wctob (*wp++);
if (ch != EOF)
putchar (ch);
else
fputs ("<???>", stdout);
}
putchar ('"');
}
#endif
first = 0;
}
}
putchar ('\n');
return;
}
}

View File

@ -1,4 +1,7 @@
/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. /* locale - Implementation of the locale program according to POSIX 1003.2
Copyright (C) 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
The GNU C Library is free software; you can redistribute it and/or 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 modify it under the terms of the GNU Library General Public License as
@ -12,8 +15,8 @@ Library General Public License for more details.
You should have received a copy of the GNU Library General Public 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 License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave, not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Cambridge, MA 02139, USA. */ Boston, MA 02111-1307, USA. */
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
# include <config.h> # include <config.h>
@ -105,14 +108,21 @@ struct category
static struct category category[] = static struct category category[] =
{ {
#define DEFINE_CATEGORY(category, name, items, postload, in, check, out) \ #define DEFINE_CATEGORY(category, name, items, postload, in, check, out) \
{ _NL_NUM_##category, name, NELEMS (category##_desc) - 1, \ [category] = { _NL_NUM_##category, name, NELEMS (category##_desc), \
category##_desc }, category##_desc },
#include "categories.def" #include "categories.def"
#undef DEFINE_CATEGORY #undef DEFINE_CATEGORY
}; };
#define NCATEGORIES NELEMS (category) #define NCATEGORIES NELEMS (category)
/* Automatically set variable. */
extern const char *__progname;
/* helper function for extended name handling. */
extern void locale_special (const char *name, int show_category_name,
int show_keyword_name);
/* Prototypes for local functions. */ /* Prototypes for local functions. */
static void usage (int status) __attribute__ ((noreturn)); static void usage (int status) __attribute__ ((noreturn));
static void write_locales (void); static void write_locales (void);
@ -146,7 +156,7 @@ main (int argc, char *argv[])
!= EOF) != EOF)
switch (optchar) switch (optchar)
{ {
case '\0': case '\0': /* Long option. */
break; break;
case 'a': case 'a':
do_all = 1; do_all = 1;
@ -173,7 +183,7 @@ main (int argc, char *argv[])
/* Version information is requested. */ /* Version information is requested. */
if (do_version) if (do_version)
{ {
fprintf (stderr, "GNU %s %s\n", PACKAGE, VERSION); fprintf (stderr, "%s - GNU %s %s\n", __progname, "libc", VERSION);
exit (EXIT_SUCCESS); exit (EXIT_SUCCESS);
} }
@ -222,7 +232,7 @@ usage (int status)
{ {
if (status != EXIT_SUCCESS) if (status != EXIT_SUCCESS)
fprintf (stderr, gettext ("Try `%s --help' for more information.\n"), fprintf (stderr, gettext ("Try `%s --help' for more information.\n"),
program_invocation_name); __progname);
else else
printf (gettext ("\ printf (gettext ("\
Usage: %s [OPTION]... name\n\ Usage: %s [OPTION]... name\n\
@ -235,7 +245,7 @@ Mandatory arguments to long options are mandatory for short options too.\n\
\n\ \n\
-c, --category-name write names of selected categories\n\ -c, --category-name write names of selected categories\n\
-k, --keyword-name write names of selected keywords\n"), -k, --keyword-name write names of selected keywords\n"),
program_invocation_name); __progname);
exit (status); exit (status);
} }
@ -424,4 +434,8 @@ show_info (const char *name)
return; return;
} }
} }
/* When we get to here the name is not standard ones. For testing
and perhpas advanced use we allow some more symbols. */
locale_special (name, show_category_name, show_keyword_name);
} }

View File

@ -67,9 +67,6 @@ struct copy_def_list_t *copy_list;
/* If this is defined be POSIX conform. */ /* If this is defined be POSIX conform. */
int posix_conformance; int posix_conformance;
/* Name of the running program. */
const char *program_name;
/* If not zero give a lot more messages. */ /* If not zero give a lot more messages. */
int verbose; int verbose;
@ -118,7 +115,6 @@ main (int argc, char *argv[])
/* Set initial values for global varaibles. */ /* Set initial values for global varaibles. */
copy_list = NULL; copy_list = NULL;
posix_conformance = getenv ("POSIXLY_CORRECT") != NULL; posix_conformance = getenv ("POSIXLY_CORRECT") != NULL;
program_name = argv[0];
error_print_progname = error_print; error_print_progname = error_print;
verbose = 0; verbose = 0;
@ -128,12 +124,7 @@ main (int argc, char *argv[])
setlocale (LC_CTYPE, ""); setlocale (LC_CTYPE, "");
/* Initialize the message catalog. */ /* Initialize the message catalog. */
#if 0
/* In the final version for glibc we can use the variable. */
textdomain (_libc_intl_domainname); textdomain (_libc_intl_domainname);
#else
textdomain ("SYS_libc");
#endif
while ((optchar = getopt_long (argc, argv, "cf:hi:u:vV", long_options, NULL)) while ((optchar = getopt_long (argc, argv, "cf:hi:u:vV", long_options, NULL))
!= EOF) != EOF)
@ -182,7 +173,8 @@ main (int argc, char *argv[])
/* Version information is requested. */ /* Version information is requested. */
if (do_version) if (do_version)
{ {
fprintf (stderr, "%s - GNU %s %s\n", program_name, PACKAGE, VERSION); fprintf (stderr, "%s - GNU %s %s\n", program_invocation_short_name,
"libc", VERSION);
exit (0); exit (0);
} }
@ -389,7 +381,7 @@ usage (int status)
{ {
if (status != 0) if (status != 0)
fprintf (stderr, _("Try `%s --help' for more information.\n"), fprintf (stderr, _("Try `%s --help' for more information.\n"),
program_name); program_invocation_name);
else else
printf (_("\ printf (_("\
Usage: %s [OPTION]... name\n\ Usage: %s [OPTION]... name\n\
@ -405,7 +397,7 @@ Mandatory arguments to long options are mandatory for short options too.\n\
\n\ \n\
System's directory for character maps: %s\n\ System's directory for character maps: %s\n\
locale files : %s\n"), locale files : %s\n"),
program_name, CHARMAP_PATH, LOCALE_PATH); program_invocation_name, CHARMAP_PATH, LOCALE_PATH);
exit (status); exit (status);
} }

View File

@ -935,16 +935,29 @@ write_locale_data (const char *output_path, const char *category,
int fd; int fd;
char *fname; char *fname;
asprintf (&fname, "%s%s", output_path, category); fname = malloc (strlen (output_path) + strlen (category) + 6);
fd = creat (fname, 0666); if (fname == NULL)
error (5, errno, _("memory exhausted"));
/* Normally we write to the directory pointed to by the OUTPUT_PATH.
But for LC_MESSAGES we have to take care for the translation
data. This means we need to have a directory LC_MESSAGES in
which we place the file under the name SYS_LC_MESSAGES. */
if (strcmp (category, "LC_MESSAGES") == 0)
fd = -1;
else
{
sprintf (fname, "%s%s", output_path, category);
fd = creat (fname, 0666);
}
if (fd == -1) if (fd == -1)
{ {
int save_err = errno; int save_err = errno;
if (errno == EISDIR) if (errno == EISDIR)
{ {
free (fname); sprintf (fname, "%1$s%2$s/SYS_%2$s", output_path, category);
asprintf (&fname, "%1$s%2$s/SYS_%2$s", output_path, category);
fd = creat (fname, 0666); fd = creat (fname, 0666);
if (fd == -1) if (fd == -1)
save_err = errno; save_err = errno;

View File

@ -36,16 +36,23 @@ void *xmalloc (size_t __n);
void *xrealloc (void *__p, size_t __n); void *xrealloc (void *__p, size_t __n);
#define ADDC(ch) \ #define ADDC(ch) \
do \ do \
{ \ { \
if (bufact == bufmax) \ char *cp; \
{ \ if (bufact + (encoding_method == ENC_UCS4 ? 4 : 1) >= bufmax) \
bufmax *= 2; \ { \
buf = xrealloc (buf, bufmax); \ bufmax *= 2; \
} \ buf = xrealloc (buf, bufmax); \
buf[bufact++] = (ch); \ } \
} \ cp = &buf[bufact]; \
if (encode_char (ch, &cp) < 0) \
{ \
free (buf); \
return NULL; \
} \
bufact = cp - buf; \
} \
while (0) while (0)
@ -92,31 +99,15 @@ translate_string (char *str, struct charset_t *charset)
return NULL; return NULL;
} }
else else
{ /* Encode string using current method. */
/* Encode string using current method. */ ADDC (value);
char *cp;
if (bufmax - bufact < 8)
{
bufmax *= 2;
buf = (char *) xrealloc (buf, bufmax);
}
cp = &buf[bufact];
if (encode_char (value, &cp) < 0)
{
free (buf);
return NULL;
}
bufact = cp - buf;
}
str = &tp[1]; str = &tp[1];
} }
ADDC ('\0'); ADDC ('\0');
return buf;; return buf;
} }
@ -127,15 +118,22 @@ encode_char (unsigned int value, char **cpp)
{ {
case ENC_UCS1: case ENC_UCS1:
if (value > 255) if (value > 255)
return -11; return -1;
*(*cpp)++ = (char) value; *(*cpp)++ = (char) value;
break; break;
case ENC_UCS4: case ENC_UCS4:
#if __BYTE_ORDER == __BIG_ENDIAN
*(*cpp)++ = (char) (value >> 24); *(*cpp)++ = (char) (value >> 24);
*(*cpp)++ = (char) ((value >> 16) & 0xff); *(*cpp)++ = (char) ((value >> 16) & 0xff);
*(*cpp)++ = (char) ((value >> 8) & 0xff); *(*cpp)++ = (char) ((value >> 8) & 0xff);
*(*cpp)++ = (char) (value & 0xff); *(*cpp)++ = (char) (value & 0xff);
#else
*(*cpp)++ = (char) (value & 0xff);
*(*cpp)++ = (char) ((value >>= 8) & 0xff);
*(*cpp)++ = (char) ((value >>= 8) & 0xff);
*(*cpp)++ = (char) ((value >>= 8) & 0xff);
#endif
break; break;
default: default:

View File

@ -53,12 +53,12 @@ static const struct locale_data * *const _nl_current[] =
/* Array indexed by category of pointers to _nl_C_CATEGORY slots. /* Array indexed by category of pointers to _nl_C_CATEGORY slots.
Elements are zero for categories whose data is never used. */ Elements are zero for categories whose data is never used. */
const struct locale_data *const _nl_C[] = const struct locale_data *const _nl_C[] =
{ {
#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ #define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \
[category] = &_nl_C_##category, [category] = &_nl_C_##category,
#include "categories.def" #include "categories.def"
#undef DEFINE_CATEGORY #undef DEFINE_CATEGORY
}; };
/* Define an array of category names (also the environment variable names), /* Define an array of category names (also the environment variable names),
@ -169,11 +169,8 @@ new_composite_name (int category, char *newnames[LC_ALL])
return (char *) _nl_C_name; return (char *) _nl_C_name;
new = malloc (last_len + 1); new = malloc (last_len + 1);
if (new == NULL)
return NULL;
memcpy (new, newnames[0], last_len + 1); return new == NULL ? NULL : memcpy (new, newnames[0], last_len + 1);
return new;
} }
new = malloc (cumlen); new = malloc (cumlen);

View File

@ -57,10 +57,12 @@ struct ttyent {
#include <sys/cdefs.h> #include <sys/cdefs.h>
__BEGIN_DECLS __BEGIN_DECLS
struct ttyent *getttyent __P((void));
struct ttyent *getttynam __P((const char *)); struct ttyent *getttyent __P ((void));
int setttyent __P((void)); struct ttyent *getttynam __P ((__const char *));
int endttyent __P((void)); int setttyent __P ((void));
int endttyent __P ((void));
__END_DECLS __END_DECLS
#endif /* !_TTYENT_H_ */ #endif /* !_TTYENT_H_ */

View File

@ -16,18 +16,19 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave, not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */ Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
#include <error.h>
#include <libintl.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
struct conf struct conf
{ {
CONST char *name; const char *name;
CONST int call_name; const int call_name;
CONST enum { SYSCONF, CONFSTR, PATHCONF } call; const enum { SYSCONF, CONFSTR, PATHCONF } call;
}; };
static struct conf vars[] = static struct conf vars[] =
@ -82,31 +83,43 @@ static struct conf vars[] =
{ "_POSIX_PII_OSI_CLTS", _SC_PII_OSI_CLTS, SYSCONF }, { "_POSIX_PII_OSI_CLTS", _SC_PII_OSI_CLTS, SYSCONF },
{ "_POSIX_PII_OSI_M", _SC_PII_OSI_M, SYSCONF }, { "_POSIX_PII_OSI_M", _SC_PII_OSI_M, SYSCONF },
{ "_T_IOV_MAX", _SC_T_IOV_MAX, SYSCONF }, { "_T_IOV_MAX", _SC_T_IOV_MAX, SYSCONF },
/* POSIX.2 */
{ "BC_BASE_MAX", _SC_BC_BASE_MAX, SYSCONF },
{ "BC_DIM_MAX", _SC_BC_DIM_MAX, SYSCONF },
{ "BC_SCALE_MAX", _SC_BC_SCALE_MAX, SYSCONF },
{ "BC_STRING_MAX", _SC_BC_STRING_MAX, SYSCONF },
{ "COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX, SYSCONF },
{ "EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX, SYSCONF },
{ "EXPR_NEST_MAX", _SC_EXPR_NEST_MAX, SYSCONF },
{ "LINE_MAX", _SC_LINE_MAX, SYSCONF },
{ "RE_DUP_MAX", _SC_RE_DUP_MAX, SYSCONF },
{ "CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX },
{ "POSIX2_C_BIND", _SC_2_C_BIND, SYSCONF },
{ "POSIX2_C_DEV", _SC_2_C_DEV, SYSCONF },
{ "POSIX2_FORT_DEV", _SC_2_FORT_DEV, SYSCONF },
{ "POSIX2_FORT_RUN", _SC_2_FORT_RUN, SYSCONF },
{ "POSIX2_LOCALEDEF", _SC_2_LOCALEDEF, SYSCONF },
{ "POSIX2_SW_DEV", _SC_2_SW_DEV, SYSCONF },
{ "PATH", _CS_PATH, CONFSTR }, { "PATH", _CS_PATH, CONFSTR },
{ NULL, 0, SYSCONF } { NULL, 0, SYSCONF }
}; };
static CONST char *program; extern const char *__progname;
static void static void
DEFUN_VOID(usage) usage (void)
{ {
fprintf (stderr, _("Usage: %s variable_name [pathname]\n"), program); fprintf (stderr, _("Usage: %s variable_name [pathname]\n"), __progname);
exit (2); exit (2);
} }
int int
DEFUN(main, (argc, argv), int argc AND char **argv) main (int argc, char *argv[])
{ {
register CONST struct conf *c; register const struct conf *c;
program = strrchr (argv[0], '/');
if (program == NULL)
program = argv[0];
else
++program;
if (argc < 2 || argc > 3) if (argc < 2 || argc > 3)
usage (); usage ();
@ -124,11 +137,8 @@ DEFUN(main, (argc, argv), int argc AND char **argv)
usage (); usage ();
value = pathconf (argv[2], c->call_name); value = pathconf (argv[2], c->call_name);
if (value == -1) if (value == -1)
{ error (3, errno, "pathconf: %s", argv[2]);
fprintf (stderr, "%s: pathconf: %s: %s\n",
program, argv[2], strerror (errno));
exit (3);
}
printf ("%ld\n", value); printf ("%ld\n", value);
exit (0); exit (0);
@ -145,22 +155,17 @@ DEFUN(main, (argc, argv), int argc AND char **argv)
clen = confstr (c->call_name, (char *) NULL, 0); clen = confstr (c->call_name, (char *) NULL, 0);
cvalue = (char *) malloc (clen); cvalue = (char *) malloc (clen);
if (cvalue == NULL) if (cvalue == NULL)
{ error (3, 0, _("memory exhausted"));
fprintf (stderr, "%s: malloc: %s\n",
program, strerror (errno));
exit (3);
}
if (confstr (c->call_name, cvalue, clen) != clen) if (confstr (c->call_name, cvalue, clen) != clen)
{ error (3, errno, "confstr");
fprintf (stderr, "%s: confstr: %s\n",
program, strerror (errno));
exit (3);
}
printf ("%.*s\n", (int) clen, cvalue); printf ("%.*s\n", (int) clen, cvalue);
exit (0); exit (0);
} }
} }
fprintf (stderr, _("%s: Unrecognized variable `%s'\n"), program, argv[1]); error (2, 0, _("Unrecognized variable `%s'"), argv[1]);
exit (2); /* NOTREACHED */
return 2;
} }

View File

@ -34,8 +34,14 @@ Cambridge, MA 02139, USA. */
#define _POSIX2_BC_STRING_MAX 1000 #define _POSIX2_BC_STRING_MAX 1000
/* The maximum number of weights that can be assigned to an entry of /* The maximum number of weights that can be assigned to an entry of
the LC_COLLATE category `order' keyword in a locale definition. */ the LC_COLLATE `order' keyword in the locale definition file.
#define _POSIX2_EQUIV_CLASS_MAX 2 We have no fixed limit, 255 is very high. */
#define _POSIX2_COLL_WEIGHTS_MAX 255
/* The maximum number of weights that can be assigned to an entry of
the LC_COLLATE category `order' keyword in a locale definition.
We have no fixed limit, 255 is a high number. */
#define _POSIX2_EQUIV_CLASS_MAX 255
/* The maximum number of expressions that can be nested /* The maximum number of expressions that can be nested
within parentheses by the `expr' utility. */ within parentheses by the `expr' utility. */
@ -48,8 +54,9 @@ Cambridge, MA 02139, USA. */
permitted when using the interval notation `\{M,N\}'. */ permitted when using the interval notation `\{M,N\}'. */
#define _POSIX2_RE_DUP_MAX 255 #define _POSIX2_RE_DUP_MAX 255
/* The manimum number of bytes in a character class name. */ /* The maximum number of bytes in a character class name. We have no
#define _POSIX2_CHARCLASS_NAME_MAX 14 fixed limit, 2048 is a high number. */
#define _POSIX2_CHARCLASS_NAME_MAX 2048
/* These values are implementation-specific, /* These values are implementation-specific,
@ -68,6 +75,9 @@ Cambridge, MA 02139, USA. */
#ifndef BC_STRING_MAX #ifndef BC_STRING_MAX
#define BC_STRING_MAX _POSIX2_BC_STRING_MAX #define BC_STRING_MAX _POSIX2_BC_STRING_MAX
#endif #endif
#ifndef COLL_WEIGHTS_MAX
#define COLL_WEIGHTS_MAX _POSIX2_COLL_WEIGHTS_MAX
#endif
#ifndef EQUIV_CLASS_MAX #ifndef EQUIV_CLASS_MAX
#define EQUIV_CLASS_MAX _POSIX2_EQUIV_CLASS_MAX #define EQUIV_CLASS_MAX _POSIX2_EQUIV_CLASS_MAX
#endif #endif

View File

@ -216,7 +216,7 @@ extern unsigned int sleep __P ((unsigned int __seconds));
#ifdef __USE_BSD #ifdef __USE_BSD
/* Sleep USECONDS microseconds, or until a signal arrives that is not blocked /* Sleep USECONDS microseconds, or until a signal arrives that is not blocked
or ignored. Return value is not necessarily useful. */ or ignored. Return value is not necessarily useful. */
extern unsigned int usleep __P ((unsigned __useconds)); extern unsigned int usleep __P ((unsigned int __useconds));
#endif #endif
@ -270,7 +270,7 @@ extern char *get_current_dir_name __P ((void));
NULL, an array is allocated with `malloc'; the array is SIZE bytes long, NULL, an array is allocated with `malloc'; the array is SIZE bytes long,
unless SIZE <= 0, in which case it is as big as necessary. */ unless SIZE <= 0, in which case it is as big as necessary. */
char *__canonicalize_directory_name_internal __P ((const char *__thisdir, char *__canonicalize_directory_name_internal __P ((__const char *__thisdir,
char *__buf, char *__buf,
size_t __size)); size_t __size));
#endif #endif
@ -307,7 +307,7 @@ extern int execve __P ((__const char *__path, char *__const __argv[],
/* Execute the file FD refers to, overlaying the running program image. /* Execute the file FD refers to, overlaying the running program image.
ARGV and ENVP are passed to the new program, as for `execve'. */ ARGV and ENVP are passed to the new program, as for `execve'. */
extern int fexecve __P ((int __fd, extern int fexecve __P ((int __fd,
char *const __argv[], char *const __envp[])); char *__const __argv[], char *__const __envp[]));
#endif #endif
@ -317,11 +317,11 @@ extern int execv __P ((__const char *__path, char *__const __argv[]));
/* Execute PATH with all arguments after PATH until a NULL pointer, /* Execute PATH with all arguments after PATH until a NULL pointer,
and the argument after that for environment. */ and the argument after that for environment. */
extern int execle __P ((__const char *__path, __const char *__arg,...)); extern int execle __P ((__const char *__path, __const char *__arg, ...));
/* Execute PATH with all arguments after PATH until /* Execute PATH with all arguments after PATH until
a NULL pointer and environment from `environ'. */ a NULL pointer and environment from `environ'. */
extern int execl __P ((__const char *__path, __const char *__arg,...)); extern int execl __P ((__const char *__path, __const char *__arg, ...));
/* Execute FILE, searching in the `PATH' environment variable if it contains /* Execute FILE, searching in the `PATH' environment variable if it contains
no slashes, with arguments ARGV and environment from `environ'. */ no slashes, with arguments ARGV and environment from `environ'. */
@ -415,7 +415,7 @@ extern __pid_t setsid __P ((void));
#ifdef __USE_GNU #ifdef __USE_GNU
/* Return the session ID of the given process. */ /* Return the session ID of the given process. */
extern __pid_t getsid __P ((__pid_t)); extern __pid_t getsid __P ((__pid_t __pid));
#endif #endif
/* Get the real user ID of the calling process. */ /* Get the real user ID of the calling process. */
@ -659,7 +659,7 @@ extern int sync __P ((void));
extern int vhangup __P ((void)); extern int vhangup __P ((void));
/* Revoke the access of all descriptors currently open on FILE. */ /* Revoke the access of all descriptors currently open on FILE. */
extern int revoke __P ((const char *__file)); extern int revoke __P ((__const char *__file));
/* Enable statistical profiling, writing samples of the PC into at most /* Enable statistical profiling, writing samples of the PC into at most
@ -689,7 +689,7 @@ extern void setusershell __P ((void)); /* Rewind and re-read the file. */
/* Prompt with PROMPT and read a string from the terminal without echoing. /* Prompt with PROMPT and read a string from the terminal without echoing.
Uses /dev/tty if possible; otherwise stderr and stdin. */ Uses /dev/tty if possible; otherwise stderr and stdin. */
extern char *getpass __P ((const char *__prompt)); extern char *getpass __P ((__const char *__prompt));
/* Put the program in the background, and dissociate from the controlling /* Put the program in the background, and dissociate from the controlling
terminal. If NOCHDIR is zero, do `chdir ("/")'. If NOCLOSE is zero, terminal. If NOCHDIR is zero, do `chdir ("/")'. If NOCLOSE is zero,
@ -770,10 +770,11 @@ extern int lockf __P ((int __fd, int __cmd, __off_t __len));
set to EINTR. */ set to EINTR. */
#define TEMP_FAILURE_RETRY(expression) \ #define TEMP_FAILURE_RETRY(expression) \
({ long int __result; \ (__extension__ \
({ long int __result; \
do __result = (long int) (expression); \ do __result = (long int) (expression); \
while (__result == -1L && errno == EINTR); \ while (__result == -1L && errno == EINTR); \
__result; }) __result; })) \
#endif #endif

View File

@ -194,8 +194,8 @@ extern __inline long int atol (__const char *__nptr)
next call. */ next call. */
extern char *l64a __P ((long int __n)); extern char *l64a __P ((long int __n));
/* Read a number from a string in base 64 as above. */ /* Read a number from a string S in base 64 as above. */
extern long int a64l __P ((const char *)); extern long int a64l __P ((__const char *__s));
#endif #endif
@ -457,12 +457,12 @@ extern lldiv_t lldiv __P ((long long int __numer, long long int __denom)) __attr
/* Convert VALUE to a string with NDIGIT digits and return a pointer to /* Convert VALUE to a string with NDIGIT digits and return a pointer to
this. Set *DECPT with the position of the decimal character and *SIGN this. Set *DECPT with the position of the decimal character and *SIGN
with the sign of the number. */ with the sign of the number. */
char *ecvt __P ((double __value, int __ndigit, int *__decpt, int *sign)); char *ecvt __P ((double __value, int __ndigit, int *__decpt, int *__sign));
/* Convert VALUE to a string rounded to NDIGIT decimal digits. Set *DECPT /* Convert VALUE to a string rounded to NDIGIT decimal digits. Set *DECPT
with the position of the decimal character and *SIGN with the sign of with the position of the decimal character and *SIGN with the sign of
the number. */ the number. */
char *fcvt __P ((double __value, int __ndigit, int *__decpt, int *sign)); char *fcvt __P ((double __value, int __ndigit, int *__decpt, int *__sign));
/* If possible convert VALUE to a string with NDIGIT significant digits. /* If possible convert VALUE to a string with NDIGIT significant digits.
Otherwise use exponential representation. The resulting string will Otherwise use exponential representation. The resulting string will
@ -471,24 +471,24 @@ char *gcvt __P ((double __value, int __ndigit, char *__buf));
/* Long double versions of above functions. */ /* Long double versions of above functions. */
char *qecvt __P ((__long_double_t __value, int __ndigit, int *__decpt, char *qecvt __P ((__long_double_t __value, int __ndigit, int *__decpt,
int *sign)); int *__sign));
char *qfcvt __P ((__long_double_t __value, int __ndigit, int *__decpt, char *qfcvt __P ((__long_double_t __value, int __ndigit, int *__decpt,
int *sign)); int *__sign));
char *qgcvt __P ((__long_double_t __value, int __ndigit, char *__buf)); char *qgcvt __P ((__long_double_t __value, int __ndigit, char *__buf));
#ifdef __USE_REENTRANT #ifdef __USE_REENTRANT
/* Reentrant version of the functions above which provide their own /* Reentrant version of the functions above which provide their own
buffers. */ buffers. */
int ecvt_r __P ((double __value, int __ndigit, int *__decpt, int *sign, int ecvt_r __P ((double __value, int __ndigit, int *__decpt, int *__sign,
char *__buf, size_t __len)); char *__buf, size_t __len));
int fcvt_r __P ((double __value, int __ndigit, int *__decpt, int *sign, int fcvt_r __P ((double __value, int __ndigit, int *__decpt, int *__sign,
char *__buf, size_t __len)); char *__buf, size_t __len));
int qecvt_r __P ((__long_double_t __value, int __ndigit, int *__decpt, int qecvt_r __P ((__long_double_t __value, int __ndigit, int *__decpt,
int *sign, char *__buf, size_t __len)); int *__sign, char *__buf, size_t __len));
int qfcvt_r __P ((__long_double_t __value, int __ndigit, int *__decpt, int qfcvt_r __P ((__long_double_t __value, int __ndigit, int *__decpt,
int *sign, char *__buf, size_t __len)); int *__sign, char *__buf, size_t __len));
#endif #endif
#endif #endif
@ -498,7 +498,7 @@ int qfcvt_r __P ((__long_double_t __value, int __ndigit, int *__decpt,
extern int mblen __P ((__const char *__s, size_t __n)); extern int mblen __P ((__const char *__s, size_t __n));
/* Return the length of the given multibyte character, /* Return the length of the given multibyte character,
putting its `wchar_t' representation in *PWC. */ putting its `wchar_t' representation in *PWC. */
extern int mbtowc __P ((wchar_t * __pwc, __const char *__s, size_t __n)); extern int mbtowc __P ((wchar_t *__pwc, __const char *__s, size_t __n));
/* Put the multibyte character represented /* Put the multibyte character represented
by WCHAR in S, returning its length. */ by WCHAR in S, returning its length. */
extern int wctomb __P ((char *__s, wchar_t __wchar)); extern int wctomb __P ((char *__s, wchar_t __wchar));
@ -510,9 +510,9 @@ extern __inline int mblen (__const char *__s, size_t __n)
/* Convert a multibyte string to a wide char string. */ /* Convert a multibyte string to a wide char string. */
extern size_t mbstowcs __P ((wchar_t * __pwcs, __const char *__s, size_t __n)); extern size_t mbstowcs __P ((wchar_t *__pwcs, __const char *__s, size_t __n));
/* Convert a wide char string to multibyte string. */ /* Convert a wide char string to multibyte string. */
extern size_t wcstombs __P ((char *__s, __const wchar_t * __pwcs, size_t __n)); extern size_t wcstombs __P ((char *__s, __const wchar_t *__pwcs, size_t __n));
#ifdef __USE_SVID #ifdef __USE_SVID

View File

@ -89,30 +89,32 @@ extern char *__strdup __P ((__const char *__s));
extern char *strdup __P ((__const char *__s)); extern char *strdup __P ((__const char *__s));
#endif #endif
#if defined (__USE_GNU) && defined (__GNUC__)
/* Duplicate S, returning an identical alloca'd string. */
#define strdupa(s) \
({ \
__const char *__old = (s); \
size_t __len = strlen (__old) + 1; \
memcpy (__builtin_alloca (__len), __old, __len); \
})
/* Return a malloc'd copy of at most N bytes of STRING. The /* Return a malloc'd copy of at most N bytes of STRING. The
resultant string is terminated even if no null terminator resultant string is terminated even if no null terminator
appears before STRING[N]. */ appears before STRING[N]. */
extern char *strndup __P ((__const char *__string, size_t __n)); extern char *strndup __P ((__const char *__string, size_t __n));
#if defined (__USE_GNU) && defined (__GNUC__)
/* Duplicate S, returning an identical alloca'd string. */
#define strdupa(s) \
(__extension__ \
({ \
__const char *__old = (s); \
size_t __len = strlen (__old) + 1; \
char *__new = __builtin_alloca (__len); \
memcpy (__new, __old, __len); \
}))
/* Return an alloca'd copy of at most N bytes of string. */ /* Return an alloca'd copy of at most N bytes of string. */
#define strndupa(s, n) \ #define strndupa(s, n) \
({ \ (__extension__ \
__const char *__old = (s); \ ({ \
char *__new; \ __const char *__old = (s); \
size_t __len = strnlen (__old, (n)); \ size_t __len = strnlen (__old, (n)); \
__new = memcpy (__builtin_alloca (__len + 1), __old, __len); \ char *__new = __builtin_alloca (__len + 1); \
__new[__len] = '\0'; \ __new[__len] = '\0'; \
__new; \ memcpy (__new, __old, __len); \
}) }))
#endif #endif
/* Find the first occurrence of C in S. */ /* Find the first occurrence of C in S. */
@ -231,7 +233,7 @@ extern __ptr_t memfrob __P ((__ptr_t __s, size_t __n));
#ifdef __USE_MISC #ifdef __USE_MISC
/* Return the file name within directory of FILENAME. */ /* Return the file name within directory of FILENAME. */
extern char *basename __P ((__const char *filename)); extern char *basename __P ((__const char *__filename));
#endif #endif
__END_DECLS __END_DECLS

View File

@ -112,6 +112,7 @@ enum
#define _SC_VERSION _SC_VERSION #define _SC_VERSION _SC_VERSION
_SC_PAGESIZE, _SC_PAGESIZE,
#define _SC_PAGESIZE _SC_PAGESIZE #define _SC_PAGESIZE _SC_PAGESIZE
#define _SC_PAGE_SIZE _SC_PAGESIZE
_SC_RTSIG_MAX, _SC_RTSIG_MAX,
#define _SC_RTSIG_MAX _SC_RTSIG_MAX #define _SC_RTSIG_MAX _SC_RTSIG_MAX
_SC_SEM_NSEMS_MAX, _SC_SEM_NSEMS_MAX,

View File

@ -16,7 +16,6 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave, not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */ Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <errno.h> #include <errno.h>
#include <limits.h> #include <limits.h>
#include <unistd.h> #include <unistd.h>
@ -24,12 +23,13 @@ Cambridge, MA 02139, USA. */
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
extern int EXFUN(__getdtablesize, (NOARGS)); extern int __getdtablesize __P ((void));
extern size_t EXFUN(__getpagesize, (NOARGS)); extern size_t __getpagesize __P ((void));
/* Get the value of the system variable NAME. */ /* Get the value of the system variable NAME. */
long int long int
DEFUN(__sysconf, (name), int name) __sysconf (name)
int name;
{ {
switch (name) switch (name)
{ {
@ -301,6 +301,13 @@ DEFUN(__sysconf, (name), int name)
return -1; return -1;
#endif #endif
case _SC_COLL_WEIGHTS_MAX:
#ifdef COLL_WEIGHTS_MAX
return COLL_WEIGHTS_MAX;
#else
return -1;
#endif
case _SC_EQUIV_CLASS_MAX: case _SC_EQUIV_CLASS_MAX:
#ifdef EQUIV_CLASS_MAX #ifdef EQUIV_CLASS_MAX
return EQUIV_CLASS_MAX; return EQUIV_CLASS_MAX;

View File

@ -16,7 +16,6 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave, not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */ Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <time.h> #include <time.h>
@ -25,7 +24,8 @@ Cambridge, MA 02139, USA. */
/* Get the value of the system variable NAME. */ /* Get the value of the system variable NAME. */
long int long int
DEFUN(__sysconf, (name), int name) __sysconf (name)
int name;
{ {
switch (name) switch (name)
{ {
@ -36,11 +36,40 @@ DEFUN(__sysconf, (name), int name)
case _SC_TZNAME_MAX: case _SC_TZNAME_MAX:
return __tzname_max (); return __tzname_max ();
case _SC_CHARCLASS_NAME_MAX:
#ifdef CHARCLASS_NAME_MAX
return CHARCLASS_NAME_MAX;
#else
return -1;
#endif
case _SC_COLL_WEIGHTS_MAX:
#ifdef COLL_WEIGHTS_MAX
return COLL_WEIGHTS_MAX;
#else
return -1;
#endif
case _SC_EQUIV_CLASS_MAX:
#ifdef EQUIV_CLASS_MAX
return EQUIV_CLASS_MAX;
#else
return -1;
#endif
case _SC_2_LOCALEDEF:
#ifdef _POSIX2_LOCALEDEF
return _POSIX2_LOCALEDEF;
#else
return -1;
#endif
case _SC_ARG_MAX: case _SC_ARG_MAX:
case _SC_CHILD_MAX: case _SC_CHILD_MAX:
case _SC_CLK_TCK: case _SC_CLK_TCK:
case _SC_NGROUPS_MAX: case _SC_NGROUPS_MAX:
case _SC_OPEN_MAX: case _SC_OPEN_MAX:
case _SC_STREAM_MAX:
case _SC_JOB_CONTROL: case _SC_JOB_CONTROL:
case _SC_SAVED_IDS: case _SC_SAVED_IDS:
case _SC_REALTIME_SIGNALS: case _SC_REALTIME_SIGNALS:
@ -57,7 +86,20 @@ DEFUN(__sysconf, (name), int name)
case _SC_MESSAGE_PASSING: case _SC_MESSAGE_PASSING:
case _SC_SEMAPHORES: case _SC_SEMAPHORES:
case _SC_SHARED_MEMORY_OBJECTS: case _SC_SHARED_MEMORY_OBJECTS:
case _SC_AIO_LIST_MAX:
case _SC_AIO_MAX:
case _SC_AIO_PRIO_DELTA_MAX:
case _SC_DELAYTIME_MAX:
case _SC_MQ_OPEN_MAX:
case _SC_MQ_PRIO_MAX:
case _SC_VERSION: case _SC_VERSION:
case _SC_PAGESIZE:
case _SC_RTSIG_MAX:
case _SC_SEM_NSEMS_MAX:
case _SC_SEM_VALUE_MAX:
case _SC_SIGQUEUE_MAX:
case _SC_TIMER_MAX:
case _SC_PII: case _SC_PII:
case _SC_PII_XTI: case _SC_PII_XTI:
@ -77,11 +119,9 @@ DEFUN(__sysconf, (name), int name)
case _SC_BC_DIM_MAX: case _SC_BC_DIM_MAX:
case _SC_BC_SCALE_MAX: case _SC_BC_SCALE_MAX:
case _SC_BC_STRING_MAX: case _SC_BC_STRING_MAX:
case _SC_EQUIV_CLASS_MAX:
case _SC_EXPR_NEST_MAX: case _SC_EXPR_NEST_MAX:
case _SC_LINE_MAX: case _SC_LINE_MAX:
case _SC_RE_DUP_MAX: case _SC_RE_DUP_MAX:
case _SC_CHARCLASS_NAME_MAX:
case _SC_2_VERSION: case _SC_2_VERSION:
case _SC_2_C_BIND: case _SC_2_C_BIND:
case _SC_2_C_DEV: case _SC_2_C_DEV:

View File

@ -8,7 +8,7 @@ test $stdio = default && stdio=libio
inhibit_glue=yes inhibit_glue=yes
echo $ac_n "checking installed Linux kernel header files""... $ac_c" 1>&6 echo $ac_n "checking installed Linux kernel header files""... $ac_c" 1>&6
if eval "test \"`echo '$''{'libc_cv_linux201'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_linux203'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
@ -17,28 +17,29 @@ else
#include <linux/version.h> #include <linux/version.h>
int main() { return 0; } int main() { return 0; }
int t() { int t() {
#if LINUX_VERSION_CODE < (2 *65536+ 0 *256+ 1) /* 2.0.1 */ #if LINUX_VERSION_CODE < (2 *65536+ 0 *256+ 3) /* 2.0.3 */
eat flaming death eat flaming death
#endif #endif
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:26: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:26: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
libc_cv_linux201='2.0.1 or later' libc_cv_linux203='2.0.3 or later'
else else
rm -rf conftest* rm -rf conftest*
libc_cv_linux201='TOO OLD!' libc_cv_linux203='TOO OLD!'
fi fi
rm -f conftest* rm -f conftest*
fi fi
echo "$ac_t""$libc_cv_linux201" 1>&6 echo "$ac_t""$libc_cv_linux203" 1>&6
if test "$libc_cv_linux201" != '2.0.1 or later'; then if test "$libc_cv_linux203" != '2.0.3 or later'; then
{ echo "configure: error: GNU libc requires kernel header files from Linux 2.0.1 { echo "configure: error: GNU libc requires kernel header files from
or later to be installed before configuring. The kernel header files Linux 2.0.3 or later to be installed before configuring.
are found usually in /usr/include/asm and /usr/include/linux; make sure The kernel header files are found usually in /usr/include/asm and
these directories use files from Linux 2.0.1 or later. This check uses /usr/include/linux; make sure these directories use files from
<linux/version.h>, so make sure that file was built correctly when Linux 2.0.3 or later. This check uses <linux/version.h>, so
installing the kernel header files." 1>&2; exit 1; } make sure that file was built correctly when installing the kernel header
files." 1>&2; exit 1; }
fi fi

View File

@ -29,6 +29,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
wmemcmp wmemcpy wmemmove wmemset wcpcpy wcpncpy \ wmemcmp wmemcpy wmemmove wmemset wcpcpy wcpncpy \
btowc wctob mbsinit \ btowc wctob mbsinit \
mbrlen mbrtowc wcrtomb mbsrtowcs wcsrtombs \ mbrlen mbrtowc wcrtomb mbsrtowcs wcsrtombs \
mbsnrtowcs wcsnrtombs \
wcstol wcstoul wcstoq wcstouq wcstod wcstold wcstof \ wcstol wcstoul wcstoq wcstouq wcstod wcstold wcstof \
wcscoll wcsxfrm \ wcscoll wcsxfrm \
wcwidth wcswidth wcwidth wcswidth

143
wcsmbs/mbsnrtowcs.c Normal file
View File

@ -0,0 +1,143 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <wchar.h>
#ifndef EILSEQ
#define EILSEQ EINVAL
#endif
/* We don't need the state really because we don't have shift states
to maintain between calls to this function. */
static mbstate_t internal;
/* This is a non-standard function but it is very useful in the
implementation of stdio because we have to deal with unterminated
buffers. At most NMC bytes will be converted. */
size_t
__mbsnrtowcs (dst, src, nmc, len, ps)
wchar_t *dst;
const char **src;
size_t nmc;
size_t len;
mbstate_t *ps;
{
size_t written = 0;
const char *run = *src;
const char *last = run + nmc;
if (ps == NULL)
ps = &internal;
if (dst == NULL)
/* The LEN parameter has to be ignored if we don't actually write
anything. */
len = ~0;
/* Copy all words. */
while (written < len && run < last)
{
wchar_t value;
size_t count;
unsigned char byte = *run++;
/* We expect a start of a new multibyte character. */
if (byte < 0x80)
{
/* One byte sequence. */
count = 0;
value = byte;
}
else if ((byte & 0xe0) == 0xc0)
{
count = 1;
value = byte & 0x1f;
}
else if ((byte & 0xf0) == 0xe0)
{
/* We expect three bytes. */
count = 2;
value = byte & 0x0f;
}
else if ((byte & 0xf8) == 0xf0)
{
/* We expect four bytes. */
count = 3;
value = byte & 0x07;
}
else if ((byte & 0xfc) == 0xf8)
{
/* We expect five bytes. */
count = 4;
value = byte & 0x03;
}
else if ((byte & 0xfe) == 0xfc)
{
/* We expect six bytes. */
count = 5;
value = byte & 0x01;
}
else
{
/* This is an illegal encoding. */
errno = EILSEQ;
return (size_t) -1;
}
/* Read the possible remaining bytes. */
while (count-- > 0)
{
byte = *run++;
if ((byte & 0xc0) != 0x80)
{
/* This is an illegal encoding. */
errno = EILSEQ;
return (size_t) -1;
}
value <<= 6;
value |= byte & 0x3f;
}
/* Store value is required. */
if (dst != NULL)
*dst++ = value;
/* The whole sequence is read. Check whether end of string is
reached. */
if (value == L'\0')
{
/* Found the end of the string. */
*src = NULL;
return written;
}
/* Increment counter of produced words. */
++written;
}
/* Store address of next byte to process. */
*src = run;
return written;
}
weak_alias (__mbsnrtowcs, mbsnrtowcs)

View File

@ -131,7 +131,7 @@ extern wchar_t *wmemcpy __P ((wchar_t *__s1, __const wchar_t *__s2,
/* Copy N bytes of SRC to DEST, guaranteeing /* Copy N bytes of SRC to DEST, guaranteeing
correct behavior for overlapping strings. */ correct behavior for overlapping strings. */
extern wchar_t *wmemmove __P ((wchar_t *__s1, __const wchar_t *__s2, extern wchar_t *wmemmove __P ((wchar_t *__s1, __const wchar_t *__s2,
size_t __N)); size_t __n));
/* Set N bytes of S to C. */ /* Set N bytes of S to C. */
extern wchar_t *wmemset __P ((wchar_t *__s, wchar_t __c, size_t __n)); extern wchar_t *wmemset __P ((wchar_t *__s, wchar_t __c, size_t __n));
@ -168,8 +168,8 @@ extern __inline size_t mbrlen (__const char *s, size_t n, mbstate_t *ps)
{ return ps != NULL ? mbrtowc (NULL, s, n, ps) : __mbrlen (s, n, NULL); } { return ps != NULL ? mbrtowc (NULL, s, n, ps) : __mbrlen (s, n, NULL); }
#endif #endif
/* Write wide character representation of multibyte chracter string SRC /* Write wide character representation of multibyte character string
to DST. */ SRC to DST. */
extern size_t mbsrtowcs __P ((wchar_t *__dst, __const char **__src, extern size_t mbsrtowcs __P ((wchar_t *__dst, __const char **__src,
size_t __len, mbstate_t *__ps)); size_t __len, mbstate_t *__ps));
@ -180,6 +180,21 @@ extern size_t wcsrtombs __P ((char *__dst, __const wchar_t **__src,
#ifdef __USE_GNU #ifdef __USE_GNU
/* Write wide character representation of at most NMC bytes of the
multibyte character string SRC to DST. */
extern size_t __mbsnrtowcs __P ((wchar_t *__dst, __const char **__src,
size_t __nmc, size_t __len, mbstate_t *__ps));
extern size_t mbsnrtowcs __P ((wchar_t *__dst, __const char **__src,
size_t __nmc, size_t __len, mbstate_t *__ps));
/* Write multibyte character representation of at most NWC characters
from the wide character string SRC to DST. */
extern size_t __wcsnrtombs __P ((char *__dst, __const wchar_t **__src,
size_t __nwc, size_t __len, mbstate_t *__ps));
extern size_t wcsnrtombs __P ((char *__dst, __const wchar_t **__src,
size_t __nwc, size_t __len, mbstate_t *__ps));
/* The following functions are extensions found in X/Open CAE. */ /* The following functions are extensions found in X/Open CAE. */
/* Determine number of column positions required for C. */ /* Determine number of column positions required for C. */
@ -229,11 +244,11 @@ extern unsigned long long int wcstouq __P ((__const wchar_t *__nptr,
/* The internal entry points for `wcstoX' take an extra flag argument /* The internal entry points for `wcstoX' take an extra flag argument
saying whether or not to parse locale-dependent number grouping. */ saying whether or not to parse locale-dependent number grouping. */
extern double __wcstod_internal __P ((__const wchar_t *__nptr, extern double __wcstod_internal __P ((__const wchar_t *__nptr,
wchar_t **_endptr, int __group)); wchar_t **__endptr, int __group));
extern float __wcstof_internal __P ((__const wchar_t *__nptr, extern float __wcstof_internal __P ((__const wchar_t *__nptr,
wchar_t **_endptr, int __group)); wchar_t **__endptr, int __group));
extern __long_double_t __wcstold_internal __P ((__const wchar_t *__nptr, extern __long_double_t __wcstold_internal __P ((__const wchar_t *__nptr,
wchar_t **_endptr, wchar_t **__endptr,
int __group)); int __group));
extern long int __wcstol_internal __P ((__const wchar_t *__nptr, extern long int __wcstol_internal __P ((__const wchar_t *__nptr,

129
wcsmbs/wcsnrtombs.c Normal file
View File

@ -0,0 +1,129 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <wchar.h>
#ifndef EILSEQ
#define EILSEQ EINVAL
#endif
static const wchar_t encoding_mask[] =
{
~0x7ff, ~0xffff, ~0x1fffff, ~0x3ffffff
};
static const unsigned char encoding_byte[] =
{
0xc0, 0xe0, 0xf0, 0xf8, 0xfc
};
/* We don't need the state really because we don't have shift states
to maintain between calls to this function. */
static mbstate_t internal;
/* This is a non-standard function but it is very useful in the
implementation of stdio because we have to deal with unterminated
buffers. At most NWC wide character will be converted. */
size_t
__wcsnrtombs (dst, src, nwc, len, ps)
char *dst;
const wchar_t **src;
size_t nwc;
size_t len;
mbstate_t *ps;
{
size_t written = 0;
const wchar_t *run = *src;
if (ps == NULL)
ps = &internal;
if (dst == NULL)
/* The LEN parameter has to be ignored if we don't actually write
anything. */
len = ~0;
while (written < len && nwc-- > 0)
{
wchar_t wc = *run++;
if (wc < 0 || wc > 0x7fffffff)
{
/* This is no correct ISO 10646 character. */
errno = EILSEQ;
return (size_t) -1;
}
if (wc == L'\0')
{
/* Found the end. */
if (dst != NULL)
*dst = '\0';
*src = NULL;
return written;
}
else if (wc < 0x80)
{
/* It's an one byte sequence. */
if (dst != NULL)
*dst++ = (char) wc;
++written;
}
else
{
size_t step;
for (step = 2; step < 6; ++step)
if ((wc & encoding_mask[step - 2]) == 0)
break;
if (written + step >= len)
/* Too long. */
break;
if (dst != NULL)
{
size_t cnt = step;
dst[0] = encoding_byte[cnt - 2];
--cnt;
do
{
dst[cnt] = 0x80 | (wc & 0x3f);
wc >>= 6;
}
while (--cnt > 0);
dst[0] |= wc;
dst += step;
}
written += step;
}
}
/* Store position of first unprocessed word. */
*src = run;
return written;
}
weak_alias (__wcsnrtombs, wcsnrtombs)