X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=locale.c;h=0986614794f2518d99b38d4675b25ee9133f23fa;hb=9497474043a29ae84d941e84594160f022e3f31c;hp=22e903037a4b41d70903a430086c3fee84f04fd8;hpb=be3c0a43e1e6b1244032726df02a3ab450a3c4be;p=p5sagit%2Fp5-mst-13.2.git diff --git a/locale.c b/locale.c index 22e9030..0986614 100644 --- a/locale.c +++ b/locale.c @@ -25,6 +25,12 @@ # include #endif +#ifdef I_LANGINFO +# include +#endif + +#include "reentr.h" + /* * Standardize the locale name from a string returned by 'setlocale'. * @@ -212,7 +218,7 @@ Perl_new_collate(pTHX_ char *newcoll) SSize_t mult = fb - fa; if (mult < 1) Perl_croak(aTHX_ "strxfrm() gets absurd"); - PL_collxfrm_base = (fa > mult) ? (fa - mult) : 0; + PL_collxfrm_base = (fa > (Size_t)mult) ? (fa - mult) : 0; PL_collxfrm_mult = mult; } } @@ -462,10 +468,60 @@ Perl_init_i18nl10n(pTHX_ int printwarn) #ifdef USE_LOCALE_NUMERIC new_numeric(curnum); #endif /* USE_LOCALE_NUMERIC */ + } #endif /* USE_LOCALE */ +#ifdef USE_PERLIO + { + /* Set PL_wantutf8 to TRUE if using PerlIO _and_ + any of the following are true: + - nl_langinfo(CODESET) contains /^utf-?8/i + - $ENV{LANGUAGE} contains /^utf-?8/i (only if using glibc) + - $ENV{LC_CALL} contains /^utf-?8/i + - $ENV{LC_CTYPE} contains /^utf-?8/i + - $ENV{LANG} contains /^utf-?8/i + If PL_wantutf8 is true, perl.c:S_parse_body() + will turn on the PerlIO :utf8 discipline on STDIN, STDOUT, + STDERR, _and_ the default open discipline. + */ + bool wantutf8 = FALSE; + char *codeset = NULL; +#if defined(HAS_NL_LANGINFO) && defined(CODESET) + codeset = nl_langinfo(CODESET); +#endif + if (codeset && + (ibcmp(codeset, "UTF-8", 5) == 0 || + ibcmp(codeset, "UTF8", 4) == 0)) + wantutf8 = TRUE; +#if defined(USE_LOCALE) +#ifdef __GLIBC__ + if (!wantutf8 && language && + (ibcmp(language, "UTF-8", 5) == 0 || + ibcmp(language, "UTF8", 4) == 0)) + wantutf8 = TRUE; +#endif + if (!wantutf8 && lc_all && + (ibcmp(lc_all, "UTF-8", 5) == 0 || + ibcmp(lc_all, "UTF8", 4) == 0)) + wantutf8 = TRUE; +#ifdef USE_LOCALE_CTYPE + if (!wantutf8 && curctype && + (ibcmp(curctype, "UTF-8", 5) == 0 || + ibcmp(curctype, "UTF8", 4) == 0)) + wantutf8 = TRUE; +#endif + if (!wantutf8 && lang && + (ibcmp(lang, "UTF-8", 5) == 0 || + ibcmp(lang, "UTF8", 4) == 0)) + wantutf8 = TRUE; +#endif /* USE_LOCALE */ + if (wantutf8) + PL_wantutf8 = TRUE; + } +#endif + #ifdef USE_LOCALE_CTYPE if (curctype != NULL) Safefree(curctype); @@ -520,7 +576,7 @@ Perl_mem_collxfrm(pTHX_ const char *s, STRLEN len, STRLEN *xlen) xused = strxfrm(xbuf + xout, s + xin, xAlloc - xout); if (xused == -1) goto bad; - if (xused < xAlloc - xout) + if ((STRLEN)xused < xAlloc - xout) break; xAlloc = (2 * xAlloc) + 1; Renew(xbuf, xAlloc, char);