Bug nalezen: isprint() vs diakriticka znamenka
Cejka Rudolf
cejkar na dcse.fee.vutbr.cz
Pondělí Září 7 14:19:04 CEST 1998
Michal Hucik (chaky na goliash.inext.cz) wrote:
: Petr Kolar (PETR.KOLAR na vslib.cz) wrote:
: > chaky na goliash.inext.cz (Michal Hucik) wrote:
: [ ... ]
: > Nemuzu si pomoci, ale ten clovek, ktery tohle vymyslel, vedel o locales
: > asi tolik jako Hurvinek. To si nemohl nekde precist, ze existuji nejake
: > kategorie locales, a ze by mel misto
: > setlocale (LC_ALL, "C");
: > udelat
: > setlocale (LC_NUMERIC, "C");
: > !?!?! Kvuli tumu, ze program potrebuje zapsat do konfiguracniho souboru
: > nejaka cisla (a pak je precist), tak uzivatel nemuze pouzivat ISO-8859-2,
: > a kdyby na to prislo, nemuze mit jeho jazykem mluvici program.
: > Kam se maji posilat bug reporty?
: Autor je Damon Chaplin (DAChaplin na msn.com) ... uz mu posilam patch i s
: opravou toho prekodovani do hex - myslim si ze rozumnejsi bude kodovat to do
: oct.
: Vzhledem k tomu ze nekdo vyviji nejakou aplikaci v UK, tak docela chapu, ze
: jsou mu nejake ty locales zcela putna <g> ...
Zadrzte! Takove nesmysly mu neposilejte! Opet opakuji: I v teto
dobe stale existuje spousta lidi, kteri toho o locales moc nevi (vcetne
me ;-)). Ale prave Damon Chaplin podle zdrojovek, ktere jsem videl,
naopak locales jako jeden z mala pravdepodobne ovlada!
(Vyrez z programu, ktery jsem videl, naopak vypadal docela korektne.)
Zkuste nasledujici test na svem pocitaci:
--------------------------------------------------------------------------
#include <ctype.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void prloc(void)
{
int i, c;
c = 0;
for (i = 0; i < 256; i++)
if (isprint(i))
c++;
printf("LC_ALL = %s (printable characters: %d)\n",
setlocale(LC_ALL, NULL), c);
}
char *stloc(int save, int cat, char *scat, char *loc)
{
char *old;
if (save)
old = strdup(setlocale(LC_ALL, NULL));
else
old = NULL;
setlocale(cat, loc);
printf("setlocale(%s, \"%s\")%s\n", scat, loc, \
save ? " (old saved)" : "");
return old;
}
int main(void)
{
char *old;
prloc();
(void)stloc(0, LC_CTYPE, "LC_CTYPE", "");
prloc();
old = stloc(1, LC_ALL, "LC_ALL", "C");
prloc();
(void)stloc(0, LC_ALL, "LC_ALL", old);
prloc();
free(old);
return 0;
}
--------------------------------------------------------------------------
Vystup by mel vypadat priblizne takto:
--------------------------------------------------------------------------
LC_ALL = C (printable characters: 95)
setlocale(LC_CTYPE, "")
LC_ALL = C/cs/C/C/C/C (printable characters: 190)
setlocale(LC_ALL, "C") (old saved)
LC_ALL = C (printable characters: 95)
setlocale(LC_ALL, "C/cs/C/C/C/C")
LC_ALL = C/cs/C/C/C/C (printable characters: 190)
--------------------------------------------------------------------------
Pokud na poslednim radku vidite pouze 95 tisknutelnych znaku, pak zavada
neni v Damon Chaplinovi, ale nekde uplne jinde. Napriklad ve spatne
libc knihovne, kterou timto budete moct s klidem zahodit :-).
--------------------------------------------------------------------------
Rudolf Cejka (cejkar na dcse.fee.vutbr.cz; http://www.fee.vutbr.cz/~cejkar)
Technical University of Brno, Faculty of El. Engineering and Comp. Science
Bozetechova 2, 612 66 Brno, Czech Republic
Další informace o konferenci Linux