mirror of
git://sourceware.org/git/glibc.git
synced 2025-01-18 12:16:13 +08:00
* Makefile (subdirs): Added wcsmbs.
* wcsmbs: New directory of wide char/multibyte char functions from drepper.
This commit is contained in:
parent
4ca84cff3b
commit
a482b5a595
@ -1,5 +1,9 @@
|
||||
Wed Feb 7 18:48:30 1996 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
|
||||
|
||||
* Makefile (subdirs): Added wcsmbs.
|
||||
* wcsmbs: New directory of wide char/multibyte char functions from
|
||||
drepper.
|
||||
|
||||
* hurd/hurdmsg.c (_S_msg_report_wait): Function removed.
|
||||
* hurd/report-wait.c: New file.
|
||||
* hurd/Makefile (routines): Added report-wait.
|
||||
|
2
Makefile
2
Makefile
@ -52,7 +52,7 @@ endif
|
||||
|
||||
# These are the subdirectories containing the library source.
|
||||
subdirs = csu assert ctype db locale intl math setjmp signal stdlib \
|
||||
stdio-common $(stdio) malloc string time dirent grp pwd \
|
||||
stdio-common $(stdio) malloc string wcsmbs time dirent grp pwd\
|
||||
posix io termios resource misc socket sysvipc gmon gnulib \
|
||||
$(wildcard crypt) manual $(sysdep-subdirs) elf
|
||||
export subdirs := $(subdirs) # Benign, useless in GNU make before 3.63.
|
||||
|
146
hurd/report-wait.c
Normal file
146
hurd/report-wait.c
Normal file
@ -0,0 +1,146 @@
|
||||
/* Report on what a thread in our task is waiting for.
|
||||
Copyright (C) 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. */
|
||||
|
||||
#include <hurd.h>
|
||||
#include <hurd/signal.h>
|
||||
#include <hurd/fd.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <hurd/msg_server.h>
|
||||
#include "thread_state.h"
|
||||
#include "intr-msg.h"
|
||||
|
||||
static void
|
||||
describe_number (string_t description, const char *flavor, int i)
|
||||
{
|
||||
char *p = __stpcpy (description, flavor);
|
||||
p += i / 10 + 1;
|
||||
*p = '\0';
|
||||
do
|
||||
{
|
||||
*--p = '0' + i % 10;
|
||||
i /= 10;
|
||||
} while (i != 0);
|
||||
assert (p[-1] == '#');
|
||||
}
|
||||
|
||||
static void
|
||||
describe_port (string_t description, mach_port_t port)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (port == __mach_task_self ())
|
||||
{
|
||||
strcpy (description, "task-self");
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < _hurd_nports; ++i)
|
||||
if (port == _hurd_ports[i].port)
|
||||
{
|
||||
describe_number (description, "init#", i);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_hurd_init_dtable)
|
||||
{
|
||||
for (i = 0; i < _hurd_init_dtablesize; ++i)
|
||||
if (port == _hurd_init_dtable[i])
|
||||
{
|
||||
describe_number (description, "fd#", i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (_hurd_dtable)
|
||||
{
|
||||
for (i = 0; i < _hurd_dtablesize; ++i)
|
||||
if (_hurd_dtable[i] == NULL)
|
||||
continue;
|
||||
else if (port == _hurd_dtable[i]->port.port)
|
||||
{
|
||||
describe_number (description, "fd#", i);
|
||||
return;
|
||||
}
|
||||
else if (port == _hurd_dtable[i]->ctty.port)
|
||||
{
|
||||
describe_number (description, "bgfd#", i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
describe_number (description, "port#", port);
|
||||
}
|
||||
|
||||
|
||||
kern_return_t
|
||||
_S_msg_report_wait (mach_port_t msgport, thread_t thread,
|
||||
string_t description, int *msgid)
|
||||
{
|
||||
*msgid = 0;
|
||||
|
||||
if (thread == _hurd_msgport_thread)
|
||||
/* Cute. */
|
||||
strcpy (description, "msgport");
|
||||
else
|
||||
{
|
||||
/* Make sure this is really one of our threads. */
|
||||
|
||||
struct hurd_sigstate *ss;
|
||||
|
||||
__mutex_lock (&_hurd_siglock);
|
||||
for (ss = _hurd_sigstates; ss != NULL; ss = ss->next)
|
||||
if (ss->thread == thread)
|
||||
break;
|
||||
__mutex_unlock (&_hurd_siglock);
|
||||
if (ss == NULL)
|
||||
/* To hell with you. */
|
||||
return EINVAL;
|
||||
|
||||
if (ss->suspended != MACH_PORT_NULL)
|
||||
strcpy (description, "sigsuspend");
|
||||
else
|
||||
{
|
||||
/* Examine the thread's state to see if it is blocked in an RPC. */
|
||||
|
||||
struct machine_thread_state state;
|
||||
mach_msg_type_number_t count = MACHINE_THREAD_STATE_COUNT;
|
||||
error_t err;
|
||||
|
||||
err = __thread_get_state (thread, MACHINE_THREAD_STATE_FLAVOR,
|
||||
(integer_t *) &state, &count);
|
||||
if (err)
|
||||
return err;
|
||||
assert (count == MACHINE_THREAD_STATE_COUNT);
|
||||
if (SYSCALL_EXAMINE (&state, msgid))
|
||||
{
|
||||
/* Blocked in a system call. */
|
||||
if (*msgid == -25)
|
||||
/* mach_msg system call. Examine its parameters. */
|
||||
describe_port (description, MSG_EXAMINE (&state, msgid));
|
||||
else
|
||||
strcpy (description, "kernel");
|
||||
}
|
||||
else
|
||||
description[0] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
__mach_port_deallocate (__mach_task_self (), thread);
|
||||
return 0;
|
||||
}
|
@ -61,6 +61,7 @@ Cambridge, MA 02139, USA. */
|
||||
/* Don't include stdlib.h for non-GNU C libraries because some of them
|
||||
contain conflicting prototypes for getopt. */
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#endif /* GNU C library. */
|
||||
|
||||
#ifndef _
|
||||
|
31
wcsmbs/Makefile
Normal file
31
wcsmbs/Makefile
Normal file
@ -0,0 +1,31 @@
|
||||
# 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.
|
||||
|
||||
#
|
||||
# Sub-makefile for wcsmbs portion of the library.
|
||||
#
|
||||
subdir := wcsmbs
|
||||
|
||||
headers := wcstr.h mbstr.h
|
||||
|
||||
routines := mbsadvance mbscat mbschr mbscmp mbscpy mbsdup mbslen \
|
||||
mbsncat mbsncmp mbsncpy mbsrchr mbstomb wcscat wcschr wcscmp\
|
||||
wcscpy wcscspn wcsdup wcslen wcsncat wcsncmp wcsncpy wcspbrk\
|
||||
wcsrchr wcsspn wcstok wcswcs
|
||||
|
||||
include ../Rules
|
38
wcsmbs/mbsadvance.c
Normal file
38
wcsmbs/mbsadvance.c
Normal file
@ -0,0 +1,38 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <mbstr.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
/* Advance pointer to multibyte string by one character. */
|
||||
char *
|
||||
mbsadvance (mbs)
|
||||
const char *mbs;
|
||||
{
|
||||
int clen;
|
||||
|
||||
/* Reset multibyte characters to their initial state. */
|
||||
(void) mblen ((char *) NULL, 0);
|
||||
|
||||
clen = mblen (mbs, MB_CUR_MAX);
|
||||
|
||||
/* FIXME: when current character is illegal return same character. */
|
||||
return clen <= 0 ? (char *) mbs : (char *) (mbs + clen);
|
||||
}
|
||||
|
56
wcsmbs/mbscat.c
Normal file
56
wcsmbs/mbscat.c
Normal file
@ -0,0 +1,56 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <mbstr.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
/* Append SRC onto DEST. */
|
||||
char *
|
||||
mbscat (dest, src)
|
||||
char *dest;
|
||||
const char *src;
|
||||
{
|
||||
const char * const d = dest;
|
||||
size_t len = 0;
|
||||
int clen = 0;
|
||||
|
||||
/* Reset multibyte characters to their initial state. */
|
||||
(void) mblen ((char *) NULL, 0);
|
||||
|
||||
do
|
||||
{
|
||||
dest += clen;
|
||||
clen = mblen (dest, MB_CUR_MAX);
|
||||
}
|
||||
while (clen > 0);
|
||||
|
||||
clen = 0;
|
||||
do
|
||||
{
|
||||
len += clen;
|
||||
clen = mblen (&src[len], MB_CUR_MAX);
|
||||
}
|
||||
while (clen > 0);
|
||||
|
||||
(void) memcpy ((void *) dest, (void *) src, len);
|
||||
dest[len] = '\0'; /* '\0' is the multibyte representation of L'\0' */
|
||||
|
||||
return (char *) d;
|
||||
}
|
||||
|
60
wcsmbs/mbschr.c
Normal file
60
wcsmbs/mbschr.c
Normal file
@ -0,0 +1,60 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <mbstr.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define __need_wchar_t
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
/* Find the first occurence of MBC in MBS. */
|
||||
char *
|
||||
mbschr (mbs, mbc)
|
||||
const char *mbs;
|
||||
mbchar_t mbc;
|
||||
{
|
||||
int clen;
|
||||
wchar_t wc;
|
||||
wchar_t c;
|
||||
|
||||
/* Reset multibyte characters to their initial state. */
|
||||
(void) mblen ((char *) NULL, 0);
|
||||
|
||||
clen = mbtowc (&wc, (char *) &mbc, MB_CUR_MAX);
|
||||
if (clen < 0)
|
||||
/* FIXME: search character is illegal. */
|
||||
return NULL;
|
||||
else if (clen == 0)
|
||||
wc = L'\0';
|
||||
|
||||
clen = 0;
|
||||
do
|
||||
{
|
||||
mbs += clen;
|
||||
clen = mbtowc (&c, mbs, MB_CUR_MAX);
|
||||
}
|
||||
while (clen > 0 && c != wc);
|
||||
|
||||
if (clen < 0 || (clen == 0 && wc != L'\0'))
|
||||
/* FIXME: clen < 0 means illegal character in string. */
|
||||
return NULL;
|
||||
|
||||
return (char *) mbs;
|
||||
}
|
||||
|
63
wcsmbs/mbscmp.c
Normal file
63
wcsmbs/mbscmp.c
Normal file
@ -0,0 +1,63 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <mbstr.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define __need_wchar_t
|
||||
/* FIXME: should be defined in stddef.h.
|
||||
!!! #define __need_uwchar_t */
|
||||
typedef unsigned int uwchar_t;
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
/* Compare MBS1 and MBS2. */
|
||||
int
|
||||
mbscmp (mbs1, mbs2)
|
||||
const char *mbs1;
|
||||
const char *mbs2;
|
||||
{
|
||||
int len1 = 0;
|
||||
int len2 = 0;
|
||||
uwchar_t c1;
|
||||
uwchar_t c2;
|
||||
|
||||
/* Reset multibyte characters to their initial state. */
|
||||
(void) mblen ((char *) NULL, 0);
|
||||
|
||||
do
|
||||
{
|
||||
len1 = mbtowc ((wchar_t *) &c1, mbs1, MB_CUR_MAX);
|
||||
len2 = mbtowc ((wchar_t *) &c2, mbs2, MB_CUR_MAX);
|
||||
|
||||
if (len1 == 0)
|
||||
return len2 == 0 ? 0 : -1;
|
||||
if (len2 == 0)
|
||||
return 1;
|
||||
if (len1 < 0 || len2 < 0)
|
||||
/* FIXME: an illegal character appears. What to do? */
|
||||
return c1 - c2;
|
||||
|
||||
mbs1 += len1;
|
||||
mbs2 += len2;
|
||||
}
|
||||
while (c1 == c2);
|
||||
|
||||
return c1 - c2;
|
||||
}
|
||||
|
47
wcsmbs/mbscpy.c
Normal file
47
wcsmbs/mbscpy.c
Normal file
@ -0,0 +1,47 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <mbstr.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
/* Copy SRC to DEST. */
|
||||
char *
|
||||
mbscpy (dest, src)
|
||||
char *dest;
|
||||
const char *src;
|
||||
{
|
||||
size_t len = 0;
|
||||
int clen = 0;
|
||||
|
||||
/* Reset multibyte characters to their initial state. */
|
||||
(void) mblen ((char *) NULL, 0);
|
||||
|
||||
do
|
||||
{
|
||||
len += clen;
|
||||
clen = mblen (&src[len], MB_CUR_MAX);
|
||||
}
|
||||
while (clen > 0);
|
||||
|
||||
(void) memcpy ((void *) dest, (void *) src, len);
|
||||
dest[len] = '\0'; /* '\0' is the multibyte representation of L'\0' */
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
51
wcsmbs/mbsdup.c
Normal file
51
wcsmbs/mbsdup.c
Normal file
@ -0,0 +1,51 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <mbstr.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
/* Duplicate MBS, returning an identical malloc'd string. */
|
||||
char *
|
||||
mbsdup (mbs)
|
||||
const char *mbs;
|
||||
{
|
||||
size_t len = 0;
|
||||
int clen = 0;
|
||||
char *retval;
|
||||
|
||||
/* Reset multibyte characters to their initial state. */
|
||||
(void) mblen ((char *) NULL, 0);
|
||||
|
||||
do
|
||||
{
|
||||
len += clen;
|
||||
clen = mblen (&mbs[len], MB_CUR_MAX);
|
||||
}
|
||||
while (clen > 0);
|
||||
|
||||
retval = (char *) malloc (len + 1);
|
||||
if (retval != NULL)
|
||||
{
|
||||
(void) memcpy ((void *) retval, (void *) mbs, len);
|
||||
retval[len] = '\0'; /* '\0' is the multibyte representation of L'\0' */
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
45
wcsmbs/mbslen.c
Normal file
45
wcsmbs/mbslen.c
Normal file
@ -0,0 +1,45 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <mbstr.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
/* Return the length of MBS. */
|
||||
size_t
|
||||
mbslen (mbs)
|
||||
const char *mbs;
|
||||
{
|
||||
size_t len = 0;
|
||||
int clen = 0;
|
||||
|
||||
/* Reset multibyte characters to their initial state. */
|
||||
(void) mblen ((char *) NULL, 0);
|
||||
|
||||
do
|
||||
{
|
||||
len += clen;
|
||||
clen = mblen (&mbs[len], MB_CUR_MAX);
|
||||
}
|
||||
while (clen > 0);
|
||||
|
||||
/* FIXME: if string contains an illegal character the length upto this
|
||||
character is returned. */
|
||||
return len;
|
||||
}
|
||||
|
61
wcsmbs/mbsncat.c
Normal file
61
wcsmbs/mbsncat.c
Normal file
@ -0,0 +1,61 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <mbstr.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
/* Append no more than N multi-byte characters from SRC onto DEST. */
|
||||
char *
|
||||
mbsncat (dest, src, n)
|
||||
char *dest;
|
||||
const char *src;
|
||||
size_t n;
|
||||
{
|
||||
const char * const d = dest;
|
||||
const char * const s = src;
|
||||
size_t len = 0;
|
||||
int clen = 0;
|
||||
|
||||
if (n == 0)
|
||||
return (char *) d;
|
||||
|
||||
/* Reset multibyte characters to their initial state. */
|
||||
(void) mblen ((char *) NULL, 0);
|
||||
|
||||
do
|
||||
{
|
||||
dest += clen;
|
||||
clen = mblen (dest, MB_CUR_MAX);
|
||||
}
|
||||
while (clen > 0);
|
||||
|
||||
clen = 0;
|
||||
do
|
||||
{
|
||||
src += clen;
|
||||
clen = mblen (src, MB_CUR_MAX);
|
||||
}
|
||||
while (clen > 0 && ++len < n);
|
||||
|
||||
(void) memcpy ((void *) dest, (void *) s, src - s);
|
||||
dest[src - s] = '\0'; /* '\0' is the multibyte representation of L'\0' */
|
||||
|
||||
return (char *) d;
|
||||
}
|
||||
|
68
wcsmbs/mbsncmp.c
Normal file
68
wcsmbs/mbsncmp.c
Normal file
@ -0,0 +1,68 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <mbstr.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define __need_wchar_t
|
||||
/* FIXME: should be defined in stddef.h.
|
||||
!!! #define __need_uwchar_t */
|
||||
typedef unsigned int uwchar_t;
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
/* Compare N characters of MBS1 and MBS2. */
|
||||
int
|
||||
mbsncmp (mbs1, mbs2, n)
|
||||
const char *mbs1;
|
||||
const char *mbs2;
|
||||
size_t n;
|
||||
{
|
||||
size_t len = 0;
|
||||
int clen1 = 0;
|
||||
int clen2 = 0;
|
||||
uwchar_t c1;
|
||||
uwchar_t c2;
|
||||
|
||||
if (n == 0)
|
||||
return 0;
|
||||
|
||||
/* Reset multibyte characters to their initial state. */
|
||||
(void) mblen ((char *) NULL, 0);
|
||||
|
||||
do
|
||||
{
|
||||
clen1 = mbtowc ((wchar_t *) &c1, mbs1, MB_CUR_MAX);
|
||||
clen2 = mbtowc ((wchar_t *) &c2, mbs2, MB_CUR_MAX);
|
||||
|
||||
if (clen1 == 0)
|
||||
return clen2 == 0 ? 0 : -1;
|
||||
if (clen2 == 0)
|
||||
return 1;
|
||||
if (clen1 < 0 || clen2 < 0)
|
||||
/* FIXME: an illegal character appears. What to do? */
|
||||
return c1 - c2;
|
||||
|
||||
mbs1 += clen1;
|
||||
mbs2 += clen2;
|
||||
}
|
||||
while (c1 == c2 && ++len < n);
|
||||
|
||||
return len < n ? c1 - c2 : 0;
|
||||
}
|
||||
|
55
wcsmbs/mbsncpy.c
Normal file
55
wcsmbs/mbsncpy.c
Normal file
@ -0,0 +1,55 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <mbstr.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
/* Copy no more than N characters of SRC to DEST. */
|
||||
char *
|
||||
mbsncpy (dest, src, n)
|
||||
char *dest;
|
||||
const char *src;
|
||||
size_t n;
|
||||
{
|
||||
const char * const s = src;
|
||||
size_t len = 0;
|
||||
int clen = 0;
|
||||
|
||||
if (n == 0)
|
||||
{
|
||||
dest[0] = '\0'; /* '\0' is the multibyte representation of L'\0' */
|
||||
return dest;
|
||||
}
|
||||
|
||||
/* Reset multibyte characters to their initial state. */
|
||||
(void) mblen ((char *) NULL, 0);
|
||||
|
||||
do
|
||||
{
|
||||
src += clen;
|
||||
clen = mblen (src, MB_CUR_MAX);
|
||||
}
|
||||
while (clen > 0 && ++len < n);
|
||||
|
||||
(void) memcpy ((void *) dest, (void *) s, src - s);
|
||||
dest[src - s] = '\0'; /* '\0' is the multibyte representation of L'\0' */
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
61
wcsmbs/mbsrchr.c
Normal file
61
wcsmbs/mbsrchr.c
Normal file
@ -0,0 +1,61 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <mbstr.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define __need_wchar_t
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
/* Find the last occurence of MBC in MBS. */
|
||||
char *
|
||||
mbsrchr (mbs, mbc)
|
||||
const char *mbs;
|
||||
mbchar_t mbc;
|
||||
{
|
||||
const char * retval = NULL;
|
||||
int clen;
|
||||
wchar_t wc;
|
||||
wchar_t c;
|
||||
|
||||
/* Reset multibyte characters to their initial state. */
|
||||
(void) mblen ((char *) NULL, 0);
|
||||
|
||||
clen = mbtowc (&wc, (char *) &mbc, MB_CUR_MAX);
|
||||
if (clen < 0)
|
||||
/* FIXME: search character MBC is illegal. */
|
||||
return NULL;
|
||||
else if (clen == 0)
|
||||
wc = L'\0';
|
||||
|
||||
clen = 0;
|
||||
do
|
||||
{
|
||||
mbs += clen;
|
||||
clen = mbtowc (&c, mbs, MB_CUR_MAX);
|
||||
}
|
||||
while (clen > 0 && c != wc);
|
||||
|
||||
if (clen < 0)
|
||||
/* FIXME: clen < 0 means illegal character in string. */
|
||||
return NULL;
|
||||
|
||||
return (char *) (clen > 0 || (clen == 0 && wc == L'\0') ? mbs : retval);
|
||||
}
|
||||
|
42
wcsmbs/mbstomb.c
Normal file
42
wcsmbs/mbstomb.c
Normal file
@ -0,0 +1,42 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <mbstr.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
/* Advance pointer to multibyte string by one character. */
|
||||
mbchar_t
|
||||
mbstomb (mbs)
|
||||
const char *mbs;
|
||||
{
|
||||
mbchar_t retval = 0;
|
||||
int clen;
|
||||
|
||||
/* Reset multibyte characters to their initial state. */
|
||||
(void) mblen ((char *) NULL, 0);
|
||||
|
||||
clen = mblen (mbs, MB_CUR_MAX);
|
||||
|
||||
if (clen > 0)
|
||||
(void) memcpy (&retval, mbs, clen);
|
||||
|
||||
/* FIXME: when current character is illegal return '\0'. */
|
||||
return retval;
|
||||
}
|
||||
|
69
wcsmbs/mbstr.h
Normal file
69
wcsmbs/mbstr.h
Normal file
@ -0,0 +1,69 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#ifndef _MBSTRING_H
|
||||
|
||||
#define _MBSTRING_H 1
|
||||
#include <features.h>
|
||||
#include <limits.h>
|
||||
|
||||
#define __need_size_t
|
||||
#include <stddef.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/* This data type should be large enough to contain MB_CUR_MAX bytes. */
|
||||
typedef unsigned int mbchar_t;
|
||||
|
||||
|
||||
/* Copy SRC to DEST. */
|
||||
extern char *mbscpy __P ((char *__dest, __const char *__src));
|
||||
/* Copy no more than N multi-byte characters of SRC to DEST. */
|
||||
extern char *mbsncpy __P ((char *__dest, __const char *__src, size_t __n));
|
||||
|
||||
/* Append SRC onto DEST. */
|
||||
extern char *mbscat __P ((char *__dest, __const char *__src));
|
||||
/* Append no more than N characters from SRC onto DEST. */
|
||||
extern char *mbsncat __P ((char *__dest, __const char *__src, size_t __n));
|
||||
|
||||
/* Compare S1 and S2. */
|
||||
extern int mbscmp __P ((__const char *__s1, __const char *__s2));
|
||||
/* Compare N characters of S1 and S2. */
|
||||
extern int mbsncmp __P ((__const char *__s1, __const char *__s2, size_t __n));
|
||||
|
||||
/* Duplicate MBS, returning an identical malloc'd string. */
|
||||
extern char *mbsdup __P ((__const char *__s));
|
||||
|
||||
/* Find the first occurence of MBC in MBS. */
|
||||
extern char *mbschr __P ((__const char *__mbs, mbchar_t mbc));
|
||||
/* Find the last occurence of MBC in MBS. */
|
||||
extern char *mbsrchr __P ((__const char *__mbs, mbchar_t mbc));
|
||||
|
||||
/* Return the length of MBS. */
|
||||
extern size_t mbslen __P ((__const char *__mbs));
|
||||
|
||||
|
||||
/* Advance pointer to multibyte string by one character. */
|
||||
extern char *mbsadvance __P ((__const char *__mbs));
|
||||
|
||||
/* Return first character in MBS. */
|
||||
extern mbchar_t mbstomb __P ((__const char *__mbs));
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* mbstring.h */
|
49
wcsmbs/wcscat.c
Normal file
49
wcsmbs/wcscat.c
Normal file
@ -0,0 +1,49 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
|
||||
|
||||
/* Append SRC on the end of DEST. */
|
||||
wchar_t *
|
||||
wcscat (dest, src)
|
||||
wchar_t *dest;
|
||||
const wchar_t *src;
|
||||
{
|
||||
register wchar_t *s1 = dest;
|
||||
register const wchar_t *s2 = src;
|
||||
wchar_t c;
|
||||
|
||||
/* Find the end of the string. */
|
||||
do
|
||||
c = *s1++;
|
||||
while (c != L'\0');
|
||||
|
||||
/* Make S1 point before the next character, so we can increment
|
||||
it while memory is read (wins on pipelined cpus). */
|
||||
s1 -= 2;
|
||||
|
||||
do
|
||||
{
|
||||
c = *s2++;
|
||||
*++s1 = c;
|
||||
}
|
||||
while (c != L'\0');
|
||||
|
||||
return dest;
|
||||
}
|
35
wcsmbs/wcschr.c
Normal file
35
wcsmbs/wcschr.c
Normal file
@ -0,0 +1,35 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
|
||||
|
||||
/* Find the first ocurrence of WC in WCS. */
|
||||
wchar_t *
|
||||
wcschr (wcs, wc)
|
||||
register const wchar_t *wcs;
|
||||
register const wchar_t wc;
|
||||
{
|
||||
while (*wcs != L'\0')
|
||||
if (*wcs == wc)
|
||||
return (wchar_t *) wcs;
|
||||
else
|
||||
++wcs;
|
||||
|
||||
return NULL;
|
||||
}
|
42
wcsmbs/wcscmp.c
Normal file
42
wcsmbs/wcscmp.c
Normal file
@ -0,0 +1,42 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
|
||||
|
||||
/* Compare S1 and S2, returning less than, equal to or
|
||||
greater than zero if S1 is lexiographically less than,
|
||||
equal to or greater than S2. */
|
||||
int
|
||||
wcscmp (s1, s2)
|
||||
const wchar_t *s1;
|
||||
const wchar_t *s2;
|
||||
{
|
||||
uwchar_t c1, c2;
|
||||
|
||||
do
|
||||
{
|
||||
c1 = (uwchar_t) *s1++;
|
||||
c2 = (uwchar_t) *s2++;
|
||||
if (c1 == L'\0')
|
||||
return c1 - c2;
|
||||
}
|
||||
while (c1 == c2);
|
||||
|
||||
return c1 - c2;
|
||||
}
|
44
wcsmbs/wcscpy.c
Normal file
44
wcsmbs/wcscpy.c
Normal file
@ -0,0 +1,44 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
|
||||
#define __need_ptrdiff_t
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
/* Copy SRC to DEST. */
|
||||
wchar_t *
|
||||
wcscpy (dest, src)
|
||||
wchar_t *dest;
|
||||
const wchar_t *src;
|
||||
{
|
||||
wchar_t *wcp = (wchar_t *) src;
|
||||
wchar_t c;
|
||||
const ptrdiff_t off = dest - src - 1;
|
||||
|
||||
do
|
||||
{
|
||||
c = *wcp++;
|
||||
wcp[off] = c;
|
||||
}
|
||||
while (c != L'\0');
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
38
wcsmbs/wcscspn.c
Normal file
38
wcsmbs/wcscspn.c
Normal file
@ -0,0 +1,38 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
|
||||
|
||||
/* Return the length of the maximum initial segment
|
||||
of WCS which contains only wide-characters not in REJECT. */
|
||||
size_t
|
||||
wcscspn (wcs, reject)
|
||||
const wchar_t *wcs;
|
||||
const wchar_t *reject;
|
||||
{
|
||||
register size_t count = 0;
|
||||
|
||||
while (*wcs != L'\0')
|
||||
if (wcschr (reject, *wcs++) == NULL)
|
||||
++count;
|
||||
else
|
||||
return count;
|
||||
|
||||
return count;
|
||||
}
|
38
wcsmbs/wcsdup.c
Normal file
38
wcsmbs/wcsdup.c
Normal file
@ -0,0 +1,38 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
/* Duplicate S, returning an identical malloc'd string. */
|
||||
wchar_t *
|
||||
wcsdup (s)
|
||||
const wchar_t *s;
|
||||
{
|
||||
size_t len = (wcslen (s) + 1) * sizeof (wchar_t);
|
||||
void *new = malloc (len);
|
||||
|
||||
if (new == NULL)
|
||||
return NULL;
|
||||
|
||||
memcpy (new, (void *) s, len);
|
||||
|
||||
return (wchar_t *) new;
|
||||
}
|
42
wcsmbs/wcslen.c
Normal file
42
wcsmbs/wcslen.c
Normal file
@ -0,0 +1,42 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
|
||||
|
||||
/* Copy SRC to DEST. */
|
||||
size_t
|
||||
wcslen (s)
|
||||
const wchar_t *s;
|
||||
{
|
||||
size_t len = 0;
|
||||
|
||||
while (s[len] != L'\0')
|
||||
{
|
||||
if (s[++len] == L'\0')
|
||||
return len;
|
||||
if (s[++len] == L'\0')
|
||||
return len;
|
||||
if (s[++len] == L'\0')
|
||||
return len;
|
||||
++len;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
79
wcsmbs/wcsncat.c
Normal file
79
wcsmbs/wcsncat.c
Normal file
@ -0,0 +1,79 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
|
||||
|
||||
/* Append no more than N wide-character of SRC onto DEST. */
|
||||
wchar_t *
|
||||
wcsncat (dest, src, n)
|
||||
wchar_t *dest;
|
||||
const wchar_t *src;
|
||||
size_t n;
|
||||
{
|
||||
wchar_t c;
|
||||
wchar_t * const s = dest;
|
||||
|
||||
/* Find the end of DEST. */
|
||||
do
|
||||
c = *dest++;
|
||||
while (c != L'\0');
|
||||
|
||||
/* Make DEST point before next character, so we can increment
|
||||
it while memory is read (wins on pipelined cpus). */
|
||||
dest -= 2;
|
||||
|
||||
if (n >= 4)
|
||||
{
|
||||
size_t n4 = n >> 2;
|
||||
do
|
||||
{
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
return s;
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
return s;
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
return s;
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
return s;
|
||||
} while (--n4 > 0);
|
||||
n &= 3;
|
||||
}
|
||||
|
||||
while (n > 0)
|
||||
{
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
return s;
|
||||
n--;
|
||||
}
|
||||
|
||||
if (c != L'\0')
|
||||
*++dest = L'\0';
|
||||
|
||||
return s;
|
||||
}
|
70
wcsmbs/wcsncmp.c
Normal file
70
wcsmbs/wcsncmp.c
Normal file
@ -0,0 +1,70 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
|
||||
|
||||
/* Compare no more than N characters of S1 and S2,
|
||||
returning less than, equal to or greater than zero
|
||||
if S1 is lexiographically less than, equal to or
|
||||
greater than S2. */
|
||||
int
|
||||
wcsncmp (s1, s2, n)
|
||||
const wchar_t *s1;
|
||||
const wchar_t *s2;
|
||||
size_t n;
|
||||
{
|
||||
uwchar_t c1 = L'\0';
|
||||
uwchar_t c2 = L'\0';
|
||||
|
||||
if (n >= 4)
|
||||
{
|
||||
size_t n4 = n >> 2;
|
||||
do
|
||||
{
|
||||
c1 = (uwchar_t) *s1++;
|
||||
c2 = (uwchar_t) *s2++;
|
||||
if (c1 == L'\0' || c1 != c2)
|
||||
return c1 - c2;
|
||||
c1 = (uwchar_t) *s1++;
|
||||
c2 = (uwchar_t) *s2++;
|
||||
if (c1 == L'\0' || c1 != c2)
|
||||
return c1 - c2;
|
||||
c1 = (uwchar_t) *s1++;
|
||||
c2 = (uwchar_t) *s2++;
|
||||
if (c1 == L'\0' || c1 != c2)
|
||||
return c1 - c2;
|
||||
c1 = (uwchar_t) *s1++;
|
||||
c2 = (uwchar_t) *s2++;
|
||||
if (c1 == L'\0' || c1 != c2)
|
||||
return c1 - c2;
|
||||
} while (--n4 > 0);
|
||||
n &= 3;
|
||||
}
|
||||
|
||||
while (n > 0)
|
||||
{
|
||||
c1 = (uwchar_t) *s1++;
|
||||
c2 = (uwchar_t) *s2++;
|
||||
if (c1 == L'\0' || c1 != c2)
|
||||
return c1 - c2;
|
||||
n--;
|
||||
}
|
||||
|
||||
return c1 - c2;
|
||||
}
|
85
wcsmbs/wcsncpy.c
Normal file
85
wcsmbs/wcsncpy.c
Normal file
@ -0,0 +1,85 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
|
||||
|
||||
/* Copy no more than N wide-characters of SRC to DEST. */
|
||||
wchar_t *
|
||||
wcsncpy (dest, src, n)
|
||||
wchar_t *dest;
|
||||
const wchar_t *src;
|
||||
size_t n;
|
||||
{
|
||||
wchar_t c;
|
||||
wchar_t * const s = dest;
|
||||
|
||||
--dest;
|
||||
|
||||
if (n >= 4)
|
||||
{
|
||||
size_t n4 = n >> 2;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
break;
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
break;
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
break;
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
break;
|
||||
if (--n4 == 0)
|
||||
goto last_chars;
|
||||
}
|
||||
n = n - (dest - s) - 1;
|
||||
if (n == 0)
|
||||
return s;
|
||||
goto zero_fill;
|
||||
}
|
||||
|
||||
last_chars:
|
||||
n &= 3;
|
||||
if (n == 0)
|
||||
return s;
|
||||
|
||||
do
|
||||
{
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (--n == 0)
|
||||
return s;
|
||||
}
|
||||
while (c != L'\0');
|
||||
|
||||
zero_fill:
|
||||
do
|
||||
*++dest = L'\0';
|
||||
while (--n > 0);
|
||||
|
||||
return s;
|
||||
}
|
35
wcsmbs/wcspbrk.c
Normal file
35
wcsmbs/wcspbrk.c
Normal file
@ -0,0 +1,35 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
|
||||
|
||||
/* Find the first ocurrence in WCS of any wide-character in ACCEPT. */
|
||||
wchar_t *
|
||||
wcspbrk (wcs, accept)
|
||||
register const wchar_t *wcs;
|
||||
register const wchar_t *accept;
|
||||
{
|
||||
while (*wcs != L'\0')
|
||||
if (wcschr (accept, *wcs) == NULL)
|
||||
++wcs;
|
||||
else
|
||||
return (wchar_t *) wcs;
|
||||
|
||||
return NULL;
|
||||
}
|
38
wcsmbs/wcsrchr.c
Normal file
38
wcsmbs/wcsrchr.c
Normal file
@ -0,0 +1,38 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
|
||||
|
||||
/* Find the last ocurrence of WC in WCS. */
|
||||
wchar_t *
|
||||
wcsrchr (wcs, wc)
|
||||
register const wchar_t *wcs;
|
||||
register const wchar_t wc;
|
||||
{
|
||||
const wchar_t *retval = NULL;
|
||||
|
||||
while (*wcs != L'\0')
|
||||
{
|
||||
if (*wcs == wc)
|
||||
retval = wcs;
|
||||
++wcs;
|
||||
}
|
||||
|
||||
return (wchar_t *) retval;
|
||||
}
|
45
wcsmbs/wcsspn.c
Normal file
45
wcsmbs/wcsspn.c
Normal file
@ -0,0 +1,45 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
|
||||
|
||||
/* Return the length of the maximum initial segment
|
||||
of WCS which contains only wide-characters in ACCEPT. */
|
||||
size_t
|
||||
wcsspn (wcs, accept)
|
||||
const wchar_t *wcs;
|
||||
const wchar_t *accept;
|
||||
{
|
||||
register const wchar_t *p;
|
||||
register const wchar_t *a;
|
||||
register size_t count = 0;
|
||||
|
||||
for (p = wcs; *p != L'\0'; ++p)
|
||||
{
|
||||
for (a = accept; *a != L'\0'; ++a)
|
||||
if (*p == *a)
|
||||
break;
|
||||
if (*a == L'\0')
|
||||
return count;
|
||||
else
|
||||
++count;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
67
wcsmbs/wcstok.c
Normal file
67
wcsmbs/wcstok.c
Normal file
@ -0,0 +1,67 @@
|
||||
/* Copyright (C) 1995 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. */
|
||||
|
||||
#include <wcstr.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
static wchar_t *olds = NULL;
|
||||
|
||||
/* Parse WCS into tokens separated by characters in DELIM.
|
||||
If WCS is NULL, the last string wcstok() was called with is
|
||||
used. */
|
||||
wchar_t *
|
||||
wcstok (wcs, delim)
|
||||
register wchar_t *wcs;
|
||||
register const wchar_t *delim;
|
||||
{
|
||||
wchar_t *token;
|
||||
|
||||
if (wcs == NULL)
|
||||
{
|
||||
if (olds == NULL)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
wcs = olds;
|
||||
}
|
||||
|
||||
/* Scan leading delimiters. */
|
||||
wcs += wcsspn (wcs, delim);
|
||||
if (*wcs == L'\0')
|
||||
{
|
||||
olds = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Find the end of the token. */
|
||||
token = wcs;
|
||||
wcs = wcspbrk (token, delim);
|
||||
if (wcs == NULL)
|
||||
/* This token finishes the string. */
|
||||
olds = NULL;
|
||||
else
|
||||
{
|
||||
/* Terminate the token and make OLDS point past it. */
|
||||
*wcs = L'\0';
|
||||
olds = wcs + 1;
|
||||
}
|
||||
return token;
|
||||
}
|
84
wcsmbs/wcstr.h
Normal file
84
wcsmbs/wcstr.h
Normal file
@ -0,0 +1,84 @@
|
||||
/* Copyright (C) 1995 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, 1992 Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
|
||||
#ifndef _WCSTRING_H
|
||||
|
||||
#define _WCSTRING_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
|
||||
#include <stddef.h>
|
||||
|
||||
/* FIXME: Should go with this or another name in stddef.h. */
|
||||
typedef unsigned int uwchar_t;
|
||||
|
||||
|
||||
/* 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 *wcswcs __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));
|
||||
|
||||
/* Return the number of wide-characters in S. */
|
||||
extern size_t wcslen __P ((__const wchar_t *__s));
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* wcstring.h */
|
97
wcsmbs/wcswcs.c
Normal file
97
wcsmbs/wcswcs.c
Normal file
@ -0,0 +1,97 @@
|
||||
/* Copyright (C) 1995 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 <wcstr.h>
|
||||
|
||||
wchar_t *
|
||||
wcswcs (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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user