Ivan Shmakov wrote:

> >>>>> Maciej Sieczka <[EMAIL PROTECTED]> writes:
> 
> [...]
> 
>  >> I could change it to use strtol(), which sets errno to ERANGE on
>  >> overflow.
> 
>       It may be better to check `*tailptr', like:

There's no point. The string which is being passed to atoi() is lex's
yytext variable, which is guaranteed to consist solely of decimal
digits:

        I               [0-9]+
        
        ...
        
        {I}             {
                                yylval.ival = atoi(yytext);
                                return INTEGER;
                        }

strtol() only stops when it encounters an invalid character; it won't
stop just because it has read more than 9 digits. So, the endptr
argument will always point to the terminating NUL.

The issue is that atoi() doesn't provide any indication that it
clamped the result to INT_MAX (or INT_MIN), while strtol() sets errno.

>  > Would that make r.mapcalc accept integers bigger than int32?
> 
>       The sizes of the C types generally depend on the platform, but
>       for x86-based platforms I'm familiar with, sizeof (long) is 32.
> 
>       It may make sense to use `long long' and strtoll () where
>       available.

You can't store anything larger than an "int" in a CELL map, so there
isn't much point in supporting 64-bit integers within r.mapcalc. If
you need more digits for intermediate values, you may as well just use
a double and convert the final result with the int() function.

-- 
Glynn Clements <[EMAIL PROTECTED]>
_______________________________________________
grass-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/grass-dev

Reply via email to