Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Update.
	* 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>
  • Loading branch information
Ulrich Drepper committed Aug 2, 2000
1 parent 925e31d commit 8fb8147
Show file tree
Hide file tree
Showing 10 changed files with 196 additions and 29 deletions.
19 changes: 19 additions & 0 deletions ChangeLog
@@ -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>

Expand Down
2 changes: 1 addition & 1 deletion assert/Makefile
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions assert/Versions
Expand Up @@ -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 changes: 25 additions & 0 deletions assert/__assert.c
@@ -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);
}
9 changes: 8 additions & 1 deletion assert/assert.h
@@ -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
Expand Down Expand Up @@ -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) \
Expand Down
5 changes: 4 additions & 1 deletion gnulib/Makefile
@@ -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
Expand All @@ -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 changes: 74 additions & 0 deletions gnulib/tst-gcc.c
@@ -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;
}
8 changes: 8 additions & 0 deletions locale/localeinfo.h
Expand Up @@ -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;
Expand Down
29 changes: 25 additions & 4 deletions locale/programs/ld-ctype.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -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
Expand All @@ -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);
Expand Down Expand Up @@ -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_3level = (struct iovec *)
xmalloc (ctype->nr_charclass * sizeof (struct iovec));
{
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)
Expand Down Expand Up @@ -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;
Expand Down
50 changes: 28 additions & 22 deletions posix/fnmatch_loop.c
Expand Up @@ -256,35 +256,41 @@ 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
# if __BYTE_ORDER == __LITTLE_ENDIAN
if ((wt & 0xf0ffff) == 0)
/* 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)
{
wt >>= 16;
if ((__ctype_b[(UCHAR) *n] & wt) != 0)
goto matched;
}
/* Old locale format. */
# if __BYTE_ORDER == __LITTLE_ENDIAN
if ((wt & 0xf0ffff) == 0)
{
wt >>= 16;
if ((__ctype_b[(UCHAR) *n] & wt) != 0)
goto matched;
}
# else
if (wt <= 0x800)
if (wt <= 0x800)
{
if ((__ctype_b[(UCHAR) *n] & wt) != 0)
goto matched;
}
# endif
else
if (ISWCTYPE (BTOWC ((UCHAR) *n), wt))
goto matched;
}
else
{
if ((__ctype_b[(UCHAR) *n] & wt) != 0)
/* New locale format. */
if (_ISCTYPE ((UCHAR) *n, wt))
goto matched;
}
# endif
else
# else
if (ISWCTYPE (BTOWC ((UCHAR) *n), wt))
goto matched;
# endif
if (ISWCTYPE (BTOWC ((UCHAR) *n), wt))
goto matched;
#else
if ((STREQ (str, L("alnum")) && ISALNUM ((UCHAR) *n))
|| (STREQ (str, L("alpha")) && ISALPHA ((UCHAR) *n))
Expand Down

0 comments on commit 8fb8147

Please sign in to comment.