Mercurial > sdl-ios-xcode
view test/Makefile.in @ 3539:f2846bf19360
Fixed bug #896
John Popplewell 2009-12-08 23:05:50 PST
Originally reported by AKFoerster on the mailing list.
Error decoding UTF8 Russian text to UTF-16LE on Windows, but specifically on
platforms without iconv support (the default on Windows).
Valid UTF8 characters are flagged as being overlong and then substituted by the
UNKNOWN_UNICODE character.
After studying the testiconv.c example program, reading the RFCs and putting
some printf statements in SDL_iconv.c the problem is in a test for 'Maximum
overlong sequences', specifically 4.2.1, which is carried out by the following
code:
} else if ( p[0] >= 0xC0 ) {
if ( (p[0] & 0xE0) != 0xC0 ) {
/* Skip illegal sequences
return SDL_ICONV_EILSEQ;
*/
ch = UNKNOWN_UNICODE;
} else {
if ( (p[0] & 0xCE) == 0xC0 ) { <<<<<<<< here
overlong = SDL_TRUE;
}
ch = (Uint32)(p[0] & 0x1F);
left = 1;
}
} else {
Here is the 2-byte encoding of a character in range 00000080 - 000007FF
110xxxxx 10xxxxxx
The line in question is supposed to be checking for an overlong sequence which
would be less than
11000001 10111111
which should be represented as a single byte.
BUT, the mask value (0xCE) is wrong, it isn't checking the top-most bit:
11000001 value
11001110 mask (incorrect)
^
and should be (0xDE):
11000001 value
11011110 mask (correct)
making the above code:
} else if ( p[0] >= 0xC0 ) {
if ( (p[0] & 0xE0) != 0xC0 ) {
/* Skip illegal sequences
return SDL_ICONV_EILSEQ;
*/
ch = UNKNOWN_UNICODE;
} else {
if ( (p[0] & 0xDE) == 0xC0 ) { <<<<<<<< here
overlong = SDL_TRUE;
}
ch = (Uint32)(p[0] & 0x1F);
left = 1;
}
} else {
I can supply a test program and/or a patch if required,
best regards,
John Popplewell
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 11 Dec 2009 08:03:43 +0000 |
parents | 64a60c5d502e |
children | 5ea08f1c29d0 |
line wrap: on
line source
# Makefile to build the SDL tests srcdir = @srcdir@ CC = @CC@ EXE = @EXE@ CFLAGS = @CFLAGS@ LIBS = @LIBS@ TARGETS = checkkeys$(EXE) graywin$(EXE) loopwave$(EXE) testalpha$(EXE) testatomic$(EXE) testaudioinfo$(EXE) testbitmap$(EXE) testblitspeed$(EXE) testcursor$(EXE) testdraw2$(EXE) testdyngles$(EXE) testdyngl$(EXE) testerror$(EXE) testfile$(EXE) testgamma$(EXE) testgl2$(EXE) testgles$(EXE) testgl$(EXE) testhaptic$(EXE) testhread$(EXE) testiconv$(EXE) testime$(EXE) testintersections$(EXE) testjoystick$(EXE) testkeys$(EXE) testloadso$(EXE) testlock$(EXE) testmmousetablet$(EXE) testmultiaudio$(EXE) testoverlay2$(EXE) testoverlay$(EXE) testpalette$(EXE) testplatform$(EXE) testpower$(EXE) testresample$(EXE) testsem$(EXE) testsprite2$(EXE) testsprite$(EXE) testspriteminimal$(EXE) testtimer$(EXE) testver$(EXE) testvidinfo$(EXE) testwin$(EXE) testwm2$(EXE) testwm$(EXE) threadwin$(EXE) torturethread$(EXE) all: Makefile $(TARGETS) Makefile: $(srcdir)/Makefile.in $(SHELL) config.status $@ checkkeys$(EXE): $(srcdir)/checkkeys.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) graywin$(EXE): $(srcdir)/graywin.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) loopwave$(EXE): $(srcdir)/loopwave.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testresample$(EXE): $(srcdir)/testresample.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testaudioinfo$(EXE): $(srcdir)/testaudioinfo.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testmultiaudio$(EXE): $(srcdir)/testmultiaudio.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testpower$(EXE): $(srcdir)/testpower.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testalpha$(EXE): $(srcdir)/testalpha.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) @MATHLIB@ testbitmap$(EXE): $(srcdir)/testbitmap.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testblitspeed$(EXE): $(srcdir)/testblitspeed.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testcursor$(EXE): $(srcdir)/testcursor.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testintersections$(EXE): $(srcdir)/testintersections.c $(srcdir)/common.c $(CC) -o $@ $(srcdir)/testintersections.c $(srcdir)/common.c $(CFLAGS) $(LIBS) testdraw2$(EXE): $(srcdir)/testdraw2.c $(srcdir)/common.c $(CC) -o $@ $(srcdir)/testdraw2.c $(srcdir)/common.c $(CFLAGS) $(LIBS) testdyngl$(EXE): $(srcdir)/testdyngl.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testdyngles$(EXE): $(srcdir)/testdyngles.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testerror$(EXE): $(srcdir)/testerror.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testfile$(EXE): $(srcdir)/testfile.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testgamma$(EXE): $(srcdir)/testgamma.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) @MATHLIB@ testgl$(EXE): $(srcdir)/testgl.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) @GLLIB@ @MATHLIB@ testgl2$(EXE): $(srcdir)/testgl2.c $(srcdir)/common.c $(CC) -o $@ $(srcdir)/testgl2.c $(srcdir)/common.c $(CFLAGS) $(LIBS) @GLLIB@ @MATHLIB@ testgles$(EXE): $(srcdir)/testgles.c $(srcdir)/common.c $(CC) -o $@ $(srcdir)/testgles.c $(srcdir)/common.c $(CFLAGS) $(LIBS) @GLLIB@ @MATHLIB@ testhread$(EXE): $(srcdir)/testhread.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testiconv$(EXE): $(srcdir)/testiconv.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testjoystick$(EXE): $(srcdir)/testjoystick.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testkeys$(EXE): $(srcdir)/testkeys.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testlock$(EXE): $(srcdir)/testlock.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testoverlay2$(EXE): $(srcdir)/testoverlay2.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testoverlay$(EXE): $(srcdir)/testoverlay.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testpalette$(EXE): $(srcdir)/testpalette.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) @MATHLIB@ testplatform$(EXE): $(srcdir)/testplatform.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testsem$(EXE): $(srcdir)/testsem.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testspriteminimal$(EXE): $(srcdir)/testspriteminimal.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) @MATHLIB@ testsprite$(EXE): $(srcdir)/testsprite.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) @MATHLIB@ testsprite2$(EXE): $(srcdir)/testsprite2.c $(srcdir)/common.c $(CC) -o $@ $(srcdir)/testsprite2.c $(srcdir)/common.c $(CFLAGS) $(LIBS) @MATHLIB@ testtimer$(EXE): $(srcdir)/testtimer.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testver$(EXE): $(srcdir)/testver.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testvidinfo$(EXE): $(srcdir)/testvidinfo.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testwin$(EXE): $(srcdir)/testwin.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testwm$(EXE): $(srcdir)/testwm.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testwm2$(EXE): $(srcdir)/testwm2.c $(srcdir)/common.c $(CC) -o $@ $(srcdir)/testwm2.c $(srcdir)/common.c $(CFLAGS) $(LIBS) threadwin$(EXE): $(srcdir)/threadwin.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) torturethread$(EXE): $(srcdir)/torturethread.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testloadso$(EXE): $(srcdir)/testloadso.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testhaptic$(EXE): $(srcdir)/testhaptic.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testmmousetablet$(EXE): $(srcdir)/testmmousetablet.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testatomic$(EXE): $(srcdir)/testatomic.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) testime$(EXE): $(srcdir)/testime.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) @SDL_TTF_LIB@ clean: rm -f $(TARGETS) distclean: clean rm -f Makefile rm -f config.status config.cache config.log rm -rf $(srcdir)/autom4te*