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';