#include "ruby/ruby.h"#include <ctype.h>#include <stdio.h>#include <errno.h>#include <math.h>#include <float.h>#include "ruby/util.h"#include <sys/types.h>#include <sys/stat.h>#include "stdlib.h"#include "string.h"

Go to the source code of this file.
Data Structures | |
| struct | stack_node |
| union | U |
| struct | Bigint |
Defines | |
| #define | S_ISDIR(m) ((m & S_IFMT) == S_IFDIR) |
| #define | A ((int*)a) |
| #define | B ((int*)b) |
| #define | C ((int*)c) |
| #define | D ((int*)d) |
| #define | mmprepare(base, size) |
| #define | mmarg mmkind, size, high, low |
| #define | mmswap(a, b) mmswap_((a),(b),mmarg) |
| #define | mmrot3(a, b, c) mmrot3_((a),(b),(c),mmarg) |
| #define | PUSH(ll, rr) do { top->LL = (ll); top->RR = (rr); ++top; } while (0) |
| #define | POP(ll, rr) do { --top; ll = top->LL; rr = top->RR; } while (0) |
| #define | med3(a, b, c) |
| #define | PATH_MAX 8192 |
| #define | IEEE_LITTLE_ENDIAN |
| #define | MALLOC malloc |
| #define | PRIVATE_MEM 2304 |
| #define | PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) |
| #define | IEEE_Arith |
| #define | word0(x) (x.L[1]) |
| #define | word1(x) (x.L[0]) |
| #define | dval(x) (x.d) |
| #define | Storeinc(a, b, c) |
| #define | Exp_shift 20 |
| #define | Exp_shift1 20 |
| #define | Exp_msk1 0x100000 |
| #define | Exp_msk11 0x100000 |
| #define | Exp_mask 0x7ff00000 |
| #define | P 53 |
| #define | Bias 1023 |
| #define | Emin (-1022) |
| #define | Exp_1 0x3ff00000 |
| #define | Exp_11 0x3ff00000 |
| #define | Ebits 11 |
| #define | Frac_mask 0xfffff |
| #define | Frac_mask1 0xfffff |
| #define | Ten_pmax 22 |
| #define | Bletch 0x10 |
| #define | Bndry_mask 0xfffff |
| #define | Bndry_mask1 0xfffff |
| #define | LSB 1 |
| #define | Sign_bit 0x80000000 |
| #define | Log2P 1 |
| #define | Tiny0 0 |
| #define | Tiny1 1 |
| #define | Quick_max 14 |
| #define | Int_max 14 |
| #define | Avoid_Underflow |
| #define | Flt_Rounds 1 |
| #define | Rounding Flt_Rounds |
| #define | rounded_product(a, b) a *= b |
| #define | rounded_quotient(a, b) a /= b |
| #define | Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) |
| #define | Big1 0xffffffff |
| #define | FFFFFFFF 0xffffffffUL |
| #define | Llong long long |
| #define | ULLong unsigned Llong |
| #define | MULTIPLE_THREADS 1 |
| #define | ACQUIRE_DTOA_LOCK(n) |
| #define | FREE_DTOA_LOCK(n) |
| #define | Kmax 15 |
| #define | Bcopy(x, y) |
| #define | d0 word0(d) |
| #define | d1 word1(d) |
| #define | d0 word0(d) |
| #define | d1 word1(d) |
| #define | Scale_Bit 0x10 |
| #define | n_bigtens 5 |
| #define | rv_alloc(i) xmalloc(i) |
| #define | rv_strdup(s, rve) nrv_alloc(s, rve, strlen(s)+1) |
| #define | DBL_MANH_SIZE 20 |
| #define | DBL_MANL_SIZE 32 |
| #define | INFSTR "Infinity" |
| #define | NANSTR "NaN" |
| #define | DBL_ADJ (DBL_MAX_EXP - 2) |
| #define | SIGFIGS ((DBL_MANT_DIG + 3) / 4 + 1) |
| #define | dexp_get(u) ((int)(word0(u) >> Exp_shift) & ~Exp_msk1) |
| #define | dexp_set(u, v) (word0(u) = (((int)(word0(u)) & ~Exp_mask) | (v << Exp_shift))) |
| #define | dmanh_get(u) ((int)(word0(u) & Frac_mask)) |
| #define | dmanl_get(u) ((int)word1(u)) |
Typedefs | |
| typedef U | double_u |
| typedef struct Bigint | Bigint |
Functions | |
| unsigned long | ruby_scan_oct (const char *start, size_t len, size_t *retlen) |
| unsigned long | ruby_scan_hex (const char *start, size_t len, size_t *retlen) |
| static unsigned long | scan_digits (const char *str, int base, size_t *retlen, int *overflow) |
| unsigned long | ruby_strtoul (const char *str, char **endptr, int base) |
| static void | mmswap_ (register char *a, register char *b, int mmkind, size_t size, size_t high, size_t low) |
| static void | mmrot3_ (register char *a, register char *b, register char *c, int mmkind, size_t size, size_t high, size_t low) |
| void | ruby_qsort (void *base, const size_t nel, const size_t size, int(*cmp)(const void *, const void *, void *), void *d) |
| char * | ruby_strdup (const char *str) |
| char * | ruby_getcwd (void) |
| static Bigint * | Balloc (int k) |
| static void | Bfree (Bigint *v) |
| static Bigint * | multadd (Bigint *b, int m, int a) |
| static Bigint * | s2b (const char *s, int nd0, int nd, ULong y9) |
| static int | hi0bits (register ULong x) |
| static int | lo0bits (ULong *y) |
| static Bigint * | i2b (int i) |
| static Bigint * | mult (Bigint *a, Bigint *b) |
| static Bigint * | pow5mult (Bigint *b, int k) |
| static Bigint * | lshift (Bigint *b, int k) |
| static int | cmp (Bigint *a, Bigint *b) |
| static Bigint * | diff (Bigint *a, Bigint *b) |
| static double | ulp (double x_) |
| static double | b2d (Bigint *a, int *e) |
| static Bigint * | d2b (double d_, int *e, int *bits) |
| static double | ratio (Bigint *a, Bigint *b) |
| double | ruby_strtod (const char *s00, char **se) |
| static int | quorem (Bigint *b, Bigint *S) |
| static char * | nrv_alloc (const char *s, char **rve, size_t n) |
| char * | ruby_dtoa (double d_, int mode, int ndigits, int *decpt, int *sign, char **rve) |
| void | ruby_each_words (const char *str, void(*func)(const char *, int, void *), void *arg) |
| char * | BSD__hdtoa (double d, const char *xdigs, int ndigits, int *decpt, int *sign, char **rve) |
Variables | |
| static double | private_mem [PRIVATE_mem] |
| static double * | pmem_next = private_mem |
| static Bigint * | freelist [Kmax+1] |
| static Bigint * | p5s |
| static const double | tens [] |
| static const double | bigtens [] = { 1e16, 1e32, 1e64, 1e128, 1e256 } |
| static const double | tinytens [] |
| #define ACQUIRE_DTOA_LOCK | ( | n | ) |
| #define Avoid_Underflow |
| #define B ((int*)b) |
| #define Bcopy | ( | x, | |||
| y | ) |
Value:
memcpy((char *)&x->sign, (char *)&y->sign, \ y->wds*sizeof(Long) + 2*sizeof(int))
Definition at line 1181 of file util.c.
Referenced by multadd(), ruby_dtoa(), and ruby_strtod().
| #define Bias 1023 |
| #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) |
| #define Big1 0xffffffff |
| #define Bletch 0x10 |
| #define Bndry_mask 0xfffff |
| #define Bndry_mask1 0xfffff |
| #define C ((int*)c) |
| #define d0 word0(d) |
| #define d0 word0(d) |
Referenced by b2d(), d2b(), math_acos(), math_acosh(), math_asin(), math_atanh(), math_gamma(), math_lgamma(), math_log(), math_log10(), math_log2(), and math_sqrt().
| #define d1 word1(d) |
| #define d1 word1(d) |
Referenced by b2d(), d2b(), and inet_pton().
| #define DBL_ADJ (DBL_MAX_EXP - 2) |
| #define DBL_MANH_SIZE 20 |
| #define DBL_MANL_SIZE 32 |
| #define dexp_get | ( | u | ) | ((int)(word0(u) >> Exp_shift) & ~Exp_msk1) |
| #define dexp_set | ( | u, | |||
| v | ) | (word0(u) = (((int)(word0(u)) & ~Exp_mask) | (v << Exp_shift))) |
| #define dmanh_get | ( | u | ) | ((int)(word0(u) & Frac_mask)) |
| #define dmanl_get | ( | u | ) | ((int)word1(u)) |
| #define dval | ( | x | ) | (x.d) |
Definition at line 942 of file util.c.
Referenced by b2d(), d2b(), ratio(), ruby_dtoa(), ruby_strtod(), and ulp().
| #define Emin (-1022) |
| #define Exp_1 0x3ff00000 |
| #define Exp_11 0x3ff00000 |
| #define Exp_mask 0x7ff00000 |
| #define Exp_msk1 0x100000 |
Definition at line 966 of file util.c.
Referenced by d2b(), ratio(), ruby_dtoa(), ruby_strtod(), and ulp().
| #define Exp_shift 20 |
| #define Exp_shift1 20 |
| #define FFFFFFFF 0xffffffffUL |
| #define Flt_Rounds 1 |
| #define Frac_mask 0xfffff |
| #define Frac_mask1 0xfffff |
| #define FREE_DTOA_LOCK | ( | n | ) |
| #define IEEE_Arith |
| #define INFSTR "Infinity" |
| #define Int_max 14 |
| #define Log2P 1 |
| #define LSB 1 |
| #define med3 | ( | a, | |||
| b, | |||||
| c | ) |
| #define mmprepare | ( | base, | |||
| size | ) |
| #define mmrot3 | ( | a, | |||
| b, | |||||
| c | ) | mmrot3_((a),(b),(c),mmarg) |
| #define mmswap | ( | a, | |||
| b | ) | mmswap_((a),(b),mmarg) |
| #define n_bigtens 5 |
| #define NANSTR "NaN" |
| #define P 53 |
| #define PATH_MAX 8192 |
Referenced by ruby_getcwd().
| #define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) |
| #define Quick_max 14 |
| #define rounded_product | ( | a, | |||
| b | ) | a *= b |
| #define rounded_quotient | ( | a, | |||
| b | ) | a /= b |
| #define Rounding Flt_Rounds |
| #define rv_alloc | ( | i | ) | xmalloc(i) |
| #define rv_strdup | ( | s, | |||
| rve | ) | nrv_alloc(s, rve, strlen(s)+1) |
| #define Scale_Bit 0x10 |
| #define SIGFIGS ((DBL_MANT_DIG + 3) / 4 + 1) |
| #define Sign_bit 0x80000000 |
| #define Storeinc | ( | a, | |||
| b, | |||||
| c | ) |
| #define Ten_pmax 22 |
| #define Tiny0 0 |
| #define Tiny1 1 |
| #define ULLong unsigned Llong |
| #define word0 | ( | x | ) | (x.L[1]) |
Definition at line 936 of file util.c.
Referenced by b2d(), BSD__hdtoa(), d2b(), ratio(), ruby_dtoa(), ruby_strtod(), and ulp().
| #define word1 | ( | x | ) | (x.L[0]) |
Definition at line 937 of file util.c.
Referenced by b2d(), d2b(), ruby_dtoa(), ruby_strtod(), and ulp().
| static double b2d | ( | Bigint * | a, | |
| int * | e | |||
| ) | [static] |
| static Bigint* Balloc | ( | int | k | ) | [static] |
Definition at line 1136 of file util.c.
References ACQUIRE_DTOA_LOCK, FREE_DTOA_LOCK, Bigint::k, MALLOC, Bigint::maxwds, Bigint::next, PRIVATE_mem, Bigint::sign, Bigint::wds, and Bigint::x.
Referenced by d2b(), diff(), i2b(), lshift(), mult(), multadd(), ruby_dtoa(), ruby_strtod(), and s2b().
| static void Bfree | ( | Bigint * | v | ) | [static] |
Definition at line 1171 of file util.c.
References ACQUIRE_DTOA_LOCK, FREE_DTOA_LOCK, Bigint::k, and Bigint::next.
Referenced by lshift(), multadd(), pow5mult(), ruby_dtoa(), and ruby_strtod().
| char* BSD__hdtoa | ( | double | d, | |
| const char * | xdigs, | |||
| int | ndigits, | |||
| int * | decpt, | |||
| int * | sign, | |||
| char ** | rve | |||
| ) |
Definition at line 3944 of file util.c.
References U::d, DBL_ADJ, DBL_MANH_SIZE, DBL_MANL_SIZE, DBL_MANT_DIG, DBL_MAX_EXP, dexp_get, dexp_set, dmanh_get, dmanl_get, INFSTR, isinf(), isnan, NANSTR, nrv_alloc(), NULL, rv_alloc, SIGFIGS, Sign_bit, and word0.
Definition at line 1562 of file util.c.
References Bigint::wds, and Bigint::x.
Referenced by diff(), quorem(), ruby_dtoa(), ruby_qsort(), and ruby_strtod().
| static Bigint* d2b | ( | double | d_, | |
| int * | e, | |||
| int * | bits | |||
| ) | [static] |
Definition at line 1591 of file util.c.
References Balloc(), cmp(), FFFFFFFF, Bigint::k, Bigint::sign, Storeinc, ULLong, Bigint::wds, and Bigint::x.
Referenced by fun_sio_from_gb18030(), fun_sio_to_gb18030(), num_step(), pair_byte_cmp(), rb_dlptr_cmp(), ruby_dtoa(), and ruby_strtod().
| static int hi0bits | ( | register ULong | x | ) | [static] |
| static Bigint* i2b | ( | int | i | ) | [static] |
Definition at line 1342 of file util.c.
References Balloc(), Bigint::wds, and Bigint::x.
Referenced by pow5mult(), ruby_dtoa(), and ruby_strtod().
| static int lo0bits | ( | ULong * | y | ) | [static] |
Definition at line 1508 of file util.c.
References Balloc(), Bfree(), Bigint::k, Bigint::maxwds, Bigint::wds, and Bigint::x.
| static void mmrot3_ | ( | register char * | a, | |
| register char * | b, | |||
| register char * | c, | |||
| int | mmkind, | |||
| size_t | size, | |||
| size_t | high, | |||
| size_t | low | |||
| ) | [static] |
| static void mmswap_ | ( | register char * | a, | |
| register char * | b, | |||
| int | mmkind, | |||
| size_t | size, | |||
| size_t | high, | |||
| size_t | low | |||
| ) | [static] |
Definition at line 1353 of file util.c.
References Balloc(), FFFFFFFF, Bigint::k, Bigint::maxwds, Storeinc, ULLong, Bigint::wds, and Bigint::x.
Referenced by pow5mult(), ruby_dtoa(), and ruby_strtod().
Definition at line 1185 of file util.c.
References Balloc(), Bcopy, Bfree(), FFFFFFFF, Bigint::k, Bigint::maxwds, ULLong, Bigint::wds, and Bigint::x.
Referenced by pow5mult(), ruby_dtoa(), and s2b().
| static char* nrv_alloc | ( | const char * | s, | |
| char ** | rve, | |||
| size_t | n | |||
| ) | [static] |
Definition at line 1456 of file util.c.
References ACQUIRE_DTOA_LOCK, Bfree(), FREE_DTOA_LOCK, i2b(), mult(), multadd(), and Bigint::next.
Referenced by ruby_dtoa(), and ruby_strtod().
Definition at line 3005 of file util.c.
References cmp(), FFFFFFFF, Storeinc, ULLong, Bigint::wds, and Bigint::x.
Referenced by ruby_dtoa().
Definition at line 1917 of file util.c.
References b2d(), dval, Exp_msk1, Bigint::k, Bigint::wds, and word0.
Referenced by ruby_strtod().
| char* ruby_dtoa | ( | double | d_, | |
| int | mode, | |||
| int | ndigits, | |||
| int * | decpt, | |||
| int * | sign, | |||
| char ** | rve | |||
| ) |
Definition at line 3192 of file util.c.
References Balloc(), Bcopy, Bfree(), Bias, bigtens, Bletch, Bndry_mask, cmp(), d2b(), diff(), dval, Exp_1, Exp_11, Exp_mask, Exp_msk1, Exp_shift, Exp_shift1, Flt_Rounds, Frac_mask, Frac_mask1, hi0bits(), i2b(), Int_max, Bigint::k, Log2P, lshift, mult(), multadd(), n_bigtens, no_digits, P, pow5mult(), Quick_max, quorem(), Rounding, rv_alloc, rv_strdup, S, Bigint::sign, Sign_bit, Ten_pmax, tens, Bigint::wds, word0, word1, and Bigint::x.
Referenced by flo_to_s().
| void ruby_each_words | ( | const char * | str, | |
| void(*)(const char *, int, void *) | func, | |||
| void * | arg | |||
| ) |
| char* ruby_getcwd | ( | void | ) |
| void ruby_qsort | ( | void * | base, | |
| const size_t | nel, | |||
| const size_t | size, | |||
| int(*)(const void *, const void *, void *) | cmp, | |||
| void * | d | |||
| ) |
| unsigned long ruby_scan_hex | ( | const char * | start, | |
| size_t | len, | |||
| size_t * | retlen | |||
| ) |
Definition at line 41 of file util.c.
References strchr().
Referenced by unescape_unicode_bmp(), and unescape_unicode_list().
| unsigned long ruby_scan_oct | ( | const char * | start, | |
| size_t | len, | |||
| size_t * | retlen | |||
| ) |
Definition at line 27 of file util.c.
Referenced by parser_tokadd_escape(), and unescape_nonascii().
| char* ruby_strdup | ( | const char * | str | ) |
Definition at line 601 of file util.c.
References xmalloc.
Referenced by argf_initialize_copy(), load_lock(), ruby_setenv(), and yycompile().
| double ruby_strtod | ( | const char * | s00, | |
| char ** | se | |||
| ) |
Definition at line 2070 of file util.c.
References Avoid_Underflow, Balloc(), Bcopy, Bfree(), Bias, Big0, Big1, bigtens, Bndry_mask, Bndry_mask1, cmp(), d2b(), DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, diff(), dval, Emin, errno, Exp_1, Exp_mask, Exp_msk1, Exp_shift, FLT_RADIX, Flt_Rounds, Frac_mask, i2b(), IEEE_Arith, ISDIGIT, Bigint::k, Log2P, LSB, lshift, mult(), n_bigtens, P, pow5mult(), ratio(), rb_warn(), rounded_product, rounded_quotient, Rounding, s2b(), Scale_Bit, Bigint::sign, strchr(), Ten_pmax, tens, Tiny0, Tiny1, ulp(), Bigint::wds, word0, word1, and Bigint::x.
| unsigned long ruby_strtoul | ( | const char * | str, | |
| char ** | endptr, | |||
| int | base | |||
| ) |
| static Bigint* s2b | ( | const char * | s, | |
| int | nd0, | |||
| int | nd, | |||
| ULong | y9 | |||
| ) | [static] |
Definition at line 1236 of file util.c.
References Balloc(), Bigint::k, multadd(), Bigint::wds, and Bigint::x.
Referenced by ruby_strtod().
| static unsigned long scan_digits | ( | const char * | str, | |
| int | base, | |||
| size_t * | retlen, | |||
| int * | overflow | |||
| ) | [static] |
| static double ulp | ( | double | x_ | ) | [static] |
const double bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 } [static] |
double * pmem_next = private_mem [static] |
double private_mem[PRIVATE_mem] [static] |
const double tens[] [static] |
Initial value:
{
1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1e20, 1e21, 1e22
}
Definition at line 1953 of file util.c.
Referenced by ruby_dtoa(), and ruby_strtod().
const double tinytens[] [static] |