[Senna-dev 935] Re: [PATCH] sen_atoi() and sen_str_itoa() support INT_MIN

Back to archive index

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




Senna-dev メーリングリストの案内
Back to archive index