* gnulib/Makefile (tests): Add tst-gcc.
	* gnulib/tst-gcc.c: New file.

	* assert/Makefile (routines): Add __assert.
	* assert/Versions: Export __assert for glibc 2.2.
	* assert/__assert.c: New file.
	* assert/assert.h: Declare __assert.

2000-07-27  Bruno Haible  <haible@clisp.cons.org>

	* locale/localeinfo.h (_ISCTYPE): New macro.
	* posix/fnmatch_loop.c (internal_fnmatch): Use it, support new
	LC_CTYPE locale format.
	* locale/programs/ld-ctype.c (locale_ctype_t): New field class_b.
	(ctype_output): Output class_b[nr] right before class_3level[nr].
	(allocate_arrays): Fill class_b, similarly to class_3level.

2000-08-01  Ulrich Drepper  <drepper@redhat.com>
This commit is contained in:
Ulrich Drepper 2000-08-02 00:09:25 +00:00
parent 925e31d9c2
commit 8fb81470d9
10 changed files with 196 additions and 29 deletions

View File

@ -1,3 +1,22 @@
2000-08-01 Ulrich Drepper <drepper@redhat.com>
* gnulib/Makefile (tests): Add tst-gcc.
* gnulib/tst-gcc.c: New file.
* assert/Makefile (routines): Add __assert.
* assert/Versions: Export __assert for glibc 2.2.
* assert/__assert.c: New file.
* assert/assert.h: Declare __assert.
2000-07-27 Bruno Haible <haible@clisp.cons.org>
* locale/localeinfo.h (_ISCTYPE): New macro.
* posix/fnmatch_loop.c (internal_fnmatch): Use it, support new
LC_CTYPE locale format.
* locale/programs/ld-ctype.c (locale_ctype_t): New field class_b.
(ctype_output): Output class_b[nr] right before class_3level[nr].
(allocate_arrays): Fill class_b, similarly to class_3level.
2000-08-01 Ulrich Drepper <drepper@redhat.com>
Joseph S. Myers <jsm28@cam.ac.uk>

View File

@ -22,7 +22,7 @@
subdir := assert
headers := assert.h
routines := assert assert-perr
routines := assert assert-perr __assert
tests := test-assert test-assert-perr
include ../Rules

View File

@ -3,4 +3,8 @@ libc {
# functions used in inline functions or macros
__assert_fail; __assert_perror_fail;
}
GLIBC_2.2 {
# just for standard compliance
__assert;
}
}

25
assert/__assert.c Normal file
View File

@ -0,0 +1,25 @@
/* Copyright (C) 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
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 <assert.h>
void
__assert (const char *assertion, const char *file, int line)
{
__assert_fail (assertion, file, line, (const char *) 0);
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991,92,94,95,96,97,98,99 Free Software Foundation, Inc.
/* Copyright (C) 1991,92,94,95,96,97,98,99,2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -68,6 +68,13 @@ extern void __assert_perror_fail (int __errnum, __const char *__file,
__const char *__function)
__THROW __attribute__ ((__noreturn__));
/* The following is not at all used here but needed for standard
compliance. */
extern void __assert (const char *__assertion, const char *__file, int __line)
__THROW __attribute__ ((__noreturn__));
__END_DECLS
# define assert(expr) \

View File

@ -1,4 +1,4 @@
# Copyright (C) 1991, 1997 Free Software Foundation, Inc.
# Copyright (C) 1991, 1997, 2000 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@ -18,6 +18,9 @@
subdir := gnulib
# Maybe this is the right place for a test of gcc's interface.
tests = tst-gcc
# Which routines are required is machine-dependent.
include ../Rules

74
gnulib/tst-gcc.c Normal file
View File

@ -0,0 +1,74 @@
/* Test program for the gcc interface.
Copyright (C) 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>.
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 <stdio.h>
#define __no_type_class -1
#define __void_type_class 0
#define __integer_type_class 1
#define __char_type_class 2
#define __enumeral_type_class 3
#define __boolean_type_class 4
#define __pointer_type_class 5
#define __reference_type_class 6
#define __offset_type_class 7
#define __real_type_class 8
#define __complex_type_class 9
#define __function_type_class 10
#define __method_type_class 11
#define __record_type_class 12
#define __union_type_class 13
#define __array_type_class 14
#define __string_type_class 15
#define __set_type_class 16
#define __file_type_class 17
#define __lang_type_class 18
#define TEST(var) \
({ int wrong = (__builtin_classify_type (__##var##_type) \
!= __##var##_type_class); \
printf ("%-15s is %d: %s\n", \
#var, __builtin_classify_type (__##var##_type), \
wrong ? "WRONG" : "OK"); \
wrong; \
})
int
main (void)
{
int result = 0;
int __integer_type;
void *__pointer_type;
double __real_type;
__complex__ double __complex_type;
struct { int a; } __record_type;
union { int a; int b; } __union_type;
result |= TEST (integer);
result |= TEST (pointer);
result |= TEST (real);
result |= TEST (complex);
result |= TEST (record);
result |= TEST (union);
return result;
}

View File

@ -130,6 +130,14 @@ enum
};
/* LC_CTYPE specific:
Access a wide character class with a single character index.
_ISCTYPE (c, desc) = iswctype (btowc (c), desc).
c must be an `unsigned char'. desc must be a nonzero wctype_t. */
#define _ISCTYPE(c, desc) \
(((((const uint32_t *) (desc)) - 8)[(c) >> 5] >> ((c) & 0x1f)) & 1)
/* For each category declare the variable for the current locale data. */
#define DEFINE_CATEGORY(category, category_name, items, a) \
extern struct locale_data *_nl_current_##category;

View File

@ -170,6 +170,7 @@ struct locale_ctype_t
uint32_t *names;
uint32_t **map;
uint32_t **map32;
uint32_t **class_b;
struct iovec *class_3level;
struct iovec *map_3level;
uint32_t *class_name_ptr;
@ -842,7 +843,7 @@ ctype_output (struct localedef_t *locale, struct charmap_t *charmap,
+ (oldstyle_tables
? (ctype->map_collection_nr - 2)
: (ctype->nr_charclass + ctype->map_collection_nr)));
struct iovec iov[2 + nelems + ctype->nr_charclass
struct iovec iov[2 + nelems + 2 * ctype->nr_charclass
+ ctype->map_collection_nr + 2];
struct locale_file data;
uint32_t idx[nelems + 1];
@ -1169,6 +1170,12 @@ ctype_output (struct localedef_t *locale, struct charmap_t *charmap,
size_t nr = elem - _NL_ITEM_INDEX (_NL_CTYPE_EXTRA_MAP_1);
if (nr < ctype->nr_charclass)
{
iov[2 + elem + offset].iov_base = ctype->class_b[nr];
iov[2 + elem + offset].iov_len = 256 / 32
* sizeof (uint32_t);
idx[elem] += iov[2 + elem + offset].iov_len;
++offset;
iov[2 + elem + offset] = ctype->class_3level[nr];
}
else
@ -1182,7 +1189,7 @@ ctype_output (struct localedef_t *locale, struct charmap_t *charmap,
}
}
assert (2 + elem + offset == (nelems + ctype->nr_charclass
assert (2 + elem + offset == (nelems + 2 * ctype->nr_charclass
+ ctype->map_collection_nr + 2 + 2));
write_locale_data (output_path, "LC_CTYPE", 2 + elem + offset, iov);
@ -4083,8 +4090,12 @@ Computing table size for character classes might take a while..."),
xcalloc ((oldstyle_tables ? ctype->plane_size * ctype->plane_cnt : 256),
sizeof (char_class32_t));
if (!oldstyle_tables)
{
ctype->class_b = (uint32_t **)
xmalloc (ctype->nr_charclass * sizeof (uint32_t *));
ctype->class_3level = (struct iovec *)
xmalloc (ctype->nr_charclass * sizeof (struct iovec));
}
/* This is the array accessed using the multibyte string elements. */
for (idx = 0; idx < 256; ++idx)
@ -4113,6 +4124,16 @@ Computing table size for character classes might take a while..."),
{
size_t nr;
for (nr = 0; nr < ctype->nr_charclass; nr++)
{
ctype->class_b[nr] = (uint32_t *)
xcalloc (256 / 32, sizeof (uint32_t));
for (idx = 0; idx < 256; ++idx)
if (ctype->class256_collection[idx] & _ISbit (nr))
ctype->class_b[nr][idx >> 5] |= (uint32_t)1 << (idx & 0x1f);
}
for (nr = 0; nr < ctype->nr_charclass; nr++)
{
struct wctype_table t;

View File

@ -256,17 +256,13 @@ FCT (pattern, string, no_leading_period, flags)
/* Invalid character class name. */
return FNM_NOMATCH;
/* The following code is glibc specific but does
there a good job in sppeding up the code since
we can avoid the btowc() call. The
IS_CHAR_CLASS call will return a bit mask for
the 32-bit table. We have to convert it to a
bitmask for the __ctype_b table. This has to
be done based on the byteorder as can be seen
below. In any case we will fall back on the
code using btowc() if the class is not one of
the standard classes. */
# if defined _LIBC && ! WIDE_CHAR_VERSION
/* The following code is glibc specific but does
there a good job in speeding up the code since
we can avoid the btowc() call. */
if (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_HASH_SIZE) != 0)
{
/* Old locale format. */
# if __BYTE_ORDER == __LITTLE_ENDIAN
if ((wt & 0xf0ffff) == 0)
{
@ -282,9 +278,19 @@ FCT (pattern, string, no_leading_period, flags)
}
# endif
else
# endif
if (ISWCTYPE (BTOWC ((UCHAR) *n), wt))
goto matched;
}
else
{
/* New locale format. */
if (_ISCTYPE ((UCHAR) *n, wt))
goto matched;
}
# else
if (ISWCTYPE (BTOWC ((UCHAR) *n), wt))
goto matched;
# endif
#else
if ((STREQ (str, L("alnum")) && ISALNUM ((UCHAR) *n))
|| (STREQ (str, L("alpha")) && ISALPHA ((UCHAR) *n))