1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

Thu Mar 14 06:01:07 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>

* string/strnlen.c: New file.
	* string/Makefile (routines): Add strnlen.
	* string/string.h [__USE_GNU] (strnlen): Declare new function.
	[__OPTIMIZE__]: Define extern inline implementation of it.
This commit is contained in:
Roland McGrath
1996-03-14 11:20:23 +00:00
parent 52e9a9d118
commit 8d71c7b0e4
5 changed files with 59 additions and 14 deletions

View File

@ -1,4 +1,4 @@
# Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. # Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
# This file is part of the GNU C Library. # This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or # The GNU C Library is free software; you can redistribute it and/or
@ -24,7 +24,8 @@ subdir := string
headers := string.h strings.h memory.h endian.h bytesex.h headers := string.h strings.h memory.h endian.h bytesex.h
routines := strcat strchr strcmp strcoll strcpy strcspn strdup \ routines := strcat strchr strcmp strcoll strcpy strcspn strdup \
strerror _strerror strlen strncat strncmp strncpy \ strerror _strerror strlen strnlen \
strncat strncmp strncpy \
strrchr strpbrk strsignal strspn strstr strtok \ strrchr strpbrk strsignal strspn strstr strtok \
strxfrm memchr memcmp memmove memset \ strxfrm memchr memcmp memmove memset \
bcopy bzero ffs stpcpy stpncpy \ bcopy bzero ffs stpcpy stpncpy \

View File

@ -127,9 +127,26 @@ extern __ptr_t memmem __P ((__const __ptr_t __haystack, size_t __haystacklen,
__const __ptr_t __needle, size_t __needlelen)); __const __ptr_t __needle, size_t __needlelen));
#endif #endif
/* Return the length of S. */ /* Return the length of S. */
extern size_t strlen __P ((__const char *__s)); extern size_t strlen __P ((__const char *__s));
#ifdef __USE_GNU
/* Find the length of STRING, but scan at most MAXLEN characters.
If no '\0' terminator is found in that many characters, return MAXLEN. */
extern size_t strnlen __P ((__const char *__string, size_t __maxlen));
#ifdef __OPTIMIZE__
extern __inline size_t
strnlen (__const char *__string, size_t __maxlen)
{
__const char *__end = memchr (__string, '\0', __maxlen);
return __end ? __end - __string : __maxlen;
}
#endif
#endif
/* Return a string describing the meaning of the `errno' code in ERRNUM. */ /* Return a string describing the meaning of the `errno' code in ERRNUM. */
extern char *strerror __P ((int __errnum)); extern char *strerror __P ((int __errnum));
#ifdef __USE_REENTRANT #ifdef __USE_REENTRANT

30
string/strnlen.c Normal file
View File

@ -0,0 +1,30 @@
/* Find the length of STRING, but scan at most MAXLEN characters.
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 <string.h>
/* Find the length of STRING, but scan at most MAXLEN characters.
If no '\0' terminator is found in that many characters, return MAXLEN. */
size_t
strnlen (const char *string, size_t maxlen)
{
const char *end = memchr (string, '\0', maxlen);
return end ? end - string : maxlen;
}

View File

@ -32,22 +32,18 @@ extern void __libc_global_ctors (void);
static void static void
init (int *data) init (int *data)
{ {
extern int __personality (int);
int argc = *data; int argc = *data;
char **argv = (void *) (data + 1); char **argv = (void *) (data + 1);
char **envp = &argv[argc + 1]; char **envp = &argv[argc + 1];
#ifdef __i386__ /* The `personality' system call takes one argument that chooses the
/* Make sure we are not using the iBSC2 personality. The `personality' "personality", i.e. the set of system calls and such. Zero is the
syscall takes one argument; zero means the Linux personality. The native Linux value; we must make this call first thing to disable
argument arrives in %ebx; we have to save and restore %ebx by hand emulation of some other system that might have been enabled by default
here, because GCC (as of 2.7.0) cannot handle saving and restoring it based on the executable format. */
for us when it is the dedicated GOT register for PIC. */ __personality (0);
asm ("pushl %%ebx\n"
"xorl %%ebx, %%ebx\n"
"int $0x80 # syscall no %0\n"
"popl %%ebx"
: : "a" (SYS_ify (personality)));
#endif
/* Set the FPU control word to the proper default value. */ /* Set the FPU control word to the proper default value. */
__setfpucw (__fpu_control); __setfpucw (__fpu_control);

View File

@ -15,6 +15,7 @@ mlockall - mlockall 1 __mlockall mlockall
mount - mount 5 __mount mount mount - mount 5 __mount mount
munlock - munlock 2 __munlock munlock munlock - munlock 2 __munlock munlock
munlockall - munlockall 0 __munlockall munlockall munlockall - munlockall 0 __munlockall munlockall
personality init-first personality 1 __personality personality
pipe - pipe 1 __pipe pipe pipe - pipe 1 __pipe pipe
reboot - reboot 3 reboot reboot - reboot 3 reboot
s_ptrace ptrace ptrace 4 __syscall_ptrace s_ptrace ptrace ptrace 4 __syscall_ptrace