[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Info-mtools] mtools does not work in Turkish locale
From: |
Pali Rohár |
Subject: |
Re: [Info-mtools] mtools does not work in Turkish locale |
Date: |
Thu, 22 Oct 2020 19:01:48 +0200 |
User-agent: |
NeoMutt/20180716 |
Hello!
On Thursday 22 October 2020 16:55:04 Chris Lamb wrote:
> $ LC_CTYPE=tr_TR.UTF-8 mtools
> Syntax error at line 5 for drive A: column 9 in file /etc/mtools.conf:
> unrecognized keyword
>
> $ echo $?
> 1
>
...
> As I describe in my followup to that bug, I can confirm that this is
> indeed locale issue, as commenting out the setlocale(3) call at the
> top of the "main" entry point fixes this issue.
>
> The following "patch" against mtools.c also ""works"" for me:
>
> +#ifdef HAVE_SETLOCALE
> + char *old_locale = setlocale(LC_ALL, NULL);
> + setlocale(LC_ALL, "C");
> + read_config();
> + setlocale(LC_ALL, old_locale);
> +#else
> read_config();
> +#endif
>
>
> .. but this is obviously not right, as it would mean that genuine
> syntax errors printed in read_config() would not be translated into,
> well, Turkish. Can't seem to get a "C" locale version of toupper(3) to
> work right this second, and am assuming you folks will have a cleaner
> solution anyway, hence forwarding this to you.
IIRC toupper() for lowercase i with dot in Turkish locale returns
uppercase I with dot. In English or C locale it is uppercase I without
dot.
I guess that for case-insensitive parsing of config options (which are
written in English) should be used toupper() variant in C locale.
There is a standard POSIX function toupper_l() which takes as a second
argument locale. So I think that for reading config file it should be
used function toupper_l() with C locale instead of locale-dependent
toupper() function.
--
Pali Rohár
pali.rohar@gmail.com