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

Back to archive index

morita morit****@razil*****
2008年 7月 3日 (木) 22:55:53 JST


森です。
いつもありがとうございます。。。コミットお願いします!!

Kouhei Sutou さんは書きました:
> 須藤です。
>
> 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 mailing list
> Senna****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/senna-dev
> バグ報告方法:http://qwik.jp/senna/bug_report.html
>
>   




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