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