Tue Jun 4 21:01:20 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>

* sysdeps/mach/hurd/getlogin_r.c: New file.

Wed Jun  5 02:11:30 1996  Ulrich Drepper  <drepper@cygnus.com>

	* io/Makefile (routines): Add ttyname_r.

	* resolv/res_debug.c, resolv/resolv.h: Update from bind-4.3.4-T4A.

	* sysdeps/libm-i387/e_asinl.S, sysdeps/libm-i387/e_atan2l.S,
	sysdeps/libm-i387/e_expl.S, sysdeps/libm-i387/e_fmodl.S,
	sysdeps/libm-i387/e_log10l.S, sysdeps/libm-i387/e_logl.S,
	sysdeps/libm-i387/e_remainderl.S, sysdeps/libm-i387/e_scalbl.S,
	sysdeps/libm-i387/e_sqrtl.S, sysdeps/libm-i387/s_atanl.S,
	sysdeps/libm-i387/s_cosl.S, sysdeps/libm-i387/s_ilogbl.S,
	sysdeps/libm-i387/s_log1pl.S, sysdeps/libm-i387/s_logbl.S,
	sysdeps/libm-i387/s_scalbnl.S, sysdeps/libm-i387/s_sinl.S,
	sysdeps/libm-i387/s_tanl.S: New files.  i387 assembler versions
	of `long double' math functions.

	* sysdeps/libm-ieee754/k_standard.c: Add handling for errors
	in long double functions.

	* sysdeps/libm-ieee754/s_ilogbl.c, sysdeps/libm-ieee754/s_logbl.c,
	sysdeps/libm-ieee754/s_modfl.c:  New files.  Generic versions
	of `long double' math functions.

	* sysdeps/libm-ieee754/s_isinf.c [NO_LONG_DOUBLE]: Add string
        alias for __isinfl.

	* sysdeps/libm-ieee754/w_acoshl.c, sysdeps/libm-ieee754/w_acosl.c,
	sysdeps/libm-ieee754/w_asinl.c, sysdeps/libm-ieee754/w_atan2l.c,
	sysdeps/libm-ieee754/w_atanhl.c, sysdeps/libm-ieee754/w_cabsl.c,
	sysdeps/libm-ieee754/w_coshl.c, sysdeps/libm-ieee754/w_dreml.c,
	sysdeps/libm-ieee754/w_expl.c, sysdeps/libm-ieee754/w_fmodl.c,
	sysdeps/libm-ieee754/w_gammal.c, sysdeps/libm-ieee754/w_gammal_r.c,
	sysdeps/libm-ieee754/w_hypotl.c, sysdeps/libm-ieee754/w_j0l.c,
	sysdeps/libm-ieee754/w_j1l.c, sysdeps/libm-ieee754/w_jnl.c,
	sysdeps/libm-ieee754/w_lgammal.c, sysdeps/libm-ieee754/w_lgammal_r.c,
	sysdeps/libm-ieee754/w_log10l.c, sysdeps/libm-ieee754/w_logl.c,
	sysdeps/libm-ieee754/w_powl.c, sysdeps/libm-ieee754/w_remainderl.c,
	sysdeps/libm-ieee754/w_scalbl.c, sysdeps/libm-ieee754/w_sinhl.c,
	sysdeps/libm-ieee754/w_sqrtl.c: New files.  Wrapper functions
	around long double function implementations.

	* sysdeps/posix/ttyname_r.c (ttyname_r): Use _D_EXACT_NAMLEN
	to determine length of directory entry name.

	* posix/Makefile (routines): Add getlogin_r.
	* posix/unistd.h: Add prototype for getlogin_r.
	* sysdeps/stub/getlogin_r.c: New file.  Reentrant version of
	getlogin function, specified in P1003.1c/D6.  Stub version.
	* sysdeps/unix/getlogin.c (getlogin): Use ttyname_r instead of
	ttyname.  This avoids saving and restoring the old content.
	Also use setutent_r, getutline_r and endutent_r instead of
	accing UTMP file directly.
	* sysdeps/unix/getlogin_r.c: New file.  Reentrant version of
	getlogin function, specified in P1003.1c/D6.

Tue Jun  4 20:10:09 1996  J.T. Conklin  <jtc@cygnus.com>

	* sysdeps/libm-i387/s_finitef.S: Fix mask for exponent.

	* elf/dl-lookup.c (_dl_lookup_symbol): Grok magical undefined symbols
	_GNU_libc_dl_{open,close,symbol} and resolve them to dl functions.

	* elf/rtld.c (rtld_map): Renamed to _dl_rtld_map, made global.
	* elf/link.h: Declare _dl_rtld_map.

	* elf/dl-lookup.c (_dl_symbol_value): New function.
	* elf/link.h: Declare it.

	stdio-common/vfscanf.c: Prepare for reentrant libio.
	Used in reentrant libio.
This commit is contained in:
Roland McGrath 1996-06-05 01:07:21 +00:00
parent f68b86cc7b
commit ee188d555b
62 changed files with 2730 additions and 133 deletions

View File

@ -1,5 +1,78 @@
Tue Jun 4 21:01:20 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* sysdeps/mach/hurd/getlogin_r.c: New file.
Wed Jun 5 02:11:30 1996 Ulrich Drepper <drepper@cygnus.com>
* io/Makefile (routines): Add ttyname_r.
* resolv/res_debug.c, resolv/resolv.h: Update from bind-4.3.4-T4A.
* sysdeps/libm-i387/e_asinl.S, sysdeps/libm-i387/e_atan2l.S,
sysdeps/libm-i387/e_expl.S, sysdeps/libm-i387/e_fmodl.S,
sysdeps/libm-i387/e_log10l.S, sysdeps/libm-i387/e_logl.S,
sysdeps/libm-i387/e_remainderl.S, sysdeps/libm-i387/e_scalbl.S,
sysdeps/libm-i387/e_sqrtl.S, sysdeps/libm-i387/s_atanl.S,
sysdeps/libm-i387/s_cosl.S, sysdeps/libm-i387/s_ilogbl.S,
sysdeps/libm-i387/s_log1pl.S, sysdeps/libm-i387/s_logbl.S,
sysdeps/libm-i387/s_scalbnl.S, sysdeps/libm-i387/s_sinl.S,
sysdeps/libm-i387/s_tanl.S: New files. i387 assembler versions
of `long double' math functions.
* sysdeps/libm-ieee754/k_standard.c: Add handling for errors
in long double functions.
* sysdeps/libm-ieee754/s_ilogbl.c, sysdeps/libm-ieee754/s_logbl.c,
sysdeps/libm-ieee754/s_modfl.c: New files. Generic versions
of `long double' math functions.
* sysdeps/libm-ieee754/s_isinf.c [NO_LONG_DOUBLE]: Add string
alias for __isinfl.
* sysdeps/libm-ieee754/w_acoshl.c, sysdeps/libm-ieee754/w_acosl.c,
sysdeps/libm-ieee754/w_asinl.c, sysdeps/libm-ieee754/w_atan2l.c,
sysdeps/libm-ieee754/w_atanhl.c, sysdeps/libm-ieee754/w_cabsl.c,
sysdeps/libm-ieee754/w_coshl.c, sysdeps/libm-ieee754/w_dreml.c,
sysdeps/libm-ieee754/w_expl.c, sysdeps/libm-ieee754/w_fmodl.c,
sysdeps/libm-ieee754/w_gammal.c, sysdeps/libm-ieee754/w_gammal_r.c,
sysdeps/libm-ieee754/w_hypotl.c, sysdeps/libm-ieee754/w_j0l.c,
sysdeps/libm-ieee754/w_j1l.c, sysdeps/libm-ieee754/w_jnl.c,
sysdeps/libm-ieee754/w_lgammal.c, sysdeps/libm-ieee754/w_lgammal_r.c,
sysdeps/libm-ieee754/w_log10l.c, sysdeps/libm-ieee754/w_logl.c,
sysdeps/libm-ieee754/w_powl.c, sysdeps/libm-ieee754/w_remainderl.c,
sysdeps/libm-ieee754/w_scalbl.c, sysdeps/libm-ieee754/w_sinhl.c,
sysdeps/libm-ieee754/w_sqrtl.c: New files. Wrapper functions
around long double function implementations.
* sysdeps/posix/ttyname_r.c (ttyname_r): Use _D_EXACT_NAMLEN
to determine length of directory entry name.
* posix/Makefile (routines): Add getlogin_r.
* posix/unistd.h: Add prototype for getlogin_r.
* sysdeps/stub/getlogin_r.c: New file. Reentrant version of
getlogin function, specified in P1003.1c/D6. Stub version.
* sysdeps/unix/getlogin.c (getlogin): Use ttyname_r instead of
ttyname. This avoids saving and restoring the old content.
Also use setutent_r, getutline_r and endutent_r instead of
accing UTMP file directly.
* sysdeps/unix/getlogin_r.c: New file. Reentrant version of
getlogin function, specified in P1003.1c/D6.
Tue Jun 4 20:10:09 1996 J.T. Conklin <jtc@cygnus.com>
* sysdeps/libm-i387/s_finitef.S: Fix mask for exponent.
Tue Jun 4 18:57:57 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> Tue Jun 4 18:57:57 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* elf/dl-lookup.c (_dl_lookup_symbol): Grok magical undefined symbols
_GNU_libc_dl_{open,close,symbol} and resolve them to dl functions.
* elf/rtld.c (rtld_map): Renamed to _dl_rtld_map, made global.
* elf/link.h: Declare _dl_rtld_map.
* elf/dl-lookup.c (_dl_symbol_value): New function.
* elf/link.h: Declare it.
* elf/dladdr.c: Remove #include <setjmp.h>, we don't use it. * elf/dladdr.c: Remove #include <setjmp.h>, we don't use it.
* shlib-versions: Set libdl=2. * shlib-versions: Set libdl=2.
@ -1353,12 +1426,12 @@ Tue May 7 23:43:07 1996 Ulrich Drepper <drepper@cygnus.com>
libio/iosetvbuf.c, libio/ioungetc.c, libio/iovsprintf.c, libio/iosetvbuf.c, libio/ioungetc.c, libio/iovsprintf.c,
libio/libio.h, libio/putc.c, libio/putchar.c, libio/rewind.c, libio/libio.h, libio/putc.c, libio/putchar.c, libio/rewind.c,
libio/stdio.h, stdio-common/printf_fp.c, stdio-common/vfprintf.c, libio/stdio.h, stdio-common/printf_fp.c, stdio-common/vfprintf.c,
stdio-common/vfscanf.c: Prepare for reentrent libio. stdio-common/vfscanf.c: Prepare for reentrant libio.
* libio/clearerr_u.c, libio/feof_u.c, libio/ferror_u.c, * libio/clearerr_u.c, libio/feof_u.c, libio/ferror_u.c,
libio/fputc_u.c, libio/getc_u.c, libio/getchar_u.c, libio/fputc_u.c, libio/getc_u.c, libio/getchar_u.c,
libio/iofflush_u.c, libio/putc_u.c, libio/putchar_u.c: New files. libio/iofflush_u.c, libio/putc_u.c, libio/putchar_u.c: New files.
Used in reentrent libio. Used in reentrant libio.
* misc/getusershell.c: Prevent warnings. * misc/getusershell.c: Prevent warnings.

View File

@ -109,13 +109,41 @@ _dl_lookup_symbol (const char *undef_name, const Elf32_Sym **ref,
} }
if (weak_value.s == NULL && ELF32_ST_BIND ((*ref)->st_info) != STB_WEAK) if (weak_value.s == NULL && ELF32_ST_BIND ((*ref)->st_info) != STB_WEAK)
{
/* The symbol was not defined by any object in scope. To allow
access to dynamic linker functionality without using -ldl and
thereby brining the dynamic linker's symbols into scope, we
recognize a few magical symbol names and resolve them to the
addresses of functions inside the dynamic linker. */
struct magic
{
unsigned long int hash;
const char *name;
Elf32_Addr value;
};
static struct magic magic[] =
{
{ 0xd6a2a5e, "_GNU_libc_dl_open", (Elf32_Addr) &_dl_open },
{ 0x69ef845, "_GNU_libc_dl_close", (Elf32_Addr) &_dl_close },
{ 0xae4d63c, "_GNU_libc_dl_symbol", (Elf32_Addr) &_dl_symbol_value },
{ 0, NULL, 0 }
};
struct magic *m;
for (m = magic; m->hash; ++m)
if (hash == m->hash && !strcmp (name, m->name))
return m->value;
{ {
const char msg[] = "undefined symbol: "; const char msg[] = "undefined symbol: ";
char buf[sizeof msg + strlen (undef_name)]; char buf[sizeof msg + strlen (undef_name)];
memcpy (buf, msg, sizeof msg - 1); memcpy (buf, msg, sizeof msg - 1);
memcpy (&buf[sizeof msg - 1], undef_name, sizeof buf - sizeof msg + 1); memcpy (&buf[sizeof msg - 1], undef_name,
sizeof buf - sizeof msg + 1);
_dl_signal_error (0, reference_name, buf); _dl_signal_error (0, reference_name, buf);
} }
}
*ref = weak_value.s; *ref = weak_value.s;
return weak_value.a; return weak_value.a;
@ -135,3 +163,15 @@ _dl_setup_hash (struct link_map *map)
hash += map->l_nbuckets; hash += map->l_nbuckets;
map->l_chain = hash; map->l_chain = hash;
} }
/* Look up symbol NAME in MAP's scope and return its run-time address. */
Elf32_Addr
_dl_symbol_value (struct link_map *map, const char *name)
{
Elf32_Addr loadbase;
const Elf32_Sym *ref = NULL;
struct link_map *scope[2] = { map, NULL };
loadbase = _dl_lookup_symbol (name, &ref, scope, map->l_name, 0, 0);
return loadbase + ref->st_value;
}

View File

@ -216,6 +216,12 @@ extern Elf32_Addr _dl_lookup_symbol (const char *undef,
Elf32_Addr reloc_addr, Elf32_Addr reloc_addr,
int noplt); int noplt);
/* Look up symbol NAME in MAP's scope and return its run-time address. */
extern Elf32_Addr _dl_symbol_value (struct link_map *map, const char *name);
/* Structure describing the dynamic linker itself. */
extern struct link_map _dl_rtld_map;
/* List of objects currently loaded. */ /* List of objects currently loaded. */
extern struct link_map *_dl_loaded; extern struct link_map *_dl_loaded;

View File

@ -52,7 +52,7 @@ static void dl_main (const Elf32_Phdr *phdr,
Elf32_Word phent, Elf32_Word phent,
Elf32_Addr *user_entry); Elf32_Addr *user_entry);
static struct link_map rtld_map; struct link_map _dl_rtld_map;
Elf32_Addr Elf32_Addr
_dl_start (void *arg) _dl_start (void *arg)
@ -92,16 +92,17 @@ _dl_start (void *arg)
/* Transfer data about ourselves to the permanent link_map structure. */ /* Transfer data about ourselves to the permanent link_map structure. */
rtld_map.l_addr = bootstrap_map.l_addr; _dl_rtld_map.l_addr = bootstrap_map.l_addr;
rtld_map.l_ld = bootstrap_map.l_ld; _dl_rtld_map.l_ld = bootstrap_map.l_ld;
memcpy (rtld_map.l_info, bootstrap_map.l_info, sizeof rtld_map.l_info); memcpy (_dl_rtld_map.l_info, bootstrap_map.l_info,
_dl_setup_hash (&rtld_map); sizeof _dl_rtld_map.l_info);
_dl_setup_hash (&_dl_rtld_map);
/* Cache the DT_RPATH stored in ld.so itself; this will be /* Cache the DT_RPATH stored in ld.so itself; this will be
the default search path. */ the default search path. */
_dl_rpath = (void *) (rtld_map.l_addr + _dl_rpath = (void *) (_dl_rtld_map.l_addr +
rtld_map.l_info[DT_STRTAB]->d_un.d_ptr + _dl_rtld_map.l_info[DT_STRTAB]->d_un.d_ptr +
rtld_map.l_info[DT_RPATH]->d_un.d_val); _dl_rtld_map.l_info[DT_RPATH]->d_un.d_val);
/* Call the OS-dependent function to set up life so we can do things like /* Call the OS-dependent function to set up life so we can do things like
file access. It will call `dl_main' (below) to do all the real work file access. It will call `dl_main' (below) to do all the real work
@ -243,12 +244,12 @@ of this helper program; chances are you did not intend to run this program.\n",
/* Put the link_map for ourselves on the chain so it can be found by /* Put the link_map for ourselves on the chain so it can be found by
name. */ name. */
rtld_map.l_name = (char *) rtld_map.l_libname = interpreter_name; _dl_rtld_map.l_name = (char *) _dl_rtld_map.l_libname = interpreter_name;
rtld_map.l_type = lt_interpreter; _dl_rtld_map.l_type = lt_interpreter;
while (l->l_next) while (l->l_next)
l = l->l_next; l = l->l_next;
l->l_next = &rtld_map; l->l_next = &_dl_rtld_map;
rtld_map.l_prev = l; _dl_rtld_map.l_prev = l;
/* Load all the libraries specified by DT_NEEDED entries. */ /* Load all the libraries specified by DT_NEEDED entries. */
_dl_map_object_deps (l); _dl_map_object_deps (l);
@ -257,12 +258,12 @@ of this helper program; chances are you did not intend to run this program.\n",
it will determine gdb's search order. it will determine gdb's search order.
Perhaps do this always, so later dlopen by name finds it? Perhaps do this always, so later dlopen by name finds it?
XXX But then gdb always considers it present. */ XXX But then gdb always considers it present. */
if (rtld_map.l_opencount == 0) if (_dl_rtld_map.l_opencount == 0)
{ {
/* No DT_NEEDED entry referred to the interpreter object itself, /* No DT_NEEDED entry referred to the interpreter object itself,
so remove it from the list of visible objects. */ so remove it from the list of visible objects. */
rtld_map.l_prev->l_next = rtld_map.l_next; _dl_rtld_map.l_prev->l_next = _dl_rtld_map.l_next;
rtld_map.l_next->l_prev = rtld_map.l_prev; _dl_rtld_map.l_next->l_prev = _dl_rtld_map.l_prev;
} }
if (list_only) if (list_only)
@ -325,7 +326,7 @@ of this helper program; chances are you did not intend to run this program.\n",
l = l->l_next; l = l->l_next;
do do
{ {
if (l != &rtld_map) if (l != &_dl_rtld_map)
_dl_relocate_object (l, lazy); _dl_relocate_object (l, lazy);
l = l->l_prev; l = l->l_prev;
} while (l); } while (l);
@ -337,28 +338,28 @@ of this helper program; chances are you did not intend to run this program.\n",
_dl_relocate_object might need to call `mprotect' for DT_TEXTREL. */ _dl_relocate_object might need to call `mprotect' for DT_TEXTREL. */
_dl_sysdep_start_cleanup (); _dl_sysdep_start_cleanup ();
if (rtld_map.l_opencount > 0) if (_dl_rtld_map.l_opencount > 0)
/* There was an explicit ref to the dynamic linker as a shared lib. /* There was an explicit ref to the dynamic linker as a shared lib.
Re-relocate ourselves with user-controlled symbol definitions. */ Re-relocate ourselves with user-controlled symbol definitions. */
_dl_relocate_object (&rtld_map, lazy); _dl_relocate_object (&_dl_rtld_map, lazy);
/* Tell the debugger where to find the map of loaded objects. */ /* Tell the debugger where to find the map of loaded objects. */
dl_r_debug.r_version = 1 /* R_DEBUG_VERSION XXX */; dl_r_debug.r_version = 1 /* R_DEBUG_VERSION XXX */;
dl_r_debug.r_ldbase = rtld_map.l_addr; /* Record our load address. */ dl_r_debug.r_ldbase = _dl_rtld_map.l_addr; /* Record our load address. */
dl_r_debug.r_map = _dl_loaded; dl_r_debug.r_map = _dl_loaded;
dl_r_debug.r_brk = (Elf32_Addr) &_dl_r_debug_state; dl_r_debug.r_brk = (Elf32_Addr) &_dl_r_debug_state;
if (rtld_map.l_info[DT_INIT]) if (_dl_rtld_map.l_info[DT_INIT])
{ {
/* Call the initializer for the compatibility version of the /* Call the initializer for the compatibility version of the
dynamic linker. There is no additional initialization dynamic linker. There is no additional initialization
required for the ABI-compliant dynamic linker. */ required for the ABI-compliant dynamic linker. */
(*(void (*) (void)) (rtld_map.l_addr + (*(void (*) (void)) (_dl_rtld_map.l_addr +
rtld_map.l_info[DT_INIT]->d_un.d_ptr)) (); _dl_rtld_map.l_info[DT_INIT]->d_un.d_ptr)) ();
/* Clear the field so a future dlopen won't run it again. */ /* Clear the field so a future dlopen won't run it again. */
rtld_map.l_info[DT_INIT] = NULL; _dl_rtld_map.l_info[DT_INIT] = NULL;
} }
/* Once we return, _dl_sysdep_start will invoke /* Once we return, _dl_sysdep_start will invoke

View File

@ -40,7 +40,7 @@ routines := \
chdir fchdir \ chdir fchdir \
getcwd getwd getdirname \ getcwd getwd getdirname \
chown fchown \ chown fchown \
ttyname isatty \ ttyname ttyname_r isatty \
link symlink readlink \ link symlink readlink \
unlink rmdir \ unlink rmdir \
ftw fts poll ftw fts poll

View File

@ -39,7 +39,7 @@ routines := \
getpid getppid \ getpid getppid \
getuid geteuid getgid getegid getgroups setuid setgid group_member \ getuid geteuid getgid getegid getgroups setuid setgid group_member \
getpgid setpgid getpgrp setpgrp getsid setsid \ getpgid setpgid getpgrp setpgrp getsid setsid \
getlogin setlogin \ getlogin getlogin_r setlogin \
pathconf sysconf fpathconf \ pathconf sysconf fpathconf \
glob fnmatch regex \ glob fnmatch regex \
confstr \ confstr \

View File

@ -541,6 +541,12 @@ extern int tcsetpgrp __P ((int __fd, __pid_t __pgrp_id));
/* Return the login name of the user. */ /* Return the login name of the user. */
extern char *getlogin __P ((void)); extern char *getlogin __P ((void));
#ifdef __USE_REENTRANT
/* Return at most NAME_LEN characters of the login name of the user in NAME.
If it cannot be determined or some other error occured, return the error
code. Otherwise return 0. */
extern int getlogin_r __P ((char *__name, size_t __name_len));
#endif
#ifdef __USE_BSD #ifdef __USE_BSD
/* Set the login name returned by `getlogin'. */ /* Set the login name returned by `getlogin'. */

View File

@ -596,6 +596,15 @@ __p_rr(cp, msg, file)
char t[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"]; char t[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];
fprintf(file, "\t%s\n", inet_ntop(AF_INET6, cp, t, sizeof t)); fprintf(file, "\t%s\n", inet_ntop(AF_INET6, cp, t, sizeof t));
cp += dlen;
break;
}
case T_LOC: {
char t[255];
(void) fprintf(file, "\t%s\n", loc_ntoa(cp, t));
cp += dlen;
break; break;
} }
@ -831,3 +840,385 @@ __p_time(value)
} }
return (nbuf); return (nbuf);
} }
/*
* routines to convert between on-the-wire RR format and zone file format.
* Does not contain conversion to/from decimal degrees; divide or multiply
* by 60*60*1000 for that.
*/
static unsigned int poweroften[10] = {1, 10, 100, 1000, 10000, 100000,
1000000,10000000,100000000,1000000000};
/* takes an XeY precision/size value, returns a string representation. */
static const char *
precsize_ntoa(prec)
u_int8_t prec;
{
static char retbuf[sizeof("90000000.00")];
unsigned long val;
int mantissa, exponent;
mantissa = (int)((prec >> 4) & 0x0f) % 10;
exponent = (int)((prec >> 0) & 0x0f) % 10;
val = mantissa * poweroften[exponent];
(void) sprintf(retbuf, "%ld.%.2ld", val/100, val%100);
return (retbuf);
}
/* converts ascii size/precision X * 10**Y(cm) to 0xXY. moves pointer. */
static u_int8_t
precsize_aton(strptr)
char **strptr;
{
unsigned int mval = 0, cmval = 0;
u_int8_t retval = 0;
register char *cp;
register int exponent;
register int mantissa;
cp = *strptr;
while (isdigit(*cp))
mval = mval * 10 + (*cp++ - '0');
if (*cp == '.') { /* centimeters */
cp++;
if (isdigit(*cp)) {
cmval = (*cp++ - '0') * 10;
if (isdigit(*cp)) {
cmval += (*cp++ - '0');
}
}
}
cmval = (mval * 100) + cmval;
for (exponent = 0; exponent < 9; exponent++)
if (cmval < poweroften[exponent+1])
break;
mantissa = cmval / poweroften[exponent];
if (mantissa > 9)
mantissa = 9;
retval = (mantissa << 4) | exponent;
*strptr = cp;
return (retval);
}
/* converts ascii lat/lon to unsigned encoded 32-bit number. moves pointer. */
static u_int32_t
latlon2ul(latlonstrptr,which)
char **latlonstrptr;
int *which;
{
register char *cp;
u_int32_t retval;
int deg = 0, min = 0, secs = 0, secsfrac = 0;
cp = *latlonstrptr;
while (isdigit(*cp))
deg = deg * 10 + (*cp++ - '0');
while (isspace(*cp))
cp++;
if (!(isdigit(*cp)))
goto fndhemi;
while (isdigit(*cp))
min = min * 10 + (*cp++ - '0');
while (isspace(*cp))
cp++;
if (!(isdigit(*cp)))
goto fndhemi;
while (isdigit(*cp))
secs = secs * 10 + (*cp++ - '0');
if (*cp == '.') { /* decimal seconds */
cp++;
if (isdigit(*cp)) {
secsfrac = (*cp++ - '0') * 100;
if (isdigit(*cp)) {
secsfrac += (*cp++ - '0') * 10;
if (isdigit(*cp)) {
secsfrac += (*cp++ - '0');
}
}
}
}
while (!isspace(*cp)) /* if any trailing garbage */
cp++;
while (isspace(*cp))
cp++;
fndhemi:
switch (*cp) {
case 'N': case 'n':
case 'E': case 'e':
retval = ((unsigned)1<<31)
+ (((((deg * 60) + min) * 60) + secs) * 1000)
+ secsfrac;
break;
case 'S': case 's':
case 'W': case 'w':
retval = ((unsigned)1<<31)
- (((((deg * 60) + min) * 60) + secs) * 1000)
- secsfrac;
break;
default:
retval = 0; /* invalid value -- indicates error */
break;
}
switch (*cp) {
case 'N': case 'n':
case 'S': case 's':
*which = 1; /* latitude */
break;
case 'E': case 'e':
case 'W': case 'w':
*which = 2; /* longitude */
break;
default:
*which = 0; /* error */
break;
}
cp++; /* skip the hemisphere */
while (!isspace(*cp)) /* if any trailing garbage */
cp++;
while (isspace(*cp)) /* move to next field */
cp++;
*latlonstrptr = cp;
return (retval);
}
/* converts a zone file representation in a string to an RDATA on-the-wire
* representation. */
int
loc_aton(ascii, binary)
const char *ascii;
u_char *binary;
{
const char *cp, *maxcp;
u_char *bcp;
u_int32_t latit = 0, longit = 0, alt = 0;
u_int32_t lltemp1 = 0, lltemp2 = 0;
int altmeters = 0, altfrac = 0, altsign = 1;
u_int8_t hp = 0x16; /* default = 1e6 cm = 10000.00m = 10km */
u_int8_t vp = 0x13; /* default = 1e3 cm = 10.00m */
u_int8_t siz = 0x12; /* default = 1e2 cm = 1.00m */
int which1 = 0, which2 = 0;
cp = ascii;
maxcp = cp + strlen(ascii);
lltemp1 = latlon2ul(&cp, &which1);
lltemp2 = latlon2ul(&cp, &which2);
switch (which1 + which2) {
case 3: /* 1 + 2, the only valid combination */
if ((which1 == 1) && (which2 == 2)) { /* normal case */
latit = lltemp1;
longit = lltemp2;
} else if ((which1 == 2) && (which2 == 1)) { /* reversed */
longit = lltemp1;
latit = lltemp2;
} else { /* some kind of brokenness */
return 0;
}
break;
default: /* we didn't get one of each */
return 0;
}
/* altitude */
if (*cp == '-') {
altsign = -1;
cp++;
}
if (*cp == '+')
cp++;
while (isdigit(*cp))
altmeters = altmeters * 10 + (*cp++ - '0');
if (*cp == '.') { /* decimal meters */
cp++;
if (isdigit(*cp)) {
altfrac = (*cp++ - '0') * 10;
if (isdigit(*cp)) {
altfrac += (*cp++ - '0');
}
}
}
alt = (10000000 + (altsign * (altmeters * 100 + altfrac)));
while (!isspace(*cp) && (cp < maxcp)) /* if trailing garbage or m */
cp++;
while (isspace(*cp) && (cp < maxcp))
cp++;
if (cp >= maxcp)
goto defaults;
siz = precsize_aton(&cp);
while (!isspace(*cp) && (cp < maxcp)) /* if trailing garbage or m */
cp++;
while (isspace(*cp) && (cp < maxcp))
cp++;
if (cp >= maxcp)
goto defaults;
hp = precsize_aton(&cp);
while (!isspace(*cp) && (cp < maxcp)) /* if trailing garbage or m */
cp++;
while (isspace(*cp) && (cp < maxcp))
cp++;
if (cp >= maxcp)
goto defaults;
vp = precsize_aton(&cp);
defaults:
bcp = binary;
*bcp++ = (u_int8_t) 0; /* version byte */
*bcp++ = siz;
*bcp++ = hp;
*bcp++ = vp;
PUTLONG(latit,bcp);
PUTLONG(longit,bcp);
PUTLONG(alt,bcp);
return (16); /* size of RR in octets */
}
/* takes an on-the-wire LOC RR and formats it in a human readable format. */
char *
loc_ntoa(binary, ascii)
const u_char *binary;
char *ascii;
{
static char *error = "?";
register const u_char *cp = binary;
int latdeg, latmin, latsec, latsecfrac;
int longdeg, longmin, longsec, longsecfrac;
char northsouth, eastwest;
int altmeters, altfrac, altsign;
const int referencealt = 100000 * 100;
int32_t latval, longval, altval;
u_int32_t templ;
u_int8_t sizeval, hpval, vpval, versionval;
char *sizestr, *hpstr, *vpstr;
versionval = *cp++;
if (versionval) {
sprintf(ascii, "; error: unknown LOC RR version");
return (ascii);
}
sizeval = *cp++;
hpval = *cp++;
vpval = *cp++;
GETLONG(templ, cp);
latval = (templ - ((unsigned)1<<31));
GETLONG(templ, cp);
longval = (templ - ((unsigned)1<<31));
GETLONG(templ, cp);
if (templ < referencealt) { /* below WGS 84 spheroid */
altval = referencealt - templ;
altsign = -1;
} else {
altval = templ - referencealt;
altsign = 1;
}
if (latval < 0) {
northsouth = 'S';
latval = -latval;
} else
northsouth = 'N';
latsecfrac = latval % 1000;
latval = latval / 1000;
latsec = latval % 60;
latval = latval / 60;
latmin = latval % 60;
latval = latval / 60;
latdeg = latval;
if (longval < 0) {
eastwest = 'W';
longval = -longval;
} else
eastwest = 'E';
longsecfrac = longval % 1000;
longval = longval / 1000;
longsec = longval % 60;
longval = longval / 60;
longmin = longval % 60;
longval = longval / 60;
longdeg = longval;
altfrac = altval % 100;
altmeters = (altval / 100) * altsign;
if ((sizestr = strdup(precsize_ntoa(sizeval))) == NULL)
sizestr = error;
if ((hpstr = strdup(precsize_ntoa(hpval))) == NULL)
hpstr = error;
if ((vpstr = strdup(precsize_ntoa(vpval))) == NULL)
vpstr = error;
sprintf(ascii,
"%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %d.%.2dm %sm %sm %sm",
latdeg, latmin, latsec, latsecfrac, northsouth,
longdeg, longmin, longsec, longsecfrac, eastwest,
altmeters, altfrac, sizestr, hpstr, vpstr);
if (sizestr != error)
free(sizestr);
if (hpstr != error)
free(hpstr);
if (vpstr != error)
free(vpstr);
return (ascii);
}

View File

@ -189,6 +189,8 @@ extern struct __res_state _res;
#define res_ownok __res_ownok #define res_ownok __res_ownok
#define res_mailok __res_mailok #define res_mailok __res_mailok
#define res_dnok __res_dnok #define res_dnok __res_dnok
#define loc_ntoa __loc_ntoa
#define loc_aton __loc_aton
#define dn_skipname __dn_skipname #define dn_skipname __dn_skipname
#define fp_query __fp_query #define fp_query __fp_query
#define fp_nquery __fp_nquery #define fp_nquery __fp_nquery
@ -212,6 +214,8 @@ int __res_hnok __P((const char *));
int __res_ownok __P((const char *)); int __res_ownok __P((const char *));
int __res_mailok __P((const char *)); int __res_mailok __P((const char *));
int __res_dnok __P((const char *)); int __res_dnok __P((const char *));
int __loc_aton __P((const char *ascii, u_char *binary));
char * __loc_ntoa __P((const u_char *binary, char *ascii));
int __dn_skipname __P((const u_char *, const u_char *)); int __dn_skipname __P((const u_char *, const u_char *));
void __fp_resstat __P((struct __res_state *, FILE *)); void __fp_resstat __P((struct __res_state *, FILE *));
void __fp_query __P((const u_char *, FILE *)); void __fp_query __P((const u_char *, FILE *));

View File

@ -0,0 +1,21 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
/* asinl = atanl (x / sqrtl(1 - x^2)) */
ENTRY(__ieee754_asinl)
fldt 4(%esp) /* x */
fst %st(1)
fmul %st(0) /* x^2 */
fld1
fsubp /* 1 - x^2 */
fsqrt /* sqrt (1 - x^2) */
fpatan
ret

View File

@ -0,0 +1,16 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__ieee754_atan2l)
fldt 4(%esp)
fldt 16(%esp)
fpatan
ret

View File

@ -0,0 +1,40 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
/* e^x = 2^(x * log2l(e)) */
ENTRY(__ieee754_expl)
fldt 4(%esp)
/* I added the following ugly construct because expl(+-Inf) resulted
in NaN. The ugliness results from the bright minds at Intel.
-- drepper@cygnus.com. */
fxam /* Is NaN or +-Inf? */
fstsw %ax
sahf
jnc .LnoInfNaN /* No, jump. */
jp .LisInf /* Is +-Inf, jump. */
.LnoInfNaN:
fldl2e
fmulp /* x * log2(e) */
fstl %st(1)
frndint /* int(x * log2(e)) */
fstl %st(2)
fsubrp /* fract(x * log2(e)) */
f2xm1 /* 2^(fract(x * log2(e))) - 1 */
fld1
faddp /* 2^(fract(x * log2(e))) */
fscale /* e^x */
ret
.LisInf:
andb $2, %ah /* Test sign. */
jz .LpInf /* If positive, jump. */
fldz /* Set result to 0. */
.LpInf: ret

View File

@ -0,0 +1,20 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__ieee754_fmodl)
fldt 16(%esp)
fldt 4(%esp)
1: fprem
fstsw %ax
sahf
jp 1b
fstpl %st(1)
ret

View File

@ -0,0 +1,16 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__ieee754_log10l)
fldlg2
fldt 4(%esp)
fyl2x
ret

View File

@ -0,0 +1,16 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__ieee754_logl)
fldln2
fldt 4(%esp)
fyl2x
ret

View File

@ -0,0 +1,19 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__ieee754_remainderl)
fldt 16(%esp)
fldt 4(%esp)
1: fprem1
fstsw %ax
sahf
jp 1b
ret

View File

@ -0,0 +1,16 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__ieee754_scalbl)
fldt 16(%esp)
fldt 4(%esp)
fscale
ret

View File

@ -0,0 +1,15 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__ieee754_sqrtl)
fldt 4(%esp)
fsqrt
ret

View File

@ -0,0 +1,17 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__atanl)
fldt 4(%esp)
fld1
fpatan
ret
weak_alias (__atanl, atanl)

View File

@ -0,0 +1,29 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__cosl)
fldt 4(%esp)
fcos
fnstsw %ax
andw $0x400,%ax
jnz 1f
ret
1: fldpi
fadd %st(0)
fxch %st(1)
2: fprem1
fnstsw %ax
andw $0x400,%ax
jnz 2b
fstp %st(1)
fcos
ret
weak_alias (__cosl, cosl)

View File

@ -9,9 +9,9 @@ RCSID("$NetBSD: s_finitef.S,v 1.3 1995/05/09 00:00:02 jtc Exp $")
ENTRY(__finitef) ENTRY(__finitef)
movl 4(%esp),%eax movl 4(%esp),%eax
andl $0x7ff00000, %eax andl $0x7f800000, %eax
cmpl $0x7ff00000, %eax cmpl $0x7f800000, %eax
setnel %al setne %al
andl $0x000000ff, %eax andl $0x000000ff, %eax
ret ret
weak_alias (__finitef, finitef) weak_alias (__finitef, finitef)

View File

@ -0,0 +1,24 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Changes for long double by Ulrich Drepper <drepper@cygnus.com>
* Public domain.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__ilogbl)
pushl %ebp
movl %esp,%ebp
subl $4,%esp
fldt 8(%ebp)
fxtract
fistpl -4(%ebp)
movl -4(%ebp),%eax
leave
ret
weak_alias (__ilogbl, ilogbl)

View File

@ -0,0 +1,25 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
/*
* Since the fyl2xp1 instruction has such a limited range:
* -(1 - (sqrt(2) / 2)) <= x <= sqrt(2) - 1
* it's not worth trying to use it.
*/
ENTRY(__log1pl)
fldln2
fldt 4(%esp)
fld1
faddp
fyl2x
ret
weak_alias (__log1pl, log1pl)

View File

@ -0,0 +1,15 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Changes for long double by Ulrich Drepper <drepper@cygnus.com>
* Public domain.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__logbl)
fldt 4(%esp)
fxtract
ret
weak_alias (__logbl, logbl)

View File

@ -0,0 +1,16 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Changes for long double by Ulrich Drepper <drepper@cygnus.com>
* Public domain.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__scalbnl)
fildl 16(%esp)
fldt 4(%esp)
fscale
ret
weak_alias (__scalbnl, scalbnl)

View File

@ -0,0 +1,29 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__sinl)
fldt 4(%esp)
fsin
fnstsw %ax
andw $0x400,%ax
jnz 1f
ret
1: fldpi
fadd %st(0)
fxch %st(1)
2: fprem1
fnstsw %ax
andw $0x400,%ax
jnz 2b
fstp %st(1)
fsin
ret
weak_alias (__sinl, sinl)

View File

@ -0,0 +1,31 @@
/*
* Written by J.T. Conklin <jtc@netbsd.org>.
* Public domain.
*
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
*/
#include <machine/asm.h>
RCSID("$NetBSD: $")
ENTRY(__tanl)
fldt 4(%esp)
fptan
fnstsw %ax
andw $0x400,%ax
jnz 1f
fstp %st(0)
ret
1: fldpi
fadd %st(0)
fxch %st(1)
2: fprem1
fstsw %ax
andw $0x400,%ax
jnz 2b
fstp %st(1)
fptan
fstp %st(0)
ret
weak_alias (__tanl, tanl)

View File

@ -104,9 +104,11 @@ static double zero = 0.0; /* used as const */
switch(type) { switch(type) {
case 1: case 1:
case 101: case 101:
case 201:
/* acos(|x|>1) */ /* acos(|x|>1) */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "acos" : "acosf"; exc.name = type < 100 ? "acos" : (type < 200
? "acosf" : "acosl");;
exc.retval = zero; exc.retval = zero;
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = EDOM; errno = EDOM;
@ -119,9 +121,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 2: case 2:
case 102: case 102:
case 202:
/* asin(|x|>1) */ /* asin(|x|>1) */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "asin" : "asinf"; exc.name = type < 100 ? "asin" : (type < 200
? "asinf" : "asinl");
exc.retval = zero; exc.retval = zero;
if(_LIB_VERSION == _POSIX_) if(_LIB_VERSION == _POSIX_)
errno = EDOM; errno = EDOM;
@ -134,11 +138,13 @@ static double zero = 0.0; /* used as const */
break; break;
case 3: case 3:
case 103: case 103:
case 203:
/* atan2(+-0,+-0) */ /* atan2(+-0,+-0) */
exc.arg1 = y; exc.arg1 = y;
exc.arg2 = x; exc.arg2 = x;
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "atan2" : "atan2f"; exc.name = type < 100 ? "atan2" : (type < 200
? "atan2f" : "atan2l");
exc.retval = zero; exc.retval = zero;
if(_LIB_VERSION == _POSIX_) if(_LIB_VERSION == _POSIX_)
errno = EDOM; errno = EDOM;
@ -151,9 +157,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 4: case 4:
case 104: case 104:
case 204:
/* hypot(finite,finite) overflow */ /* hypot(finite,finite) overflow */
exc.type = OVERFLOW; exc.type = OVERFLOW;
exc.name = type < 100 ? "hypot" : "hypotf"; exc.name = type < 100 ? "hypot" : (type < 200
? "hypotf" : "hypotl");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = HUGE; exc.retval = HUGE;
else else
@ -166,9 +174,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 5: case 5:
case 105: case 105:
case 205:
/* cosh(finite) overflow */ /* cosh(finite) overflow */
exc.type = OVERFLOW; exc.type = OVERFLOW;
exc.name = type < 100 ? "cosh" : "coshf"; exc.name = type < 100 ? "cosh" : (type < 200
? "coshf" : "coshl");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = HUGE; exc.retval = HUGE;
else else
@ -181,9 +191,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 6: case 6:
case 106: case 106:
case 206:
/* exp(finite) overflow */ /* exp(finite) overflow */
exc.type = OVERFLOW; exc.type = OVERFLOW;
exc.name = type < 100 ? "exp" : "expf"; exc.name = type < 100 ? "exp" : (type < 200
? "expf" : "expl");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = HUGE; exc.retval = HUGE;
else else
@ -196,9 +208,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 7: case 7:
case 107: case 107:
case 207:
/* exp(finite) underflow */ /* exp(finite) underflow */
exc.type = UNDERFLOW; exc.type = UNDERFLOW;
exc.name = type < 100 ? "exp" : "expf"; exc.name = type < 100 ? "exp" : (type < 200
? "expf" : "expl");
exc.retval = zero; exc.retval = zero;
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = ERANGE; errno = ERANGE;
@ -208,9 +222,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 8: case 8:
case 108: case 108:
case 208:
/* y0(0) = -inf */ /* y0(0) = -inf */
exc.type = DOMAIN; /* should be SING for IEEE */ exc.type = DOMAIN; /* should be SING for IEEE */
exc.name = type < 100 ? "y0" : "y0f"; exc.name = type < 100 ? "y0" : (type < 200 ? "y0f" : "y0l");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = -HUGE; exc.retval = -HUGE;
else else
@ -226,9 +241,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 9: case 9:
case 109: case 109:
case 209:
/* y0(x<0) = NaN */ /* y0(x<0) = NaN */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "y0" : "y0f"; exc.name = type < 100 ? "y0" : (type < 200 ? "y0f" : "y0l");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = -HUGE; exc.retval = -HUGE;
else else
@ -244,9 +260,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 10: case 10:
case 110: case 110:
case 210:
/* y1(0) = -inf */ /* y1(0) = -inf */
exc.type = DOMAIN; /* should be SING for IEEE */ exc.type = DOMAIN; /* should be SING for IEEE */
exc.name = type < 100 ? "y1" : "y1f"; exc.name = type < 100 ? "y1" : (type < 200 ? "y1f" : "y1l");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = -HUGE; exc.retval = -HUGE;
else else
@ -262,9 +279,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 11: case 11:
case 111: case 111:
case 211:
/* y1(x<0) = NaN */ /* y1(x<0) = NaN */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "y1" : "y1f"; exc.name = type < 100 ? "y1" : (type < 200 ? "y1f" : "y1l");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = -HUGE; exc.retval = -HUGE;
else else
@ -280,9 +298,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 12: case 12:
case 112: case 112:
case 212:
/* yn(n,0) = -inf */ /* yn(n,0) = -inf */
exc.type = DOMAIN; /* should be SING for IEEE */ exc.type = DOMAIN; /* should be SING for IEEE */
exc.name = type < 100 ? "yn" : "ynf"; exc.name = type < 100 ? "yn" : (type < 200 ? "ynf" : "ynl");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = -HUGE; exc.retval = -HUGE;
else else
@ -298,9 +317,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 13: case 13:
case 113: case 113:
case 213:
/* yn(x<0) = NaN */ /* yn(x<0) = NaN */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "yn" : "ynf"; exc.name = type < 100 ? "yn" : (type < 200 ? "ynf" : "ynl");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = -HUGE; exc.retval = -HUGE;
else else
@ -316,9 +336,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 14: case 14:
case 114: case 114:
case 214:
/* lgamma(finite) overflow */ /* lgamma(finite) overflow */
exc.type = OVERFLOW; exc.type = OVERFLOW;
exc.name = type < 100 ? "lgamma" : "lgammaf"; exc.name = type < 100 ? "lgamma" : (type < 200
? "lgammaf" : "lgammal");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = HUGE; exc.retval = HUGE;
else else
@ -331,9 +353,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 15: case 15:
case 115: case 115:
case 215:
/* lgamma(-integer) or lgamma(0) */ /* lgamma(-integer) or lgamma(0) */
exc.type = SING; exc.type = SING;
exc.name = type < 100 ? "lgamma" : "lgammaf"; exc.name = type < 100 ? "lgamma" : (type < 200
? "lgammaf" : "lgammal");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = HUGE; exc.retval = HUGE;
else else
@ -349,9 +373,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 16: case 16:
case 116: case 116:
case 216:
/* log(0) */ /* log(0) */
exc.type = SING; exc.type = SING;
exc.name = type < 100 ? "log" : "logf"; exc.name = type < 100 ? "log" : (type < 200 ? "logf" : "logl");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = -HUGE; exc.retval = -HUGE;
else else
@ -367,9 +392,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 17: case 17:
case 117: case 117:
case 217:
/* log(x<0) */ /* log(x<0) */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "log" : "logf"; exc.name = type < 100 ? "log" : (type < 200 ? "logf" : "logl");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = -HUGE; exc.retval = -HUGE;
else else
@ -385,9 +411,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 18: case 18:
case 118: case 118:
case 218:
/* log10(0) */ /* log10(0) */
exc.type = SING; exc.type = SING;
exc.name = type < 100 ? "log10" : "log10f"; exc.name = type < 100 ? "log10" : (type < 200
? "log10f" : "log10l");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = -HUGE; exc.retval = -HUGE;
else else
@ -403,9 +431,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 19: case 19:
case 119: case 119:
case 219:
/* log10(x<0) */ /* log10(x<0) */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "log10" : "log10f"; exc.name = type < 100 ? "log10" : (type < 200
? "log10f" : "log10l");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = -HUGE; exc.retval = -HUGE;
else else
@ -421,10 +451,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 20: case 20:
case 120: case 120:
case 220:
/* pow(0.0,0.0) */ /* pow(0.0,0.0) */
/* error only if _LIB_VERSION == _SVID_ */ /* error only if _LIB_VERSION == _SVID_ */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "pow" : "powf"; exc.name = type < 100 ? "pow" : (type < 200 ? "powf" : "powl");
exc.retval = zero; exc.retval = zero;
if (_LIB_VERSION != _SVID_) exc.retval = 1.0; if (_LIB_VERSION != _SVID_) exc.retval = 1.0;
else if (!matherr(&exc)) { else if (!matherr(&exc)) {
@ -434,9 +465,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 21: case 21:
case 121: case 121:
case 221:
/* pow(x,y) overflow */ /* pow(x,y) overflow */
exc.type = OVERFLOW; exc.type = OVERFLOW;
exc.name = type < 100 ? "pow" : "powf"; exc.name = type < 100 ? "pow" : (type < 200 ? "powf" : "powl");
if (_LIB_VERSION == _SVID_) { if (_LIB_VERSION == _SVID_) {
exc.retval = HUGE; exc.retval = HUGE;
y *= 0.5; y *= 0.5;
@ -454,9 +486,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 22: case 22:
case 122: case 122:
case 222:
/* pow(x,y) underflow */ /* pow(x,y) underflow */
exc.type = UNDERFLOW; exc.type = UNDERFLOW;
exc.name = type < 100 ? "pow" : "powf"; exc.name = type < 100 ? "pow" : (type < 200 ? "powf" : "powl");
exc.retval = zero; exc.retval = zero;
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = ERANGE; errno = ERANGE;
@ -466,9 +499,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 23: case 23:
case 123: case 123:
case 223:
/* 0**neg */ /* 0**neg */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "pow" : "powf"; exc.name = type < 100 ? "pow" : (type < 200 ? "powf" : "powl");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = zero; exc.retval = zero;
else else
@ -484,9 +518,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 24: case 24:
case 124: case 124:
case 224:
/* neg**non-integral */ /* neg**non-integral */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "pow" : "powf"; exc.name = type < 100 ? "pow" : (type < 200 ? "powf" : "powl");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = zero; exc.retval = zero;
else else
@ -502,9 +537,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 25: case 25:
case 125: case 125:
case 225:
/* sinh(finite) overflow */ /* sinh(finite) overflow */
exc.type = OVERFLOW; exc.type = OVERFLOW;
exc.name = type < 100 ? "sinh" : "sinhf"; exc.name = type < 100 ? "sinh" : (type < 200
? "sinhf" : "sinhl");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = ( (x>zero) ? HUGE : -HUGE); exc.retval = ( (x>zero) ? HUGE : -HUGE);
else else
@ -517,9 +554,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 26: case 26:
case 126: case 126:
case 226:
/* sqrt(x<0) */ /* sqrt(x<0) */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "sqrt" : "sqrtf"; exc.name = type < 100 ? "sqrt" : (type < 200
? "sqrtf" : "sqrtl");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = zero; exc.retval = zero;
else else
@ -535,9 +574,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 27: case 27:
case 127: case 127:
case 227:
/* fmod(x,0) */ /* fmod(x,0) */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "fmod" : "fmodf"; exc.name = type < 100 ? "fmod" : (type < 200
? "fmodf" : "fmodl");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = x; exc.retval = x;
else else
@ -553,9 +594,12 @@ static double zero = 0.0; /* used as const */
break; break;
case 28: case 28:
case 128: case 128:
case 228:
/* remainder(x,0) */ /* remainder(x,0) */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "remainder" : "remainderf"; exc.name = type < 100 ? "remainder" : (type < 200
? "remainderf"
: "remainderl");
exc.retval = zero/zero; exc.retval = zero/zero;
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = EDOM; errno = EDOM;
@ -568,9 +612,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 29: case 29:
case 129: case 129:
case 229:
/* acosh(x<1) */ /* acosh(x<1) */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "acosh" : "acoshf"; exc.name = type < 100 ? "acosh" : (type < 200
? "acoshf" : "acoshl");
exc.retval = zero/zero; exc.retval = zero/zero;
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = EDOM; errno = EDOM;
@ -583,9 +629,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 30: case 30:
case 130: case 130:
case 230:
/* atanh(|x|>1) */ /* atanh(|x|>1) */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "atanh" : "atanhf"; exc.name = type < 100 ? "atanh" : (type < 200
? "atanhf" : "atanhl");
exc.retval = zero/zero; exc.retval = zero/zero;
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = EDOM; errno = EDOM;
@ -598,9 +646,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 31: case 31:
case 131: case 131:
case 231:
/* atanh(|x|=1) */ /* atanh(|x|=1) */
exc.type = SING; exc.type = SING;
exc.name = type < 100 ? "atanh" : "atanhf"; exc.name = type < 100 ? "atanh" : (type < 200
? "atanhf" : "atanhl");
exc.retval = x/zero; /* sign(x)*inf */ exc.retval = x/zero; /* sign(x)*inf */
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = EDOM; errno = EDOM;
@ -613,9 +663,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 32: case 32:
case 132: case 132:
case 232:
/* scalb overflow; SVID also returns +-HUGE_VAL */ /* scalb overflow; SVID also returns +-HUGE_VAL */
exc.type = OVERFLOW; exc.type = OVERFLOW;
exc.name = type < 100 ? "scalb" : "scalbf"; exc.name = type < 100 ? "scalb" : (type < 200
? "scalbf" : "scalbl");
exc.retval = x > zero ? HUGE_VAL : -HUGE_VAL; exc.retval = x > zero ? HUGE_VAL : -HUGE_VAL;
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = ERANGE; errno = ERANGE;
@ -625,9 +677,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 33: case 33:
case 133: case 133:
case 233:
/* scalb underflow */ /* scalb underflow */
exc.type = UNDERFLOW; exc.type = UNDERFLOW;
exc.name = type < 100 ? "scalb" : "scalbf"; exc.name = type < 100 ? "scalb" : (type < 200
? "scalbf" : "scalbl");
exc.retval = __copysign(zero,x); exc.retval = __copysign(zero,x);
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = ERANGE; errno = ERANGE;
@ -637,9 +691,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 34: case 34:
case 134: case 134:
case 234:
/* j0(|x|>X_TLOSS) */ /* j0(|x|>X_TLOSS) */
exc.type = TLOSS; exc.type = TLOSS;
exc.name = type < 100 ? "j0" : "j0f"; exc.name = type < 100 ? "j0" : (type < 200 ? "j0f" : "j0l");
exc.retval = zero; exc.retval = zero;
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = ERANGE; errno = ERANGE;
@ -653,9 +708,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 35: case 35:
case 135: case 135:
case 235:
/* y0(x>X_TLOSS) */ /* y0(x>X_TLOSS) */
exc.type = TLOSS; exc.type = TLOSS;
exc.name = type < 100 ? "y0" : "y0f"; exc.name = type < 100 ? "y0" : (type < 200 ? "y0f" : "y0l");
exc.retval = zero; exc.retval = zero;
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = ERANGE; errno = ERANGE;
@ -669,9 +725,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 36: case 36:
case 136: case 136:
case 236:
/* j1(|x|>X_TLOSS) */ /* j1(|x|>X_TLOSS) */
exc.type = TLOSS; exc.type = TLOSS;
exc.name = type < 100 ? "j1" : "j1f"; exc.name = type < 100 ? "j1" : (type < 200 ? "j1f" : "j1l");
exc.retval = zero; exc.retval = zero;
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = ERANGE; errno = ERANGE;
@ -685,9 +742,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 37: case 37:
case 137: case 137:
case 237:
/* y1(x>X_TLOSS) */ /* y1(x>X_TLOSS) */
exc.type = TLOSS; exc.type = TLOSS;
exc.name = type < 100 ? "y1" : "y1f"; exc.name = type < 100 ? "y1" : (type < 200 ? "y1f" : "y1l");
exc.retval = zero; exc.retval = zero;
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = ERANGE; errno = ERANGE;
@ -701,9 +759,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 38: case 38:
case 138: case 138:
case 238:
/* jn(|x|>X_TLOSS) */ /* jn(|x|>X_TLOSS) */
exc.type = TLOSS; exc.type = TLOSS;
exc.name = type < 100 ? "jn" : "jnf"; exc.name = type < 100 ? "jn" : (type < 200 ? "jnf" : "jnl");
exc.retval = zero; exc.retval = zero;
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = ERANGE; errno = ERANGE;
@ -717,9 +776,10 @@ static double zero = 0.0; /* used as const */
break; break;
case 39: case 39:
case 139: case 139:
case 239:
/* yn(x>X_TLOSS) */ /* yn(x>X_TLOSS) */
exc.type = TLOSS; exc.type = TLOSS;
exc.name = type < 100 ? "yn" : "ynf"; exc.name = type < 100 ? "yn" : (type < 200 ? "ynf" : "ynl");
exc.retval = zero; exc.retval = zero;
if (_LIB_VERSION == _POSIX_) if (_LIB_VERSION == _POSIX_)
errno = ERANGE; errno = ERANGE;
@ -733,9 +793,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 40: case 40:
case 140: case 140:
case 240:
/* gamma(finite) overflow */ /* gamma(finite) overflow */
exc.type = OVERFLOW; exc.type = OVERFLOW;
exc.name = type < 100 ? "gamma" : "gammaf"; exc.name = type < 100 ? "gamma" : (type < 200
? "gammaf" : "gammal");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = HUGE; exc.retval = HUGE;
else else
@ -748,9 +810,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 41: case 41:
case 141: case 141:
case 241:
/* gamma(-integer) or gamma(0) */ /* gamma(-integer) or gamma(0) */
exc.type = SING; exc.type = SING;
exc.name = type < 100 ? "gamma" : "gammaf"; exc.name = type < 100 ? "gamma" : (type < 200
? "gammaf" : "gammal");
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
exc.retval = HUGE; exc.retval = HUGE;
else else
@ -766,10 +830,11 @@ static double zero = 0.0; /* used as const */
break; break;
case 42: case 42:
case 142: case 142:
case 242:
/* pow(NaN,0.0) */ /* pow(NaN,0.0) */
/* error only if _LIB_VERSION == _SVID_ & _XOPEN_ */ /* error only if _LIB_VERSION == _SVID_ & _XOPEN_ */
exc.type = DOMAIN; exc.type = DOMAIN;
exc.name = type < 100 ? "pow" : "powf"; exc.name = type < 100 ? "pow" : (type < 200 ? "powf" : "powl");
exc.retval = x; exc.retval = x;
if (_LIB_VERSION == _IEEE_ || if (_LIB_VERSION == _IEEE_ ||
_LIB_VERSION == _POSIX_) exc.retval = 1.0; _LIB_VERSION == _POSIX_) exc.retval = 1.0;

View File

@ -0,0 +1,56 @@
/* s_ilogbl.c -- long double version of s_ilogb.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/* ilogbl(long double x)
* return the binary exponent of non-zero x
* ilogbl(0) = 0x80000001
* ilogbl(inf/NaN) = 0x7fffffff (no signal is raised)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
int __ilogbl(long double x)
#else
int __ilogbl(x)
long double x;
#endif
{
int32_t es,hx,lx,ix;
GET_LDOUBLE_EXP(es,x);
es &= 0x7fff;
if(es==0) {
GET_LDOUBLE_WORDS(es,hx,lx,x);
if((hx|lx)==0)
return 0x80000001; /* ilogbl(0) = 0x80000001 */
else /* subnormal x */
if(hx==0) {
for (ix = -16415; lx>0; lx<<=1) ix -=1;
} else {
for (ix = -16383; hx>0; hx<<=1) ix -=1;
}
return ix;
}
else if (es<0x7fff) return es-0x3fff;
else return 0x7fffffff;
}
weak_alias (__ilogbl, ilogbl)

View File

@ -31,5 +31,6 @@ static char rcsid[] = "$NetBSD: s_isinf.c,v 1.3 1995/05/11 23:20:14 jtc Exp $";
} }
weak_alias (__isinf, isinf) weak_alias (__isinf, isinf)
#ifdef NO_LONG_DOUBLE #ifdef NO_LONG_DOUBLE
strong_alias (__isinf, __isinfl)
weak_alias (__isinf, isinfl) weak_alias (__isinf, isinfl)
#endif #endif

View File

@ -0,0 +1,47 @@
/* s_logbl.c -- long double version of s_logb.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* long double logbl(x)
* IEEE 754 logb. Included to pass IEEE test suite. Not recommend.
* Use ilogb instead.
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __logbl(long double x)
#else
long double __logbl(x)
long double x;
#endif
{
int32_t es,lx,ix;
GET_LDOUBLE_WORDS(es,ix,lx,x);
es &= 0x7fff; /* exponent */
if((es|ix|lx)==0) return -1.0/fabs(x);
if(es==0x7fff) return x*x;
if(es==0) /* IEEE 754 logb */
return -16382.0;
else
return (long double) (es-0x3fff);
}
weak_alias (__logbl, logbl)

View File

@ -0,0 +1,88 @@
/* s_modfl.c -- long double version of s_modf.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* modfl(long double x, long double *iptr)
* return fraction part of x, and return x's integral part in *iptr.
* Method:
* Bit twiddling.
*
* Exception:
* No exception.
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
static const long double one = 1.0;
#else
static long double one = 1.0;
#endif
#ifdef __STDC__
long double __modfl(long double x, long double *iptr)
#else
long double __modfl(x, iptr)
long double x,*iptr;
#endif
{
int32_t i0,i1,j0;
u_int32_t i,se;
GET_LDOUBLE_WORDS(se,i0,i1,x);
j0 = (se&0x7fff)-0x3fff; /* exponent of x */
if(j0<32) { /* integer part in high x */
if(j0<0) { /* |x|<1 */
SET_LDOUBLE_WORDS(*iptr,se&0x8000,0,0); /* *iptr = +-0 */
return x;
} else {
i = (0xffffffff)>>j0;
if(((i0&i)|i1)==0) { /* x is integral */
u_int32_t high;
*iptr = x;
GET_HIGH_WORD(high,x);
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
return x;
} else {
INSERT_WORDS(*iptr,i0&(~i),0);
return x - *iptr;
}
}
} else if (j0>63) { /* no fraction part */
u_int32_t high;
*iptr = x*one;
GET_HIGH_WORD(high,x);
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
return x;
} else { /* fraction part in low x */
i = ((u_int32_t)(0xffffffff))>>(j0-20);
if((i1&i)==0) { /* x is integral */
u_int32_t high;
*iptr = x;
GET_HIGH_WORD(high,x);
INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */
return x;
} else {
INSERT_WORDS(*iptr,i0,i1&(~i));
return x - *iptr;
}
}
}
weak_alias (__modfl, modfl)

View File

@ -0,0 +1,47 @@
/* w_acoshl.c -- long double version of w_acosh.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper acoshl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __acoshl(long double x) /* wrapper acosh */
#else
long double __acoshl(x) /* wrapper acosh */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_acoshl(x);
#else
long double z;
z = __ieee754_acoshl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(x<1.0) {
return __kernel_standard(x,x,229); /* acoshl(x<1) */
} else
return z;
#endif
}
weak_alias (__acoshl, acoshl)

View File

@ -0,0 +1,48 @@
/* w_acosl.c -- long double version of w_acos.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrap_acosl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __acosl(long double x) /* wrapper acos */
#else
long double __acosl(x) /* wrapper acos */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_acosl(x);
#else
long double z;
z = __ieee754_acosl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(fabsl(x)>1.0) {
return __kernel_standard(x,x,201); /* acosl(|x|>1) */
} else
return z;
#endif
}
weak_alias (__acosl, acosl)

View File

@ -0,0 +1,49 @@
/* w_asinl.c -- long double version of w_asin.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper asinl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __asinl(long double x) /* wrapper asinl */
#else
long double __asinl(x) /* wrapper asinl */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_asinl(x);
#else
long double z;
z = __ieee754_asinl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(fabsl(x)>1.0) {
return __kernel_standard(x,x,202); /* asinl(|x|>1) */
} else
return z;
#endif
}
weak_alias (__asinl, asinl)

View File

@ -0,0 +1,48 @@
/* w_atan2l.c -- long double version of w_atan2.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper atan2l(y,x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __atan2l(long double y, long double x) /* wrapper atan2l */
#else
long double __atan2l(y,x) /* wrapper atan2l */
long double y,x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_atan2l(y,x);
#else
long double z;
z = __ieee754_atan2l(y,x);
if(_LIB_VERSION == _IEEE_||__isnanl(x)||__isnanl(y)) return z;
if(x==0.0&&y==0.0) {
return __kernel_standard(y,x,203); /* atan2l(+-0,+-0) */
} else
return z;
#endif
}
weak_alias (__atan2l, atan2l)

View File

@ -0,0 +1,52 @@
/* w_atanhl.c -- long double version of w_atanh.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper atanhl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __atanhl(long double x) /* wrapper atanhl */
#else
long double __atanhl(x) /* wrapper atanhl */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_atanhl(x);
#else
long double z,y;
z = __ieee754_atanhl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
y = fabsl(x);
if(y>=1.0) {
if(y>1.0)
return __kernel_standard(x,x,230); /* atanhl(|x|>1) */
else
return __kernel_standard(x,x,231); /* atanhl(|x|==1) */
} else
return z;
#endif
}
weak_alias (__atanhl, atanhl)

View File

@ -0,0 +1,18 @@
/*
* cabsl() wrapper for hypotl().
*
* Written by J.T. Conklin, <jtc@wimsey.com>
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
* Placed into the Public Domain, 1994.
*/
#include <math.h>
long double
__cabsl(z)
struct __cabsl_complex z;
{
return __hypotl(z.x, z.y);
}
weak_alias (__cabsl, cabsl)

View File

@ -0,0 +1,47 @@
/* w_acoshl.c -- long double version of w_acosh.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper coshl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __coshl(long double x) /* wrapper coshl */
#else
long double __coshl(x) /* wrapper coshl */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_coshl(x);
#else
long double z;
z = __ieee754_coshl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(fabsl(x)>7.10475860073943863426e+02) {
return __kernel_standard(x,x,205); /* cosh overflow */
} else
return z;
#endif
}
weak_alias (__coshl, coshl)

View File

@ -0,0 +1,18 @@
/*
* dreml() wrapper for remainderl().
*
* Written by J.T. Conklin, <jtc@wimsey.com>
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
* Placed into the Public Domain, 1994.
*/
#include <math.h>
long double
__dreml(x, y)
long double x, y;
{
return __remainderl(x, y);
}
weak_alias (__dreml, dreml)

View File

@ -0,0 +1,60 @@
/* w_expl.c -- long double version of w_exp.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper expl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
static const long double
#else
static long double
#endif
o_threshold= 1.135652340629414394949193107797076489134e4,
/* 0x400C, 0xB17217F7, 0xD1CF79AC */
u_threshold= -1.140019167866942050398521670162263001513e4;
/* 0x400C, 0xB220C447, 0x69C201E8 */
#ifdef __STDC__
long double __expl(long double x) /* wrapper exp */
#else
long double __expl(x) /* wrapper exp */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_expl(x);
#else
long double z;
z = __ieee754_expl(x);
if(_LIB_VERSION == _IEEE_) return z;
if(__finitel(x)) {
if(x>o_threshold)
return __kernel_standard(x,x,206); /* exp overflow */
else if(x<u_threshold)
return __kernel_standard(x,x,207); /* exp underflow */
}
return z;
#endif
}
weak_alias (__expl, expl)

View File

@ -0,0 +1,48 @@
/* w_fmodl.c -- long double version of w_fmod.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper fmodl(x,y)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __fmodl(long double x, long double y)/* wrapper fmodl */
#else
long double __fmodl(x,y) /* wrapper fmodl */
long double x,y;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_fmodl(x,y);
#else
long double z;
z = __ieee754_fmodl(x,y);
if(_LIB_VERSION == _IEEE_ ||__isnanl(y)||__isnanl(x)) return z;
if(y==0.0) {
return __kernel_standard(x,y,227); /* fmod(x,0) */
} else
return z;
#endif
}
weak_alias (__fmodl, fmodl)

View File

@ -0,0 +1,54 @@
/* w_gammal.c -- long double version of w_gamma.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/* long double gammal(double x)
* Return the logarithm of the Gamma function of x.
*
* Method: call gammal_r
*/
#include "math.h"
#include "math_private.h"
extern int signgam;
#ifdef __STDC__
long double __gammal(long double x)
#else
long double __gammal(x)
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_lgammal_r(x,&signgam);
#else
long double y;
y = __ieee754_lgammal_r(x,&signgam);
if(_LIB_VERSION == _IEEE_) return y;
if(!__finitel(y)&&__finitel(x)) {
if(__floorl(x)==x&&x<=0.0)
return __kernel_standard(x,x,241); /* gamma pole */
else
return __kernel_standard(x,x,240); /* gamma overflow */
} else
return y;
#endif
}
weak_alias (__gammal, gammal)

View File

@ -0,0 +1,52 @@
/* w_gammal_r.c -- long double version of w_gamma_r.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper long double gammal_r(long double x, int *signgamp)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __gammal_r(long double x, int *signgamp)
/* wrapper lgammal_r */
#else
long double __gammal_r(x,signgamp) /* wrapper lgamma_r */
long double x; int *signgamp;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_lgammal_r(x,signgamp);
#else
long double y;
y = __ieee754_lgammal_r(x,signgamp);
if(_LIB_VERSION == _IEEE_) return y;
if(!__finitel(y)&&__finitel(x)) {
if(__floorl(x)==x&&x<=0.0)
return __kernel_standard(x,x,241); /* gamma pole */
else
return __kernel_standard(x,x,240); /* gamma overflow */
} else
return y;
#endif
}
weak_alias (__gammal_r, gammal_r)

View File

@ -0,0 +1,48 @@
/* w_hypotl.c -- long double version of w_hypot.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper hypotl(x,y)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __hypotl(longdouble x, long double y)/* wrapper hypotl */
#else
long double __hypotl(x,y) /* wrapper hypotl */
long double x,y;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_hypotl(x,y);
#else
long double z;
z = __ieee754_hypotl(x,y);
if(_LIB_VERSION == _IEEE_) return z;
if((!__finitel(z))&&__finitel(x)&&__finitel(y))
return __kernel_standard(x,y,204); /* hypot overflow */
else
return z;
#endif
}
weak_alias (__hypotl, hypotl)

View File

@ -0,0 +1,75 @@
/* w_j0l.c -- long double version of w_j0.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper j0l(long double x), y0l(long double x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __j0l(long double x) /* wrapper j0l */
#else
long double __j0l(x) /* wrapper j0 */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_j0l(x);
#else
long double z = __ieee754_j0l(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(fabsl(x)>X_TLOSS) {
return __kernel_standard(x,x,234); /* j0(|x|>X_TLOSS) */
} else
return z;
#endif
}
weak_alias (__j0l, j0l)
#ifdef __STDC__
long double __y0l(long double x) /* wrapper y0l */
#else
long double __y0l(x) /* wrapper y0 */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_y0l(x);
#else
long double z;
z = __ieee754_y0l(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x) ) return z;
if(x <= 0.0){
if(x==0.0)
/* d= -one/(x-x); */
return __kernel_standard(x,x,208);
else
/* d = zero/(x-x); */
return __kernel_standard(x,x,209);
}
if(x>X_TLOSS) {
return __kernel_standard(x,x,235); /* y0(x>X_TLOSS) */
} else
return z;
#endif
}
weak_alias (__y0l, y0l)

View File

@ -0,0 +1,76 @@
/* w_j1l.c -- long double version of w_j1.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper of j1l,y1l
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __j1l(long double x) /* wrapper j1l */
#else
long double __j1l(x) /* wrapper j1l */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_j1l(x);
#else
long double z;
z = __ieee754_j1l(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x) ) return z;
if(fabsl(x)>X_TLOSS) {
return __kernel_standard(x,x,236); /* j1(|x|>X_TLOSS) */
} else
return z;
#endif
}
weak_alias (__j1l, j1l)
#ifdef __STDC__
long double __y1l(long double x) /* wrapper y1l */
#else
long double __y1l(x) /* wrapper y1l */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_y1l(x);
#else
long double z;
z = __ieee754_y1l(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x) ) return z;
if(x <= 0.0){
if(x==0.0)
/* d= -one/(x-x); */
return __kernel_standard(x,x,210);
else
/* d = zero/(x-x); */
return __kernel_standard(x,x,211);
}
if(x>X_TLOSS) {
return __kernel_standard(x,x,237); /* y1(x>X_TLOSS) */
} else
return z;
#endif
}
weak_alias (__y1l, y1l)

View File

@ -0,0 +1,98 @@
/* w_jnl.c -- long double version of w_jn.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper jn(int n, double x), yn(int n, double x)
* floating point Bessel's function of the 1st and 2nd kind
* of order n
*
* Special cases:
* y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
* y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
* Note 2. About jn(n,x), yn(n,x)
* For n=0, j0(x) is called,
* for n=1, j1(x) is called,
* for n<x, forward recursion us used starting
* from values of j0(x) and j1(x).
* for n>x, a continued fraction approximation to
* j(n,x)/j(n-1,x) is evaluated and then backward
* recursion is used starting from a supposed value
* for j(n,x). The resulting value of j(0,x) is
* compared with the actual value to correct the
* supposed value of j(n,x).
*
* yn(n,x) is similar in all respects, except
* that forward recursion is used for all
* values of n>1.
*
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __jnl(int n, long double x) /* wrapper jnl */
#else
long double __jnl(n,x) /* wrapper jnl */
long double x; int n;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_jnl(n,x);
#else
long double z;
z = __ieee754_jnl(n,x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x) ) return z;
if(fabsl(x)>X_TLOSS) {
return __kernel_standard((double)n,x,238); /* jn(|x|>X_TLOSS,n) */
} else
return z;
#endif
}
weak_alias (__jnl, jnl)
#ifdef __STDC__
long double __ynl(int n, long double x) /* wrapper ynl */
#else
long double __ynl(n,x) /* wrapper ynl */
long double x; int n;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_ynl(n,x);
#else
long double z;
z = __ieee754_ynl(n,x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x) ) return z;
if(x <= 0.0){
if(x==0.0)
/* d= -one/(x-x); */
return __kernel_standard((double)n,x,212);
else
/* d = zero/(x-x); */
return __kernel_standard((double)n,x,213);
}
if(x>X_TLOSS) {
return __kernel_standard((double)n,x,239); /* yn(x>X_TLOSS,n) */
} else
return z;
#endif
}
weak_alias (__ynl, ynl)

View File

@ -0,0 +1,54 @@
/* w_lgammal.c -- long double version of w_lgamma.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/* long double lgammal(long double x)
* Return the logarithm of the Gamma function of x.
*
* Method: call __ieee754_lgammal_r
*/
#include "math.h"
#include "math_private.h"
extern int signgam;
#ifdef __STDC__
long double __lgammal(long double x)
#else
long double __lgammal(x)
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_lgammal_r(x,&signgam);
#else
long double y;
y = __ieee754_lgammal_r(x,&signgam);
if(_LIB_VERSION == _IEEE_) return y;
if(!__finitel(y)&&__finitel(x)) {
if(__floorl(x)==x&&x<=0.0)
return __kernel_standard(x,x,215); /* lgamma pole */
else
return __kernel_standard(x,x,214); /* lgamma overflow */
} else
return y;
#endif
}
weak_alias (__lgammal, lgammal)

View File

@ -0,0 +1,52 @@
/* w_lgammal_r.c -- long double version of w_lgamma_r.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper long double lgammal_r(long double x, int *signgamp)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __lgammal_r(long double x, int *signgamp)
/* wrapper lgamma_r */
#else
long double __lgammal_r(x,signgamp) /* wrapper lgamma_r */
long double x; int *signgamp;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_lgammal_r(x,signgamp);
#else
long double y;
y = __ieee754_lgammal_r(x,signgamp);
if(_LIB_VERSION == _IEEE_) return y;
if(!__finitel(y)&&__finitel(x)) {
if(__floorl(x)==x&&x<=0.0)
return __kernel_standard(x,x,215); /* lgamma pole */
else
return __kernel_standard(x,x,214); /* lgamma overflow */
} else
return y;
#endif
}
weak_alias (__lgammal_r, lgammal_r)

View File

@ -0,0 +1,51 @@
/* w_log10l.c -- long double version of w_log10.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper log10l(X)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __log10l(long double x) /* wrapper log10l */
#else
long double __log10l(x) /* wrapper log10l */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_log10l(x);
#else
long double z;
z = __ieee754_log10l(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(x<=0.0) {
if(x==0.0)
return __kernel_standard(x,x,218); /* log10(0) */
else
return __kernel_standard(x,x,219); /* log10(x<0) */
} else
return z;
#endif
}
weak_alias (__log10l, log10l)

View File

@ -0,0 +1,48 @@
/* w_logl.c -- long double version of w_log.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper logl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __logl(long double x) /* wrapper logl */
#else
long double __logl(x) /* wrapper logl */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_logl(x);
#else
long double z;
z = __ieee754_logl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x) || x > 0.0) return z;
if(x==0.0)
return __kernel_standard(x,x,216); /* log(0) */
else
return __kernel_standard(x,x,217); /* log(x<0) */
#endif
}
weak_alias (__logl, logl)

View File

@ -0,0 +1,64 @@
/* w_powl.c -- long double version of w_pow.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* wrapper powl(x,y) return x**y
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __powl(long double x, long double y)/* wrapper powl */
#else
long double __powl(x,y) /* wrapper powl */
long double x,y;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_powl(x,y);
#else
long double z;
z=__ieee754_powl(x,y);
if(_LIB_VERSION == _IEEE_|| __isnanl(y)) return z;
if(__isnanl(x)) {
if(y==0.0)
return __kernel_standard(x,y,242); /* pow(NaN,0.0) */
else
return z;
}
if(x==0.0){
if(y==0.0)
return __kernel_standard(x,y,220); /* pow(0.0,0.0) */
if(__finite(y)&&y<0.0)
return __kernel_standard(x,y,223); /* pow(0.0,negative) */
return z;
}
if(!__finitel(z)) {
if(__finitel(x)&&__finitel(y)) {
if(__isnanl(z))
return __kernel_standard(x,y,224); /* pow neg**non-int */
else
return __kernel_standard(x,y,221); /* pow overflow */
}
}
if(z==0.0&&__finitel(x)&&__finitel(y))
return __kernel_standard(x,y,222); /* pow underflow */
return z;
#endif
}
weak_alias (__powl, powl)

View File

@ -0,0 +1,48 @@
/* w_remainderl.c -- long double version of w_remainder.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper remainderl(x,p)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __remainderl(long double x, long double y)
/* wrapper remainderl */
#else
long double __remainderl(x,y) /* wrapper remainder */
long double x,y;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_remainderl(x,y);
#else
long double z;
z = __ieee754_remainderl(x,y);
if(_LIB_VERSION == _IEEE_ || __isnanl(y)) return z;
if(y==0.0)
return __kernel_standard(x,y,228); /* remainder(x,0) */
else
return z;
#endif
}
weak_alias (__remainderl, remainderl)

View File

@ -0,0 +1,65 @@
/* w_scalbl.c -- long double version of w_scalb.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper scalbl(long double x, long double fn) is provide for
* passing various standard test suite. One
* should use scalbnl() instead.
*/
#include "math.h"
#include "math_private.h"
#include <errno.h>
#ifdef __STDC__
#ifdef _SCALB_INT
long double __scalbl(long double x, int fn) /* wrapper scalbl */
#else
long double __scalbl(long double x, long double fn)/* wrapper scalbl */
#endif
#else
long double __scalbl(x,fn) /* wrapper scalbl */
#ifdef _SCALB_INT
long double x; int fn;
#else
long double x,fn;
#endif
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_scalbl(x,fn);
#else
long double z;
z = __ieee754_scalbl(x,fn);
if(_LIB_VERSION == _IEEE_) return z;
if(!(__finitel(z)||__isnanl(z))&&__finitel(x)) {
return __kernel_standard(x,(double)fn,232); /* scalb overflow */
}
if(z==0.0&&z!=x) {
return __kernel_standard(x,(double)fn,233); /* scalb underflow */
}
#ifndef _SCALB_INT
if(!__finitel(fn)) errno = ERANGE;
#endif
return z;
#endif
}
weak_alias (__scalbl, scalbl)

View File

@ -0,0 +1,47 @@
/* w_sinhl.c -- long double version of w_sinh.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper sinhl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __sinhl(long double x) /* wrapper sinhl */
#else
long double __sinhl(x) /* wrapper sinhl */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_sinhl(x);
#else
long double z;
z = __ieee754_sinhl(x);
if(_LIB_VERSION == _IEEE_) return z;
if(!__finitel(z)&&__finitel(x)) {
return __kernel_standard(x,x,225); /* sinh overflow */
} else
return z;
#endif
}
weak_alias (__sinhl, sinhl)

View File

@ -0,0 +1,47 @@
/* w_sqrtl.c -- long double version of w_sqrt.c.
* Conversion to long double by Ulrich Drepper,
* Cygnus Support, drepper@cygnus.com.
*/
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: $";
#endif
/*
* wrapper sqrtl(x)
*/
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
long double __sqrtl(long double x) /* wrapper sqrtl */
#else
long double __sqrtl(x) /* wrapper sqrtl */
long double x;
#endif
{
#ifdef _IEEE_LIBM
return __ieee754_sqrtl(x);
#else
long double z;
z = __ieee754_sqrtl(x);
if(_LIB_VERSION == _IEEE_ || __isnanl(x)) return z;
if(x<0.0) {
return __kernel_standard(x,x,226); /* sqrt(negative) */
} else
return z;
#endif
}
weak_alias (__sqrtl, sqrtl)

View File

@ -0,0 +1,41 @@
/* Reentrant function to return the current login name. Hurd version.
Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <unistd.h>
#include <hurd.h>
#include <string.h>
/* Return at most NAME_LEN characters of the login name of the user in NAME.
If it cannot be determined or some other error occured, return the error
code. Otherwise return 0. */
int
getlogin_r (name, name_len)
char *name;
size_t name_len;
{
static char login[1024]; /* XXX */
error_t err;
if (err = __USEPORT (PROC, __proc_getlogin (port, login)))
return errno = err;
strncpy (name, login, name_len);
return 0;
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992, 1993, 1995 Free Software Foundation, Inc. /* Copyright (C) 1991, 92, 93, 95, 96 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -48,7 +48,7 @@ ttyname_r (fd, buf, buflen)
/* Test for the absolute minimal size. This makes life easier inside /* Test for the absolute minimal size. This makes life easier inside
the loop. */ the loop. */
if (buflen < sizeof (dev) + 2) if (buflen < (int) (sizeof (dev) + 2))
{ {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
@ -73,8 +73,8 @@ ttyname_r (fd, buf, buflen)
{ {
char *cp; char *cp;
cp = stpncpy (&buf[sizeof (dev) + 1], d->d_name, cp = __stpncpy (&buf[sizeof (dev) + 1], d->d_name,
MIN (d->d_namlen + 1, buflen)); MIN ((int) (_D_EXACT_NAMLEN (d) + 1), buflen));
cp[0] = '\0'; cp[0] = '\0';
if (stat (buf, &st) == 0 && st.st_dev == mydev) if (stat (buf, &st) == 0 && st.st_dev == mydev)

35
sysdeps/stub/getlogin_r.c Normal file
View File

@ -0,0 +1,35 @@
/* Reentrant function to return the current login name. Stub version.
Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <unistd.h>
/* Return at most NAME_LEN characters of the login name of the user in NAME.
If it cannot be determined or some other error occured, return the error
code. Otherwise return 0. */
int
getlogin_r (name, name_len)
char *name;
size_t name_len;
{
errno = ENOSYS;
return errno;
}
stub_warning (getlogin_r)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992 Free Software Foundation, Inc. /* Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -17,7 +17,6 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */ Cambridge, MA 02139, USA. */
#include <ansidecl.h> #include <ansidecl.h>
#include <stddef.h>
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
@ -27,38 +26,29 @@ Cambridge, MA 02139, USA. */
#include <utmp.h> #include <utmp.h>
/* Defined in ttyname.c. */
extern char *__ttyname;
/* Return the login name of the user, or NULL if it can't be determined. /* Return the login name of the user, or NULL if it can't be determined.
The returned pointer, if not NULL, is good only until the next call. */ The returned pointer, if not NULL, is good only until the next call. */
char * char *
DEFUN_VOID(getlogin) DEFUN_VOID(getlogin)
{ {
char save_tty_pathname[2 + 2 * NAME_MAX]; char tty_pathname[2 + 2 * NAME_MAX];
char *save_ttyname; char *real_tty_path = tty_pathname;
char *real_tty_path;
char *result = NULL; char *result = NULL;
FILE *f; static struct utmp_data utmp_data;
static struct utmp ut; struct utmp *ut;
if (__ttyname == NULL)
save_ttyname = NULL;
else
save_ttyname = strcpy (save_tty_pathname, __ttyname);
{ {
int err; int err = 0;
int d = __open ("/dev/tty", 0); int d = __open ("/dev/tty", 0);
if (d < 0) if (d < 0)
return NULL; return NULL;
real_tty_path = ttyname (d); if (ttyname_r (d, real_tty_path, sizeof (tty_pathname)) < 0)
err = errno; err = errno;
(void) close (d); (void) close (d);
if (real_tty_path == NULL) if (errno != 0)
{ {
errno = err; errno = err;
return NULL; return NULL;
@ -67,24 +57,18 @@ DEFUN_VOID(getlogin)
real_tty_path += 5; /* Remove "/dev/". */ real_tty_path += 5; /* Remove "/dev/". */
f = fopen ("/etc/utmp", "r"); setutent_r (&utmp_data);
if (f != NULL) if (getutline_r (real_tty_path, &ut, &utmp_data) < 0)
{ {
while (fread ((PTR) &ut, sizeof(ut), 1, f) == 1) if (errno == ESRCH)
if (!strncmp (ut.ut_line, real_tty_path, sizeof (ut.ut_line))) /* The caller expects ENOENT if nothing is found. */
{
result = ut.ut_name;
/* The name is not null-terminated if
it is as long as sizeof (ut.ut_name). */
result[sizeof (ut.ut_name)] = '\0';
break;
}
(void) fclose (f);
}
if (save_ttyname != NULL)
strcpy (__ttyname, save_ttyname);
if (result == NULL)
errno = ENOENT; errno = ENOENT;
result = NULL;
}
else
result = ut->ut_line;
endutent_r (&utmp_data);
return result; return result;
} }

80
sysdeps/unix/getlogin_r.c Normal file
View File

@ -0,0 +1,80 @@
/* Reentrant function to return the current login name. Unix version.
Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <limits.h>
#include <fcntl.h>
#include <utmp.h>
/* Return at most NAME_LEN characters of the login name of the user in NAME.
If it cannot be determined or some other error occured, return the error
code. Otherwise return 0. */
int
getlogin_r (name, name_len)
char *name;
size_t name_len;
{
char tty_pathname[2 + 2 * NAME_MAX];
char *real_tty_path = tty_pathname;
int result = 0;
struct utmp_data utmp_data;
struct utmp *ut;
{
int err;
int d = __open ("/dev/tty", 0);
if (d < 0)
return errno;
result = ttyname_r (d, real_tty_path, sizeof (tty_pathname));
err = errno;
(void) close (d);
if (result < 0)
{
errno = err;
return err;
}
}
real_tty_path += 5; /* Remove "/dev/". */
setutent_r (&utmp_data);
if (getutline_r (real_tty_path, &ut, &utmp_data) < 0)
{
if (errno == ESRCH)
/* The caller expects ENOENT if nothing is found. */
result = ENOENT;
else
result = errno;
}
else
{
strncpy (name, ut->ut_line, name_len);
result = 0;
}
endutent_r (&utmp_data);
return result;
}