2005-12-13 Ulrich Drepper <drepper@redhat.com>

This commit is contained in:
Ulrich Drepper 2005-12-14 08:43:25 +00:00
parent d1dc39a44e
commit b6ab06cef4
137 changed files with 8146 additions and 441 deletions

1590
ChangeLog

File diff suppressed because it is too large Load Diff

View File

@ -622,14 +622,15 @@ endif # $(+cflags) == ""
+cflags := $(sort $(+cflags))
# These are flags given to the C compiler to tell it to look for include
# files (including ones given in angle brackets) in the current directory,
# in the parent library source directory and in the include directory.
# These are flags given to the C compiler to tell it to look for
# include files (including ones given in angle brackets) in the parent
# library source directory, in the include directory, and in the
# current directory.
# `+sysdep-includes' will be defined by Makerules.
+includes = -I$(..)include -I. \
$(patsubst %/,-I%,$(objpfx)) $(patsubst %/,-I%,$(..)) \
+includes = -I$(..)include $(patsubst %/,-I%,$(..)) \
$(libio-include) $(includes) \
$(+sysdep-includes) $(sysincludes)
$(+sysdep-includes) $(sysincludes) -I. \
$(patsubst %/,-I%,$(objpfx))
# Since libio has several internal header files, we use a -I instead
# of many little headers in the include directory.

View File

@ -208,53 +208,6 @@ before-compile += $(gen-as-const-headers:%.sym=$(common-objpfx)%.h)
# later directory would be chosen over a .c file in an earlier directory,
# which does not preserve the desired sysdeps ordering behavior.
# It matters that this set of rules, for compiling from sources in
# the current directory (the $srcdir/$subdir) come before the
# generated sysdep rules in included from sysd-rules below. When
# compiling in the source tree, generated sources go into the current
# directory, and those should be chosen before any sources in sysdeps.
define o-iterator-doit
$(objpfx)%$o: %.S $(before-compile); $$(compile-command.S)
endef
object-suffixes-left := $(all-object-suffixes)
include $(o-iterator)
define o-iterator-doit
$(objpfx)%$o: %.s $(before-compile); $$(compile-command.s)
endef
object-suffixes-left := $(all-object-suffixes)
include $(o-iterator)
define o-iterator-doit
$(objpfx)%$o: %.c $(before-compile); $$(compile-command.c)
endef
object-suffixes-left := $(all-object-suffixes)
include $(o-iterator)
# Omit the objpfx rules when building in the source tree, because
# objpfx is empty and so these rules just override the ones above.
ifdef objpfx
# Define first rules to find the source files in $(objpfx).
# Generated source files will end up there.
define o-iterator-doit
$(objpfx)%$o: $(objpfx)%.S $(before-compile); $$(compile-command.S)
endef
object-suffixes-left := $(all-object-suffixes)
include $(o-iterator)
define o-iterator-doit
$(objpfx)%$o: $(objpfx)%.s $(before-compile); $$(compile-command.s)
endef
object-suffixes-left := $(all-object-suffixes)
include $(o-iterator)
define o-iterator-doit
$(objpfx)%$o: $(objpfx)%.c $(before-compile); $$(compile-command.c)
endef
object-suffixes-left := $(all-object-suffixes)
include $(o-iterator)
endif
# System-dependent makefiles can put in `inhibit-sysdep-asm' wildcard
# patterns matching sysdep directories whose assembly source files should
# be suppressed.
@ -304,6 +257,7 @@ $(+sysdir_pfx)sysd-rules: $(+sysdir_pfx)config.make $(..)Makerules \
echo "\$$(objpfx)m_%.S: $$dir/s_%.S; \$$(+make-include-of-dep)"; \
echo "\$$(objpfx)m_%.c: $$dir/s_%.c; \$$(+make-include-of-dep)"; \
done; \
echo "\$$(objpfx)m_%.c: s_%.c; \$$(+make-include-of-dep)"; \
echo 'sysd-rules-done = t') > $@T
mv -f $@T $@
@ -318,6 +272,53 @@ echo '#include <$<>' > $@T
mv -f $@T $@
endef
# It matters that this set of rules, for compiling from sources in
# the current directory (the $srcdir/$subdir) come before the
# generated sysdep rules in included from sysd-rules below. When
# compiling in the source tree, generated sources go into the current
# directory, and those should be chosen before any sources in sysdeps.
define o-iterator-doit
$(objpfx)%$o: %.S $(before-compile); $$(compile-command.S)
endef
object-suffixes-left := $(all-object-suffixes)
include $(o-iterator)
define o-iterator-doit
$(objpfx)%$o: %.s $(before-compile); $$(compile-command.s)
endef
object-suffixes-left := $(all-object-suffixes)
include $(o-iterator)
define o-iterator-doit
$(objpfx)%$o: %.c $(before-compile); $$(compile-command.c)
endef
object-suffixes-left := $(all-object-suffixes)
include $(o-iterator)
# Omit the objpfx rules when building in the source tree, because
# objpfx is empty and so these rules just override the ones above.
ifdef objpfx
# Define first rules to find the source files in $(objpfx).
# Generated source files will end up there.
define o-iterator-doit
$(objpfx)%$o: $(objpfx)%.S $(before-compile); $$(compile-command.S)
endef
object-suffixes-left := $(all-object-suffixes)
include $(o-iterator)
define o-iterator-doit
$(objpfx)%$o: $(objpfx)%.s $(before-compile); $$(compile-command.s)
endef
object-suffixes-left := $(all-object-suffixes)
include $(o-iterator)
define o-iterator-doit
$(objpfx)%$o: $(objpfx)%.c $(before-compile); $$(compile-command.c)
endef
object-suffixes-left := $(all-object-suffixes)
include $(o-iterator)
endif
# Generate version maps, but wait until sysdep-subdirs is known
ifeq ($(sysd-sorted-done),t)
ifeq ($(versioning),yes)

32
bare/brdinit.c Normal file
View File

@ -0,0 +1,32 @@
/* Copyright (C) 1994, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil),
On-Line Applications Research Corporation.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <standalone.h>
/* This file is only required when a "bare" board is configured. */
/* _Board_Initialize
This routine normally performs board specific initialization. */
void
_Board_Initialize ()
{
}

42
bare/console.c Normal file
View File

@ -0,0 +1,42 @@
/* Copyright (C) 1994, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil),
On-Line Applications Research Corporation.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <standalone.h>
/* This file is only required when a "bare" board is configured. */
/* These routines provide console IO routines for your embedded target. */
int
_Console_Putc (ch)
char ch;
{
/* eat the character */
return 0;
}
int
_Console_Getc (poll)
int poll;
{
/* boring user, never types anything */
return -1;
}

102
csu/check_fds.c Normal file
View File

@ -0,0 +1,102 @@
/* Copyright (C) 2000, 2002, 2003, 2005 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <fcntl.h>
#include <paths.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
/* Try to get a machine dependent instruction which will make the
program crash. This is used in case everything else fails. */
#include <abort-instr.h>
#ifndef ABORT_INSTRUCTION
/* No such instruction is available. */
# define ABORT_INSTRUCTION
#endif
#include <device-nrs.h>
#include <not-cancel.h>
/* Should other OSes (e.g., Hurd) have different versions which can
be written in a better way? */
static void
check_one_fd (int fd, int mode)
{
/* Note that fcntl() with this parameter is not a cancellation point. */
if (__builtin_expect (__libc_fcntl (fd, F_GETFD), 0) == -1
&& errno == EBADF)
{
const char *name;
dev_t dev;
/* For writable descriptors we use /dev/full. */
if ((mode & O_ACCMODE) == O_WRONLY)
{
name = _PATH_DEV "full";
dev = makedev (DEV_FULL_MAJOR, DEV_FULL_MINOR);
}
else
{
name = _PATH_DEVNULL;
dev = makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR);
}
/* Something is wrong with this descriptor, it's probably not
opened. Open /dev/null so that the SUID program we are
about to start does not accidently use this descriptor. */
int nullfd = open_not_cancel (name, mode, 0);
/* We are very paranoid here. With all means we try to ensure
that we are actually opening the /dev/null device and nothing
else.
Note that the following code assumes that STDIN_FILENO,
STDOUT_FILENO, STDERR_FILENO are the three lowest file
decsriptor numbers, in this order. */
struct stat64 st;
if (__builtin_expect (nullfd != fd, 0)
|| __builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) != 0
|| __builtin_expect (S_ISCHR (st.st_mode), 1) == 0
|| st.st_rdev != dev)
/* We cannot even give an error message here since it would
run into the same problems. */
while (1)
/* Try for ever and ever. */
ABORT_INSTRUCTION;
}
}
void
__libc_check_standard_fds (void)
{
/* This is really paranoid but some people actually are. If /dev/null
should happen to be a symlink to somewhere else and not the device
commonly known as "/dev/null" we bail out. We can detect this with
the O_NOFOLLOW flag for open() but only on some system. */
#ifndef O_NOFOLLOW
# define O_NOFOLLOW 0
#endif
/* Check all three standard file descriptors. */
check_one_fd (STDIN_FILENO, O_WRONLY | O_NOFOLLOW);
check_one_fd (STDOUT_FILENO, O_RDONLY | O_NOFOLLOW);
check_one_fd (STDERR_FILENO, O_RDONLY | O_NOFOLLOW);
}

37
csu/errno-loc.c Normal file
View File

@ -0,0 +1,37 @@
/* MT support function to get address of `errno' variable, non-threaded
version.
Copyright (C) 1996, 1998, 2002, 2004 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <tls.h>
#if ! USE___THREAD && !RTLD_PRIVATE_ERRNO
#undef errno
extern int errno;
#endif
int *
#if ! USE___THREAD
weak_const_function
#endif
__errno_location (void)
{
return &errno;
}
libc_hidden_def (__errno_location)

94
debug/backtrace.c Normal file
View File

@ -0,0 +1,94 @@
/* Return backtrace of current program state. Generic version.
Copyright (C) 1998, 2000, 2002, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <execinfo.h>
#include <signal.h>
#include <frame.h>
#include <sigcontextinfo.h>
#include <bp-checks.h>
#include <ldsodefs.h>
/* This implementation assumes a stack layout that matches the defaults
used by gcc's `__builtin_frame_address' and `__builtin_return_address'
(FP is the frame pointer register):
+-----------------+ +-----------------+
FP -> | previous FP --------> | previous FP ------>...
| | | |
| return address | | return address |
+-----------------+ +-----------------+
*/
/* Get some notion of the current stack. Need not be exactly the top
of the stack, just something somewhere in the current frame. */
#ifndef CURRENT_STACK_FRAME
# define CURRENT_STACK_FRAME ({ char __csf; &__csf; })
#endif
/* By default we assume that the stack grows downward. */
#ifndef INNER_THAN
# define INNER_THAN <
#endif
/* By default assume the `next' pointer in struct layout points to the
next struct layout. */
#ifndef ADVANCE_STACK_FRAME
# define ADVANCE_STACK_FRAME(next) BOUNDED_1 ((struct layout *) (next))
#endif
/* By default, the frame pointer is just what we get from gcc. */
#ifndef FIRST_FRAME_POINTER
# define FIRST_FRAME_POINTER __builtin_frame_address (0)
#endif
int
__backtrace (array, size)
void **array;
int size;
{
struct layout *current;
void *__unbounded top_frame;
void *__unbounded top_stack;
int cnt = 0;
top_frame = FIRST_FRAME_POINTER;
top_stack = CURRENT_STACK_FRAME;
/* We skip the call to this function, it makes no sense to record it. */
current = BOUNDED_1 ((struct layout *) top_frame);
while (cnt < size)
{
if ((void *) current INNER_THAN top_stack
|| !((void *) current INNER_THAN __libc_stack_end))
/* This means the address is out of range. Note that for the
toplevel we see a frame pointer with value NULL which clearly is
out of range. */
break;
array[cnt++] = current->return_address;
current = ADVANCE_STACK_FRAME (current->next);
}
return cnt;
}
weak_alias (__backtrace, backtrace)
libc_hidden_def (__backtrace)

58
debug/backtracesyms.c Normal file
View File

@ -0,0 +1,58 @@
/* Return list with names for address in backtrace.
Copyright (C) 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <execinfo.h>
#include <stdlib.h>
#include <string.h>
/* Assume the worst for the width of an address. */
#define WORD_WIDTH 16
char **
__backtrace_symbols (array, size)
void *const *array;
int size;
{
int cnt;
size_t total = 0;
char **result;
/* We can compute the text size needed for the symbols since we print
them all as "[+0x<addr>]". */
total = size * (WORD_WIDTH + 6);
/* Allocate memory for the result. */
result = malloc (size * sizeof (char *) + total);
if (result != NULL)
{
char *last = (char *) (result + size);
for (cnt = 0; cnt < size; ++cnt)
{
result[cnt] = last;
last += 1 + sprintf (last, "[+%p]", array[cnt]);
}
}
return result;
}
weak_alias (__backtrace_symbols, backtrace_symbols)

64
debug/backtracesymsfd.c Normal file
View File

@ -0,0 +1,64 @@
/* Write formatted list with names for addresses in backtrace to a file.
Copyright (C) 1998, 2003, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <execinfo.h>
#include <string.h>
#include <sys/uio.h>
#include <stdio-common/_itoa.h>
#include <not-cancel.h>
#if __ELF_NATIVE_CLASS == 32
# define WORD_WIDTH 8
#else
/* We assume 64bits. */
# define WORD_WIDTH 16
#endif
void
__backtrace_symbols_fd (array, size, fd)
void *const *array;
int size;
int fd;
{
struct iovec iov[3];
int cnt;
for (cnt = 0; cnt < size; ++cnt)
{
char buf[WORD_WIDTH];
iov[0].iov_base = (void *) "[0x";
iov[0].iov_len = 3;
iov[1].iov_base = _itoa_word ((unsigned long int) array[cnt],
&buf[WORD_WIDTH], 16, 0);
iov[1].iov_len = &buf[WORD_WIDTH] - (char *) iov[1].iov_base;
iov[2].iov_base = (void *) "]\n";
iov[2].iov_len = 2;
/* We prefer to use the non-cancelable interface if it is available. */
writev_not_cancel_no_status (fd, iov, 3);
}
}
weak_alias (__backtrace_symbols_fd, backtrace_symbols_fd)
libc_hidden_def (__backtrace_symbols_fd)

27
dirent/alphasort64.c Normal file
View File

@ -0,0 +1,27 @@
/* Copyright (C) 1992, 1997, 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <dirent.h>
#include <string.h>
int
alphasort64 (const void *a, const void *b)
{
return strcoll ((*(const struct dirent64 **) a)->d_name,
(*(const struct dirent64 **) b)->d_name);
}

35
dirent/closedir.c Normal file
View File

@ -0,0 +1,35 @@
/* Copyright (C) 1991, 1995, 1996, 1997 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <stddef.h>
#include <dirent.h>
/* Close the directory stream DIRP.
Return 0 if successful, -1 if not. */
int
__closedir (DIR *dirp)
{
__set_errno (ENOSYS);
return -1;
}
weak_alias (__closedir, closedir)
stub_warning (closedir)
#include <stub-tag.h>

33
dirent/dirfd.c Normal file
View File

@ -0,0 +1,33 @@
/* Return the file descriptor used by a DIR stream. Stub version.
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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <dirent.h>
#include <dirstream.h>
#include <errno.h>
int
dirfd (dirp)
DIR *dirp;
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (dirfd)
#include <stub-tag.h>

5
elf/dl-brk.c Normal file
View File

@ -0,0 +1,5 @@
/* We can use the normal code but we also know the __curbrk is not exported
from ld.so. */
extern void *__curbrk attribute_hidden;
#include <brk.c>

311
elf/dl-cache.c Normal file
View File

@ -0,0 +1,311 @@
/* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
Copyright (C) 1996-2002, 2003, 2004 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <assert.h>
#include <unistd.h>
#include <ldsodefs.h>
#include <sys/mman.h>
#include <dl-cache.h>
#include <dl-procinfo.h>
#include <stdio-common/_itoa.h>
#ifndef _DL_PLATFORMS_COUNT
# define _DL_PLATFORMS_COUNT 0
#endif
/* This is the starting address and the size of the mmap()ed file. */
static struct cache_file *cache;
static struct cache_file_new *cache_new;
static size_t cachesize;
/* 1 if cache_data + PTR points into the cache. */
#define _dl_cache_verify_ptr(ptr) (ptr < cache_data_size)
#define SEARCH_CACHE(cache) \
/* We use binary search since the table is sorted in the cache file. \
The first matching entry in the table is returned. \
It is important to use the same algorithm as used while generating \
the cache file. */ \
do \
{ \
left = 0; \
right = cache->nlibs - 1; \
\
while (left <= right) \
{ \
__typeof__ (cache->libs[0].key) key; \
\
middle = (left + right) / 2; \
\
key = cache->libs[middle].key; \
\
/* Make sure string table indices are not bogus before using \
them. */ \
if (! _dl_cache_verify_ptr (key)) \
{ \
cmpres = 1; \
break; \
} \
\
/* Actually compare the entry with the key. */ \
cmpres = _dl_cache_libcmp (name, cache_data + key); \
if (__builtin_expect (cmpres == 0, 0)) \
{ \
/* Found it. LEFT now marks the last entry for which we \
know the name is correct. */ \
left = middle; \
\
/* There might be entries with this name before the one we \
found. So we have to find the beginning. */ \
while (middle > 0) \
{ \
__typeof__ (cache->libs[0].key) key; \
\
key = cache->libs[middle - 1].key; \
/* Make sure string table indices are not bogus before \
using them. */ \
if (! _dl_cache_verify_ptr (key) \
/* Actually compare the entry. */ \
|| _dl_cache_libcmp (name, cache_data + key) != 0) \
break; \
--middle; \
} \
\
do \
{ \
int flags; \
__typeof__ (cache->libs[0]) *lib = &cache->libs[middle]; \
\
/* Only perform the name test if necessary. */ \
if (middle > left \
/* We haven't seen this string so far. Test whether the \
index is ok and whether the name matches. Otherwise \
we are done. */ \
&& (! _dl_cache_verify_ptr (lib->key) \
|| (_dl_cache_libcmp (name, cache_data + lib->key) \
!= 0))) \
break; \
\
flags = lib->flags; \
if (_dl_cache_check_flags (flags) \
&& _dl_cache_verify_ptr (lib->value)) \
{ \
if (best == NULL || flags == GLRO(dl_correct_cache_id)) \
{ \
HWCAP_CHECK; \
best = cache_data + lib->value; \
\
if (flags == GLRO(dl_correct_cache_id)) \
/* We've found an exact match for the shared \
object and no general `ELF' release. Stop \
searching. */ \
break; \
} \
} \
} \
while (++middle <= right); \
break; \
} \
\
if (cmpres < 0) \
left = middle + 1; \
else \
right = middle - 1; \
} \
} \
while (0)
int
internal_function
_dl_cache_libcmp (const char *p1, const char *p2)
{
while (*p1 != '\0')
{
if (*p1 >= '0' && *p1 <= '9')
{
if (*p2 >= '0' && *p2 <= '9')
{
/* Must compare this numerically. */
int val1;
int val2;
val1 = *p1++ - '0';
val2 = *p2++ - '0';
while (*p1 >= '0' && *p1 <= '9')
val1 = val1 * 10 + *p1++ - '0';
while (*p2 >= '0' && *p2 <= '9')
val2 = val2 * 10 + *p2++ - '0';
if (val1 != val2)
return val1 - val2;
}
else
return 1;
}
else if (*p2 >= '0' && *p2 <= '9')
return -1;
else if (*p1 != *p2)
return *p1 - *p2;
else
{
++p1;
++p2;
}
}
return *p1 - *p2;
}
/* Look up NAME in ld.so.cache and return the file name stored there,
or null if none is found. */
const char *
internal_function
_dl_load_cache_lookup (const char *name)
{
int left, right, middle;
int cmpres;
const char *cache_data;
uint32_t cache_data_size;
const char *best;
/* Print a message if the loading of libs is traced. */
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0))
_dl_debug_printf (" search cache=%s\n", LD_SO_CACHE);
if (cache == NULL)
{
/* Read the contents of the file. */
void *file = _dl_sysdep_read_whole_file (LD_SO_CACHE, &cachesize,
PROT_READ);
/* We can handle three different cache file formats here:
- the old libc5/glibc2.0/2.1 format
- the old format with the new format in it
- only the new format
The following checks if the cache contains any of these formats. */
if (file != MAP_FAILED && cachesize > sizeof *cache
&& memcmp (file, CACHEMAGIC, sizeof CACHEMAGIC - 1) == 0)
{
size_t offset;
/* Looks ok. */
cache = file;
/* Check for new version. */
offset = ALIGN_CACHE (sizeof (struct cache_file)
+ cache->nlibs * sizeof (struct file_entry));
cache_new = (struct cache_file_new *) ((void *) cache + offset);
if (cachesize < (offset + sizeof (struct cache_file_new))
|| memcmp (cache_new->magic, CACHEMAGIC_VERSION_NEW,
sizeof CACHEMAGIC_VERSION_NEW - 1) != 0)
cache_new = (void *) -1;
}
else if (file != MAP_FAILED && cachesize > sizeof *cache_new
&& memcmp (file, CACHEMAGIC_VERSION_NEW,
sizeof CACHEMAGIC_VERSION_NEW - 1) == 0)
{
cache_new = file;
cache = file;
}
else
{
if (file != MAP_FAILED)
__munmap (file, cachesize);
cache = (void *) -1;
}
assert (cache != NULL);
}
if (cache == (void *) -1)
/* Previously looked for the cache file and didn't find it. */
return NULL;
best = NULL;
if (cache_new != (void *) -1)
{
uint64_t platform;
/* This is where the strings start. */
cache_data = (const char *) cache_new;
/* Now we can compute how large the string table is. */
cache_data_size = (const char *) cache + cachesize - cache_data;
platform = _dl_string_platform (GLRO(dl_platform));
if (platform != (uint64_t) -1)
platform = 1ULL << platform;
/* Only accept hwcap if it's for the right platform. */
#ifdef USE_TLS
# define _DL_HWCAP_TLS_MASK (1LL << 63)
#else
# define _DL_HWCAP_TLS_MASK 0
#endif
#define HWCAP_CHECK \
if (GLRO(dl_osversion) && lib->osversion > GLRO(dl_osversion)) \
continue; \
if (_DL_PLATFORMS_COUNT && platform != -1 \
&& (lib->hwcap & _DL_HWCAP_PLATFORM) != 0 \
&& (lib->hwcap & _DL_HWCAP_PLATFORM) != platform) \
continue; \
if (lib->hwcap \
& ~(GLRO(dl_hwcap) | _DL_HWCAP_PLATFORM | _DL_HWCAP_TLS_MASK)) \
continue
SEARCH_CACHE (cache_new);
}
else
{
/* This is where the strings start. */
cache_data = (const char *) &cache->libs[cache->nlibs];
/* Now we can compute how large the string table is. */
cache_data_size = (const char *) cache + cachesize - cache_data;
#undef HWCAP_CHECK
#define HWCAP_CHECK do {} while (0)
SEARCH_CACHE (cache);
}
/* Print our result if wanted. */
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0)
&& best != NULL)
_dl_debug_printf (" trying file=%s\n", best);
return best;
}
#ifndef MAP_COPY
/* If the system does not support MAP_COPY we cannot leave the file open
all the time since this would create problems when the file is replaced.
Therefore we provide this function to close the file and open it again
once needed. */
void
_dl_unload_cache (void)
{
if (cache != NULL && cache != (struct cache_file *) -1)
{
__munmap (cache, cachesize);
cache = NULL;
}
}
#endif

86
elf/dl-environ.c Normal file
View File

@ -0,0 +1,86 @@
/* Environment handling for dynamic loader.
Copyright (C) 1995-1998, 2000, 2001, 2002 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <ldsodefs.h>
/* Walk through the environment of the process and return all entries
starting with `LD_'. */
char *
internal_function
_dl_next_ld_env_entry (char ***position)
{
char **current = *position;
char *result = NULL;
while (*current != NULL)
{
if (__builtin_expect ((*current)[0] == 'L', 0)
&& (*current)[1] == 'D' && (*current)[2] == '_')
{
result = &(*current)[3];
/* Save current position for next visit. */
*position = ++current;
break;
}
++current;
}
return result;
}
/* In ld.so __environ is not exported. */
extern char **__environ attribute_hidden;
int
unsetenv (const char *name)
{
char **ep;
ep = __environ;
while (*ep != NULL)
{
size_t cnt = 0;
while ((*ep)[cnt] == name[cnt] && name[cnt] != '\0')
++cnt;
if (name[cnt] == '\0' && (*ep)[cnt] == '=')
{
/* Found it. Remove this pointer by moving later ones to
the front. */
char **dp = ep;
do
dp[0] = dp[1];
while (*dp++);
/* Continue the loop in case NAME appears again. */
}
else
++ep;
}
return 0;
}

32
elf/dl-execstack.c Normal file
View File

@ -0,0 +1,32 @@
/* Stack executability handling for GNU dynamic linker. Stub version.
Copyright (C) 2003, 2004 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <ldsodefs.h>
#include <errno.h>
/* There is no portable way to know the bounds of the initial thread's stack
so as to mprotect it. */
int
internal_function
_dl_make_stack_executable (void **stack_endp)
{
return ENOSYS;
}
rtld_hidden_def (_dl_make_stack_executable)

323
elf/dl-fptr.c Normal file
View File

@ -0,0 +1,323 @@
/* Manage function descriptors. Generic version.
Copyright (C) 1999,2000,2001,2002,2003,2004 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <libintl.h>
#include <unistd.h>
#include <string.h>
#include <sys/param.h>
#include <sys/mman.h>
#include <link.h>
#include <ldsodefs.h>
#include <elf/dynamic-link.h>
#include <dl-fptr.h>
#include <atomic.h>
#ifndef ELF_MACHINE_BOOT_FPTR_TABLE_LEN
/* ELF_MACHINE_BOOT_FPTR_TABLE_LEN should be greater than the number of
dynamic symbols in ld.so. */
# define ELF_MACHINE_BOOT_FPTR_TABLE_LEN 256
#endif
#ifndef ELF_MACHINE_LOAD_ADDRESS
# error "ELF_MACHINE_LOAD_ADDRESS is not defined."
#endif
#ifndef COMPARE_AND_SWAP
# define COMPARE_AND_SWAP(ptr, old, new) \
(atomic_compare_and_exchange_bool_acq (ptr, new, old) == 0)
#endif
ElfW(Addr) _dl_boot_fptr_table [ELF_MACHINE_BOOT_FPTR_TABLE_LEN];
static struct local
{
struct fdesc_table *root;
struct fdesc *free_list;
unsigned int npages; /* # of pages to allocate */
/* the next to members MUST be consecutive! */
struct fdesc_table boot_table;
struct fdesc boot_fdescs[1024];
}
local =
{
.root = &local.boot_table,
.npages = 2,
.boot_table =
{
.len = sizeof (local.boot_fdescs) / sizeof (local.boot_fdescs[0]),
.first_unused = 0
}
};
/* Create a new fdesc table and return a pointer to the first fdesc
entry. The fdesc lock must have been acquired already. */
static struct fdesc_table *
new_fdesc_table (struct local *l, size_t *size)
{
size_t old_npages = l->npages;
size_t new_npages = old_npages + old_npages;
struct fdesc_table *new_table;
/* If someone has just created a new table, we return NULL to tell
the caller to use the new table. */
if (! COMPARE_AND_SWAP (&l->npages, old_npages, new_npages))
return (struct fdesc_table *) NULL;
*size = old_npages * GLRO(dl_pagesize);
new_table = __mmap (NULL, *size,
PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
if (new_table == MAP_FAILED)
_dl_signal_error (errno, NULL, NULL,
N_("cannot map pages for fdesc table"));
new_table->len
= (*size - sizeof (*new_table)) / sizeof (struct fdesc);
new_table->first_unused = 1;
return new_table;
}
static ElfW(Addr)
make_fdesc (ElfW(Addr) ip, ElfW(Addr) gp)
{
struct fdesc *fdesc = NULL;
struct fdesc_table *root;
unsigned int old;
struct local *l;
ELF_MACHINE_LOAD_ADDRESS (l, local);
retry:
root = l->root;
while (1)
{
old = root->first_unused;
if (old >= root->len)
break;
else if (COMPARE_AND_SWAP (&root->first_unused, old, old + 1))
{
fdesc = &root->fdesc[old];
goto install;
}
}
if (l->free_list)
{
/* Get it from free-list. */
do
{
fdesc = l->free_list;
if (fdesc == NULL)
goto retry;
}
while (! COMPARE_AND_SWAP ((ElfW(Addr) *) &l->free_list,
(ElfW(Addr)) fdesc, fdesc->ip));
}
else
{
/* Create a new fdesc table. */
size_t size;
struct fdesc_table *new_table = new_fdesc_table (l, &size);
if (new_table == NULL)
goto retry;
new_table->next = root;
if (! COMPARE_AND_SWAP ((ElfW(Addr) *) &l->root,
(ElfW(Addr)) root,
(ElfW(Addr)) new_table))
{
/* Someone has just installed a new table. Return NULL to
tell the caller to use the new table. */
__munmap (new_table, size);
goto retry;
}
/* Note that the first entry was reserved while allocating the
memory for the new page. */
fdesc = &new_table->fdesc[0];
}
install:
fdesc->ip = ip;
fdesc->gp = gp;
return (ElfW(Addr)) fdesc;
}
static inline ElfW(Addr) * __attribute__ ((always_inline))
make_fptr_table (struct link_map *map)
{
const ElfW(Sym) *symtab
= (const void *) D_PTR (map, l_info[DT_SYMTAB]);
const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
ElfW(Addr) *fptr_table;
size_t size;
size_t len;
/* XXX Apparently the only way to find out the size of the dynamic
symbol section is to assume that the string table follows right
afterwards... */
len = ((strtab - (char *) symtab)
/ map->l_info[DT_SYMENT]->d_un.d_val);
size = ((len * sizeof (fptr_table[0]) + GLRO(dl_pagesize) - 1)
& -GLRO(dl_pagesize));
/* XXX We don't support here in the moment systems without MAP_ANON.
There probably are none for IA-64. In case this is proven wrong
we will have to open /dev/null here and use the file descriptor
instead of the hard-coded -1. */
fptr_table = __mmap (NULL, size,
PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE,
-1, 0);
if (fptr_table == MAP_FAILED)
_dl_signal_error (errno, NULL, NULL,
N_("cannot map pages for fptr table"));
if (COMPARE_AND_SWAP ((ElfW(Addr) *) &map->l_mach.fptr_table,
(ElfW(Addr)) NULL, (ElfW(Addr)) fptr_table))
map->l_mach.fptr_table_len = len;
else
__munmap (fptr_table, len * sizeof (fptr_table[0]));
return map->l_mach.fptr_table;
}
ElfW(Addr)
_dl_make_fptr (struct link_map *map, const ElfW(Sym) *sym,
ElfW(Addr) ip)
{
ElfW(Addr) *ftab = map->l_mach.fptr_table;
const ElfW(Sym) *symtab;
Elf_Symndx symidx;
struct local *l;
if (__builtin_expect (ftab == NULL, 0))
ftab = make_fptr_table (map);
symtab = (const void *) D_PTR (map, l_info[DT_SYMTAB]);
symidx = sym - symtab;
if (symidx >= map->l_mach.fptr_table_len)
_dl_signal_error (0, NULL, NULL,
N_("internal error: symidx out of range of fptr table"));
while (ftab[symidx] == 0)
{
/* GOT has already been relocated in elf_get_dynamic_info -
don't try to relocate it again. */
ElfW(Addr) fdesc
= make_fdesc (ip, map->l_info[DT_PLTGOT]->d_un.d_ptr);
if (__builtin_expect (COMPARE_AND_SWAP (&ftab[symidx], (ElfW(Addr)) NULL,
fdesc), 1))
{
/* Noone has updated the entry and the new function
descriptor has been installed. */
#if 0
const char *strtab
= (const void *) D_PTR (map, l_info[DT_STRTAB]);
ELF_MACHINE_LOAD_ADDRESS (l, local);
if (l->root != &l->boot_table
|| l->boot_table.first_unused > 20)
_dl_debug_printf ("created fdesc symbol `%s' at %lx\n",
strtab + sym->st_name, ftab[symidx]);
#endif
break;
}
else
{
/* We created a duplicated function descriptor. We put it on
free-list. */
struct fdesc *f = (struct fdesc *) fdesc;
ELF_MACHINE_LOAD_ADDRESS (l, local);
do
f->ip = (ElfW(Addr)) l->free_list;
while (! COMPARE_AND_SWAP ((ElfW(Addr) *) &l->free_list,
f->ip, fdesc));
}
}
return ftab[symidx];
}
void
_dl_unmap (struct link_map *map)
{
ElfW(Addr) *ftab = map->l_mach.fptr_table;
struct fdesc *head = NULL, *tail = NULL;
size_t i;
__munmap ((void *) map->l_map_start,
map->l_map_end - map->l_map_start);
if (ftab == NULL)
return;
/* String together the fdesc structures that are being freed. */
for (i = 0; i < map->l_mach.fptr_table_len; ++i)
{
if (ftab[i])
{
*(struct fdesc **) ftab[i] = head;
head = (struct fdesc *) ftab[i];
if (tail == NULL)
tail = head;
}
}
/* Prepend the new list to the free_list: */
if (tail)
do
tail->ip = (ElfW(Addr)) local.free_list;
while (! COMPARE_AND_SWAP ((ElfW(Addr) *) &local.free_list,
tail->ip, (ElfW(Addr)) head));
__munmap (ftab, (map->l_mach.fptr_table_len
* sizeof (map->l_mach.fptr_table[0])));
map->l_mach.fptr_table = NULL;
}
ElfW(Addr)
_dl_lookup_address (const void *address)
{
ElfW(Addr) addr = (ElfW(Addr)) address;
struct fdesc_table *t;
unsigned long int i;
for (t = local.root; t != NULL; t = t->next)
{
i = (struct fdesc *) addr - &t->fdesc[0];
if (i < t->first_unused && addr == (ElfW(Addr)) &t->fdesc[i])
{
addr = t->fdesc[i].ip;
break;
}
}
return addr;
}

51
elf/dl-origin.c Normal file
View File

@ -0,0 +1,51 @@
/* Find path of executable.
Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <stdlib.h>
#include <string.h>
#include <sys/param.h>
#include <ldsodefs.h>
#include <dl-dst.h>
const char *
_dl_get_origin (void)
{
char *result = (char *) -1;
/* We use the environment variable LD_ORIGIN_PATH. If it is set make
a copy and strip out trailing slashes. */
if (GLRO(dl_origin_path) != NULL)
{
size_t len = strlen (GLRO(dl_origin_path));
result = (char *) malloc (len + 1);
if (result == NULL)
result = (char *) -1;
else
{
char *cp = __mempcpy (result, GLRO(dl_origin_path), len);
while (cp > result + 1 && cp[-1] == '/')
--cp;
*cp = '\0';
}
}
return result;
}

5
elf/dl-sbrk.c Normal file
View File

@ -0,0 +1,5 @@
/* We can use the normal code but we also know the __curbrk is not exported
from ld.so. */
extern void *__curbrk attribute_hidden;
#include <sbrk.c>

33
elf/dl-symaddr.c Normal file
View File

@ -0,0 +1,33 @@
/* Get the symbol address. Generic version.
Copyright (C) 1999, 2000, 2001, 2003 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <ldsodefs.h>
#include <dl-fptr.h>
void *
_dl_symbol_address (struct link_map *map, const ElfW(Sym) *ref)
{
ElfW(Addr) value = (map ? map->l_addr : 0) + ref->st_value;
/* Return the pointer to function descriptor. */
if (ELFW(ST_TYPE) (ref->st_info) == STT_FUNC)
return (void *) _dl_make_fptr (map, ref, value);
else
return (void *) value;
}

590
elf/dl-sysdep.c Normal file
View File

@ -0,0 +1,590 @@
/* Operating system support for run-time dynamic linker. Generic Unix version.
Copyright (C) 1995-1998, 2000-2003, 2004, 2005 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <assert.h>
#include <elf.h>
#include <errno.h>
#include <fcntl.h>
#include <libintl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <ldsodefs.h>
#include <stdio-common/_itoa.h>
#include <fpu_control.h>
#include <entry.h>
#include <dl-machine.h>
#include <dl-procinfo.h>
#include <dl-osinfo.h>
#include <hp-timing.h>
#include <tls.h>
#ifdef _DL_FIRST_PLATFORM
# define _DL_FIRST_EXTRA (_DL_FIRST_PLATFORM + _DL_PLATFORMS_COUNT)
#else
# define _DL_FIRST_EXTRA _DL_HWCAP_COUNT
#endif
extern char **_environ attribute_hidden;
extern void _end attribute_hidden;
/* Protect SUID program against misuse of file descriptors. */
extern void __libc_check_standard_fds (void);
#ifdef NEED_DL_BASE_ADDR
ElfW(Addr) _dl_base_addr;
#endif
int __libc_enable_secure attribute_relro = 0;
INTVARDEF(__libc_enable_secure)
int __libc_multiple_libcs = 0; /* Defining this here avoids the inclusion
of init-first. */
/* This variable contains the lowest stack address ever used. */
void *__libc_stack_end attribute_relro = NULL;
rtld_hidden_data_def(__libc_stack_end)
static ElfW(auxv_t) *_dl_auxv attribute_relro;
#ifndef DL_FIND_ARG_COMPONENTS
# define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp) \
do { \
void **_tmp; \
(argc) = *(long int *) cookie; \
(argv) = (char **) ((long int *) cookie + 1); \
(envp) = (argv) + (argc) + 1; \
for (_tmp = (void **) (envp); *_tmp; ++_tmp) \
continue; \
(auxp) = (void *) ++_tmp; \
} while (0)
#endif
#ifndef DL_STACK_END
# define DL_STACK_END(cookie) ((void *) (cookie))
#endif
ElfW(Addr)
_dl_sysdep_start (void **start_argptr,
void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phnum,
ElfW(Addr) *user_entry))
{
const ElfW(Phdr) *phdr = NULL;
ElfW(Word) phnum = 0;
ElfW(Addr) user_entry;
ElfW(auxv_t) *av;
#ifdef HAVE_AUX_SECURE
# define set_seen(tag) (tag) /* Evaluate for the side effects. */
# define set_seen_secure() ((void) 0)
#else
uid_t uid = 0;
gid_t gid = 0;
unsigned int seen = 0;
# define set_seen_secure() (seen = -1)
# ifdef HAVE_AUX_XID
# define set_seen(tag) (tag) /* Evaluate for the side effects. */
# else
# define M(type) (1 << (type))
# define set_seen(tag) seen |= M ((tag)->a_type)
# endif
#endif
#ifdef NEED_DL_SYSINFO
uintptr_t new_sysinfo = 0;
#endif
__libc_stack_end = DL_STACK_END (start_argptr);
DL_FIND_ARG_COMPONENTS (start_argptr, _dl_argc, INTUSE(_dl_argv), _environ,
_dl_auxv);
user_entry = (ElfW(Addr)) ENTRY_POINT;
GLRO(dl_platform) = NULL; /* Default to nothing known about the platform. */
for (av = _dl_auxv; av->a_type != AT_NULL; set_seen (av++))
switch (av->a_type)
{
case AT_PHDR:
phdr = (void *) av->a_un.a_val;
break;
case AT_PHNUM:
phnum = av->a_un.a_val;
break;
case AT_PAGESZ:
GLRO(dl_pagesize) = av->a_un.a_val;
break;
case AT_ENTRY:
user_entry = av->a_un.a_val;
break;
#ifdef NEED_DL_BASE_ADDR
case AT_BASE:
_dl_base_addr = av->a_un.a_val;
break;
#endif
#ifndef HAVE_AUX_SECURE
case AT_UID:
case AT_EUID:
uid ^= av->a_un.a_val;
break;
case AT_GID:
case AT_EGID:
gid ^= av->a_un.a_val;
break;
#endif
case AT_SECURE:
#ifndef HAVE_AUX_SECURE
seen = -1;
#endif
INTUSE(__libc_enable_secure) = av->a_un.a_val;
break;
case AT_PLATFORM:
GLRO(dl_platform) = (void *) av->a_un.a_val;
break;
case AT_HWCAP:
GLRO(dl_hwcap) = (unsigned long int) av->a_un.a_val;
break;
case AT_CLKTCK:
GLRO(dl_clktck) = av->a_un.a_val;
break;
case AT_FPUCW:
GLRO(dl_fpu_control) = av->a_un.a_val;
break;
#ifdef NEED_DL_SYSINFO
case AT_SYSINFO:
new_sysinfo = av->a_un.a_val;
break;
#endif
#if defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO
case AT_SYSINFO_EHDR:
GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val;
break;
#endif
#ifdef DL_PLATFORM_AUXV
DL_PLATFORM_AUXV
#endif
}
#ifndef HAVE_AUX_SECURE
if (seen != -1)
{
/* Fill in the values we have not gotten from the kernel through the
auxiliary vector. */
# ifndef HAVE_AUX_XID
# define SEE(UID, var, uid) \
if ((seen & M (AT_##UID)) == 0) var ^= __get##uid ()
SEE (UID, uid, uid);
SEE (EUID, uid, euid);
SEE (GID, gid, gid);
SEE (EGID, gid, egid);
# endif
/* If one of the two pairs of IDs does not match this is a setuid
or setgid run. */
INTUSE(__libc_enable_secure) = uid | gid;
}
#endif
#ifndef HAVE_AUX_PAGESIZE
if (GLRO(dl_pagesize) == 0)
GLRO(dl_pagesize) = __getpagesize ();
#endif
#if defined NEED_DL_SYSINFO
/* Only set the sysinfo value if we also have the vsyscall DSO. */
if (GLRO(dl_sysinfo_dso) != 0 && new_sysinfo)
GLRO(dl_sysinfo) = new_sysinfo;
#endif
#ifdef DL_SYSDEP_INIT
DL_SYSDEP_INIT;
#endif
#ifdef DL_PLATFORM_INIT
DL_PLATFORM_INIT;
#endif
/* Determine the length of the platform name. */
if (GLRO(dl_platform) != NULL)
GLRO(dl_platformlen) = strlen (GLRO(dl_platform));
if (__sbrk (0) == &_end)
/* The dynamic linker was run as a program, and so the initial break
starts just after our bss, at &_end. The malloc in dl-minimal.c
will consume the rest of this page, so tell the kernel to move the
break up that far. When the user program examines its break, it
will see this new value and not clobber our data. */
__sbrk (GLRO(dl_pagesize)
- ((&_end - (void *) 0) & (GLRO(dl_pagesize) - 1)));
/* If this is a SUID program we make sure that FDs 0, 1, and 2 are
allocated. If necessary we are doing it ourself. If it is not
possible we stop the program. */
if (__builtin_expect (INTUSE(__libc_enable_secure), 0))
__libc_check_standard_fds ();
(*dl_main) (phdr, phnum, &user_entry);
return user_entry;
}
void
internal_function
_dl_sysdep_start_cleanup (void)
{
}
void
internal_function
_dl_show_auxv (void)
{
char buf[64];
ElfW(auxv_t) *av;
/* Terminate string. */
buf[63] = '\0';
/* The following code assumes that the AT_* values are encoded
starting from 0 with AT_NULL, 1 for AT_IGNORE, and all other values
close by (otherwise the array will be too large). In case we have
to support a platform where these requirements are not fulfilled
some alternative implementation has to be used. */
for (av = _dl_auxv; av->a_type != AT_NULL; ++av)
{
static const struct
{
const char label[20];
enum { unknown = 0, dec, hex, str, ignore } form;
} auxvars[] =
{
[AT_EXECFD - 2] = { "AT_EXECFD: ", dec },
[AT_PHDR - 2] = { "AT_PHDR: 0x", hex },
[AT_PHENT - 2] = { "AT_PHENT: ", dec },
[AT_PHNUM - 2] = { "AT_PHNUM: ", dec },
[AT_PAGESZ - 2] = { "AT_PAGESZ: ", dec },
[AT_BASE - 2] = { "AT_BASE: 0x", hex },
[AT_FLAGS - 2] = { "AT_FLAGS: 0x", hex },
[AT_ENTRY - 2] = { "AT_ENTRY: 0x", hex },
[AT_NOTELF - 2] = { "AT_NOTELF: ", hex },
[AT_UID - 2] = { "AT_UID: ", dec },
[AT_EUID - 2] = { "AT_EUID: ", dec },
[AT_GID - 2] = { "AT_GID: ", dec },
[AT_EGID - 2] = { "AT_EGID: ", dec },
[AT_PLATFORM - 2] = { "AT_PLATFORM: ", str },
[AT_HWCAP - 2] = { "AT_HWCAP: ", hex },
[AT_CLKTCK - 2] = { "AT_CLKTCK: ", dec },
[AT_FPUCW - 2] = { "AT_FPUCW: ", hex },
[AT_DCACHEBSIZE - 2] = { "AT_DCACHEBSIZE: 0x", hex },
[AT_ICACHEBSIZE - 2] = { "AT_ICACHEBSIZE: 0x", hex },
[AT_UCACHEBSIZE - 2] = { "AT_UCACHEBSIZE: 0x", hex },
[AT_IGNOREPPC - 2] = { "AT_IGNOREPPC", ignore },
[AT_SECURE - 2] = { "AT_SECURE: ", dec },
[AT_SYSINFO - 2] = { "AT_SYSINFO: 0x", hex },
[AT_SYSINFO_EHDR - 2] = { "AT_SYSINFO_EHDR: 0x", hex },
};
unsigned int idx = (unsigned int) (av->a_type - 2);
if ((unsigned int) av->a_type < 2u || auxvars[idx].form == ignore)
continue;
assert (AT_NULL == 0);
assert (AT_IGNORE == 1);
if (av->a_type == AT_HWCAP)
{
/* This is handled special. */
if (_dl_procinfo (av->a_un.a_val) == 0)
continue;
}
if (idx < sizeof (auxvars) / sizeof (auxvars[0])
&& auxvars[idx].form != unknown)
{
const char *val = (char *) av->a_un.a_val;
if (__builtin_expect (auxvars[idx].form, dec) == dec)
val = _itoa ((unsigned long int) av->a_un.a_val,
buf + sizeof buf - 1, 10, 0);
else if (__builtin_expect (auxvars[idx].form, hex) == hex)
val = _itoa ((unsigned long int) av->a_un.a_val,
buf + sizeof buf - 1, 16, 0);
_dl_printf ("%s%s\n", auxvars[idx].label, val);
continue;
}
/* Unknown value: print a generic line. */
char buf2[17];
buf[sizeof (buf2) - 1] = '\0';
const char *val2 = _itoa ((unsigned long int) av->a_un.a_val,
buf2 + sizeof buf2 - 1, 16, 0);
const char *val = _itoa ((unsigned long int) av->a_type,
buf + sizeof buf - 1, 16, 0);
_dl_printf ("AT_??? (0x%s): 0x%s\n", val, val2);
}
}
/* Return an array of useful/necessary hardware capability names. */
const struct r_strlenpair *
internal_function
_dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
size_t *max_capstrlen)
{
/* Determine how many important bits are set. */
uint64_t masked = GLRO(dl_hwcap) & GLRO(dl_hwcap_mask);
size_t cnt = platform != NULL;
size_t n, m;
size_t total;
struct r_strlenpair *temp;
struct r_strlenpair *result;
struct r_strlenpair *rp;
char *cp;
/* Count the number of bits set in the masked value. */
for (n = 0; (~((1ULL << n) - 1) & masked) != 0; ++n)
if ((masked & (1ULL << n)) != 0)
++cnt;
#if (defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO) && defined SHARED
/* The system-supplied DSO can contain a note of type 2, vendor "GNU".
This gives us a list of names to treat as fake hwcap bits. */
const char *dsocaps = NULL;
size_t dsocapslen = 0;
if (GLRO(dl_sysinfo_map) != NULL)
{
const ElfW(Phdr) *const phdr = GLRO(dl_sysinfo_map)->l_phdr;
const ElfW(Word) phnum = GLRO(dl_sysinfo_map)->l_phnum;
for (uint_fast16_t i = 0; i < phnum; ++i)
if (phdr[i].p_type == PT_NOTE)
{
const ElfW(Addr) start = (phdr[i].p_vaddr
+ GLRO(dl_sysinfo_map)->l_addr);
const struct
{
ElfW(Word) vendorlen;
ElfW(Word) datalen;
ElfW(Word) type;
} *note = (const void *) start;
while ((ElfW(Addr)) (note + 1) - start < phdr[i].p_memsz)
{
#define ROUND(len) (((len) + sizeof (ElfW(Word)) - 1) & -sizeof (ElfW(Word)))
if (note->type == 2
&& note->vendorlen == sizeof "GNU"
&& !memcmp ((note + 1), "GNU", sizeof "GNU")
&& note->datalen > 2 * sizeof (ElfW(Word)) + 2)
{
const ElfW(Word) *p = ((const void *) (note + 1)
+ ROUND (sizeof "GNU"));
cnt += *p++;
++p; /* Skip mask word. */
dsocaps = (const char *) p;
dsocapslen = note->datalen - sizeof *p * 2;
break;
}
note = ((const void *) (note + 1)
+ ROUND (note->vendorlen) + ROUND (note->datalen));
}
if (dsocaps != NULL)
break;
}
}
#endif
#ifdef USE_TLS
/* For TLS enabled builds always add 'tls'. */
++cnt;
#else
if (cnt == 0)
{
/* If we no have platform name and no important capability we only
have the base directory to search. */
result = (struct r_strlenpair *) malloc (sizeof (*result));
if (result == NULL)
goto no_memory;
result[0].str = (char *) result; /* Does not really matter. */
result[0].len = 0;
*sz = 1;
return result;
}
#endif
/* Create temporary data structure to generate result table. */
temp = (struct r_strlenpair *) alloca (cnt * sizeof (*temp));
m = 0;
#if defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO
if (dsocaps != NULL)
{
const ElfW(Word) mask = ((const ElfW(Word) *) dsocaps)[-1];
GLRO(dl_hwcap) |= (uint64_t) mask << _DL_FIRST_EXTRA;
size_t len;
for (const char *p = dsocaps; p < dsocaps + dsocapslen; p += len + 1)
{
uint_fast8_t bit = *p++;
len = strlen (p);
/* Skip entries that are not enabled in the mask word. */
if (__builtin_expect (mask & ((ElfW(Word)) 1 << bit), 1))
{
temp[m].str = p;
temp[m].len = len;
++m;
}
else
--cnt;
}
}
#endif
for (n = 0; masked != 0; ++n)
if ((masked & (1ULL << n)) != 0)
{
temp[m].str = _dl_hwcap_string (n);
temp[m].len = strlen (temp[m].str);
masked ^= 1ULL << n;
++m;
}
if (platform != NULL)
{
temp[m].str = platform;
temp[m].len = platform_len;
++m;
}
#ifdef USE_TLS
temp[m].str = "tls";
temp[m].len = 3;
++m;
#endif
assert (m == cnt);
/* Determine the total size of all strings together. */
if (cnt == 1)
total = temp[0].len + 1;
else
{
total = (1UL << (cnt - 2)) * (temp[0].len + temp[cnt - 1].len + 2);
for (n = 1; n + 1 < cnt; ++n)
total += (1UL << (cnt - 3)) * (temp[n].len + 1);
}
/* The result structure: we use a very compressed way to store the
various combinations of capability names. */
*sz = 1 << cnt;
result = (struct r_strlenpair *) malloc (*sz * sizeof (*result) + total);
if (result == NULL)
{
#ifndef USE_TLS
no_memory:
#endif
_dl_signal_error (ENOMEM, NULL, NULL,
N_("cannot create capability list"));
}
if (cnt == 1)
{
result[0].str = (char *) (result + *sz);
result[0].len = temp[0].len + 1;
result[1].str = (char *) (result + *sz);
result[1].len = 0;
cp = __mempcpy ((char *) (result + *sz), temp[0].str, temp[0].len);
*cp = '/';
*sz = 2;
*max_capstrlen = result[0].len;
return result;
}
/* Fill in the information. This follows the following scheme
(indeces from TEMP for four strings):
entry #0: 0, 1, 2, 3 binary: 1111
#1: 0, 1, 3 1101
#2: 0, 2, 3 1011
#3: 0, 3 1001
This allows the representation of all possible combinations of
capability names in the string. First generate the strings. */
result[1].str = result[0].str = cp = (char *) (result + *sz);
#define add(idx) \
cp = __mempcpy (__mempcpy (cp, temp[idx].str, temp[idx].len), "/", 1);
if (cnt == 2)
{
add (1);
add (0);
}
else
{
n = 1 << (cnt - 1);
do
{
n -= 2;
/* We always add the last string. */
add (cnt - 1);
/* Add the strings which have the bit set in N. */
for (m = cnt - 2; m > 0; --m)
if ((n & (1 << m)) != 0)
add (m);
/* Always add the first string. */
add (0);
}
while (n != 0);
}
#undef add
/* Now we are ready to install the string pointers and length. */
for (n = 0; n < (1UL << cnt); ++n)
result[n].len = 0;
n = cnt;
do
{
size_t mask = 1 << --n;
rp = result;
for (m = 1 << cnt; m > 0; ++rp)
if ((--m & mask) != 0)
rp->len += temp[n].len + 1;
}
while (n != 0);
/* The first half of the strings all include the first string. */
n = (1 << cnt) - 2;
rp = &result[2];
while (n != (1UL << (cnt - 1)))
{
if ((--n & 1) != 0)
rp[0].str = rp[-2].str + rp[-2].len;
else
rp[0].str = rp[-1].str;
++rp;
}
/* The second half starts right after the first part of the string of
the corresponding entry in the first half. */
do
{
rp[0].str = rp[-(1 << (cnt - 1))].str + temp[cnt - 1].len + 1;
++rp;
}
while (--n != 0);
/* The maximum string length. */
*max_capstrlen = result[0].len;
return result;
}

799
elf/dl-tls.c Normal file
View File

@ -0,0 +1,799 @@
/* Thread-local storage handling in the ELF dynamic linker. Generic version.
Copyright (C) 2002, 2003, 2004, 2005 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <assert.h>
#include <errno.h>
#include <libintl.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/param.h>
#include <tls.h>
/* We don't need any of this if TLS is not supported. */
#ifdef USE_TLS
# include <dl-tls.h>
# include <ldsodefs.h>
/* Amount of excess space to allocate in the static TLS area
to allow dynamic loading of modules defining IE-model TLS data. */
# define TLS_STATIC_SURPLUS 64 + DL_NNS * 100
/* Value used for dtv entries for which the allocation is delayed. */
# define TLS_DTV_UNALLOCATED ((void *) -1l)
/* Out-of-memory handler. */
# ifdef SHARED
static void
__attribute__ ((__noreturn__))
oom (void)
{
_dl_fatal_printf ("cannot allocate memory for thread-local data: ABORT\n");
}
# endif
size_t
internal_function
_dl_next_tls_modid (void)
{
size_t result;
if (__builtin_expect (GL(dl_tls_dtv_gaps), false))
{
size_t disp = 0;
struct dtv_slotinfo_list *runp = GL(dl_tls_dtv_slotinfo_list);
/* Note that this branch will never be executed during program
start since there are no gaps at that time. Therefore it
does not matter that the dl_tls_dtv_slotinfo is not allocated
yet when the function is called for the first times.
NB: the offset +1 is due to the fact that DTV[0] is used
for something else. */
result = GL(dl_tls_static_nelem) + 1;
if (result <= GL(dl_tls_max_dtv_idx))
do
{
while (result - disp < runp->len)
{
if (runp->slotinfo[result - disp].map == NULL)
break;
++result;
assert (result <= GL(dl_tls_max_dtv_idx) + 1);
}
if (result - disp < runp->len)
break;
disp += runp->len;
}
while ((runp = runp->next) != NULL);
if (result > GL(dl_tls_max_dtv_idx))
{
/* The new index must indeed be exactly one higher than the
previous high. */
assert (result == GL(dl_tls_max_dtv_idx) + 1);
/* There is no gap anymore. */
GL(dl_tls_dtv_gaps) = false;
goto nogaps;
}
}
else
{
/* No gaps, allocate a new entry. */
nogaps:
result = ++GL(dl_tls_max_dtv_idx);
}
return result;
}
# ifdef SHARED
void
internal_function
_dl_determine_tlsoffset (void)
{
size_t max_align = TLS_TCB_ALIGN;
size_t freetop = 0;
size_t freebottom = 0;
/* The first element of the dtv slot info list is allocated. */
assert (GL(dl_tls_dtv_slotinfo_list) != NULL);
/* There is at this point only one element in the
dl_tls_dtv_slotinfo_list list. */
assert (GL(dl_tls_dtv_slotinfo_list)->next == NULL);
struct dtv_slotinfo *slotinfo = GL(dl_tls_dtv_slotinfo_list)->slotinfo;
/* Determining the offset of the various parts of the static TLS
block has several dependencies. In addition we have to work
around bugs in some toolchains.
Each TLS block from the objects available at link time has a size
and an alignment requirement. The GNU ld computes the alignment
requirements for the data at the positions *in the file*, though.
I.e, it is not simply possible to allocate a block with the size
of the TLS program header entry. The data is layed out assuming
that the first byte of the TLS block fulfills
p_vaddr mod p_align == &TLS_BLOCK mod p_align
This means we have to add artificial padding at the beginning of
the TLS block. These bytes are never used for the TLS data in
this module but the first byte allocated must be aligned
according to mod p_align == 0 so that the first byte of the TLS
block is aligned according to p_vaddr mod p_align. This is ugly
and the linker can help by computing the offsets in the TLS block
assuming the first byte of the TLS block is aligned according to
p_align.
The extra space which might be allocated before the first byte of
the TLS block need not go unused. The code below tries to use
that memory for the next TLS block. This can work if the total
memory requirement for the next TLS block is smaller than the
gap. */
# if TLS_TCB_AT_TP
/* We simply start with zero. */
size_t offset = 0;
for (size_t cnt = 0; slotinfo[cnt].map != NULL; ++cnt)
{
assert (cnt < GL(dl_tls_dtv_slotinfo_list)->len);
size_t firstbyte = (-slotinfo[cnt].map->l_tls_firstbyte_offset
& (slotinfo[cnt].map->l_tls_align - 1));
size_t off;
max_align = MAX (max_align, slotinfo[cnt].map->l_tls_align);
if (freebottom - freetop >= slotinfo[cnt].map->l_tls_blocksize)
{
off = roundup (freetop + slotinfo[cnt].map->l_tls_blocksize
- firstbyte, slotinfo[cnt].map->l_tls_align)
+ firstbyte;
if (off <= freebottom)
{
freetop = off;
/* XXX For some architectures we perhaps should store the
negative offset. */
slotinfo[cnt].map->l_tls_offset = off;
continue;
}
}
off = roundup (offset + slotinfo[cnt].map->l_tls_blocksize - firstbyte,
slotinfo[cnt].map->l_tls_align) + firstbyte;
if (off > offset + slotinfo[cnt].map->l_tls_blocksize
+ (freebottom - freetop))
{
freetop = offset;
freebottom = off - slotinfo[cnt].map->l_tls_blocksize;
}
offset = off;
/* XXX For some architectures we perhaps should store the
negative offset. */
slotinfo[cnt].map->l_tls_offset = off;
}
GL(dl_tls_static_used) = offset;
GL(dl_tls_static_size) = (roundup (offset + TLS_STATIC_SURPLUS, max_align)
+ TLS_TCB_SIZE);
# elif TLS_DTV_AT_TP
/* The TLS blocks start right after the TCB. */
size_t offset = TLS_TCB_SIZE;
for (size_t cnt = 0; slotinfo[cnt].map != NULL; ++cnt)
{
assert (cnt < GL(dl_tls_dtv_slotinfo_list)->len);
size_t firstbyte = (-slotinfo[cnt].map->l_tls_firstbyte_offset
& (slotinfo[cnt].map->l_tls_align - 1));
size_t off;
max_align = MAX (max_align, slotinfo[cnt].map->l_tls_align);
if (slotinfo[cnt].map->l_tls_blocksize <= freetop - freebottom)
{
off = roundup (freebottom, slotinfo[cnt].map->l_tls_align);
if (off - freebottom < firstbyte)
off += slotinfo[cnt].map->l_tls_align;
if (off + slotinfo[cnt].map->l_tls_blocksize - firstbyte <= freetop)
{
slotinfo[cnt].map->l_tls_offset = off - firstbyte;
freebottom = (off + slotinfo[cnt].map->l_tls_blocksize
- firstbyte);
continue;
}
}
off = roundup (offset, slotinfo[cnt].map->l_tls_align);
if (off - offset < firstbyte)
off += slotinfo[cnt].map->l_tls_align;
slotinfo[cnt].map->l_tls_offset = off - firstbyte;
if (off - firstbyte - offset > freetop - freebottom)
{
freebottom = offset;
freetop = off - firstbyte;
}
offset = off + slotinfo[cnt].map->l_tls_blocksize - firstbyte;
}
GL(dl_tls_static_used) = offset;
GL(dl_tls_static_size) = roundup (offset + TLS_STATIC_SURPLUS,
TLS_TCB_ALIGN);
# else
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
# endif
/* The alignment requirement for the static TLS block. */
GL(dl_tls_static_align) = max_align;
}
/* This is called only when the data structure setup was skipped at startup,
when there was no need for it then. Now we have dynamically loaded
something needing TLS, or libpthread needs it. */
int
internal_function
_dl_tls_setup (void)
{
assert (GL(dl_tls_dtv_slotinfo_list) == NULL);
assert (GL(dl_tls_max_dtv_idx) == 0);
const size_t nelem = 2 + TLS_SLOTINFO_SURPLUS;
GL(dl_tls_dtv_slotinfo_list)
= calloc (1, (sizeof (struct dtv_slotinfo_list)
+ nelem * sizeof (struct dtv_slotinfo)));
if (GL(dl_tls_dtv_slotinfo_list) == NULL)
return -1;
GL(dl_tls_dtv_slotinfo_list)->len = nelem;
/* Number of elements in the static TLS block. It can't be zero
because of various assumptions. The one element is null. */
GL(dl_tls_static_nelem) = GL(dl_tls_max_dtv_idx) = 1;
/* This initializes more variables for us. */
_dl_determine_tlsoffset ();
return 0;
}
rtld_hidden_def (_dl_tls_setup)
# endif
static void *
internal_function
allocate_dtv (void *result)
{
dtv_t *dtv;
size_t dtv_length;
/* We allocate a few more elements in the dtv than are needed for the
initial set of modules. This should avoid in most cases expansions
of the dtv. */
dtv_length = GL(dl_tls_max_dtv_idx) + DTV_SURPLUS;
dtv = calloc (dtv_length + 2, sizeof (dtv_t));
if (dtv != NULL)
{
/* This is the initial length of the dtv. */
dtv[0].counter = dtv_length;
/* The rest of the dtv (including the generation counter) is
Initialize with zero to indicate nothing there. */
/* Add the dtv to the thread data structures. */
INSTALL_DTV (result, dtv);
}
else
result = NULL;
return result;
}
/* Get size and alignment requirements of the static TLS block. */
void
internal_function
_dl_get_tls_static_info (size_t *sizep, size_t *alignp)
{
*sizep = GL(dl_tls_static_size);
*alignp = GL(dl_tls_static_align);
}
void *
internal_function
_dl_allocate_tls_storage (void)
{
void *result;
size_t size = GL(dl_tls_static_size);
# if TLS_DTV_AT_TP
/* Memory layout is:
[ TLS_PRE_TCB_SIZE ] [ TLS_TCB_SIZE ] [ TLS blocks ]
^ This should be returned. */
size += (TLS_PRE_TCB_SIZE + GL(dl_tls_static_align) - 1)
& ~(GL(dl_tls_static_align) - 1);
# endif
/* Allocate a correctly aligned chunk of memory. */
result = __libc_memalign (GL(dl_tls_static_align), size);
if (__builtin_expect (result != NULL, 1))
{
/* Allocate the DTV. */
void *allocated = result;
# if TLS_TCB_AT_TP
/* The TCB follows the TLS blocks. */
result = (char *) result + size - TLS_TCB_SIZE;
/* Clear the TCB data structure. We can't ask the caller (i.e.
libpthread) to do it, because we will initialize the DTV et al. */
memset (result, '\0', TLS_TCB_SIZE);
# elif TLS_DTV_AT_TP
result = (char *) result + size - GL(dl_tls_static_size);
/* Clear the TCB data structure and TLS_PRE_TCB_SIZE bytes before it.
We can't ask the caller (i.e. libpthread) to do it, because we will
initialize the DTV et al. */
memset ((char *) result - TLS_PRE_TCB_SIZE, '\0',
TLS_PRE_TCB_SIZE + TLS_TCB_SIZE);
# endif
result = allocate_dtv (result);
if (result == NULL)
free (allocated);
}
return result;
}
void *
internal_function
_dl_allocate_tls_init (void *result)
{
if (result == NULL)
/* The memory allocation failed. */
return NULL;
dtv_t *dtv = GET_DTV (result);
struct dtv_slotinfo_list *listp;
size_t total = 0;
size_t maxgen = 0;
/* We have to prepare the dtv for all currently loaded modules using
TLS. For those which are dynamically loaded we add the values
indicating deferred allocation. */
listp = GL(dl_tls_dtv_slotinfo_list);
while (1)
{
size_t cnt;
for (cnt = total == 0 ? 1 : 0; cnt < listp->len; ++cnt)
{
struct link_map *map;
void *dest;
/* Check for the total number of used slots. */
if (total + cnt > GL(dl_tls_max_dtv_idx))
break;
map = listp->slotinfo[cnt].map;
if (map == NULL)
/* Unused entry. */
continue;
/* Keep track of the maximum generation number. This might
not be the generation counter. */
maxgen = MAX (maxgen, listp->slotinfo[cnt].gen);
if (map->l_tls_offset == NO_TLS_OFFSET)
{
/* For dynamically loaded modules we simply store
the value indicating deferred allocation. */
dtv[map->l_tls_modid].pointer.val = TLS_DTV_UNALLOCATED;
dtv[map->l_tls_modid].pointer.is_static = false;
continue;
}
assert (map->l_tls_modid == cnt);
assert (map->l_tls_blocksize >= map->l_tls_initimage_size);
# if TLS_TCB_AT_TP
assert ((size_t) map->l_tls_offset >= map->l_tls_blocksize);
dest = (char *) result - map->l_tls_offset;
# elif TLS_DTV_AT_TP
dest = (char *) result + map->l_tls_offset;
# else
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
# endif
/* Copy the initialization image and clear the BSS part. */
dtv[map->l_tls_modid].pointer.val = dest;
dtv[map->l_tls_modid].pointer.is_static = true;
memset (__mempcpy (dest, map->l_tls_initimage,
map->l_tls_initimage_size), '\0',
map->l_tls_blocksize - map->l_tls_initimage_size);
}
total += cnt;
if (total >= GL(dl_tls_max_dtv_idx))
break;
listp = listp->next;
assert (listp != NULL);
}
/* The DTV version is up-to-date now. */
dtv[0].counter = maxgen;
return result;
}
rtld_hidden_def (_dl_allocate_tls_init)
void *
internal_function
_dl_allocate_tls (void *mem)
{
return _dl_allocate_tls_init (mem == NULL
? _dl_allocate_tls_storage ()
: allocate_dtv (mem));
}
rtld_hidden_def (_dl_allocate_tls)
void
internal_function
_dl_deallocate_tls (void *tcb, bool dealloc_tcb)
{
dtv_t *dtv = GET_DTV (tcb);
/* We need to free the memory allocated for non-static TLS. */
for (size_t cnt = 0; cnt < dtv[-1].counter; ++cnt)
if (! dtv[1 + cnt].pointer.is_static
&& dtv[1 + cnt].pointer.val != TLS_DTV_UNALLOCATED)
free (dtv[1 + cnt].pointer.val);
/* The array starts with dtv[-1]. */
#ifdef SHARED
if (dtv != GL(dl_initial_dtv))
#endif
free (dtv - 1);
if (dealloc_tcb)
{
# if TLS_TCB_AT_TP
/* The TCB follows the TLS blocks. Back up to free the whole block. */
tcb -= GL(dl_tls_static_size) - TLS_TCB_SIZE;
# elif TLS_DTV_AT_TP
/* Back up the TLS_PRE_TCB_SIZE bytes. */
tcb -= (TLS_PRE_TCB_SIZE + GL(dl_tls_static_align) - 1)
& ~(GL(dl_tls_static_align) - 1);
# endif
free (tcb);
}
}
rtld_hidden_def (_dl_deallocate_tls)
# ifdef SHARED
/* The __tls_get_addr function has two basic forms which differ in the
arguments. The IA-64 form takes two parameters, the module ID and
offset. The form used, among others, on IA-32 takes a reference to
a special structure which contain the same information. The second
form seems to be more often used (in the moment) so we default to
it. Users of the IA-64 form have to provide adequate definitions
of the following macros. */
# ifndef GET_ADDR_ARGS
# define GET_ADDR_ARGS tls_index *ti
# endif
# ifndef GET_ADDR_MODULE
# define GET_ADDR_MODULE ti->ti_module
# endif
# ifndef GET_ADDR_OFFSET
# define GET_ADDR_OFFSET ti->ti_offset
# endif
static void *
allocate_and_init (struct link_map *map)
{
void *newp;
newp = __libc_memalign (map->l_tls_align, map->l_tls_blocksize);
if (newp == NULL)
oom ();
/* Initialize the memory. */
memset (__mempcpy (newp, map->l_tls_initimage, map->l_tls_initimage_size),
'\0', map->l_tls_blocksize - map->l_tls_initimage_size);
return newp;
}
struct link_map *
_dl_update_slotinfo (unsigned long int req_modid)
{
struct link_map *the_map = NULL;
dtv_t *dtv = THREAD_DTV ();
/* The global dl_tls_dtv_slotinfo array contains for each module
index the generation counter current when the entry was created.
This array never shrinks so that all module indices which were
valid at some time can be used to access it. Before the first
use of a new module index in this function the array was extended
appropriately. Access also does not have to be guarded against
modifications of the array. It is assumed that pointer-size
values can be read atomically even in SMP environments. It is
possible that other threads at the same time dynamically load
code and therefore add to the slotinfo list. This is a problem
since we must not pick up any information about incomplete work.
The solution to this is to ignore all dtv slots which were
created after the one we are currently interested. We know that
dynamic loading for this module is completed and this is the last
load operation we know finished. */
unsigned long int idx = req_modid;
struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list);
while (idx >= listp->len)
{
idx -= listp->len;
listp = listp->next;
}
if (dtv[0].counter < listp->slotinfo[idx].gen)
{
/* The generation counter for the slot is higher than what the
current dtv implements. We have to update the whole dtv but
only those entries with a generation counter <= the one for
the entry we need. */
size_t new_gen = listp->slotinfo[idx].gen;
size_t total = 0;
/* We have to look through the entire dtv slotinfo list. */
listp = GL(dl_tls_dtv_slotinfo_list);
do
{
for (size_t cnt = total == 0 ? 1 : 0; cnt < listp->len; ++cnt)
{
size_t gen = listp->slotinfo[cnt].gen;
if (gen > new_gen)
/* This is a slot for a generation younger than the
one we are handling now. It might be incompletely
set up so ignore it. */
continue;
/* If the entry is older than the current dtv layout we
know we don't have to handle it. */
if (gen <= dtv[0].counter)
continue;
/* If there is no map this means the entry is empty. */
struct link_map *map = listp->slotinfo[cnt].map;
if (map == NULL)
{
/* If this modid was used at some point the memory
might still be allocated. */
if (! dtv[total + cnt].pointer.is_static
&& dtv[total + cnt].pointer.val != TLS_DTV_UNALLOCATED)
{
free (dtv[total + cnt].pointer.val);
dtv[total + cnt].pointer.val = TLS_DTV_UNALLOCATED;
}
continue;
}
/* Check whether the current dtv array is large enough. */
size_t modid = map->l_tls_modid;
assert (total + cnt == modid);
if (dtv[-1].counter < modid)
{
/* Reallocate the dtv. */
dtv_t *newp;
size_t newsize = GL(dl_tls_max_dtv_idx) + DTV_SURPLUS;
size_t oldsize = dtv[-1].counter;
assert (map->l_tls_modid <= newsize);
if (dtv == GL(dl_initial_dtv))
{
/* This is the initial dtv that was allocated
during rtld startup using the dl-minimal.c
malloc instead of the real malloc. We can't
free it, we have to abandon the old storage. */
newp = malloc ((2 + newsize) * sizeof (dtv_t));
if (newp == NULL)
oom ();
memcpy (newp, &dtv[-1], oldsize * sizeof (dtv_t));
}
else
{
newp = realloc (&dtv[-1],
(2 + newsize) * sizeof (dtv_t));
if (newp == NULL)
oom ();
}
newp[0].counter = newsize;
/* Clear the newly allocated part. */
memset (newp + 2 + oldsize, '\0',
(newsize - oldsize) * sizeof (dtv_t));
/* Point dtv to the generation counter. */
dtv = &newp[1];
/* Install this new dtv in the thread data
structures. */
INSTALL_NEW_DTV (dtv);
}
/* If there is currently memory allocate for this
dtv entry free it. */
/* XXX Ideally we will at some point create a memory
pool. */
if (! dtv[modid].pointer.is_static
&& dtv[modid].pointer.val != TLS_DTV_UNALLOCATED)
/* Note that free is called for NULL is well. We
deallocate even if it is this dtv entry we are
supposed to load. The reason is that we call
memalign and not malloc. */
free (dtv[modid].pointer.val);
/* This module is loaded dynamically- We defer memory
allocation. */
dtv[modid].pointer.is_static = false;
dtv[modid].pointer.val = TLS_DTV_UNALLOCATED;
if (modid == req_modid)
the_map = map;
}
total += listp->len;
}
while ((listp = listp->next) != NULL);
/* This will be the new maximum generation counter. */
dtv[0].counter = new_gen;
}
return the_map;
}
/* The generic dynamic and local dynamic model cannot be used in
statically linked applications. */
void *
__tls_get_addr (GET_ADDR_ARGS)
{
dtv_t *dtv = THREAD_DTV ();
struct link_map *the_map = NULL;
void *p;
if (__builtin_expect (dtv[0].counter != GL(dl_tls_generation), 0))
the_map = _dl_update_slotinfo (GET_ADDR_MODULE);
p = dtv[GET_ADDR_MODULE].pointer.val;
if (__builtin_expect (p == TLS_DTV_UNALLOCATED, 0))
{
/* The allocation was deferred. Do it now. */
if (the_map == NULL)
{
/* Find the link map for this module. */
size_t idx = GET_ADDR_MODULE;
struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list);
while (idx >= listp->len)
{
idx -= listp->len;
listp = listp->next;
}
the_map = listp->slotinfo[idx].map;
}
p = dtv[GET_ADDR_MODULE].pointer.val = allocate_and_init (the_map);
dtv[GET_ADDR_MODULE].pointer.is_static = false;
}
return (char *) p + GET_ADDR_OFFSET;
}
# endif
void
_dl_add_to_slotinfo (struct link_map *l)
{
/* Now that we know the object is loaded successfully add
modules containing TLS data to the dtv info table. We
might have to increase its size. */
struct dtv_slotinfo_list *listp;
struct dtv_slotinfo_list *prevp;
size_t idx = l->l_tls_modid;
/* Find the place in the dtv slotinfo list. */
listp = GL(dl_tls_dtv_slotinfo_list);
prevp = NULL; /* Needed to shut up gcc. */
do
{
/* Does it fit in the array of this list element? */
if (idx < listp->len)
break;
idx -= listp->len;
prevp = listp;
listp = listp->next;
}
while (listp != NULL);
if (listp == NULL)
{
/* When we come here it means we have to add a new element
to the slotinfo list. And the new module must be in
the first slot. */
assert (idx == 0);
listp = prevp->next = (struct dtv_slotinfo_list *)
malloc (sizeof (struct dtv_slotinfo_list)
+ TLS_SLOTINFO_SURPLUS * sizeof (struct dtv_slotinfo));
if (listp == NULL)
{
/* We ran out of memory. We will simply fail this
call but don't undo anything we did so far. The
application will crash or be terminated anyway very
soon. */
/* We have to do this since some entries in the dtv
slotinfo array might already point to this
generation. */
++GL(dl_tls_generation);
_dl_signal_error (ENOMEM, "dlopen", NULL, N_("\
cannot create TLS data structures"));
}
listp->len = TLS_SLOTINFO_SURPLUS;
listp->next = NULL;
memset (listp->slotinfo, '\0',
TLS_SLOTINFO_SURPLUS * sizeof (struct dtv_slotinfo));
}
/* Add the information into the slotinfo data structure. */
listp->slotinfo[idx].map = l;
listp->slotinfo[idx].gen = GL(dl_tls_generation) + 1;
}
#endif /* use TLS */

1
elf/dl-trampoline.c Normal file
View File

@ -0,0 +1 @@
#error "Architecture specific PLT trampolines must be defined."

54
gmon/bb_init_func.c Normal file
View File

@ -0,0 +1,54 @@
/* Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David Mosberger (davidm@cs.arizona.edu).
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
/* __bb_init_func is invoked at the beginning of each function, before
any registers have been saved. This generic routine should work
provided that calling this function doesn't mangle the arguments
passed to the function being called. If that's not the case, a
system specific routine must be provided. */
#include <sys/types.h>
#include <sys/gmon.h>
#include <stdlib.h>
void
__bb_init_func (struct __bb *bb)
{
struct gmonparam *p = &_gmonparam;
if (bb->zero_word != 0)
{
return; /* handle common case quickly */
}
/* insert this basic-block into basic-block list: */
bb->zero_word = 1;
bb->next = __bb_head;
__bb_head = bb;
if (bb->next == 0 && p->state != GMON_PROF_ON)
{
/* we didn't register _mcleanup yet and pc profiling doesn't seem
to be active, so let's register it now: */
extern void *__dso_handle __attribute__ ((__weak__));
__cxa_atexit ((void (*) (void *)) _mcleanup, NULL,
&__dso_handle ? __dso_handle : NULL);
}
}

50
inet/check_pf.c Normal file
View File

@ -0,0 +1,50 @@
/* Determine protocol families for which interfaces exist. Generic version.
Copyright (C) 2003 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <ifaddrs.h>
#include <netdb.h>
void
attribute_hidden
__check_pf (bool *seen_ipv4, bool *seen_ipv6)
{
/* Get the interface list via getifaddrs. */
struct ifaddrs *ifa = NULL;
if (getifaddrs (&ifa) != 0)
{
/* We cannot determine what interfaces are available. Be
pessimistic. */
*seen_ipv4 = true;
*seen_ipv6 = true;
return;
}
*seen_ipv4 = false;
*seen_ipv6 = false;
struct ifaddrs *runp;
for (runp = ifa; runp != NULL; runp = runp->ifa_next)
if (runp->ifa_addr->sa_family == PF_INET)
*seen_ipv4 = true;
else if (runp->ifa_addr->sa_family == PF_INET6)
*seen_ipv6 = true;
(void) freeifaddrs (ifa);
}

41
io/access.c Normal file
View File

@ -0,0 +1,41 @@
/* Copyright (C) 1991, 1995, 1996, 1997 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <stddef.h>
#include <unistd.h>
/* Test for access to FILE. */
int
__access (file, type)
const char *file;
int type;
{
if (file == NULL || (type & ~(R_OK|W_OK|X_OK|F_OK)) != 0)
{
__set_errno (EINVAL);
return -1;
}
__set_errno (ENOSYS);
return -1;
}
stub_warning (access)
weak_alias (__access, access)
#include <stub-tag.h>

40
io/chdir.c Normal file
View File

@ -0,0 +1,40 @@
/* Copyright (C) 1991, 1995, 1996, 1997 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <stddef.h>
#include <unistd.h>
/* Change the current directory to PATH. */
int
__chdir (path)
const char *path;
{
if (path == NULL)
{
__set_errno (EINVAL);
return -1;
}
__set_errno (ENOSYS);
return -1;
}
stub_warning (chdir)
weak_alias (__chdir, chdir)
#include <stub-tag.h>

42
io/chmod.c Normal file
View File

@ -0,0 +1,42 @@
/* Copyright (C) 1991, 1995, 1996, 1997 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <stddef.h>
#include <sys/stat.h>
#include <sys/types.h>
/* Change the protections of FILE to MODE. */
int
__chmod (file, mode)
const char *file;
mode_t mode;
{
if (file == NULL)
{
__set_errno (EINVAL);
return -1;
}
__set_errno (ENOSYS);
return -1;
}
stub_warning (chmod)
weak_alias (__chmod, chmod)
#include <stub-tag.h>

45
io/chown.c Normal file
View File

@ -0,0 +1,45 @@
/* Copyright (C) 1991, 1992, 1995, 1996, 1997, 2002
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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <stddef.h>
#include <unistd.h>
#include <sys/types.h>
/* Change the owner and group of FILE. */
int
__chown (file, owner, group)
const char *file;
uid_t owner;
gid_t group;
{
if (file == NULL)
{
__set_errno (EINVAL);
return -1;
}
__set_errno (ENOSYS);
return -1;
}
libc_hidden_def (__chown)
stub_warning (chown)
weak_alias (__chown, chown)
#include <stub-tag.h>

40
io/close.c Normal file
View File

@ -0,0 +1,40 @@
/* Copyright (C) 1991, 1995, 1996, 1997, 2002 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <unistd.h>
/* Close the file descriptor FD. */
int
__close (fd)
int fd;
{
if (fd < 0)
{
__set_errno (EBADF);
return -1;
}
__set_errno (ENOSYS);
return -1;
}
libc_hidden_def (__close)
stub_warning (close)
weak_alias (__close, close)
#include <stub-tag.h>

36
io/creat.c Normal file
View File

@ -0,0 +1,36 @@
/* Copyright (C) 1991, 1996, 1997, 2003 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <fcntl.h>
#include <sys/types.h>
#include <sysdep-cancel.h>
#undef creat
/* Create FILE with protections MODE. */
int
__libc_creat (file, mode)
const char *file;
mode_t mode;
{
return __open (file, O_WRONLY|O_CREAT|O_TRUNC, mode);
}
weak_alias (__libc_creat, creat)
/* __open handles cancellation. */
LIBC_CANCEL_HANDLED ();

31
io/creat64.c Normal file
View File

@ -0,0 +1,31 @@
/* Copyright (C) 1991, 1996, 1997 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <fcntl.h>
#include <sys/types.h>
#undef creat
/* Create FILE with protections MODE. */
int
creat64 (file, mode)
const char *file;
mode_t mode;
{
return __open64 (file, O_WRONLY|O_CREAT|O_TRUNC, mode);
}

34
io/dup.c Normal file
View File

@ -0,0 +1,34 @@
/* Copyright (C) 1991, 1995, 1996, 1997 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
/* Duplicate FD, returning a new file descriptor open on the same file. */
int
__dup (fd)
int fd;
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (dup)
weak_alias (__dup, dup)
#include <stub-tag.h>

48
io/dup2.c Normal file
View File

@ -0,0 +1,48 @@
/* Copyright (C) 1991, 1995, 1996, 1997, 2002 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
/* Duplicate FD to FD2, closing the old FD2 and making FD2 be
open the same file as FD is. Return FD2 or -1. */
int
__dup2 (fd, fd2)
int fd;
int fd2;
{
if (fd < 0 || fd2 < 0)
{
__set_errno (EBADF);
return -1;
}
if (fd == fd2)
/* No way to check that they are valid. */
return fd2;
__set_errno (ENOSYS);
return -1;
}
libc_hidden_def (__dup2)
stub_warning (dup2)
weak_alias (__dup2, dup2)
#include <stub-tag.h>

View File

@ -1,27 +1,56 @@
/* ANSI-C code produced by gperf version 2.7.2 */
/* ANSI-C code produced by gperf version 3.0.1 */
/* Command-line: gperf -acCgopt -k'1,2,5,9,$' -L ANSI-C -N charmap_hash programs/charmap-kw.gperf */
/* Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
&& ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
&& (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
&& ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
&& ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
&& ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
&& ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
&& ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
&& ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
&& ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
&& ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
&& ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
&& ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
&& ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
&& ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
&& ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
&& ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
&& ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
&& ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
&& ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
&& ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
&& ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
&& ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
/* The character set is not based on ISO-646. */
#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
#endif
#line 1 "programs/charmap-kw.gperf"
/* Copyright (C) 1995,1996,1997,1998,1999,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper, <drepper@gnu.org>.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as
published by the Free Software Foundation.
The GNU C Library is distributed in the hope that it will be useful,
This program 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
Lesser General Public License for more details.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include <string.h>
#include "locfile-token.h"
#line 23 "programs/charmap-kw.gperf"
struct keyword_t ;
#define TOTAL_KEYWORDS 17
@ -47,15 +76,15 @@ hash (register const char *str, register unsigned int len)
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 25, 10,
15, 20, 36, 36, 36, 36, 36, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 10, 0, 0,
5, 36, 0, 0, 36, 36, 36, 0, 0, 36,
36, 36, 36, 36, 36, 36, 36, 36, 25, 20,
15, 10, 36, 36, 36, 36, 36, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 5, 0, 0,
5, 36, 0, 0, 36, 36, 36, 5, 0, 36,
0, 36, 0, 36, 0, 36, 36, 0, 36, 36,
36, 36, 36, 36, 36, 0, 36, 0, 0, 0,
10, 0, 36, 0, 0, 0, 36, 36, 36, 0,
36, 36, 36, 36, 36, 0, 36, 5, 0, 0,
5, 0, 36, 5, 0, 0, 36, 36, 36, 0,
0, 0, 0, 0, 0, 0, 0, 0, 36, 36,
25, 36, 36, 36, 36, 36, 36, 36, 36, 36,
0, 36, 36, 36, 36, 36, 36, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
@ -75,17 +104,19 @@ hash (register const char *str, register unsigned int len)
switch (hval)
{
default:
case 9:
hval += asso_values[(unsigned char)str[8]];
/*FALLTHROUGH*/
case 8:
case 7:
case 6:
case 5:
hval += asso_values[(unsigned char)str[4]];
/*FALLTHROUGH*/
case 4:
case 3:
case 2:
hval += asso_values[(unsigned char)str[1]];
/*FALLTHROUGH*/
case 1:
hval += asso_values[(unsigned char)str[0]];
break;
@ -102,29 +133,46 @@ charmap_hash (register const char *str, register unsigned int len)
static const struct keyword_t wordlist[] =
{
{""}, {""}, {""},
#line 38 "programs/charmap-kw.gperf"
{"END", tok_end, 0},
{""},
#line 39 "programs/charmap-kw.gperf"
{"WIDTH", tok_width, 0},
#line 34 "programs/charmap-kw.gperf"
{"escseq", tok_escseq, 1},
#line 36 "programs/charmap-kw.gperf"
{"include", tok_include, 1},
{""}, {""},
#line 27 "programs/charmap-kw.gperf"
{"mb_cur_min", tok_mb_cur_min, 1},
#line 28 "programs/charmap-kw.gperf"
{"escape_char", tok_escape_char, 1},
#line 29 "programs/charmap-kw.gperf"
{"comment_char", tok_comment_char, 1},
#line 25 "programs/charmap-kw.gperf"
{"code_set_name", tok_code_set_name, 1},
#line 40 "programs/charmap-kw.gperf"
{"WIDTH_VARIABLE", tok_width_variable, 0},
{"g1esc", tok_g1esc, 1},
#line 26 "programs/charmap-kw.gperf"
{"mb_cur_max", tok_mb_cur_max, 1},
#line 35 "programs/charmap-kw.gperf"
{"addset", tok_addset, 1},
#line 37 "programs/charmap-kw.gperf"
{"CHARMAP", tok_charmap, 0},
#line 41 "programs/charmap-kw.gperf"
{"WIDTH_DEFAULT", tok_width_default, 0},
{""},
{"g2esc", tok_g2esc, 1},
{""}, {""}, {""}, {""},
#line 33 "programs/charmap-kw.gperf"
{"g3esc", tok_g3esc, 1},
{""}, {""}, {""}, {""},
{"g0esc", tok_g0esc, 1},
#line 32 "programs/charmap-kw.gperf"
{"g2esc", tok_g2esc, 1},
{""}, {""}, {""}, {""},
{"mb_cur_max", tok_mb_cur_max, 1}
#line 31 "programs/charmap-kw.gperf"
{"g1esc", tok_g1esc, 1},
{""}, {""}, {""}, {""},
#line 30 "programs/charmap-kw.gperf"
{"g0esc", tok_g0esc, 1}
};
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)

View File

@ -1,35 +1,64 @@
/* ANSI-C code produced by gperf version 2.7.2 */
/* ANSI-C code produced by gperf version 3.0.1 */
/* Command-line: gperf -acCgopt -k'1,2,5,9,$' -L ANSI-C -N locfile_hash programs/locfile-kw.gperf */
/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
&& ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
&& (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
&& ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
&& ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
&& ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
&& ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
&& ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
&& ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
&& ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
&& ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
&& ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
&& ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
&& ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
&& ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
&& ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
&& ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
&& ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
&& ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
&& ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
&& ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
&& ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
&& ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
/* The character set is not based on ISO-646. */
#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
#endif
#line 1 "programs/locfile-kw.gperf"
/* Copyright (C) 1996,1997,1998,1999,2000,2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as
published by the Free Software Foundation.
The GNU C Library is distributed in the hope that it will be useful,
This program 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
Lesser General Public License for more details.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include <string.h>
#include "locfile-token.h"
#line 23 "programs/locfile-kw.gperf"
struct keyword_t ;
#define TOTAL_KEYWORDS 175
#define MIN_WORD_LENGTH 3
#define MAX_WORD_LENGTH 22
#define MIN_HASH_VALUE 3
#define MAX_HASH_VALUE 687
/* maximum key range = 685, duplicates = 0 */
#define MAX_HASH_VALUE 610
/* maximum key range = 608, duplicates = 0 */
#ifdef __GNUC__
__inline
@ -43,49 +72,51 @@ hash (register const char *str, register unsigned int len)
{
static const unsigned short asso_values[] =
{
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
5, 0, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 15, 688, 0, 0, 0,
5, 0, 0, 0, 688, 688, 0, 688, 0, 5,
688, 688, 15, 0, 5, 15, 688, 688, 688, 0,
688, 688, 688, 688, 688, 75, 688, 0, 0, 65,
5, 0, 85, 40, 5, 155, 688, 10, 105, 120,
125, 35, 5, 20, 5, 190, 0, 125, 35, 10,
30, 35, 0, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
688, 688, 688, 688, 688, 688
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
5, 0, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 5, 611, 0, 0, 0,
0, 0, 10, 0, 611, 611, 0, 611, 0, 5,
611, 611, 0, 0, 0, 10, 611, 611, 611, 0,
611, 611, 611, 611, 611, 0, 611, 145, 105, 25,
15, 0, 190, 110, 10, 35, 611, 0, 80, 65,
5, 130, 40, 50, 5, 0, 10, 35, 50, 20,
5, 10, 0, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
611, 611, 611, 611, 611, 611
};
register int hval = len;
switch (hval)
{
default:
case 9:
hval += asso_values[(unsigned char)str[8]];
/*FALLTHROUGH*/
case 8:
case 7:
case 6:
case 5:
hval += asso_values[(unsigned char)str[4]];
/*FALLTHROUGH*/
case 4:
case 3:
case 2:
hval += asso_values[(unsigned char)str[1]];
/*FALLTHROUGH*/
case 1:
hval += asso_values[(unsigned char)str[0]];
break;
@ -102,314 +133,470 @@ locfile_hash (register const char *str, register unsigned int len)
static const struct keyword_t wordlist[] =
{
{""}, {""}, {""},
#line 30 "programs/locfile-kw.gperf"
{"END", tok_end, 0},
{""}, {""}, {""},
{"LC_TIME", tok_lc_time, 0},
{"era", tok_era, 0},
{"date", tok_date, 0},
{"LC_ADDRESS", tok_lc_address, 0},
{"LC_MESSAGES", tok_lc_messages, 0},
{"LC_TELEPHONE", tok_lc_telephone, 0},
{"LC_CTYPE", tok_lc_ctype, 0},
{"era_t_fmt", tok_era_t_fmt, 0},
{"print", tok_print, 0},
{"height", tok_height, 0},
{"LC_IDENTIFICATION", tok_lc_identification, 0},
{""},
{"era_d_fmt", tok_era_d_fmt, 0},
{"LC_COLLATE", tok_lc_collate, 0},
{""}, {""},
#line 69 "programs/locfile-kw.gperf"
{"IGNORE", tok_ignore, 0},
#line 127 "programs/locfile-kw.gperf"
{"LC_TIME", tok_lc_time, 0},
#line 29 "programs/locfile-kw.gperf"
{"LC_CTYPE", tok_lc_ctype, 0},
{""},
#line 164 "programs/locfile-kw.gperf"
{"LC_ADDRESS", tok_lc_address, 0},
#line 149 "programs/locfile-kw.gperf"
{"LC_MESSAGES", tok_lc_messages, 0},
#line 157 "programs/locfile-kw.gperf"
{"LC_NAME", tok_lc_name, 0},
{"backward", tok_backward, 0},
{"week", tok_week, 0},
{"LC_NUMERIC", tok_lc_numeric, 0},
{"reorder-end", tok_reorder_end, 0},
{""},
{"reorder-after", tok_reorder_after, 0},
{"UNDEFINED", tok_undefined, 0},
{""},
{"LC_MONETARY", tok_lc_monetary, 0},
{""},
{"repertoiremap", tok_repertoiremap, 0},
{"LC_MEASUREMENT", tok_lc_measurement, 0},
{""}, {""}, {""},
#line 154 "programs/locfile-kw.gperf"
{"LC_PAPER", tok_lc_paper, 0},
{""}, {""}, {""}, {""},
{"day", tok_day, 0},
{""}, {""},
{"yesstr", tok_yesstr, 0},
{""}, {""}, {""}, {""}, {""},
{"toupper", tok_toupper, 0},
{"era_year", tok_era_year, 0},
{""}, {""},
{"order_start", tok_order_start, 0},
{"tolower", tok_tolower, 0},
{""}, {""},
{"graph", tok_graph, 0},
{""}, {""}, {""},
{"order_end", tok_order_end, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 182 "programs/locfile-kw.gperf"
{"LC_MEASUREMENT", tok_lc_measurement, 0},
#line 55 "programs/locfile-kw.gperf"
{"LC_COLLATE", tok_lc_collate, 0},
{""},
{"abday", tok_abday, 0},
#line 184 "programs/locfile-kw.gperf"
{"LC_IDENTIFICATION", tok_lc_identification, 0},
#line 197 "programs/locfile-kw.gperf"
{"revision", tok_revision, 0},
#line 68 "programs/locfile-kw.gperf"
{"UNDEFINED", tok_undefined, 0},
#line 123 "programs/locfile-kw.gperf"
{"LC_NUMERIC", tok_lc_numeric, 0},
#line 80 "programs/locfile-kw.gperf"
{"LC_MONETARY", tok_lc_monetary, 0},
#line 177 "programs/locfile-kw.gperf"
{"LC_TELEPHONE", tok_lc_telephone, 0},
{""},
{"yesexpr", tok_yesexpr, 0},
{""}, {""},
{"t_fmt", tok_t_fmt, 0},
{""}, {""}, {""}, {""},
{"d_fmt", tok_d_fmt, 0},
{""}, {""},
{"date_fmt", tok_date_fmt, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{"grouping", tok_grouping, 0},
{""}, {""},
{"tel_dom_fmt", tok_tel_dom_fmt, 0},
{""}, {""}, {""}, {""},
{"era_d_t_fmt", tok_era_d_t_fmt, 0},
{"contact", tok_contact, 0},
{"tel", tok_tel, 0},
{"else", tok_else, 0},
{"alpha", tok_alpha, 0},
{"country_ab3", tok_country_ab3, 0},
{""}, {""}, {""}, {""},
{"country_ab2", tok_country_ab2, 0},
{"country_post", tok_country_post, 0},
{"fax", tok_fax, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{"map", tok_map, 0},
#line 130 "programs/locfile-kw.gperf"
{"week", tok_week, 0},
{""},
{"blank", tok_blank, 0},
{""},
{"forward", tok_forward, 0},
{"audience", tok_audience, 0},
{""},
{"punct", tok_punct, 0},
#line 74 "programs/locfile-kw.gperf"
{"define", tok_define, 0},
{"abbreviation", tok_abbreviation, 0},
#line 150 "programs/locfile-kw.gperf"
{"yesexpr", tok_yesexpr, 0},
#line 139 "programs/locfile-kw.gperf"
{"era_year", tok_era_year, 0},
{""},
{"copy", tok_copy, 0},
{""}, {""}, {""},
{"decimal_point", tok_decimal_point, 0},
#line 53 "programs/locfile-kw.gperf"
{"translit_ignore", tok_translit_ignore, 0},
#line 152 "programs/locfile-kw.gperf"
{"yesstr", tok_yesstr, 0},
{""},
{"upper", tok_upper, 0},
#line 87 "programs/locfile-kw.gperf"
{"negative_sign", tok_negative_sign, 0},
{""},
#line 135 "programs/locfile-kw.gperf"
{"t_fmt", tok_t_fmt, 0},
#line 155 "programs/locfile-kw.gperf"
{"height", tok_height, 0},
{""}, {""},
{"category", tok_category, 0},
#line 51 "programs/locfile-kw.gperf"
{"translit_start", tok_translit_start, 0},
#line 134 "programs/locfile-kw.gperf"
{"d_fmt", tok_d_fmt, 0},
{""},
{"conversion_rate", tok_conversion_rate, 0},
{""}, {""}, {""}, {""},
{"lower", tok_lower, 0},
{""},
{"collating-element", tok_collating_element, 0},
{"duo_p_sep_by_space", tok_duo_p_sep_by_space, 0},
#line 52 "programs/locfile-kw.gperf"
{"translit_end", tok_translit_end, 0},
#line 92 "programs/locfile-kw.gperf"
{"n_cs_precedes", tok_n_cs_precedes, 0},
#line 142 "programs/locfile-kw.gperf"
{"era_t_fmt", tok_era_t_fmt, 0},
#line 38 "programs/locfile-kw.gperf"
{"space", tok_space, 0},
#line 71 "programs/locfile-kw.gperf"
{"reorder-end", tok_reorder_end, 0},
#line 72 "programs/locfile-kw.gperf"
{"reorder-sections-after", tok_reorder_sections_after, 0},
{""},
#line 140 "programs/locfile-kw.gperf"
{"era_d_fmt", tok_era_d_fmt, 0},
#line 185 "programs/locfile-kw.gperf"
{"title", tok_title, 0},
{""}, {""},
#line 147 "programs/locfile-kw.gperf"
{"timezone", tok_timezone, 0},
{""},
{"digit", tok_digit, 0},
{""}, {""}, {""}, {""},
{"postal_fmt", tok_postal_fmt, 0},
{""},
{"d_t_fmt", tok_d_t_fmt, 0},
{"position", tok_position, 0},
{"p_sep_by_space", tok_p_sep_by_space, 0},
{"nostr", tok_nostr, 0},
{"noexpr", tok_noexpr, 0},
{""},
{"charconv", tok_charconv, 0},
{""},
{"width", tok_width, 0},
{"country_car", tok_country_car, 0},
{"comment_char", tok_comment_char, 0},
{""}, {""}, {""}, {""},
{"lang_ab", tok_lang_ab, 0},
{"lang_lib", tok_lang_lib, 0},
{"lang_name", tok_lang_name, 0},
{""}, {""}, {""}, {""},
{"elif", tok_elif, 0},
{""},
{"xdigit", tok_xdigit, 0},
{""}, {""}, {""},
{"space", tok_space, 0},
{""},
{"address", tok_address, 0},
{""}, {""}, {""}, {""}, {""},
{"name_fmt", tok_name_fmt, 0},
{""},
{"t_fmt_ampm", tok_t_fmt_ampm, 0},
{""},
{"name_mr", tok_name_mr, 0},
{""},
{"from", tok_from, 0},
{""},
{"escape_char", tok_escape_char, 0},
{"duo_valid_to", tok_duo_valid_to, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 73 "programs/locfile-kw.gperf"
{"reorder-sections-end", tok_reorder_sections_end, 0},
{""},
{"reorder-sections-after", tok_reorder_sections_after, 0},
{""}, {""}, {""}, {""}, {""}, {""},
{"territory", tok_territory, 0},
{""}, {""},
{"country_name", tok_country_name, 0},
{"language", tok_language, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""},
{"tel_int_fmt", tok_tel_int_fmt, 0},
{"mon_grouping", tok_mon_grouping, 0},
{"positive_sign", tok_positive_sign, 0},
{""},
{"abmon", tok_abmon, 0},
{"measurement", tok_measurement, 0},
{""}, {""}, {""},
{"coll_weight_max", tok_coll_weight_max, 0},
{"collating-symbol", tok_collating_symbol, 0},
{""}, {""}, {""}, {""},
{"script", tok_script, 0},
{""}, {""}, {""}, {""}, {""}, {""},
{"cal_direction", tok_cal_direction, 0},
{""}, {""}, {""}, {""},
{"duo_n_sep_by_space", tok_duo_n_sep_by_space, 0},
{""}, {""}, {""}, {""},
{"mon", tok_mon, 0},
{"translit_start", tok_translit_start, 0},
{"translit_ignore", tok_translit_ignore, 0},
{""},
{"translit_end", tok_translit_end, 0},
{"first_weekday", tok_first_weekday, 0},
{""}, {""},
{"p_sign_posn", tok_p_sign_posn, 0},
{""},
{"first_workday", tok_first_workday, 0},
#line 93 "programs/locfile-kw.gperf"
{"n_sep_by_space", tok_n_sep_by_space, 0},
{""},
{"source", tok_source, 0},
{"mon_decimal_point", tok_mon_decimal_point, 0},
{"symbol-equivalence", tok_symbol_equivalence, 0},
{""},
{"endif", tok_endif, 0},
{""}, {""}, {""},
{"duo_valid_from", tok_duo_valid_from, 0},
{"default_missing", tok_default_missing, 0},
{""}, {""},
#line 98 "programs/locfile-kw.gperf"
{"int_n_cs_precedes", tok_int_n_cs_precedes, 0},
{""}, {""}, {""},
#line 25 "programs/locfile-kw.gperf"
{"escape_char", tok_escape_char, 0},
{""},
#line 27 "programs/locfile-kw.gperf"
{"repertoiremap", tok_repertoiremap, 0},
#line 45 "programs/locfile-kw.gperf"
{"charclass", tok_charclass, 0},
#line 42 "programs/locfile-kw.gperf"
{"print", tok_print, 0},
#line 43 "programs/locfile-kw.gperf"
{"xdigit", tok_xdigit, 0},
#line 108 "programs/locfile-kw.gperf"
{"duo_n_cs_precedes", tok_duo_n_cs_precedes, 0},
#line 125 "programs/locfile-kw.gperf"
{"thousands_sep", tok_thousands_sep, 0},
#line 193 "programs/locfile-kw.gperf"
{"territory", tok_territory, 0},
#line 35 "programs/locfile-kw.gperf"
{"digit", tok_digit, 0},
{""}, {""},
#line 90 "programs/locfile-kw.gperf"
{"p_cs_precedes", tok_p_cs_precedes, 0},
{""},
#line 156 "programs/locfile-kw.gperf"
{"width", tok_width, 0},
#line 61 "programs/locfile-kw.gperf"
{"script", tok_script, 0},
#line 28 "programs/locfile-kw.gperf"
{"include", tok_include, 0},
{""},
#line 77 "programs/locfile-kw.gperf"
{"else", tok_else, 0},
#line 180 "programs/locfile-kw.gperf"
{"int_select", tok_int_select, 0},
{""}, {""}, {""}, {""},
#line 32 "programs/locfile-kw.gperf"
{"upper", tok_upper, 0},
{""}, {""},
#line 190 "programs/locfile-kw.gperf"
{"tel", tok_tel, 0},
#line 91 "programs/locfile-kw.gperf"
{"p_sep_by_space", tok_p_sep_by_space, 0},
{""}, {""},
#line 96 "programs/locfile-kw.gperf"
{"int_p_cs_precedes", tok_int_p_cs_precedes, 0},
{""}, {""},
#line 40 "programs/locfile-kw.gperf"
{"punct", tok_punct, 0},
{""}, {""},
#line 99 "programs/locfile-kw.gperf"
{"int_n_sep_by_space", tok_int_n_sep_by_space, 0},
{""}, {""}, {""},
#line 106 "programs/locfile-kw.gperf"
{"duo_p_cs_precedes", tok_duo_p_cs_precedes, 0},
{""}, {""},
#line 46 "programs/locfile-kw.gperf"
{"class", tok_class, 0},
#line 112 "programs/locfile-kw.gperf"
{"duo_int_n_cs_precedes", tok_duo_int_n_cs_precedes, 0},
#line 113 "programs/locfile-kw.gperf"
{"duo_int_n_sep_by_space", tok_duo_int_n_sep_by_space, 0},
#line 109 "programs/locfile-kw.gperf"
{"duo_n_sep_by_space", tok_duo_n_sep_by_space, 0},
#line 117 "programs/locfile-kw.gperf"
{"duo_int_n_sign_posn", tok_duo_int_n_sign_posn, 0},
{""}, {""}, {""},
#line 47 "programs/locfile-kw.gperf"
{"charconv", tok_charconv, 0},
{""}, {""},
#line 183 "programs/locfile-kw.gperf"
{"measurement", tok_measurement, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 57 "programs/locfile-kw.gperf"
{"section-symbol", tok_section_symbol, 0},
#line 181 "programs/locfile-kw.gperf"
{"int_prefix", tok_int_prefix, 0},
{""}, {""}, {""}, {""},
#line 137 "programs/locfile-kw.gperf"
{"t_fmt_ampm", tok_t_fmt_ampm, 0},
{""}, {""},
#line 97 "programs/locfile-kw.gperf"
{"int_p_sep_by_space", tok_int_p_sep_by_space, 0},
{""},
{"alt_digits", tok_alt_digits, 0},
{""},
{"duo_int_p_sep_by_space", tok_duo_int_p_sep_by_space, 0},
#line 41 "programs/locfile-kw.gperf"
{"graph", tok_graph, 0},
{""}, {""},
{"duo_p_sign_posn", tok_duo_p_sign_posn, 0},
{""}, {""}, {""},
{"duo_currency_symbol", tok_duo_currency_symbol, 0},
{""}, {""}, {""},
{"outdigit", tok_outdigit, 0},
{""}, {""}, {""}, {""},
{"revision", tok_revision, 0},
{""}, {""}, {""}, {""},
{"name_gen", tok_name_gen, 0},
{""},
{"email", tok_email, 0},
{""},
{"uno_valid_to", tok_uno_valid_to, 0},
{"negative_sign", tok_negative_sign, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 124 "programs/locfile-kw.gperf"
{"decimal_point", tok_decimal_point, 0},
{""}, {""},
{"alnum", tok_alnum, 0},
{""}, {""}, {""}, {""}, {""},
{"country_num", tok_country_num, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{"am_pm", tok_am_pm, 0},
{""},
{"mon_thousands_sep", tok_mon_thousands_sep, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{"currency_symbol", tok_currency_symbol, 0},
{""}, {""}, {""}, {""}, {""}, {""},
{"country_isbn", tok_country_isbn, 0},
{""}, {""}, {""}, {""},
{"name_ms", tok_name_ms, 0},
{"name_mrs", tok_name_mrs, 0},
{""}, {""}, {""}, {""},
{"thousands_sep", tok_thousands_sep, 0},
{""},
{"cntrl", tok_cntrl, 0},
{""}, {""}, {""}, {""}, {""},
{"n_sign_posn", tok_n_sign_posn, 0},
{"include", tok_include, 0},
{""}, {""},
{"ifdef", tok_ifdef, 0},
{""},
{"duo_p_cs_precedes", tok_duo_p_cs_precedes, 0},
{""}, {""}, {""}, {""}, {""},
{"p_cs_precedes", tok_p_cs_precedes, 0},
{"uno_valid_from", tok_uno_valid_from, 0},
{"undef", tok_undef, 0},
{""}, {""},
{"int_n_sep_by_space", tok_int_n_sep_by_space, 0},
{"lang_term", tok_lang_term, 0},
{""}, {""},
{"duo_int_n_sep_by_space", tok_duo_int_n_sep_by_space, 0},
{""},
{"duo_int_p_sign_posn", tok_duo_int_p_sign_posn, 0},
{"duo_n_sign_posn", tok_duo_n_sign_posn, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""},
{"application", tok_application, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""},
{"int_p_sign_posn", tok_int_p_sign_posn, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{"duo_int_curr_symbol", tok_duo_int_curr_symbol, 0},
{""}, {""}, {""}, {""}, {""},
{"int_prefix", tok_int_prefix, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""},
{"duo_frac_digits", tok_duo_frac_digits, 0},
{""}, {""}, {""}, {""}, {""},
#line 110 "programs/locfile-kw.gperf"
{"duo_int_p_cs_precedes", tok_duo_int_p_cs_precedes, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 111 "programs/locfile-kw.gperf"
{"duo_int_p_sep_by_space", tok_duo_int_p_sep_by_space, 0},
#line 107 "programs/locfile-kw.gperf"
{"duo_p_sep_by_space", tok_duo_p_sep_by_space, 0},
#line 116 "programs/locfile-kw.gperf"
{"duo_int_p_sign_posn", tok_duo_int_p_sign_posn, 0},
#line 153 "programs/locfile-kw.gperf"
{"nostr", tok_nostr, 0},
{""}, {""},
#line 138 "programs/locfile-kw.gperf"
{"era", tok_era, 0},
{""},
{"frac_digits", tok_frac_digits, 0},
{""}, {""},
{"charclass", tok_charclass, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""},
{"duo_n_cs_precedes", tok_duo_n_cs_precedes, 0},
{""}, {""},
{"int_curr_symbol", tok_int_curr_symbol, 0},
{""}, {""},
{"n_cs_precedes", tok_n_cs_precedes, 0},
#line 82 "programs/locfile-kw.gperf"
{"currency_symbol", tok_currency_symbol, 0},
{""},
{"int_select", tok_int_select, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{"duo_int_n_sign_posn", tok_duo_int_n_sign_posn, 0},
{"class", tok_class, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""},
{"int_p_cs_precedes", tok_int_p_cs_precedes, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""},
{"duo_int_frac_digits", tok_duo_int_frac_digits, 0},
{""}, {""}, {""}, {""}, {""},
{"int_n_sign_posn", tok_int_n_sign_posn, 0},
{""}, {""}, {""},
#line 163 "programs/locfile-kw.gperf"
{"name_ms", tok_name_ms, 0},
#line 161 "programs/locfile-kw.gperf"
{"name_mrs", tok_name_mrs, 0},
#line 162 "programs/locfile-kw.gperf"
{"name_miss", tok_name_miss, 0},
#line 81 "programs/locfile-kw.gperf"
{"int_curr_symbol", tok_int_curr_symbol, 0},
#line 186 "programs/locfile-kw.gperf"
{"source", tok_source, 0},
#line 160 "programs/locfile-kw.gperf"
{"name_mr", tok_name_mr, 0},
#line 159 "programs/locfile-kw.gperf"
{"name_gen", tok_name_gen, 0},
#line 198 "programs/locfile-kw.gperf"
{"date", tok_date, 0},
{""}, {""},
#line 187 "programs/locfile-kw.gperf"
{"address", tok_address, 0},
#line 158 "programs/locfile-kw.gperf"
{"name_fmt", tok_name_fmt, 0},
#line 31 "programs/locfile-kw.gperf"
{"copy", tok_copy, 0},
{""}, {""},
#line 49 "programs/locfile-kw.gperf"
{"tolower", tok_tolower, 0},
#line 129 "programs/locfile-kw.gperf"
{"day", tok_day, 0},
#line 103 "programs/locfile-kw.gperf"
{"duo_currency_symbol", tok_duo_currency_symbol, 0},
#line 101 "programs/locfile-kw.gperf"
{"int_n_sign_posn", tok_int_n_sign_posn, 0},
{""}, {""},
#line 148 "programs/locfile-kw.gperf"
{"date_fmt", tok_date_fmt, 0},
#line 63 "programs/locfile-kw.gperf"
{"order_end", tok_order_end, 0},
{""}, {""},
#line 166 "programs/locfile-kw.gperf"
{"country_name", tok_country_name, 0},
#line 70 "programs/locfile-kw.gperf"
{"reorder-after", tok_reorder_after, 0},
#line 118 "programs/locfile-kw.gperf"
{"uno_valid_from", tok_uno_valid_from, 0},
#line 115 "programs/locfile-kw.gperf"
{"duo_n_sign_posn", tok_duo_n_sign_posn, 0},
#line 151 "programs/locfile-kw.gperf"
{"noexpr", tok_noexpr, 0},
{""},
#line 194 "programs/locfile-kw.gperf"
{"audience", tok_audience, 0},
{""},
#line 44 "programs/locfile-kw.gperf"
{"blank", tok_blank, 0},
{""},
#line 48 "programs/locfile-kw.gperf"
{"toupper", tok_toupper, 0},
#line 67 "programs/locfile-kw.gperf"
{"position", tok_position, 0},
#line 120 "programs/locfile-kw.gperf"
{"duo_valid_from", tok_duo_valid_from, 0},
#line 39 "programs/locfile-kw.gperf"
{"cntrl", tok_cntrl, 0},
{""},
#line 26 "programs/locfile-kw.gperf"
{"comment_char", tok_comment_char, 0},
#line 86 "programs/locfile-kw.gperf"
{"positive_sign", tok_positive_sign, 0},
{""}, {""}, {""}, {""},
#line 132 "programs/locfile-kw.gperf"
{"mon", tok_mon, 0},
{""}, {""},
#line 171 "programs/locfile-kw.gperf"
{"country_car", tok_country_car, 0},
{""},
#line 60 "programs/locfile-kw.gperf"
{"symbol-equivalence", tok_symbol_equivalence, 0},
#line 102 "programs/locfile-kw.gperf"
{"duo_int_curr_symbol", tok_duo_int_curr_symbol, 0},
#line 100 "programs/locfile-kw.gperf"
{"int_p_sign_posn", tok_int_p_sign_posn, 0},
{""}, {""}, {""}, {""}, {""}, {""},
#line 172 "programs/locfile-kw.gperf"
{"country_isbn", tok_country_isbn, 0},
#line 36 "programs/locfile-kw.gperf"
{"outdigit", tok_outdigit, 0},
{""},
#line 114 "programs/locfile-kw.gperf"
{"duo_p_sign_posn", tok_duo_p_sign_posn, 0},
{""},
#line 133 "programs/locfile-kw.gperf"
{"d_t_fmt", tok_d_t_fmt, 0},
{""}, {""},
#line 33 "programs/locfile-kw.gperf"
{"lower", tok_lower, 0},
{""},
#line 167 "programs/locfile-kw.gperf"
{"country_post", tok_country_post, 0},
#line 146 "programs/locfile-kw.gperf"
{"cal_direction", tok_cal_direction, 0},
{""},
#line 189 "programs/locfile-kw.gperf"
{"email", tok_email, 0},
#line 141 "programs/locfile-kw.gperf"
{"era_d_t_fmt", tok_era_d_t_fmt, 0},
{""}, {""},
#line 173 "programs/locfile-kw.gperf"
{"lang_name", tok_lang_name, 0},
{""},
#line 179 "programs/locfile-kw.gperf"
{"tel_dom_fmt", tok_tel_dom_fmt, 0},
{""}, {""}, {""},
#line 54 "programs/locfile-kw.gperf"
{"default_missing", tok_default_missing, 0},
#line 89 "programs/locfile-kw.gperf"
{"frac_digits", tok_frac_digits, 0},
{""}, {""}, {""},
#line 88 "programs/locfile-kw.gperf"
{"int_frac_digits", tok_int_frac_digits, 0},
#line 170 "programs/locfile-kw.gperf"
{"country_num", tok_country_num, 0},
#line 119 "programs/locfile-kw.gperf"
{"uno_valid_to", tok_uno_valid_to, 0},
{""}, {""}, {""}, {""}, {""},
#line 50 "programs/locfile-kw.gperf"
{"map", tok_map, 0},
{""},
#line 105 "programs/locfile-kw.gperf"
{"duo_frac_digits", tok_duo_frac_digits, 0},
#line 178 "programs/locfile-kw.gperf"
{"tel_int_fmt", tok_tel_int_fmt, 0},
#line 121 "programs/locfile-kw.gperf"
{"duo_valid_to", tok_duo_valid_to, 0},
#line 144 "programs/locfile-kw.gperf"
{"first_weekday", tok_first_weekday, 0},
{""},
#line 143 "programs/locfile-kw.gperf"
{"alt_digits", tok_alt_digits, 0},
#line 95 "programs/locfile-kw.gperf"
{"n_sign_posn", tok_n_sign_posn, 0},
#line 84 "programs/locfile-kw.gperf"
{"mon_thousands_sep", tok_mon_thousands_sep, 0},
#line 145 "programs/locfile-kw.gperf"
{"first_workday", tok_first_workday, 0},
#line 64 "programs/locfile-kw.gperf"
{"from", tok_from, 0},
#line 131 "programs/locfile-kw.gperf"
{"abmon", tok_abmon, 0},
{""}, {""},
#line 192 "programs/locfile-kw.gperf"
{"language", tok_language, 0},
{""}, {""},
#line 195 "programs/locfile-kw.gperf"
{"application", tok_application, 0},
{""},
#line 126 "programs/locfile-kw.gperf"
{"grouping", tok_grouping, 0},
#line 78 "programs/locfile-kw.gperf"
{"elif", tok_elif, 0},
#line 128 "programs/locfile-kw.gperf"
{"abday", tok_abday, 0},
{""},
#line 196 "programs/locfile-kw.gperf"
{"abbreviation", tok_abbreviation, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 56 "programs/locfile-kw.gperf"
{"coll_weight_max", tok_coll_weight_max, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 66 "programs/locfile-kw.gperf"
{"backward", tok_backward, 0},
#line 104 "programs/locfile-kw.gperf"
{"duo_int_frac_digits", tok_duo_int_frac_digits, 0},
{""},
#line 94 "programs/locfile-kw.gperf"
{"p_sign_posn", tok_p_sign_posn, 0},
{""},
#line 199 "programs/locfile-kw.gperf"
{"category", tok_category, 0},
{""},
#line 122 "programs/locfile-kw.gperf"
{"conversion_rate", tok_conversion_rate, 0},
{""},
#line 83 "programs/locfile-kw.gperf"
{"mon_decimal_point", tok_mon_decimal_point, 0},
{""}, {""}, {""},
#line 62 "programs/locfile-kw.gperf"
{"order_start", tok_order_start, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
#line 188 "programs/locfile-kw.gperf"
{"contact", tok_contact, 0},
{""}, {""}, {""},
#line 169 "programs/locfile-kw.gperf"
{"country_ab3", tok_country_ab3, 0},
{""}, {""}, {""}, {""},
#line 168 "programs/locfile-kw.gperf"
{"country_ab2", tok_country_ab2, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
#line 174 "programs/locfile-kw.gperf"
{"lang_ab", tok_lang_ab, 0},
#line 176 "programs/locfile-kw.gperf"
{"lang_lib", tok_lang_lib, 0},
{""}, {""}, {""}, {""},
#line 191 "programs/locfile-kw.gperf"
{"fax", tok_fax, 0},
{""},
#line 136 "programs/locfile-kw.gperf"
{"am_pm", tok_am_pm, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""},
#line 37 "programs/locfile-kw.gperf"
{"alnum", tok_alnum, 0},
{""}, {""}, {""},
#line 175 "programs/locfile-kw.gperf"
{"lang_term", tok_lang_term, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 79 "programs/locfile-kw.gperf"
{"endif", tok_endif, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 165 "programs/locfile-kw.gperf"
{"postal_fmt", tok_postal_fmt, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""},
#line 75 "programs/locfile-kw.gperf"
{"undef", tok_undef, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""},
#line 58 "programs/locfile-kw.gperf"
{"collating-element", tok_collating_element, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""},
#line 85 "programs/locfile-kw.gperf"
{"mon_grouping", tok_mon_grouping, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
#line 65 "programs/locfile-kw.gperf"
{"forward", tok_forward, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
#line 59 "programs/locfile-kw.gperf"
{"collating-symbol", tok_collating_symbol, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""},
{"duo_int_n_cs_precedes", tok_duo_int_n_cs_precedes, 0},
#line 34 "programs/locfile-kw.gperf"
{"alpha", tok_alpha, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""},
{"int_frac_digits", tok_int_frac_digits, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{"section-symbol", tok_section_symbol, 0},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""},
{"int_n_cs_precedes", tok_int_n_cs_precedes, 0}
#line 76 "programs/locfile-kw.gperf"
{"ifdef", tok_ifdef, 0}
};
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)

29
math/cabsf.c Normal file
View File

@ -0,0 +1,29 @@
/* Return the complex absolute value of float complex value.
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <complex.h>
#include <math.h>
float
__cabsf (float _Complex z)
{
return __hypotf (__real__ z, __imag__ z);
}
weak_alias (__cabsf, cabsf)

29
math/cargf.c Normal file
View File

@ -0,0 +1,29 @@
/* Compute argument of complex float value.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <complex.h>
#include <math.h>
float
__cargf (__complex__ float x)
{
return __atan2f (__imag__ x, __real__ x);
}
weak_alias (__cargf, cargf)

28
math/cimagf.c Normal file
View File

@ -0,0 +1,28 @@
/* Return imaginary part of complex float value.
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <complex.h>
float
__cimagf (float _Complex z)
{
return __imag__ z;
}
weak_alias (__cimagf, cimagf)

28
math/conjf.c Normal file
View File

@ -0,0 +1,28 @@
/* Return complex conjugate of complex float value.
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <complex.h>
float _Complex
__conjf (float _Complex z)
{
return ~z;
}
weak_alias (__conjf, conjf)

28
math/crealf.c Normal file
View File

@ -0,0 +1,28 @@
/* Return real part of complex float value.
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <complex.h>
float
__crealf (float _Complex z)
{
return __real__ z;
}
weak_alias (__crealf, crealf)

14
math/e_acoshl.c Normal file
View File

@ -0,0 +1,14 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
long double
__ieee754_acoshl (long double x)
{
fputs ("__ieee754_acoshl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (acoshl)
#include <stub-tag.h>

14
math/e_acosl.c Normal file
View File

@ -0,0 +1,14 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
long double
__ieee754_acosl (long double x)
{
fputs ("__ieee754_acosl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (acosl)
#include <stub-tag.h>

14
math/e_asinl.c Normal file
View File

@ -0,0 +1,14 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
long double
__ieee754_asinl (long double x)
{
fputs ("__ieee754_asinl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (asinl)
#include <stub-tag.h>

14
math/e_atan2l.c Normal file
View File

@ -0,0 +1,14 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
long double
__ieee754_atan2l (long double x, long double y)
{
fputs ("__ieee754_atan2l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (atan2l)
#include <stub-tag.h>

14
math/e_atanhl.c Normal file
View File

@ -0,0 +1,14 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
long double
__ieee754_atanhl (long double x)
{
fputs ("__ieee754_atanhl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (__ieee754_atanhl)
#include <stub-tag.h>

14
math/e_coshl.c Normal file
View File

@ -0,0 +1,14 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
long double
__ieee754_coshl (long double x)
{
fputs ("__ieee754_coshl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (__ieee754_coshl)
#include <stub-tag.h>

30
math/e_exp10.c Normal file
View File

@ -0,0 +1,30 @@
/* Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <math.h>
#include "math_private.h"
double
__ieee754_exp10 (double arg)
{
/* This is a very stupid and inprecise implementation. It'll get
replaced sometime (soon?). */
return __ieee754_exp (M_LN10 * arg);
}

30
math/e_exp10f.c Normal file
View File

@ -0,0 +1,30 @@
/* Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <math.h>
#include "math_private.h"
float
__ieee754_exp10f (float arg)
{
/* This is a very stupid and inprecise implementation. It'll get
replaced sometime (soon?). */
return __ieee754_expf (M_LN10 * arg);
}

30
math/e_exp10l.c Normal file
View File

@ -0,0 +1,30 @@
/* Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <math.h>
#include "math_private.h"
long double
__ieee754_exp10l (long double arg)
{
/* This is a very stupid and inprecise implementation. It'll get
replaced sometime (soon?). */
return __ieee754_expl (M_LN10l * arg);
}

14
math/e_exp2l.c Normal file
View File

@ -0,0 +1,14 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
long double
__ieee754_exp2l (long double x)
{
fputs ("__ieee754_exp2l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (exp2l)
#include <stub-tag.h>

14
math/e_expl.c Normal file
View File

@ -0,0 +1,14 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
long double
__ieee754_expl (long double x)
{
fputs ("__ieee754_expl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (expl)
#include <stub-tag.h>

14
math/e_fmodl.c Normal file
View File

@ -0,0 +1,14 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
long double
__ieee754_fmodl (long double x, long double y)
{
fputs ("__ieee754_fmodl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (fmodl)
#include <stub-tag.h>

15
math/e_gammal_r.c Normal file
View File

@ -0,0 +1,15 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
long double
__ieee754_gammal_r (long double x, int *signgamp)
{
*signgamp = 0;
fputs ("__ieee754_gammal_r not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (__ieee754_gammal_r)
#include <stub-tag.h>

14
math/e_hypotl.c Normal file
View File

@ -0,0 +1,14 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
long double
__ieee754_hypotl (long double x, long double y)
{
fputs ("__ieee754_hypotl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (__ieee754_hypotl)
#include <stub-tag.h>

25
math/e_j0l.c Normal file
View File

@ -0,0 +1,25 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
#include "math_private.h"
long double
__ieee754_j0l (long double x)
{
fputs ("__ieee754_j0l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (j0l)
long double
__ieee754_y0l (long double x)
{
fputs ("__ieee754_y0l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (y0l)
#include <stub-tag.h>

25
math/e_j1l.c Normal file
View File

@ -0,0 +1,25 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
#include "math_private.h"
long double
__ieee754_j1l (long double x)
{
fputs ("__ieee754_j1l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (j1l)
long double
__ieee754_y1l (long double x)
{
fputs ("__ieee754_y1l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (y1l)
#include <stub-tag.h>

25
math/e_jnl.c Normal file
View File

@ -0,0 +1,25 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
#include "math_private.h"
long double
__ieee754_jnl (int n, long double x)
{
fputs ("__ieee754_jnl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (jnl)
long double
__ieee754_ynl (int n, long double x)
{
fputs ("__ieee754_ynl not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (ynl)
#include <stub-tag.h>

17
math/e_lgammal_r.c Normal file
View File

@ -0,0 +1,17 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
#include "math_private.h"
long double
__ieee754_lgammal_r (long double x, int *signgamp)
{
*signgamp = 0;
fputs ("__ieee754_lgammal_r not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (lgammal)
stub_warning (lgammal_r)
#include <stub-tag.h>

14
math/e_log10l.c Normal file
View File

@ -0,0 +1,14 @@
#include <math.h>
#include <stdio.h>
#include <errno.h>
long double
__ieee754_log10l (long double x)
{
fputs ("__ieee754_log10l not implemented\n", stderr);
__set_errno (ENOSYS);
return 0.0;
}
stub_warning (log10l)
#include <stub-tag.h>

34
misc/acct.c Normal file
View File

@ -0,0 +1,34 @@
/* Copyright (C) 1991, 1995, 1996, 1997 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <unistd.h>
/* Turn accounting on if NAME is an existing file. The system will then write
a record for each process as it terminates, to this file. If NAME is NULL,
turn accounting off. This call is restricted to the super-user. */
int
acct (name)
const char *name;
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (acct)
#include <stub-tag.h>

37
misc/brk.c Normal file
View File

@ -0,0 +1,37 @@
/* Copyright (C) 1991, 1995, 1996, 1997, 2002 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <unistd.h>
/* sbrk.c expects this. */
void *__curbrk;
/* Set the end of the process's data space to ADDR.
Return 0 if successful, -1 if not. */
int
__brk (addr)
void *addr;
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (brk)
weak_alias (__brk, brk)
#include <stub-tag.h>

43
misc/chflags.c Normal file
View File

@ -0,0 +1,43 @@
/* Copyright (C) 1991, 1995, 1996, 1997, 2004 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <stddef.h>
#include <sys/stat.h>
/* Change the flags of FILE to FLAGS. */
int chflags (const char *file, int flags) __THROW;
int
chflags (file, flags)
const char *file;
int flags;
{
if (file == NULL)
{
__set_errno (EINVAL);
return -1;
}
__set_errno (ENOSYS);
return -1;
}
stub_warning (chflags)
#include <stub-tag.h>

34
misc/chroot.c Normal file
View File

@ -0,0 +1,34 @@
/* Copyright (C) 1991, 1995, 1996, 1997 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <unistd.h>
/* Make PATH be the root directory (the starting point for absolute paths).
This call is restricted to the super-user. */
int
chroot (path)
const char *path;
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (chroot)
#include <stub-tag.h>

View File

@ -1,3 +1,9 @@
2005-12-13 Ulrich Drepper <drepper@redhat.com>
* sysdeps/pthread/sigfillset.c: Adjust for files moved out of
sysdeps/generic.
* errno-loc.c: New file.
2005-12-12 Roland McGrath <roland@redhat.com>
* init.c (__pthread_initialize_minimal_internal): Do __static_tls_size

1
nptl/errno-loc.c Normal file
View File

@ -0,0 +1 @@
#include "../csu/errno-loc.c"

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2003 Free Software Foundation, Inc.
/* Copyright (C) 2003, 2005 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
@ -18,4 +18,4 @@
#include <nptl/pthreadP.h>
#include <sysdeps/generic/sigfillset.c>
#include <signal/sigfillset.c>

39
posix/alarm.c Normal file
View File

@ -0,0 +1,39 @@
/* Copyright (C) 1991,95,96,97,2002 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <unistd.h>
/* Schedule an alarm. In SECONDS seconds, the process will get a SIGALRM.
If SECONDS is zero, any currently scheduled alarm will be cancelled.
The function returns the number of seconds remaining until the last
alarm scheduled would have signaled, or zero if there wasn't one.
There is no return value to indicate an error, but you can set `errno'
to 0 and check its value after calling `alarm', and this might tell you.
The signal may come late due to processor scheduling. */
unsigned int
alarm (seconds)
unsigned int seconds;
{
__set_errno (ENOSYS);
return 0;
}
libc_hidden_def (alarm)
stub_warning (alarm)
#include <stub-tag.h>

44
rt/aio_cancel.c Normal file
View File

@ -0,0 +1,44 @@
/* Cancel requests associated with given file descriptor. Stub version.
Copyright (C) 2001 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
/* We use an UGLY hack to prevent gcc from finding us cheating. The
implementation of aio_cancel and aio_cancel64 are identical and so
we want to avoid code duplication by using aliases. But gcc sees
the different parameter lists and prints a warning. We define here
a function so that aio_cancel64 has no prototype. */
#define aio_cancel64 XXX
#include <aio.h>
/* And undo the hack. */
#undef aio_cancel64
#include <errno.h>
int
aio_cancel (int fildes, struct aiocb *aiocbp)
{
__set_errno (ENOSYS);
return -1;
}
weak_alias (aio_cancel, aio_cancel64)
stub_warning (aio_cancel)
stub_warning (aio_cancel64)
#include <stub-tag.h>

51
rt/aio_fsync.c Normal file
View File

@ -0,0 +1,51 @@
/* Synchronize I/O in given file descriptor. Stub version.
Copyright (C) 2001 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
/* We use an UGLY hack to prevent gcc from finding us cheating. The
implementation of aio_fsync and aio_fsync64 are identical and so
we want to avoid code duplication by using aliases. But gcc sees
the different parameter lists and prints a warning. We define here
a function so that aio_fsync64 has no prototype. */
#define aio_fsync64 XXX
#include <aio.h>
/* And undo the hack. */
#undef aio_fsync64
#include <errno.h>
#include <fcntl.h>
int
aio_fsync (int op, struct aiocb *aiocbp)
{
if (op != O_SYNC && op != O_DSYNC)
{
__set_errno (EINVAL);
return -1;
}
__set_errno (ENOSYS);
return -1;
}
weak_alias (aio_fsync, aio_fsync64)
stub_warning (aio_fsync)
stub_warning (aio_fsync64)
#include <stub-tag.h>

29
rt/aio_misc.c Normal file
View File

@ -0,0 +1,29 @@
/* Handle general operations. Stub version.
Copyright (C) 2001 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <aio.h>
#include <aio_misc.h>
/* This file is for internal code needed by the aio_* implementation. */
void
__aio_init (const struct aioinit *init)
{
}
weak_alias (__aio_init, aio_init)

24
rt/aio_notify.c Normal file
View File

@ -0,0 +1,24 @@
/* Notify initiator of AIO request. Stub version.
Copyright (C) 2001 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <aio.h>
#include <aio_misc.h>
/* This file contains only internal functions used by
the particular aio_* implementation code. */

36
rt/aio_read.c Normal file
View File

@ -0,0 +1,36 @@
/* Asynchronous read. Stub version.
Copyright (C) 2001 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <aio.h>
#include <errno.h>
#ifdef BE_AIO64
#define aiocb aiocb64
#define aio_read aio_read64
#endif
int
aio_read (struct aiocb *aiocbp)
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (aio_read)
#include <stub-tag.h>

2
rt/aio_read64.c Normal file
View File

@ -0,0 +1,2 @@
#define BE_AIO64
#include "aio_read.c"

36
rt/aio_sigqueue.c Normal file
View File

@ -0,0 +1,36 @@
/* Copyright (C) 1997, 1999 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <aio.h>
#include <errno.h>
#include <signal.h>
#include "aio_misc.h"
int
__aio_sigqueue (sig, val, caller_pid)
int sig;
const union sigval val;
pid_t caller_pid;
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (__aio_sigqueue)
#include <stub-tag.h>

46
rt/aio_suspend.c Normal file
View File

@ -0,0 +1,46 @@
/* Suspend until termination of a requests. Stub version.
Copyright (C) 2001 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
/* We use an UGLY hack to prevent gcc from finding us cheating. The
implementations of aio_suspend and aio_suspend64 are identical and so
we want to avoid code duplication by using aliases. But gcc sees
the different parameter lists and prints a warning. We define here
a function so that aio_suspend64 has no prototype. */
#define aio_suspend64 XXX
#include <aio.h>
/* And undo the hack. */
#undef aio_suspend64
#include <errno.h>
#include <sys/time.h>
int
aio_suspend (const struct aiocb *const list[], int nent,
const struct timespec *timeout)
{
__set_errno (ENOSYS);
return -1;
}
weak_alias (aio_suspend, aio_suspend64)
stub_warning (aio_suspend)
stub_warning (aio_suspend64)
#include <stub-tag.h>

36
rt/aio_write.c Normal file
View File

@ -0,0 +1,36 @@
/* Asynchronous write. Stub version.
Copyright (C) 2001 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <aio.h>
#include <errno.h>
#ifdef BE_AIO64
#define aiocb aiocb64
#define aio_write aio_write64
#endif
int
aio_write (struct aiocb *aiocbp)
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (aio_write)
#include <stub-tag.h>

2
rt/aio_write64.c Normal file
View File

@ -0,0 +1,2 @@
#define BE_AIO64
#include "aio_write.c"

39
rt/clock_getcpuclockid.c Normal file
View File

@ -0,0 +1,39 @@
/* Copyright (C) 2000, 2001 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <time.h>
#include <unistd.h>
int
clock_getcpuclockid (pid_t pid, clockid_t *clock_id)
{
/* We don't allow any process ID but our own. */
if (pid != 0 && pid != getpid ())
return EPERM;
#ifdef CLOCK_PROCESS_CPUTIME_ID
/* Store the number. */
*clock_id = CLOCK_PROCESS_CPUTIME_ID;
return 0;
#else
/* We don't have a timer for that. */
return ENOENT;
#endif
}

30
rt/clock_getres.c Normal file
View File

@ -0,0 +1,30 @@
/* Copyright (C) 1999 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <time.h>
/* Get resolution of clock. */
int
clock_getres (clockid_t clock_id, struct timespec *res)
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (clock_getres)
#include <stub-tag.h>

31
rt/clock_gettime.c Normal file
View File

@ -0,0 +1,31 @@
/* Copyright (C) 1999, 2005 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <time.h>
/* Get current value of CLOCK and store it in TP. */
int
clock_gettime (clockid_t clock_id, struct timespec *tp)
{
__set_errno (ENOSYS);
return -1;
}
librt_hidden_def (clock_gettime)
stub_warning (clock_gettime)
#include <stub-tag.h>

39
rt/clock_nanosleep.c Normal file
View File

@ -0,0 +1,39 @@
/* High-resolution sleep with the specified clock. Stub version.
Copyright (C) 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <sys/time.h>
int
clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
struct timespec *rem)
{
if (__builtin_expect (req->tv_nsec, 0) < 0
|| __builtin_expect (req->tv_nsec, 0) >= 1000000000)
return EINVAL;
if (flags != TIMER_ABSTIME && flags != 0)
return EINVAL;
/* Not implemented. */
return ENOSYS;
}
stub_warning (clock_nanosleep)
#include <stub-tag.h>

30
rt/clock_settime.c Normal file
View File

@ -0,0 +1,30 @@
/* Copyright (C) 1999 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <time.h>
/* Set CLOCK to value TP. */
int
clock_settime (clockid_t clock_id, const struct timespec *tp)
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (clock_settime)
#include <stub-tag.h>

35
setjmp/bsd-_setjmp.c Normal file
View File

@ -0,0 +1,35 @@
/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. Stub version.
Copyright (C) 1994, 1997, 1999, 2000, 2002 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <sysdep.h>
#include <setjmp.h>
#undef _setjmp
/* This implementation in C will not usually work, because the call
really needs to be a tail-call so __sigsetjmp saves the state of
the caller, not the state of this `setjmp' frame which then
immediate unwinds. */
int
_setjmp (jmp_buf env)
{
return __sigsetjmp (env, 0);
}
libc_hidden_def (_setjmp)

34
setjmp/bsd-setjmp.c Normal file
View File

@ -0,0 +1,34 @@
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. Stub version.
Copyright (C) 1994, 1997, 1999 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <sysdep.h>
#include <setjmp.h>
#undef setjmp
/* This implementation in C will not usually work, because the call
really needs to be a tail-call so __sigsetjmp saves the state of
the caller, not the state of this `setjmp' frame which then
immediate unwinds. */
int
setjmp (jmp_buf env)
{
return __sigsetjmp (env, 1);
}

96
signal/allocrtsig.c Normal file
View File

@ -0,0 +1,96 @@
/* Handle real-time signal allocation.
Copyright (C) 1997,98,99,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <signal.h>
/* In these variables we keep track of the used variables. If the
platform does not support any real-time signals we will define the
values to some unreasonable value which will signal failing of all
the functions below. */
#ifndef __SIGRTMIN
static int current_rtmin = -1;
static int current_rtmax = -1;
#else
static int current_rtmin;
static int current_rtmax;
static int initialized;
#include <testrtsig.h>
static void
init (void)
{
if (!kernel_has_rtsig ())
{
current_rtmin = -1;
current_rtmax = -1;
}
else
{
current_rtmin = __SIGRTMIN;
current_rtmax = __SIGRTMAX;
}
initialized = 1;
}
#endif
/* Return number of available real-time signal with highest priority. */
int
__libc_current_sigrtmin (void)
{
#ifdef __SIGRTMIN
if (!initialized)
init ();
#endif
return current_rtmin;
}
libc_hidden_def (__libc_current_sigrtmin)
/* Return number of available real-time signal with lowest priority. */
int
__libc_current_sigrtmax (void)
{
#ifdef __SIGRTMIN
if (!initialized)
init ();
#endif
return current_rtmax;
}
libc_hidden_def (__libc_current_sigrtmax)
/* Allocate real-time signal with highest/lowest available
priority. Please note that we don't use a lock since we assume
this function to be called at program start. */
int
__libc_allocate_rtsig (int high)
{
#ifndef __SIGRTMIN
return -1;
#else
if (!initialized)
init ();
if (current_rtmin == -1 || current_rtmin > current_rtmax)
/* We don't have anymore signal available. */
return -1;
return high ? current_rtmin++ : current_rtmax--;
#endif
}

40
socket/accept.c Normal file
View File

@ -0,0 +1,40 @@
/* Copyright (C) 1991, 1995, 1996, 1997, 2002 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <sys/socket.h>
/* Await a connection on socket FD.
When a connection arrives, open a new socket to communicate with it,
set *ADDR (which is *ADDR_LEN bytes long) to the address of the connecting
peer and *ADDR_LEN to the address's actual length, and return the
new socket's descriptor, or -1 for errors. */
int
accept (fd, addr, addr_len)
int fd;
__SOCKADDR_ARG addr;
socklen_t *addr_len;
{
__set_errno (ENOSYS);
return -1;
}
libc_hidden_def (accept)
stub_warning (accept)
#include <stub-tag.h>

36
socket/bind.c Normal file
View File

@ -0,0 +1,36 @@
/* Copyright (C) 1991, 1995, 1996, 1997, 2002 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <sys/socket.h>
/* Give the socket FD the local address ADDR (which is LEN bytes long). */
int
__bind (fd, addr, len)
int fd;
__CONST_SOCKADDR_ARG addr;
socklen_t len;
{
__set_errno (ENOSYS);
return -1;
}
weak_alias (__bind, bind)
stub_warning (bind)
#include <stub-tag.h>

38
socket/connect.c Normal file
View File

@ -0,0 +1,38 @@
/* Copyright (C) 1991, 1995, 1996, 1997 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <sys/socket.h>
/* Open a connection on socket FD to peer at ADDR (which LEN bytes long).
For connectionless socket types, just set the default address to send to
and the only address from which to accept transmissions.
Return 0 on success, -1 for errors. */
int
__connect (fd, addr, len)
int fd;
__CONST_SOCKADDR_ARG addr;
socklen_t len;
{
__set_errno (ENOSYS);
return -1;
}
weak_alias (__connect, connect)
stub_warning (connect)
#include <stub-tag.h>

36
stdio-common/ctermid.c Normal file
View File

@ -0,0 +1,36 @@
/* Copyright (C) 1991, 1995, 1996, 1997 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <stdio.h>
/* Return the name of the controlling terminal.
If S is not NULL, the name is copied into it (it should be at
least L_ctermid bytes long), otherwise a static buffer is used. */
char *
ctermid (s)
char *s;
{
__set_errno (ENOSYS);
return NULL;
}
stub_warning (ctermid)
#include <stub-tag.h>

35
stdio-common/cuserid.c Normal file
View File

@ -0,0 +1,35 @@
/* Copyright (C) 1991, 1995, 1996, 1997 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <stdio.h>
#include <errno.h>
/* Return the username of the caller.
If S is not NULL, it points to a buffer of at least L_cuserid bytes
into which the name is copied; otherwise, a static buffer is used. */
char *
cuserid (s)
char *s;
{
__set_errno (ENOSYS);
return NULL;
}
stub_warning (cuserid)
#include <stub-tag.h>

140
stdlib/abort.c Normal file
View File

@ -0,0 +1,140 @@
/* Copyright (C) 1991,93,95,96,97,98,2001,02 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <bits/libc-lock.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/* Try to get a machine dependent instruction which will make the
program crash. This is used in case everything else fails. */
#include <abort-instr.h>
#ifndef ABORT_INSTRUCTION
/* No such instruction is available. */
# define ABORT_INSTRUCTION
#endif
#ifdef USE_IN_LIBIO
# include <libio/libioP.h>
# define fflush(s) _IO_flush_all_lockp (0)
#endif
/* We must avoid to run in circles. Therefore we remember how far we
already got. */
static int stage;
/* We should be prepared for multiple threads trying to run abort. */
__libc_lock_define_initialized_recursive (static, lock);
/* Cause an abnormal program termination with core-dump. */
void
abort (void)
{
struct sigaction act;
sigset_t sigs;
/* First acquire the lock. */
__libc_lock_lock_recursive (lock);
/* Now it's for sure we are alone. But recursive calls are possible. */
/* Unlock SIGABRT. */
if (stage == 0)
{
++stage;
if (__sigemptyset (&sigs) == 0 &&
__sigaddset (&sigs, SIGABRT) == 0)
__sigprocmask (SIG_UNBLOCK, &sigs, (sigset_t *) NULL);
}
/* Flush all streams. We cannot close them now because the user
might have registered a handler for SIGABRT. */
if (stage == 1)
{
++stage;
fflush (NULL);
}
/* Send signal which possibly calls a user handler. */
if (stage == 2)
{
/* This stage is special: we must allow repeated calls of
`abort' when a user defined handler for SIGABRT is installed.
This is risky since the `raise' implementation might also
fail but I don't see another possibility. */
int save_stage = stage;
stage = 0;
__libc_lock_unlock_recursive (lock);
raise (SIGABRT);
__libc_lock_lock_recursive (lock);
stage = save_stage + 1;
}
/* There was a handler installed. Now remove it. */
if (stage == 3)
{
++stage;
memset (&act, '\0', sizeof (struct sigaction));
act.sa_handler = SIG_DFL;
__sigfillset (&act.sa_mask);
act.sa_flags = 0;
__sigaction (SIGABRT, &act, NULL);
}
/* Now close the streams which also flushes the output the user
defined handler might has produced. */
if (stage == 4)
{
++stage;
__fcloseall ();
}
/* Try again. */
if (stage == 5)
{
++stage;
raise (SIGABRT);
}
/* Now try to abort using the system specific command. */
if (stage == 6)
{
++stage;
ABORT_INSTRUCTION;
}
/* If we can't signal ourselves and the abort instruction failed, exit. */
if (stage == 7)
{
++stage;
_exit (127);
}
/* If even this fails try to use the provided instruction to crash
or otherwise make sure we never return. */
while (1)
/* Try for ever and ever. */
ABORT_INSTRUCTION;
}
libc_hidden_def (abort)

62
stdlib/add_n.c Normal file
View File

@ -0,0 +1,62 @@
/* mpn_add_n -- Add two limb vectors of equal, non-zero length.
Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
The GNU MP Library is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or (at your
option) any later version.
The GNU MP 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the GNU MP 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 <gmp.h>
#include "gmp-impl.h"
mp_limb_t
#if __STDC__
mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
#else
mpn_add_n (res_ptr, s1_ptr, s2_ptr, size)
register mp_ptr res_ptr;
register mp_srcptr s1_ptr;
register mp_srcptr s2_ptr;
mp_size_t size;
#endif
{
register mp_limb_t x, y, cy;
register mp_size_t j;
/* The loop counter and index J goes from -SIZE to -1. This way
the loop becomes faster. */
j = -size;
/* Offset the base pointers to compensate for the negative indices. */
s1_ptr -= j;
s2_ptr -= j;
res_ptr -= j;
cy = 0;
do
{
y = s2_ptr[j];
x = s1_ptr[j];
y += cy; /* add previous carry to one addend */
cy = (y < cy); /* get out carry from that addition */
y = x + y; /* add other addend */
cy = (y < x) + cy; /* get out carry from that add, combine */
res_ptr[j] = y;
}
while (++j != 0);
return cy;
}

65
stdlib/addmul_1.c Normal file
View File

@ -0,0 +1,65 @@
/* mpn_addmul_1 -- multiply the S1_SIZE long limb vector pointed to by S1_PTR
by S2_LIMB, add the S1_SIZE least significant limbs of the product to the
limb vector pointed to by RES_PTR. Return the most significant limb of
the product, adjusted for carry-out from the addition.
Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
The GNU MP Library is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or (at your
option) any later version.
The GNU MP 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the GNU MP 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 <gmp.h>
#include "gmp-impl.h"
#include "longlong.h"
mp_limb_t
mpn_addmul_1 (res_ptr, s1_ptr, s1_size, s2_limb)
register mp_ptr res_ptr;
register mp_srcptr s1_ptr;
mp_size_t s1_size;
register mp_limb_t s2_limb;
{
register mp_limb_t cy_limb;
register mp_size_t j;
register mp_limb_t prod_high, prod_low;
register mp_limb_t x;
/* The loop counter and index J goes from -SIZE to -1. This way
the loop becomes faster. */
j = -s1_size;
/* Offset the base pointers to compensate for the negative indices. */
res_ptr -= j;
s1_ptr -= j;
cy_limb = 0;
do
{
umul_ppmm (prod_high, prod_low, s1_ptr[j], s2_limb);
prod_low += cy_limb;
cy_limb = (prod_low < cy_limb) + prod_high;
x = res_ptr[j];
prod_low = x + prod_low;
cy_limb += (prod_low < x);
res_ptr[j] = prod_low;
}
while (++j != 0);
return cy_limb;
}

56
stdlib/cmp.c Normal file
View File

@ -0,0 +1,56 @@
/* mpn_cmp -- Compare two low-level natural-number integers.
Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
The GNU MP Library is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or (at your
option) any later version.
The GNU MP 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the GNU MP 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 <gmp.h>
#include "gmp-impl.h"
/* Compare OP1_PTR/OP1_SIZE with OP2_PTR/OP2_SIZE.
There are no restrictions on the relative sizes of
the two arguments.
Return 1 if OP1 > OP2, 0 if they are equal, and -1 if OP1 < OP2. */
int
#if __STDC__
mpn_cmp (mp_srcptr op1_ptr, mp_srcptr op2_ptr, mp_size_t size)
#else
mpn_cmp (op1_ptr, op2_ptr, size)
mp_srcptr op1_ptr;
mp_srcptr op2_ptr;
mp_size_t size;
#endif
{
mp_size_t i;
mp_limb_t op1_word, op2_word;
for (i = size - 1; i >= 0; i--)
{
op1_word = op1_ptr[i];
op2_word = op2_ptr[i];
if (op1_word != op2_word)
goto diff;
}
return 0;
diff:
/* This can *not* be simplified to
op2_word - op2_word
since that expression might give signed overflow. */
return (op1_word > op2_word) ? 1 : -1;
}

32
stdlib/dbl2mpn.c Normal file
View File

@ -0,0 +1,32 @@
/* Copyright (C) 1993, 1997 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <gmp.h>
#include "gmp-impl.h"
/* Convert a `double' to a multi-precision integer representing the
significand scaled up by the highest possible number of significant bits
of fraction (DBL_MANT_DIG), and an integral power of two (MPN frexp). */
mp_size_t
__mpn_extract_double (mp_ptr res_ptr, mp_size_t size,
int *expt, int *is_neg,
double value)
{
#error "__mpn_extract_double is not implemented for this floating point format"
}

86
stdlib/div.c Normal file
View File

@ -0,0 +1,86 @@
/* Copyright (C) 1992, 1997, 1999 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
/*
* Copyright (c) 1990 Regents of the University of California.
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Chris Torek.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <stdlib.h>
/* Return the `div_t' representation of NUMER over DENOM. */
div_t
div (numer, denom)
int numer, denom;
{
div_t result;
result.quot = numer / denom;
result.rem = numer % denom;
/* The ANSI standard says that |QUOT| <= |NUMER / DENOM|, where
NUMER / DENOM is to be computed in infinite precision. In
other words, we should always truncate the quotient towards
zero, never -infinity. Machine division and remainer may
work either way when one or both of NUMER or DENOM is
negative. If only one is negative and QUOT has been
truncated towards -infinity, REM will have the same sign as
DENOM and the opposite sign of NUMER; if both are negative
and QUOT has been truncated towards -infinity, REM will be
positive (will have the opposite sign of NUMER). These are
considered `wrong'. If both are NUM and DENOM are positive,
RESULT will always be positive. This all boils down to: if
NUMER >= 0, but REM < 0, we got the wrong answer. In that
case, to get the right answer, add 1 to QUOT and subtract
DENOM from REM. */
if (numer >= 0 && result.rem < 0)
{
++result.quot;
result.rem -= denom;
}
return result;
}

Some files were not shown because too many files have changed in this diff Show More