diff options
-rw-r--r-- | ChangeLog | 95 | ||||
-rw-r--r-- | sysdeps/libm-ieee754/s_signgam.c | 3 | ||||
-rw-r--r-- | sysdeps/libm-ieee754/w_gamma.c | 10 | ||||
-rw-r--r-- | wchar.h | 1 | ||||
-rw-r--r-- | wcsmbs/btowc.c | 36 | ||||
-rw-r--r-- | wcsmbs/mbrlen.c | 35 | ||||
-rw-r--r-- | wcsmbs/mbrtowc.c | 61 | ||||
-rw-r--r-- | wcsmbs/mbsinit.c | 33 | ||||
-rw-r--r-- | wcsmbs/mbsrtowcs.c | 57 | ||||
-rw-r--r-- | wcsmbs/wchar.h | 168 | ||||
-rw-r--r-- | wcsmbs/wcrtomb.c | 60 | ||||
-rw-r--r-- | wcsmbs/wcsrtombs.c | 64 | ||||
-rw-r--r-- | wcsmbs/wcsstr.c | 97 | ||||
-rw-r--r-- | wcsmbs/wctob.c | 34 | ||||
-rw-r--r-- | wcsmbs/wmemchr.c | 62 | ||||
-rw-r--r-- | wcsmbs/wmemcmp.c | 84 | ||||
-rw-r--r-- | wcsmbs/wmemcpy.c | 31 | ||||
-rw-r--r-- | wcsmbs/wmemmove.c | 31 | ||||
-rw-r--r-- | wcsmbs/wmemset.c | 55 |
19 files changed, 1010 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog index 42f7e4be81..f8c952fa76 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,98 @@ +Mon Apr 1 13:34:55 1996 Roland McGrath <roland@whiz-bang.gnu.ai.mit.edu> + + * stdio-common/tst-printf.c (main): Add new test case. + + * sysdeps/generic/setenv.c (unsetenv): Use old-style definition. + +Mon Apr 1 11:39:10 Ulrich Drepper <drepper@gnu.ai.mit.edu> + + * stdlib/strtod.c (STRTOD): Fix handling of American style FP + numbers. + + * stdio-common/vfprintf.c (vfprintf): Don't increment format + string pointer twice after seeing `*'. + +Sun Mar 31 17:31:54 1996 Roland McGrath <roland@whiz-bang.gnu.ai.mit.edu> + + * MakeTAGS (po/SYS_libc.pot): Prepend header processed from + po/header.pot. + +Sun Mar 31 18:07:32 1996 Ulrich Drepper <drepper@gnu.ai.mit.edu> + + * locale/Makefile (others, install-bin): Compiling locale works + again. + (locale-modules): locale has no --dump option anymore. Remove + ctypedump. + + * locale/programs/config.h: Don't declare euidaccess. + Use #include_next to get libc's config.h. + + * locale/programs/ctypedump.c: Not needed anymore. Dump option + of locale is removed. + + * locale/programs/locale.c: Adapt for new locale implementation. + + * stdio-common/_itoa.h (_itoa_word): Define as inline function. + * stdio-common/_itoa.c (_itoa_lower_digits, _itoa_upper_digits): + Don't declare static because used in _itoa_word inline function. + + * stdio-common/printf-parse.h: Prepare for use in wide-char + stdio implementation. + (find_spec): Take additional argument to work with mbrlen instead + of mblen. + (parse_one_spec): Ditto. + + * stdio-common/printf-prs.c: Prepare for use in wide-char + stdio implementation. + + * stdio-common/printf.h: Mark change for wide-char handling. + Changing it now would result in incompatibilities. + + * stdio-common/vfprintf.c: New and fast implementation. + + * wcsmbs/Makefile (routines): Remove pre-ISO C multibyte functions + mbsadvance, mbscat, mbschr, mbscmp, mbscpy, mbsdup, mbslen, + mbsncat, mbsncmp, mbsncpy, mbsrchr, mbstomb. + Change wcswcs to wcsstr. + Add wmemchr, wmemcmp, wmemcpy, wmemmove, wmemset, btowc, wctob, + mbsinit, mbrlen, mbrtowc, wcrtomb, mbsrtowcs, wcsrtombs. + + * wcsmbs/btowc.c, wcsmbs/mbrlen.c, wcsmbs/mbrtowc.c, + wcsmbs/mbsinit.c, wcsmbs/mbsrtowcs.c, wcsmbs/wchar.h, + wcsmbs/wcrtomb.c, wcsmbs/wcsrtombs.c, wcsmbs/wcsstr.c, + wcsmbs/wctob.c, wcsmbs/wmemchr.c, wcsmbs/wmemcmp.c, + wcsmbs/wmemcpy.c, wcsmbs/wmemmove.c, wcsmbs/wmemset.c: New + function according to ISO C amendment 1. + * wchar.h: Wrapper around "wcsmbs/wchar.h". + + * wcsmbs/wcscat.c, wcsmbs/wcschr.c, wcsmbs/wcscmp.c, + wcsmbs/wcscpy.c, wcsmbs/wcscspn.c, wcsmbs/wcsdup.c, + wcsmbs/wcslen.c, wcsmbs/wcsncat.c, wcsmbs/wcsncmp.c, + wcsmbs/wcsncpy.c, wcsmbs/wcspbrk.c, wcsmbs/wcsrchr.c, + wcsmbs/wcsspn.c, wcsmbs/wcstok.c: Changed to conform with ISO C + amendment 1. + + * wcsmbs/mbsadvance.c, wcsmbs/mbscat.c, wcsmbs/mbschr.c, + wcsmbs/mbscmp.c, wcsmbs/mbscpy.c, wcsmbs/mbsdup.c, + wcsmbs/mbslen.c, wcsmbs/mbsncat.c, wcsmbs/mbsncmp.c, + wcsmbs/mbsncpy.c, wcsmbs/mbsrchr.c, wcsmbs/mbstomb.c, + wcsmbs/mbstr.h, wcsmbs/wcstr.h, wcsmbs/wcswcs.c: Removed. + Implement functions from early drafts, not part of final standard. + +Sun Mar 31 16:50:41 1996 Roland McGrath <roland@whiz-bang.gnu.ai.mit.edu> + + * setjmp/setjmp.h (jmp_buf): Change gratuitous struct tag name to + __jmp_bug_tag so its C++ implicit typedef does not conflict with the + __jmp_buf typedef. + + * Makerules (BUILD_CFLAGS) [! objdir]: Use $(..)config.h when + compiling in the source directories. + +Fri Mar 29 16:26:35 1996 Roland McGrath <roland@whiz-bang.gnu.ai.mit.edu> + + * sysdeps/libm-ieee754/w_gamma.c: Use signgam instead of __signgam. + * sysdeps/libm-ieee754/s_signgam.c: Undo last change. + Fri Mar 29 11:29:46 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu> * sysdeps/libm-ieee754/s_signgam.c (signgam): Renamed to __signgam, diff --git a/sysdeps/libm-ieee754/s_signgam.c b/sysdeps/libm-ieee754/s_signgam.c index 2ab5924a2a..d67d5918ec 100644 --- a/sysdeps/libm-ieee754/s_signgam.c +++ b/sysdeps/libm-ieee754/s_signgam.c @@ -1,4 +1,3 @@ #include "math.h" #include "math_private.h" -int __signgam = 0; -weak_alias (__signgam, signgam) +int signgam = 0; diff --git a/sysdeps/libm-ieee754/w_gamma.c b/sysdeps/libm-ieee754/w_gamma.c index de618b38ed..8a0a18079a 100644 --- a/sysdeps/libm-ieee754/w_gamma.c +++ b/sysdeps/libm-ieee754/w_gamma.c @@ -5,7 +5,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -23,7 +23,7 @@ static char rcsid[] = "$NetBSD: w_gamma.c,v 1.7 1995/11/20 22:06:43 jtc Exp $"; #include "math.h" #include "math_private.h" -extern int __signgam; +extern int signgam; #ifdef __STDC__ double __gamma(double x) @@ -33,10 +33,10 @@ extern int __signgam; #endif { #ifdef _IEEE_LIBM - return __ieee754_lgamma_r(x,&__signgam); + return __ieee754_lgamma_r(x,&signgam); #else double y; - y = __ieee754_lgamma_r(x,&__signgam); + y = __ieee754_lgamma_r(x,&signgam); if(_LIB_VERSION == _IEEE_) return y; if(!__finite(y)&&__finite(x)) { if(__floor(x)==x&&x<=0.0) @@ -46,5 +46,5 @@ extern int __signgam; } else return y; #endif -} +} weak_alias (__gamma, gamma) diff --git a/wchar.h b/wchar.h new file mode 100644 index 0000000000..c87ffb851b --- /dev/null +++ b/wchar.h @@ -0,0 +1 @@ +#include <wcsmbs/wchar.h> diff --git a/wcsmbs/btowc.c b/wcsmbs/btowc.c new file mode 100644 index 0000000000..062be7ec02 --- /dev/null +++ b/wcsmbs/btowc.c @@ -0,0 +1,36 @@ +/* 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> + +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> +#include <wchar.h> + + +wint_t +btowc (c) + int c; +{ + /*************************************************************\ + |* This is no complete implementation. While the multi-byte *| + |* character handling is not finished this will do. *| + \*************************************************************/ + if (WEOF != (wint_t) EOF) + return WEOF; + else + return c; +} diff --git a/wcsmbs/mbrlen.c b/wcsmbs/mbrlen.c new file mode 100644 index 0000000000..a50631e8d1 --- /dev/null +++ b/wcsmbs/mbrlen.c @@ -0,0 +1,35 @@ +/* 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> + +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 <wchar.h> + + +/* The mbrlen function has an internal shift state which gets used if + the PS parameter is NULL. */ +static mbstate_t internal; + + +size_t +mbrlen (s, n, ps) + const char *s; + size_t n; + mbstate_t *ps; +{ + return mbrtowc (NULL, s, n, ps ?: &internal); +} diff --git a/wcsmbs/mbrtowc.c b/wcsmbs/mbrtowc.c new file mode 100644 index 0000000000..17083196bd --- /dev/null +++ b/wcsmbs/mbrtowc.c @@ -0,0 +1,61 @@ +/* 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> + +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 <wchar.h> + + +size_t +mbrtowc (pwc, s, n, ps) + wchar_t *pwc; + const char *s; + size_t n; + mbstate_t *ps; +{ + wchar_t to_wide; + + /*************************************************************\ + |* This is no complete implementation. While the multi-byte *| + |* character handling is not finished this will do. *| + \*************************************************************/ + + if (s == NULL) + { + pwc = NULL; + s = ""; + n = 1; + } + + if (n == 0) + return (size_t) -2; + + /* For now. */ + to_wide = (wchar_t) *s; + + if (pwc != NULL) + *pwc = to_wide; + + if (pwc == L'\0') + { + *ps = 0; /* This is required. */ + return 0; + } + + /* Return code (size_t)-1 cannot happend for now. */ + return 1; +} diff --git a/wcsmbs/mbsinit.c b/wcsmbs/mbsinit.c new file mode 100644 index 0000000000..d9f01256d5 --- /dev/null +++ b/wcsmbs/mbsinit.c @@ -0,0 +1,33 @@ +/* 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> + +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 <wchar.h> + + +int +mbsinit (ps) + const mbstate_t *ps; +{ + /*************************************************************\ + |* This is no complete implementation. While the multi-byte *| + |* character handling is not finished this will do. *| + \*************************************************************/ + + return *ps == 0; +} diff --git a/wcsmbs/mbsrtowcs.c b/wcsmbs/mbsrtowcs.c new file mode 100644 index 0000000000..cb87938e5d --- /dev/null +++ b/wcsmbs/mbsrtowcs.c @@ -0,0 +1,57 @@ +/* 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> + +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 <wchar.h> + + +size_t +mbsrtowcs (dst, src, len, ps) + wchar_t *dst; + const char **src; + size_t len; + mbstate_t *ps; +{ + size_t result = 0; + /*************************************************************\ + |* This is no complete implementation. While the multi-byte *| + |* character handling is not finished this will do. *| + \*************************************************************/ + + while (len > 0 && **src != '\0') + { + /* For now there is no possibly illegal MB char sequence. */ + if (dst != NULL) + dst[result] = (wchar_t) **src; + ++result; + ++(*src); + --len; + } + + if (len > 0) + { + if (dst != NULL) + { + dst[result] = L'\0'; + *ps = 0; + } + *src = NULL; + } + + return result; +} diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h new file mode 100644 index 0000000000..69ad2d3c67 --- /dev/null +++ b/wcsmbs/wchar.h @@ -0,0 +1,168 @@ +/* Copyright (C) 1995, 1996 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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +/* + * ISO Standard: 7.16.4 General wide-string utilities <wchar.h> + */ + +#ifndef _WCHAR_H + +#define _WCHAR_H 1 +#include <features.h> + +__BEGIN_DECLS + +/* Get size_t, wchar_t, uwchar_t and NULL from <stddef.h>. */ +#define __need_size_t +#define __need_wchar_t +/* #define __need_uwchar_t */ +#define __need_NULL +/* __need_WCHAR_MAX */ +/* __need_WCHAR_MIN */ +#include <stddef.h> + +/* FIXME: Should go with this or another name in stddef.h. */ +typedef unsigned int uwchar_t; + +/* Conversion state information. */ +typedef int mbstate_t; /* FIXME */ + +/* Should come from <stddef.h> */ +#define WCHAR_MIN ((wchar_t) 0) /* FIXME */ +#define WCHAR_MAX (~WCHAR_MIN) /* FIXME */ + +#ifndef WEOF +# define WEOF (0xffffffffu) +#endif + +/* FIXME: should this go into <stddef.h>??? */ +#if 0 +#define __need_wint_t +#include <stddef.h> +#else +/* Integral type unchanged by default argument promotions that can + hold any value corresponding to members of the extended character + set, as well as at least one value that does not correspond to any + member of the extended character set. */ +typedef unsigned int wint_t; +#endif + + +/* Copy SRC to DEST. */ +extern wchar_t *wcscpy __P ((wchar_t *__dest, __const wchar_t *__src)); +/* Copy no more than N wide-characters of SRC to DEST. */ +extern wchar_t *wcsncpy __P ((wchar_t *__dest, __const wchar_t *__src, + size_t __n)); + +/* Append SRC onto DEST. */ +extern wchar_t *wcscat __P ((wchar_t *__dest, __const wchar_t *__src)); +/* Append no more than N wide-characters of SRC onto DEST. */ +extern wchar_t *wcsncat __P ((wchar_t *__dest, __const wchar_t *__src, + size_t __n)); + +/* Compare S1 and S2. */ +extern int wcscmp __P ((__const wchar_t *__s1, __const wchar_t *__s2)); +/* Compare N wide-characters of S1 and S2. */ +extern int wcsncmp __P ((__const wchar_t *__s1, __const wchar_t *__s2, + size_t __n)); + +/* Duplicate S, returning an identical malloc'd string. */ +extern wchar_t *wcsdup __P ((__const wchar_t *__s)); + +/* Find the first occurence of WC in WCS. */ +extern wchar_t *wcschr __P ((__const wchar_t *__wcs, wchar_t __wc)); +/* Find the last occurence of WC in WCS. */ +extern wchar_t *wcsrchr __P ((__const wchar_t *__wcs, wchar_t __wc)); + +/* Return the length of the initial segmet of WCS which + consists entirely of wide-characters not in REJECT. */ +extern size_t wcscspn __P ((__const wchar_t *__wcs, + __const wchar_t *__reject)); +/* Return the length of the initial segmet of WCS which + consists entirely of wide-characters in ACCEPT. */ +extern size_t wcsspn __P ((__const wchar_t *__wcs, __const wchar_t *__accept)); +/* Find the first occurence in WCS of any character in ACCEPT. */ +extern wchar_t *wcspbrk __P ((__const wchar_t *__wcs, + __const wchar_t *__accept)); +/* Find the first occurence of NEEDLE in HAYSTACK. */ +extern wchar_t *wcsstr __P ((__const wchar_t *__haystack, + __const wchar_t *__needle)); +/* Divide WCS into tokens separated by characters in DELIM. */ +extern wchar_t *wcstok __P ((wchar_t *__s, __const wchar_t *__delim, + wchar_t **ptr)); + +/* Return the number of wide-characters in S. */ +extern size_t wcslen __P ((__const wchar_t *__s)); + + +/* Search N bytes of S for C. */ +extern wchar_t *wmemchr __P ((__const wchar_t *__s, wchar_t __c, size_t __n)); + +/* Compare N bytes of S1 and S2. */ +extern int wmemcmp __P ((__const wchar_t *__s1, __const wchar_t *__s2, + size_t __n)); + +/* Copy N bytes of SRC to DEST. */ +extern wchar_t *wmemcpy __P ((wchar_t *__s1, __const wchar_t *__s2, + size_t __n)); + +/* Copy N bytes of SRC to DEST, guaranteeing + correct behavior for overlapping strings. */ +extern wchar_t *wmemmove __P ((wchar_t *__s1, __const wchar_t *__s2, + size_t __N)); + +/* Set N bytes of S to C. */ +extern wchar_t *wmemset __P ((wchar_t *__s, wchar_t __c, size_t __n)); + + +/* Determine whether C constitutes a valid (one-byte) multibyte + character. */ +extern wint_t btowc __P ((int __c)); + +/* Determine whether C corresponds to a member of the extended + character set whose multibyte representation is a single byte. */ +extern int wctob __P ((wint_t __c)); + +/* Determine whether PS points to an object representing the initial + state. */ +extern int mbsinit __P ((__const mbstate_t *__ps)); + +/* Return number of bytes in multibyte character pointed to by S. */ +extern size_t mbrlen __P ((__const char *__s, size_t __n, mbstate_t *ps)); + +/* Write wide character representation of multibyte character pointed + to by S to PWC. */ +extern size_t mbrtowc __P ((wchar_t *__pwc, __const char *__s, size_t __n, + mbstate_t *__p)); + +/* Write multibyte representation of wide character WC to S. */ +extern size_t wcrtomb __P ((char *__s, wchar_t __wc, mbstate_t *__ps)); + +/* Write wide character representation of multibyte chracter string SRC + to DST. */ +extern size_t mbsrtowcs __P ((wchar_t *__dst, __const char **__src, + size_t __len, mbstate_t *__ps)); + +/* Write multibyte character representation of wide character string + SRC to DST. */ +extern size_t wcsrtombs __P ((char *__dst, __const wchar_t **__src, + size_t __len, mbstate_t *__ps)); + +__END_DECLS + +#endif /* wchar.h */ diff --git a/wcsmbs/wcrtomb.c b/wcsmbs/wcrtomb.c new file mode 100644 index 0000000000..493e08f77d --- /dev/null +++ b/wcsmbs/wcrtomb.c @@ -0,0 +1,60 @@ +/* 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> + +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> + + +size_t +wcrtomb (s, wc, ps) + char *s; + wchar_t wc; + mbstate_t *ps; +{ + /*************************************************************\ + |* This is no complete implementation. While the multi-byte *| + |* character handling is not finished this will do. *| + \*************************************************************/ + + char fake[1]; + + if (s == NULL) + { + s = fake; + wc = L'\0'; + } + + if (wc == L'\0') + { + /* FIXME Write any shift sequence to get to *PS == NULL. */ + *ps = 0; + *s = '\0'; + return 1; + } + + /* FIXME For now we don't handle real multi-byte encodings. */ + if ((wc & ~0xff) != 0) + { + errno = EILSEQ; + return (size_t) -1; + } + + *s = (char) wc; + return 1; +} diff --git a/wcsmbs/wcsrtombs.c b/wcsmbs/wcsrtombs.c new file mode 100644 index 0000000000..612a86d437 --- /dev/null +++ b/wcsmbs/wcsrtombs.c @@ -0,0 +1,64 @@ +/* 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> + +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> + + +size_t +wcsrtombs (dst, src, len, ps) + char *dst; + const wchar_t **src; + size_t len; + mbstate_t *ps; +{ + size_t result = 0; + + /*************************************************************\ + |* This is no complete implementation. While the multi-byte *| + |* character handling is not finished this will do. *| + \*************************************************************/ + + while (len > 0 && **src != L'\0') + { + if ((**src & ~0xff) != 0) + { + errno = EILSEQ; + return (size_t) -1; + } + + if (dst != NULL) + dst[result] = (char) **src; + ++result; + ++(*src); + --len; + } + + if (len > 0) + { + if (dst != NULL) + { + dst[result] = '\0'; + *ps = 0; + } + *src = NULL; + } + + return result; +} diff --git a/wcsmbs/wcsstr.c b/wcsmbs/wcsstr.c new file mode 100644 index 0000000000..d2c863fff3 --- /dev/null +++ b/wcsmbs/wcsstr.c @@ -0,0 +1,97 @@ +/* Copyright (C) 1995, 1996 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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +/* + * The original strstr() file contains the following comment: + * + * My personal strstr() implementation that beats most other algorithms. + * Until someone tells me otherwise, I assume that this is the + * fastest implementation of strstr() in C. + * I deliberately chose not to comment it. You should have at least + * as much fun trying to understand it, as I had to write it :-). + * + * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */ + +#include <wchar.h> + +wchar_t * +wcsstr (haystack, needle) + const wchar_t *haystack; + const wchar_t *needle; +{ + register wchar_t b, c; + + if ((b = *needle) != L'\0') + { + haystack--; /* possible ANSI violation */ + do + if ((c = *++haystack) == L'\0') + goto ret0; + while (c != b); + + if (!(c = *++needle)) + goto foundneedle; + ++needle; + goto jin; + + for (;;) + { + register wchar_t a; + register const wchar_t *rhaystack, *rneedle; + + do + { + if (!(a = *++haystack)) + goto ret0; + if (a == b) + break; + if ((a = *++haystack) == L'\0') + goto ret0; +shloop: ; + } + while (a != b); + +jin: if (!(a = *++haystack)) + goto ret0; + + if (a != c) + goto shloop; + + if (*(rhaystack = haystack-- + 1) == (a = *(rneedle = needle))) + do + { + if (a == L'\0') + goto foundneedle; + if (*++rhaystack != (a = *++needle)) + break; + if (a == L'\0') + goto foundneedle; + } + while (*++rhaystack == (a = *++needle)); + + needle = rneedle; /* took the register-poor approach */ + + if (a == L'\0') + break; + } + } +foundneedle: + return (wchar_t*) haystack; +ret0: + return NULL; +} diff --git a/wcsmbs/wctob.c b/wcsmbs/wctob.c new file mode 100644 index 0000000000..c27bd6baba --- /dev/null +++ b/wcsmbs/wctob.c @@ -0,0 +1,34 @@ +/* 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> + +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> +#include <wchar.h> + + +int +wctob (c) + wint_t c; +{ + /*************************************************************\ + |* This is no complete implementation. While the multi-byte *| + |* character handling is not finished this will do. *| + \*************************************************************/ + + return (c & ~0xff) == 0 ? c : EOF; +} diff --git a/wcsmbs/wmemchr.c b/wcsmbs/wmemchr.c new file mode 100644 index 0000000000..67c407836d --- /dev/null +++ b/wcsmbs/wmemchr.c @@ -0,0 +1,62 @@ +/* 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>. + +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 <wchar.h> + +wchar_t * +wmemchr (s, c, n) + register const wchar_t *s; + register wchar_t c; + register size_t n; +{ + /* For performance reasons unfold the loop four times. */ + while (n >= 4) + { + if (s[0] == c) + return (wchar_t *) s; + if (s[1] == c) + return (wchar_t *) &s[1]; + if (s[2] == c) + return (wchar_t *) &s[2]; + if (s[3] == c) + return (wchar_t *) &s[3]; + s += 4; + n -= 4; + } + + if (n > 0) + { + if (*s == c) + return (wchar_t *) s; + ++s; + --n; + } + if (n > 0) + { + if (*s == c) + return (wchar_t *) s; + ++s; + --n; + } + if (n > 0) + if (*s == c) + return (wchar_t *) s; + + return NULL; +} diff --git a/wcsmbs/wmemcmp.c b/wcsmbs/wmemcmp.c new file mode 100644 index 0000000000..f96cad9c0e --- /dev/null +++ b/wcsmbs/wmemcmp.c @@ -0,0 +1,84 @@ +/* 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> + +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 <wchar.h> + + +int +wmemcmp (s1, s2, n) + const wchar_t *s1; + const wchar_t *s2; + size_t n; +{ + register uwchar_t c1; + register uwchar_t c2; + + while (n >= 4) + { + c1 = (uwchar_t) s1[0]; + c2 = (uwchar_t) s2[0]; + if (c1 - c2 != 0) + return c1 - c2; + c1 = (uwchar_t) s1[1]; + c2 = (uwchar_t) s2[1]; + if (c1 - c2 != 0) + return c1 - c2; + c1 = (uwchar_t) s1[2]; + c2 = (uwchar_t) s2[2]; + if (c1 - c2 != 0) + return c1 - c2; + c1 = (uwchar_t) s1[3]; + c2 = (uwchar_t) s2[3]; + if (c1 - c2 != 0) + return c1 - c2; + s1 += 4; + s2 += 4; + n -= 4; + } + + if (n > 0) + { + c1 = (uwchar_t) s1[0]; + c2 = (uwchar_t) s2[0]; + if (c1 - c2 != 0) + return c1 - c2; + ++s1; + ++s2; + --n; + } + if (n > 0) + { + c1 = (uwchar_t) s1[0]; + c2 = (uwchar_t) s2[0]; + if (c1 - c2 != 0) + return c1 - c2; + ++s1; + ++s2; + --n; + } + if (n > 0) + { + c1 = (uwchar_t) s1[0]; + c2 = (uwchar_t) s2[0]; + if (c1 - c2 != 0) + return c1 - c2; + } + + return 0; +} diff --git a/wcsmbs/wmemcpy.c b/wcsmbs/wmemcpy.c new file mode 100644 index 0000000000..e469122197 --- /dev/null +++ b/wcsmbs/wmemcpy.c @@ -0,0 +1,31 @@ +/* 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> + +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 <wchar.h> +#include <string.h> + + +wchar_t * +wmemcpy (s1, s2, n) + wchar_t *s1; + const wchar_t *s2; + size_t n; +{ + return (wchar_t *) memcpy ((char *) s1, (char *) s2, n * sizeof (wchar_t)); +} diff --git a/wcsmbs/wmemmove.c b/wcsmbs/wmemmove.c new file mode 100644 index 0000000000..60d60338cb --- /dev/null +++ b/wcsmbs/wmemmove.c @@ -0,0 +1,31 @@ +/* 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> + +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 <wchar.h> +#include <string.h> + + +wchar_t * +wmemmove (s1, s2, n) + wchar_t *s1; + const wchar_t *s2; + size_t n; +{ + return (wchar_t *) memmove ((char *) s1, (char *) s2, n * sizeof (wchar_t)); +} diff --git a/wcsmbs/wmemset.c b/wcsmbs/wmemset.c new file mode 100644 index 0000000000..918a232775 --- /dev/null +++ b/wcsmbs/wmemset.c @@ -0,0 +1,55 @@ +/* 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> + +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 <wchar.h> + + +wchar_t * +wmemset (s, c, n) + wchar_t *s; + wchar_t c; + size_t n; +{ + register wchar_t *wp = s; + + while (n >= 4) + { + wp[0] = c; + wp[1] = c; + wp[2] = c; + wp[3] = c; + wp += 4; + n -= 4; + } + + if (n > 0) + { + *wp++ = c; + --n; + } + if (n > 0) + { + *wp++ = c; + --n; + } + if (n > 0) + *wp = c; + + return s; +} |