[OSRS-PROJ] On Proj4...

Karl Swartz karl at kls2.com
Thu May 30 15:22:47 EDT 2002

> The problem was that strtod("15d10") on VC++ treated the value as 15 times
> 10 to the exponent 10 (scientific notation).  The values like "15d10" are
> common in DMS specific inputs.  The problem with replacing it with my
> own implementation is I don't know how widely the custom strtod() is used,
> and hence how much of the full strtod() functionality needs to be
> replicated.

If that's the issue, and if callers don't require the const storage
class on the first argument (which is unlikely to be an issue), why
not put a wrapper around the library one which just masks that issue?
I haven't looked at the PROJ.4 code in ages, but something like this
in a .h file used by everyone

    #define strtod(nptr, endptr) strtod_wrapper((nptr)), ((endptr))

    strtod_wrapper(/* const */ char *nptr, char **endptr)

and then wherever the current GPV-infested strtod() is located

    #undef strtod(nptr, endptr)

    strtod_wrapper(/* const */ char *nptr, char **endptr)
        char c, *cp = nptr;
        double result;

        /* Scan for characters which cause problems with VC++ strtod()
        while ((c = *cp) != '\0') {
            if (c == 'd' || c == 'D') {

                /* Found one, so NUL it out, call strtod(),
                /* then restore it and return
                *cp = '\0';
                result = strtod(nptr, endptr);
                *cp = c;
                return result;

        /* Nothing troublesome found, so just call the library function
        return strtod(nptr, endptr);

Karl Swartz	|Home	karl at kls2.com		http://www.kls2.com/~karl/
		|Work	karl at quartetns.com	http://www.quartetns.com/
"The average dog is a nicer person than the average person."
  - Andrew A. Rooney
PROJ.4 Discussion List
See http://www.remotesensing.org/proj for subscription, unsubscription
and other information.

More information about the Proj mailing list