|
Lines 27-32
Link Here
|
| 27 |
# include <langinfo.h> |
27 |
# include <langinfo.h> |
| 28 |
#endif |
28 |
#endif |
| 29 |
#include <limits.h> |
29 |
#include <limits.h> |
|
|
30 |
#include <locale.h> |
| 30 |
#include <stdarg.h> |
31 |
#include <stdarg.h> |
| 31 |
#include <stdio.h> |
32 |
#include <stdio.h> |
| 32 |
#include <stdlib.h> |
33 |
#include <stdlib.h> |
|
Lines 288-290
mprintf(const char *fmt, ...)
Link Here
|
| 288 |
va_end(ap); |
289 |
va_end(ap); |
| 289 |
return ret; |
290 |
return ret; |
| 290 |
} |
291 |
} |
|
|
292 |
|
| 293 |
/* |
| 294 |
* Set up libc for multibyte output in the user's chosen locale. |
| 295 |
* |
| 296 |
* XXX: we are known to have problems with Turkish (i/I confusion) so we |
| 297 |
* deliberately fall back to the C locale for now. Longer term we should |
| 298 |
* always prefer to select C.[encoding] if possible, but there's no |
| 299 |
* standardisation in locales between systems, so we'll need to survey |
| 300 |
* what's out there first. |
| 301 |
*/ |
| 302 |
void |
| 303 |
msetlocale(void) |
| 304 |
{ |
| 305 |
const char *vars[] = { "LC_ALL", "LC_CTYPE", "LANG", NULL }; |
| 306 |
char *cp; |
| 307 |
int i; |
| 308 |
|
| 309 |
/* |
| 310 |
* We can't yet cope with dotless/dotted I in Turkish locales, |
| 311 |
* so fall back to the C locale for these. |
| 312 |
*/ |
| 313 |
for (i = 0; vars[i] != NULL; i++) { |
| 314 |
if ((cp = getenv(vars[i])) == NULL) |
| 315 |
continue; |
| 316 |
if (strncasecmp(cp, "TR", 2) != 0) |
| 317 |
break; |
| 318 |
/* |
| 319 |
* If we're in a UTF-8 locale then prefer to use |
| 320 |
* the C.UTF-8 locale (or equivalent) if it exists. |
| 321 |
*/ |
| 322 |
if ((strcasestr(cp, "UTF-8") != NULL || |
| 323 |
strcasestr(cp, "UTF8") != NULL) && |
| 324 |
(setlocale(LC_CTYPE, "C.UTF-8") != NULL || |
| 325 |
setlocale(LC_CTYPE, "POSIX.UTF-8") != NULL)) |
| 326 |
return; |
| 327 |
setlocale(LC_CTYPE, "C"); |
| 328 |
return; |
| 329 |
} |
| 330 |
/* We can handle this locale */ |
| 331 |
setlocale(LC_CTYPE, ""); |
| 332 |
} |