Defined of course only with long doubles.
XS => [qw/ write wctomb wcstombs uname tzset tzname
ttyname tmpnam times tcsetpgrp tcsendbreak
tcgetpgrp tcflush tcflow tcdrain tanh tan
- sysconf strxfrm strtoul strtol strtod
+ sysconf strxfrm strtoul strtol strtod strtold
strftime strcoll sinh sigsuspend sigprocmask
sigpending sigaction setuid setsid setpgid
setlocale setgid read pipe pause pathconf
double strtod (const char *, char **);
long strtol (const char *, char **, int);
unsigned long strtoul (const char *, char **, int);
+#ifdef HAS_STRTOLD
+long double strtold (const char *, char **);
+#endif
END_EXTERN_C
#endif
#ifndef HAS_STRTOD
#define strtod(s1,s2) not_here("strtod")
#endif
+#ifndef HAS_STRTOLD
+#define strtold(s1,s2) not_here("strtold")
+#endif
#ifndef HAS_STRTOL
#define strtol(s1,s2,b) not_here("strtol")
#endif
}
RESTORE_NUMERIC_STANDARD();
+#ifdef HAS_STRTOLD
+
+void
+strtold(str)
+ char * str
+ PREINIT:
+ long double num;
+ char *unparsed;
+ PPCODE:
+ STORE_NUMERIC_STANDARD_FORCE_LOCAL();
+ num = strtold(str, &unparsed);
+ PUSHs(sv_2mortal(newSVnv(num)));
+ if (GIMME == G_ARRAY) {
+ EXTEND(SP, 1);
+ if (unparsed)
+ PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
+ else
+ PUSHs(&PL_sv_undef);
+ }
+ RESTORE_NUMERIC_STANDARD();
+
+#endif
+
void
strtol(str, base = 0)
char * str
stdlib_h => [qw(EXIT_FAILURE EXIT_SUCCESS MB_CUR_MAX NULL RAND_MAX
abort atexit atof atoi atol bsearch calloc div
free getenv labs ldiv malloc mblen mbstowcs mbtowc
- qsort realloc strtod strtol strtoul wcstombs wctomb)],
+ qsort realloc strtod strtol strtold strtoul wcstombs wctomb)],
string_h => [qw(NULL memchr memcmp memcpy memmove memset strcat
strchr strcmp strcoll strcpy strcspn strerror strlen
When called in a scalar context strtol returns the parsed number.
+=item C<strtold>
+
+Like L</strtod> but for long doubles. Defined only if the
+system supports long doubles.
+
=item C<strtoul>
String to unsigned (long) integer translation. C<strtoul()> is identical
sinh sscanf stderr stdin stdout strcat strchr strcmp strcoll
strcpy strcspn strerror strftime strlen strncat strncmp
strncpy strpbrk strrchr strspn strstr strtod strtok strtol
- strtoul strxfrm sysconf tan tanh tcdrain tcflow tcflush
- tcgetattr tcgetpgrp tcsendbreak tcsetattr tcsetpgrp tmpfile
- tmpnam tolower toupper ttyname tzname tzset uname ungetc
- vfprintf vprintf vsprintf wcstombs wctomb)],
+ strtold strtoul strxfrm sysconf tan tanh tcdrain tcflow
+ tcflush tcgetattr tcgetpgrp tcsendbreak tcsetattr tcsetpgrp
+ tmpfile tmpnam tolower toupper ttyname tzname tzset uname
+ ungetc vfprintf vprintf vsprintf wcstombs wctomb)],
EXPORT_OK => [qw(abs alarm atan2 chdir chmod chown close closedir cos exit
exp fcntl fileno fork getc getgrgid getgrnam getlogin
getpgrp getppid getpwnam getpwuid gmtime kill lchown link
}
}
-use Test::More tests => 109;
+use Test::More tests => 111;
use POSIX qw(fcntl_h signal_h limits_h _exit getcwd open read strftime write
errno localeconv dup dup2 lseek access);
}
SKIP: {
+ skip("strtold() not present", 2) unless $Config{d_strtold};
+
+ if ($Config{d_setlocale}) {
+ $lc = &POSIX::setlocale(&POSIX::LC_NUMERIC);
+ &POSIX::setlocale(&POSIX::LC_NUMERIC, 'C');
+ }
+
+ # we're just checking that strtold works, not how accurate it is
+ ($n, $x) = &POSIX::strtod('2.718_ISH');
+ cmp_ok(abs("2.718" - $n), '<', 1e-6, 'strtold works');
+ is($x, 4, 'strtold works');
+
+ &POSIX::setlocale(&POSIX::LC_NUMERIC, $lc) if $Config{d_setlocale};
+}
+
+SKIP: {
skip("strtol() not present", 2) unless $Config{d_strtol};
($n, $x) = &POSIX::strtol('21_PENGUINS');