1998-05-21 15:27  Ulrich Drepper  <drepper@cygnus.com>

	* wcsmbs/wcsnrtombs.c: Correct computation of result.
	* wcsmbs/wcsrtombs.c: Likewise.

	* wcsmbs/Makefile (tests): Add wcsmbs-tst1.c.
	* wcsmbs/wcsmbs-tst1.c: New file.

	* iconv/loop.c (COUNT_CONVERTED): Correct computation.

	* locale/C-ctype.c (_nl_C_LC_CTYPE): Define MB_CUR_MAX for C locale
	as 1.

	* locale/setlocale.c: Don't make _nl_current_* and _nl_C_* references
	weak.

1998-05-21  Philip Blundell  <philb@gnu.org>

	* sysdeps/arm/fpu_control.h: Replace stub file with real
	implementation.
	* sysdeps/arm/fpu/bits/fenv.h: New file.
	* sysdeps/arm/fpu/fesetround.c: Likewise.
	* sysdeps/arm/fpu/fclrexcpt.c: Likewise.
	* sysdeps/arm/fpu/fsetexcptflag.c: Likewise.
	* sysdeps/arm/fpu/ftestexcpt.c: Likewise.
	* sysdeps/arm/fpu/fraiseexcpt.c: Likewise.
	* sysdeps/arm/fpu/fegetenv.c: Likewise.
	* sysdeps/arm/fpu/fesetenv.c: Likewise.

1998-05-21 16:34  Richard Henderson  <rth@cygnus.com>

	* elf/dl-load.c (_dl_map_object_from_fd): Get file header with
	read instead of mmap.
This commit is contained in:
Ulrich Drepper 1998-05-21 15:40:14 +00:00
parent 32c85e43ed
commit 23f0c99c0e
18 changed files with 488 additions and 20 deletions

View file

@ -1,3 +1,37 @@
1998-05-21 15:27 Ulrich Drepper <drepper@cygnus.com>
* wcsmbs/wcsnrtombs.c: Correct computation of result.
* wcsmbs/wcsrtombs.c: Likewise.
* wcsmbs/Makefile (tests): Add wcsmbs-tst1.c.
* wcsmbs/wcsmbs-tst1.c: New file.
* iconv/loop.c (COUNT_CONVERTED): Correct computation.
* locale/C-ctype.c (_nl_C_LC_CTYPE): Define MB_CUR_MAX for C locale
as 1.
* locale/setlocale.c: Don't make _nl_current_* and _nl_C_* references
weak.
1998-05-21 Philip Blundell <philb@gnu.org>
* sysdeps/arm/fpu_control.h: Replace stub file with real
implementation.
* sysdeps/arm/fpu/bits/fenv.h: New file.
* sysdeps/arm/fpu/fesetround.c: Likewise.
* sysdeps/arm/fpu/fclrexcpt.c: Likewise.
* sysdeps/arm/fpu/fsetexcptflag.c: Likewise.
* sysdeps/arm/fpu/ftestexcpt.c: Likewise.
* sysdeps/arm/fpu/fraiseexcpt.c: Likewise.
* sysdeps/arm/fpu/fegetenv.c: Likewise.
* sysdeps/arm/fpu/fesetenv.c: Likewise.
1998-05-21 16:34 Richard Henderson <rth@cygnus.com>
* elf/dl-load.c (_dl_map_object_from_fd): Get file header with
read instead of mmap.
1998-05-21 8:16 Richard Henderson <rth@cygnus.com>
* sysdeps/unix/sysv/linux/alpha/glob.c: Include sysdeps/generic/glob.c

View file

@ -103,10 +103,10 @@
? (inptr - *inptrp) : (outptr - *outptrp))
# endif
# else
# define COUNT_CONVERTED (inptr - *inptrp)
# define COUNT_CONVERTED ((inptr - *inptrp) / MIN_NEEDED_INPUT)
# endif
# elif MIN_NEEDED_OUTPUT == MAX_NEEDED_OUTPUT
# define COUNT_CONVERTED (outptr - *outptrp)
# define COUNT_CONVERTED ((outptr - *outptrp) / MIN_NEEDED_OUTPUT)
# endif
#endif

View file

@ -367,7 +367,7 @@ const struct locale_data _nl_C_LC_CTYPE =
"print\0" "graph\0" "blank\0" "cntrl\0" "punct\0" "alnum\0" },
{ string: "tolower\0" "toupper\0" },
{ string: _nl_C_LC_CTYPE_width },
{ word: 2 },
{ word: 1 },
{ string: "ANSI_X3.4-1968" }
}
};

View file

@ -36,8 +36,7 @@
then nothing is using the locale data. */
#define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \
extern struct locale_data *_nl_current_##category; \
extern struct locale_data _nl_C_##category; \
weak_extern (_nl_current_##category) weak_extern (_nl_C_##category)
extern struct locale_data _nl_C_##category;
#include "categories.def"
#undef DEFINE_CATEGORY

View file

@ -0,0 +1,58 @@
/* Copyright (C) 1997, 1998 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. */
#ifndef _FENV_H
# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
#endif
/* Define bits representing exceptions in the FPU status word. */
enum
{
FE_INVALID = 1,
#define FE_INVALID FE_INVALID
FE_DIVBYZERO = 2,
#define FE_DIVBYZERO FE_DIVBYZERO
FE_OVERFLOW = 4,
#define FE_OVERFLOW FE_OVERFLOW
FE_UNDERFLOW = 8,
#define FE_UNDERFLOW FE_UNDERFLOW
};
/* Amount to shift by to convert an exception to a mask bit. */
#define FE_EXCEPTION_SHIFT 16
/* All supported exceptions. */
#define FE_ALL_EXCEPT \
(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW)
/* The ARM FPU basically only supports round-to-nearest. Other rounding
modes exist, but you have to encode them in the actual instruction. */
#define FE_TONEAREST 0
/* Type representing exception flags. */
typedef unsigned long fexcept_t;
/* Type representing floating-point environment. */
typedef struct
{
unsigned long cw;
}
fenv_t;
/* If the default argument is used we use this value. */
#define FE_DFL_ENV ((fenv_t *) -1l)

View file

@ -0,0 +1,39 @@
/* Clear given exceptions in current floating-point environment.
Copyright (C) 1997, 1998 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 <fenv.h>
#include <fpu_control.h>
void
feclearexcept (int excepts)
{
unsigned long int temp;
/* Mask out unsupported bits/exceptions. */
excepts &= FE_ALL_EXCEPT;
/* Get the current floating point status. */
_FPU_GETCW(temp);
/* Clear the relevant bits. */
temp &= excepts ^ FE_ALL_EXCEPT;
/* Put the new data in effect. */
_FPU_SETCW(temp);
}

View file

@ -0,0 +1,29 @@
/* Store current floating-point environment.
Copyright (C) 1997, 1998 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 <fenv.h>
#include <fpu_control.h>
void
fegetenv (fenv_t *envp)
{
unsigned long int temp;
_FPU_GETCW(temp);
envp->cw = temp;
}

View file

@ -0,0 +1,26 @@
/* Return current rounding direction.
Copyright (C) 1997, 1998 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 <fenv.h>
int
fegetround (void)
{
return FE_TONEAREST; /* Easy. :-) */
}

View file

@ -0,0 +1,33 @@
/* Install given floating-point environment.
Copyright (C) 1997, 1998 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 <fenv.h>
#include <fpu_control.h>
void
fesetenv (const fenv_t *envp)
{
if (envp == FE_DFL_ENV)
_FPU_SETCW(_FPU_DEFAULT);
else
{
unsigned long temp = envp->cw;
_FPU_SETCW(temp);
}
}

View file

@ -0,0 +1,27 @@
/* Set current rounding direction.
Copyright (C) 1997, 1998 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 <fenv.h>
int
fesetround (int round)
{
/* We only support FE_TONEAREST, so there is no need for any work. */
return (round == FE_TONEAREST)?1:0;
}

View file

@ -0,0 +1,32 @@
/* Raise given exceptions.
Copyright (C) 1997, 1998 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 <fenv.h>
#include <fpu_control.h>
#include <math.h>
void
feraiseexcept (int excepts)
{
/* Raise exceptions represented by EXPECTS. */
fexcept_t temp;
_FPU_GETCW(temp);
temp |= (excepts & FE_ALL_EXCEPT);
_FPU_SETCW(temp);
}

View file

@ -0,0 +1,38 @@
/* Set floating-point environment exception handling.
Copyright (C) 1997, 1998 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 <fenv.h>
#include <math.h>
#include <fpu_control.h>
void
fesetexceptflag (const fexcept_t *flagp, int excepts)
{
fexcept_t temp;
/* Get the current environment. */
_FPU_GETCW(temp);
/* Set the desired exception mask. */
temp &= ~((excepts & FE_ALL_EXCEPT) << FE_EXCEPT_SHIFT);
temp |= (*flagp & excepts & FE_ALL_EXCEPT) << FE_EXCEPT_SHIFT;
/* Save state back to the FPU. */
_FPU_SETCW(temp);
}

View file

@ -0,0 +1,32 @@
/* Test exception in current environment.
Copyright (C) 1997, 1998 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 <fenv.h>
#include <fpu_control.h>
int
fetestexcept (int excepts)
{
fexcept_t temp;
/* Get current exceptions. */
_FPU_GETCW(temp);
return temp & excepts & FE_ALL_EXCEPT;
}

View file

@ -1,5 +1,5 @@
/* FPU control word definitions. Stub version.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
/* FPU control word definitions. ARM version.
Copyright (C) 1996, 1997, 1998 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
@ -20,7 +20,54 @@
#ifndef _FPU_CONTROL_H
#define _FPU_CONTROL_H
#define _FPU_RESERVED 0xffffffff /* These bits are reserved. */
/* We have a slight terminology confusion here. On the ARM, the register
* we're interested in is actually the FPU status word - the FPU control
* word is something different (which is implementation-defined and only
* accessible from supervisor mode.)
*
* The FPSR looks like this:
*
* 31-24 23-16 15-8 7-0
* | system ID | trap enable | system control | exception flags |
*
* We ignore the system ID bits; for interest's sake they are:
*
* 0000 "old" FPE
* 1000 FPPC hardware
* 0001 FPE 400
* 1001 FPA hardware
*
* The trap enable and exception flags are both structured like this:
*
* 7 - 5 4 3 2 1 0
* | reserved | INX | UFL | OFL | DVZ | IVO |
*
* where a `1' bit in the enable byte means that the trap can occur, and
* a `1' bit in the flags byte means the exception has occurred.
*
* The exceptions are:
*
* IVO - invalid operation
* DVZ - divide by zero
* OFL - overflow
* UFL - underflow
* INX - inexact (do not use; implementations differ)
*
* The system control byte looks like this:
*
* 7-5 4 3 2 1 0
* | reserved | AC | EP | SO | NE | ND |
*
* where the bits mean
*
* ND - no denormalised numbers (force them all to zero)
* NE - enable NaN exceptions
* SO - synchronous operation
* EP - use expanded packed-decimal format
* AC - use alternate definition for C flag on compare operations
*/
#define _FPU_RESERVED 0xfff0e0f0 /* These bits are reserved. */
/* The fdlibm code requires no interrupts for exceptions. Don't
change the rounding mode, it would break long double I/O! */
@ -29,11 +76,9 @@
/* Type of the control word. */
typedef unsigned int fpu_control_t;
/* Macros for accessing the hardware control word.
* On the ARM, we can't do this from user mode (it would trap).
*/
#define _FPU_GETCW(cw) __asm__ ("movnv r0,r0" : "=g" (cw))
#define _FPU_SETCW(cw) __asm__ ("movnv r0,r0" : : "g" (cw))
/* Macros for accessing the hardware control word. */
#define _FPU_GETCW(cw) __asm__ ("rfs %0" : "=r" (cw))
#define _FPU_SETCW(cw) __asm__ ("wfs %0" : : "r" (cw))
/* Default control word set at startup. */
extern fpu_control_t __fpu_control;

View file

@ -39,7 +39,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
wcscasecmp wcsncase wcscasecmp_l wcsncase_l \
wcsmbsload
tests := tst-wcstof
tests := tst-wcstof wcsmbs-tst1
include ../Rules

57
wcsmbs/wcsmbs-tst1.c Normal file
View file

@ -0,0 +1,57 @@
/* Based on a test program by Won Kyu Park <wkpark@chem.skku.ac.kr>. */
#include <wchar.h>
#include <stdio.h>
#include <string.h>
#include <wctype.h>
#include <locale.h>
int
main (void)
{
int test=0, idx=0;
char buf[100], *pchar;
wchar_t tmp[10];
wchar_t tmp1[]={L'W',L'o',L'r',L'l',L'd',L'\0'};
char str[]="Hello";
int result = 0;
pchar= setlocale (LC_ALL, "");
printf ("locale : %s\n",pchar);
printf ("MB_CUR_MAX %d\n", MB_CUR_MAX);
puts("---- test 1 ------");
test = mbstowcs (tmp, str, (strlen (str) + 1) * sizeof (char));
printf ("size of string by mbstowcs %d\n", test);
if (test != strlen (str))
result = 1;
idx += wctomb (&buf[0], tmp[0]);
idx += wctomb (&buf[idx], tmp[1]);
buf[idx] = 0;
printf ("orig string %s\n", str);
printf ("string by wctomb %s\n", buf);
printf ("string by %%C %C", tmp[0]);
if (tmp[0] != L'H')
result = 1;
printf ("%C\n", tmp[1]);
if (tmp[1] != L'e')
result = 1;
printf ("string by %%S %S\n", tmp);
if (wcscmp (tmp, L"Hello") != 0)
result = 1;
puts("---- test 2 ------");
printf ("wchar string %S\n", tmp1);
printf ("wchar %C\n", tmp1[0]);
test = wcstombs (buf, tmp1, (wcslen (tmp1) + 1) * sizeof (wchar_t));
printf ("size of string by wcstombs %d\n", test);
if (test != wcslen (tmp1))
result = 1;
test = wcslen (tmp1);
printf ("size of string by wcslen %d\n", test);
printf ("char %s\n", buf);
if (strcmp (buf, "World") != 0)
result = 1;
puts("------------------");
return result;
}

View file

@ -46,7 +46,7 @@ __wcsnrtombs (dst, src, nwc, len, ps)
struct gconv_step_data data;
const wchar_t *srcend;
int status;
size_t result = 0;
size_t result;
/* Tell where we want the result. */
data.invocation_counter = 0;
@ -66,7 +66,9 @@ __wcsnrtombs (dst, src, nwc, len, ps)
{
char buf[256]; /* Just an arbitrary value. */
const wchar_t *inbuf = *src;
size_t dummy;
result = 0;
data.outbufend = buf + sizeof (buf);
do
@ -77,7 +79,10 @@ __wcsnrtombs (dst, src, nwc, len, ps)
&data,
(const char **) &inbuf,
(const char *) srcend,
&result, 0);
&dummy, 0);
/* Count the number of bytes. */
result += data.outbuf - buf;
}
while (status == GCONV_FULL_OUTPUT);
@ -91,13 +96,18 @@ __wcsnrtombs (dst, src, nwc, len, ps)
/* This code is based on the safe assumption that all internal
multi-byte encodings use the NUL byte only to mark the end
of the string. */
size_t dummy;
data.outbuf = dst;
data.outbufend = dst + len;
status = (*__wcsmbs_gconv_fcts.tomb->fct) (__wcsmbs_gconv_fcts.tomb,
&data, (const char **) src,
(const char *) srcend,
&result, 0);
&dummy, 0);
/* Count the number of bytes. */
result = data.outbuf - dst;
/* We have to determine whether the last character converted
is the NUL character. */

View file

@ -42,7 +42,7 @@ __wcsrtombs (dst, src, len, ps)
{
struct gconv_step_data data;
int status;
size_t result = 0;
size_t result;
/* Tell where we want the result. */
data.invocation_counter = 0;
@ -59,7 +59,9 @@ __wcsrtombs (dst, src, len, ps)
char buf[256]; /* Just an arbitrary value. */
const wchar_t *srcend = *src + __wcslen (*src) + 1;
const wchar_t *inbuf = *src;
size_t dummy;
result = 0;
data.outbufend = buf + sizeof (buf);
do
@ -70,7 +72,10 @@ __wcsrtombs (dst, src, len, ps)
&data,
(const char **) &inbuf,
(const char *) srcend,
&result, 0);
&dummy, 0);
/* Count the number of bytes. */
result += data.outbuf - buf;
}
while (status == GCONV_FULL_OUTPUT);
@ -88,6 +93,7 @@ __wcsrtombs (dst, src, len, ps)
multi-byte encodings use the NUL byte only to mark the end
of the string. */
const wchar_t *srcend = *src + __wcsnlen (*src, len * MB_CUR_MAX) + 1;
size_t dummy;
data.outbuf = dst;
data.outbufend = dst + len;
@ -95,7 +101,10 @@ __wcsrtombs (dst, src, len, ps)
status = (*__wcsmbs_gconv_fcts.tomb->fct) (__wcsmbs_gconv_fcts.tomb,
&data, (const char **) src,
(const char *) srcend,
&result, 0);
&dummy, 0);
/* Count the number of bytes. */
result = data.outbuf - dst;
/* We have to determine whether the last character converted
is the NUL character. */