From: William <ros...@or...> - 2005-02-12 20:08:51
|
Chris Cannam wrote: > > On Saturday 12 Feb 2005 11:47, Pedro Lopez-Cabanillas wrote: >> When RG GUI is initialized, it has already POSIX or C locale, so the >> workaround proposed by William doesn't help. When NoteFontMap() >> constructor is reached, the program has changed to es_ES locale. But >> there isn't a single call to setLocale() in RG code. > > Perhaps, since we always want to use '.' as decimal point when reading > from our own XML files, we ought in any case to be avoiding a function > whose interpretation might depend on the locale. > > Since we don't care about exponents or bases or anything much else here, > we can easily throw in a crappy reimplementation of atof to do the work > here, and perhaps we should do that anyway. Unless you can suggest an > alternative library function that's guaranteed to be i18n-free. Rather than writing conversion functions completely from scratch, it should be possible to write a simple locale-independent wrapper function for each of strtod(), atoi() and atof(), e.g. double RosegardenString::atof(char *str) { char *saved_locale = setlocale(LC_NUMERIC, NULL); if (saved_locale) { saved_locale = strdup(saved_locale); setlocale(LC_NUMERIC, "C"); } double value = atof(str, NULL); ... if (saved_locale) { setlocale(LC_NUMERIC, saved_locale); free(saved_locale); } return value; } A rough call count (some of these may not actually matter): 185 toInt() (different separators for 1000s in different locales) 27 atoi() 18 toDouble() 10 toFloat() 1 atof() >> The big question remains. Why should it differ between cvs-01/19 and >> 02/09? Research continues. > > Of course, I'd still like to know this. So would I. William |