Kouhei Sutou
kou****@cozmi*****
2008年 7月 3日 (木) 11:00:52 JST
須藤です。 sen_atoi()とsen_str_itoa()がINT_MINも扱えるようにするパッチです。 <time>のリテラルにINT_MINが使えるようになります。 パッチ前: #:<-2147483648.0> ; => #f #:<-2147483649.0> ; => #f パッチ後: #:<-2147483648.0> ; => #:<-2147483648.0> #:<-2147483649.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) { v = 0; break; } v = t; o = 0; p++; } if (rest) { *rest = o ? nptr : p; } - return n ? -v : v; + return n ? v : (v == INT_MIN ? INT_MAX /* or 0? */ : -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';