From 21453dc7381d09e6926c02c0143812680c1cfa8a Mon Sep 17 00:00:00 2001 From: tadf Date: Tue, 20 Nov 2012 12:10:08 +0000 Subject: * complex.c: some improvements. * rational.c: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37757 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ complex.c | 40 +++++++++++++++++++++++++++++----------- rational.c | 49 +++++++++++++++++++++++++++++++++++-------------- 3 files changed, 69 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index 52790145a4..018b2d13a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Nov 20 21:06:41 2012 Tadayoshi Funaba + + * complex.c: some improvements. + * rational.c: ditto. + Tue Nov 20 21:01:16 2012 Nobuyoshi Nakada * common.mk (incs): BSD make cannot deal with non-prefixed dependency diff --git a/complex.c b/complex.c index d4af405a88..d262e9a325 100644 --- a/complex.c +++ b/complex.c @@ -1498,13 +1498,19 @@ numeric_to_c(VALUE self) #include +inline static int +issign(int c) +{ + return (c == '-' || c == '+'); +} + static int read_sign(const char **s, char **b) { int sign = '?'; - if (**s == '-' || **s == '+') { + if (issign(**s)) { sign = **b = **s; (*s)++; (*b)++; @@ -1512,16 +1518,22 @@ read_sign(const char **s, return sign; } +inline static int +isdecimal(int c) +{ + return isdigit((unsigned char)c); +} + static int read_digits(const char **s, int strict, char **b) { int us = 1; - if (!isdigit((unsigned char)**s)) + if (!isdecimal(**s)) return 0; - while (isdigit((unsigned char)**s) || **s == '_') { + while (isdecimal(**s) || **s == '_') { if (**s == '_') { if (strict) { if (us) @@ -1543,6 +1555,12 @@ read_digits(const char **s, int strict, return 1; } +inline static int +islettere(int c) +{ + return (c == 'e' || c == 'E'); +} + static int read_num(const char **s, int strict, char **b) @@ -1562,7 +1580,7 @@ read_num(const char **s, int strict, } } - if (**s == 'e' || **s == 'E') { + if (islettere(**s)) { **b = **s; (*s)++; (*b)++; @@ -1575,7 +1593,7 @@ read_num(const char **s, int strict, return 1; } -static int +inline static int read_den(const char **s, int strict, char **b) { @@ -1612,7 +1630,7 @@ read_rat(const char **s, int strict, return 1; } -static int +inline static int isimagunit(int c) { return (c == 'i' || c == 'I' || @@ -1654,7 +1672,7 @@ read_comp(const char **s, int strict, **b = '\0'; num = str2num(bb); *ret = rb_complex_new2(num, ZERO); - return 0; /* e.g. "1/" */ + return 0; /* e.g. "-" */ } **b = '\0'; num = str2num(bb); @@ -1673,9 +1691,9 @@ read_comp(const char **s, int strict, st = read_rat(s, strict, b); **b = '\0'; if (strlen(bb) < 1 || - !isdigit((unsigned char)*(bb + strlen(bb) - 1))) { + !isdecimal(*(bb + strlen(bb) - 1))) { *ret = rb_complex_new2(num, ZERO); - return 0; /* e.g. "1@x" */ + return 0; /* e.g. "1@-" */ } num2 = str2num(bb); *ret = rb_complex_polar(num, num2); @@ -1685,7 +1703,7 @@ read_comp(const char **s, int strict, return 1; /* e.g. "1@2" */ } - if (**s == '-' || **s == '+') { + if (issign(**s)) { bb = *b; sign = read_sign(s, b); if (isimagunit(**s)) @@ -1713,7 +1731,7 @@ read_comp(const char **s, int strict, } } -static void +inline static void skip_ws(const char **s) { while (isspace((unsigned char)**s)) diff --git a/rational.c b/rational.c index 24d7ff1afe..16b7e4b354 100644 --- a/rational.c +++ b/rational.c @@ -1958,40 +1958,53 @@ float_rationalize(int argc, VALUE *argv, VALUE self) #include +inline static int +issign(int c) +{ + return (c == '-' || c == '+'); +} + static int read_sign(const char **s) { int sign = '?'; - if (**s == '-' || **s == '+') { + if (issign(**s)) { sign = **s; (*s)++; } return sign; } +inline static int +isdecimal(int c) +{ + return isdigit((unsigned char)c); +} + static int read_digits(const char **s, int strict, VALUE *num, int *count) { - int us = 1; + int us = 1, ret = 1; + const char *b = *s; - if (!isdigit((unsigned char)**s)) + if (!isdecimal(**s)) { + *num = ZERO; return 0; + } - *num = ZERO; - - while (isdigit((unsigned char)**s) || **s == '_') { + while (isdecimal(**s) || **s == '_') { if (**s == '_') { if (strict) { - if (us) - return 0; + if (us) { + ret = 0; + goto conv; + } } us = 1; } else { - *num = f_mul(*num, INT2FIX(10)); - *num = f_add(*num, INT2FIX(**s - '0')); if (count) (*count)++; us = 0; @@ -2002,7 +2015,15 @@ read_digits(const char **s, int strict, do { (*s)--; } while (**s == '_'); - return 1; + conv: + *num = rb_cstr_to_inum(b, 10, 0); + return ret; +} + +inline static int +islettere(int c) +{ + return (c == 'e' || c == 'E'); } static int @@ -2034,7 +2055,7 @@ read_num(const char **s, int numsign, int strict, } } - if (**s == 'e' || **s == 'E') { + if (islettere(**s)) { int expsign; (*s)++; @@ -2054,7 +2075,7 @@ read_num(const char **s, int numsign, int strict, return 1; } -static int +inline static int read_den(const char **s, int strict, VALUE *num) { @@ -2093,7 +2114,7 @@ read_rat(const char **s, int strict, return 1; } -static void +inline static void skip_ws(const char **s) { while (isspace((unsigned char)**s)) -- cgit v1.2.3