Kouhei Sutou
kou****@cozmi*****
2008年 7月 3日 (木) 11:07:44 JST
須藤です。 2008/07/03 11:00 Kouhei Sutou <kou****@cozmi*****>: > sen_atoi()とsen_str_itoa()がINT_MINも扱えるようにするパッチです。 > > <time>のリテラルにINT_MINが使えるようになります。 > > パッチ前: > #:<-2147483648.0> ; => #f > #:<-2147483649.0> ; => #f > > パッチ後: > #:<-2147483648.0> ; => #:<-2147483648.0> > #:<-2147483649.0> ; => #f ごめんなさい。 INT_MAX + 1のとき、#fじゃなくてオーバーフローした値になっていました。。。 パッチ前: > #:<2147483647.0> #:<2147483647.0> > #:<2147483648.0> #f パッチ後: > #:<2147483647.0> #:<2147483647.0> > #:<2147483648.0> #f > Index: lib/str.c =================================================================== --- lib/str.c (revision 897) +++ lib/str.c (working copy) @@ -1381,7 +1381,6 @@ int sen_atoi(const char *nptr, const char *end, const char **rest) { - /* FIXME: INT_MIN is not supported */ const char *p = nptr; int v = 0, t, n = 0, o = 0; if (p < end && *p == '-') { @@ -1390,14 +1389,14 @@ o = 1; } while (p < end && *p >= '0' && *p <= '9') { - t = v * 10 + (*p - '0'); - if (t < v) { v =0; break; } + t = v * 10 - (*p - '0'); + if (t > v || (!n && t == INT_MIN)) { v = 0; break; } v = t; o = 0; p++; } if (rest) { *rest = o ? nptr : p; } - return n ? -v : v; + return n ? v : -v; } unsigned int @@ -1497,14 +1496,18 @@ sen_rc sen_str_itoa(int i, char *p, char *end, char **rest) { - /* FIXME: INT_MIN is not supported */ char *q; if (p >= end) { return sen_invalid_argument; } + q = p; if (i < 0) { *p++ = '-'; + q = p; + if (i == INT_MIN) { + *p++ = (-(i % 10)) + '0'; + i /= 10; + } i = -i; } - q = p; do { if (p >= end) { return sen_invalid_argument; } *p++ = i % 10 + '0';