From ef5e26dc4667d4608d80094bef3d15b3f8c5bc06 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 22 Apr 2011 18:29:44 -0400 Subject: [PATCH] Fixed g_iconv() and g_convert(), improved unit test --- eglib/src/giconv.c | 20 ++-- eglib/src/glib.h | 2 - eglib/src/gunicode.c | 145 +++++++++++++++++---------- eglib/test/UTF-16BE.txt | Bin 0 -> 15242 bytes eglib/test/UTF-16LE.txt | Bin 0 -> 15242 bytes eglib/test/UTF-32BE.txt | Bin 0 -> 30484 bytes eglib/test/UTF-32LE.txt | Bin 0 -> 30484 bytes eglib/test/UTF-8.txt | 212 ++++++++++++++++++++++++++++++++++++++++ eglib/test/utf8.c | 79 ++++++++++++--- 9 files changed, 382 insertions(+), 76 deletions(-) create mode 100644 eglib/test/UTF-16BE.txt create mode 100644 eglib/test/UTF-16LE.txt create mode 100644 eglib/test/UTF-32BE.txt create mode 100644 eglib/test/UTF-32LE.txt create mode 100644 eglib/test/UTF-8.txt diff --git a/eglib/src/giconv.c b/eglib/src/giconv.c index a6bea6a27d7..a1dab060959 100644 --- a/eglib/src/giconv.c +++ b/eglib/src/giconv.c @@ -109,8 +109,11 @@ g_iconv_open (const char *to_charset, const char *from_charset) GIConv cd; guint i; - if (!to_charset || !from_charset || !to_charset[0] || !from_charset[0]) + if (!to_charset || !from_charset || !to_charset[0] || !from_charset[0]) { + errno = EINVAL; + return (GIConv) -1; + } for (i = 0; i < G_N_ELEMENTS (charsets); i++) { if (!g_ascii_strcasecmp (charsets[i].name, from_charset)) @@ -125,6 +128,8 @@ g_iconv_open (const char *to_charset, const char *from_charset) if ((icd = iconv_open (to_charset, from_charset)) == (iconv_t) -1) return (GIConv) -1; #else + errno = EINVAL; + return (GIConv) -1; #endif } @@ -178,21 +183,24 @@ g_iconv (GIConv cd, char **inbytes, size_t *inbytesleft, inptr = inbytes ? *inbytes : NULL; outleft = *outbytesleft; outptr = *outbytes; - c = cd->c; - do { - if (c == (gunichar) -1 && cd->decode (&inptr, &inleft, &c) == -1) { + if ((c = cd->c) != (gunichar) -1) + goto encode; + + while (inleft > 0) { + if (cd->decode (&inptr, &inleft, &c) == -1) { rc = -1; break; } + encode: if (cd->encode (c, &outptr, &outleft) == -1) { rc = -1; break; } - c = -1; - } while (inleft > 0 && outleft > 0); + c = (gunichar) -1; + } if (inbytesleft) *inbytesleft = inleft; diff --git a/eglib/src/glib.h b/eglib/src/glib.h index 96634b72484..a327d9c88c5 100644 --- a/eglib/src/glib.h +++ b/eglib/src/glib.h @@ -266,12 +266,10 @@ gint g_ascii_xdigit_value (gchar c); /* FIXME: g_strcasecmp supports utf8 unicode stuff */ #ifdef _MSC_VER #define g_strcasecmp stricmp -#define g_ascii_strcasecmp stricmp #define g_strncasecmp strnicmp #define g_strstrip(a) g_strchug (g_strchomp (a)) #else #define g_strcasecmp strcasecmp -#define g_ascii_strcasecmp strcasecmp #define g_ascii_strtoull strtoull #define g_strncasecmp strncasecmp #define g_strstrip(a) g_strchug (g_strchomp (a)) diff --git a/eglib/src/gunicode.c b/eglib/src/gunicode.c index 7ef1874254e..cb82409e57c 100644 --- a/eglib/src/gunicode.c +++ b/eglib/src/gunicode.c @@ -217,77 +217,114 @@ g_unichar_isspace (gunichar c) } gchar * -g_convert (const gchar *str, gssize len, - const gchar *to_codeset, const gchar *from_codeset, - gsize *bytes_read, gsize *bytes_written, GError **error) +g_convert (const gchar *str, gssize len, const gchar *to_charset, const gchar *from_charset, + gsize *bytes_read, gsize *bytes_written, GError **err) { - size_t str_len = len == -1 ? strlen (str) : len; - const char *strptr = (const char *) str; - size_t left, out_left, buffer_size; - char *buffer, *output; - char *result = NULL; + size_t outsize, outused, outleft, inleft, rc; + char *result, *outbuf, *inbuf; + gboolean flush = FALSE; + gboolean done = FALSE; GIConv cd; - if ((cd = g_iconv_open (to_codeset, from_codeset)) == (GIConv) -1) { + g_return_val_if_fail (str != NULL, NULL); + g_return_val_if_fail (to_charset != NULL, NULL); + g_return_val_if_fail (from_charset != NULL, NULL); + + if ((cd = g_iconv_open (to_charset, from_charset)) == (GIConv) -1) { + g_set_error (err, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION, g_strerror (ENOTSUP)); + if (bytes_written) *bytes_written = 0; + if (bytes_read) *bytes_read = 0; + return NULL; } - buffer_size = str_len + 1 + 8; - buffer = g_malloc (buffer_size); - out_left = str_len; - output = buffer; - left = str_len; + inleft = len < 0 ? strlen (str) : len; + inbuf = (char *) str; + + outleft = outsize = MAX (inleft, 8); + outbuf = result = g_malloc (outsize + 4); - while (left > 0){ - int res = g_iconv (cd, (char **) &strptr, &left, &output, &out_left); - if (res == (size_t) -1){ - if (errno == E2BIG){ - char *n; - size_t extra_space = 8 + left; - size_t output_used = output - buffer; + do { + if (!flush) + rc = g_iconv (cd, &inbuf, &inleft, &outbuf, &outleft); + else + rc = g_iconv (cd, NULL, NULL, &outbuf, &outleft); + + if (rc == (size_t) -1) { + switch (errno) { + case E2BIG: + /* grow our result buffer */ + outused = outbuf - result; + outsize += MAX (inleft, 8); + outleft += MAX (inleft, 8); + result = g_realloc (result, outsize + 4); + outbuf = result + outused; + break; + case EINVAL: + /* incomplete input, stop converting and terminate here */ + if (flush) + done = TRUE; + else + flush = TRUE; + break; + case EILSEQ: + /* illegal sequence in the input */ + g_set_error (err, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, "%s", g_strerror (errno)); - buffer_size += extra_space; + if (bytes_read) { + /* save offset of the illegal input sequence */ + *bytes_read = (inbuf - str); + } - n = g_realloc (buffer, buffer_size); + if (bytes_written) + *bytes_written = 0; - if (n == NULL){ - if (error != NULL) - *error = g_error_new (NULL, G_CONVERT_ERROR_FAILED, "No memory left"); - g_free (buffer); - result = NULL; - goto leave; - } - buffer = n; - out_left += extra_space; - output = buffer + output_used; - } else if (errno == EILSEQ){ - if (error != NULL) - *error = g_error_new (NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, "Invalid multi-byte sequence on input"); - result = NULL; - g_free (buffer); - goto leave; - } else if (errno == EINVAL){ - if (error != NULL) - *error = g_error_new (NULL, G_CONVERT_ERROR_PARTIAL_INPUT, "Partial character sequence"); - result = NULL; - g_free (buffer); - goto leave; + g_iconv_close (cd); + g_free (result); + return NULL; + default: + /* unknown errno */ + g_set_error (err, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, "%s", g_strerror (errno)); + + if (bytes_written) + *bytes_written = 0; + + if (bytes_read) + *bytes_read = 0; + + g_iconv_close (cd); + g_free (result); + return NULL; } - } - } - if (bytes_read != NULL) - *bytes_read = strptr - str; - if (bytes_written != NULL) - *bytes_written = output - buffer; - *output = 0; - result = buffer; - leave: + } else if (flush) { + /* input has been converted and output has been flushed */ + break; + } else { + /* input has been converted, need to flush the output */ + flush = TRUE; + } + } while (!done); + g_iconv_close (cd); + /* Note: not all charsets can be null-terminated with a single + null byte. UCS2, for example, needs 2 null bytes and UCS4 + needs 4. I hope that 4 null bytes is enough to terminate all + multibyte charsets? */ + + /* null-terminate the result */ + memset (outbuf, 0, 4); + + if (bytes_written) + *bytes_written = outbuf - result; + + if (bytes_read) + *bytes_read = inbuf - str; + return result; } diff --git a/eglib/test/UTF-16BE.txt b/eglib/test/UTF-16BE.txt new file mode 100644 index 0000000000000000000000000000000000000000..b7e494cb4d0b04f59c67a229cc96b8518945663d GIT binary patch literal 15242 zcmcJWX_Oq*b;oO_TSy*hN=?mZq(RJdO*h3fk|k!*Hrklc0ul%XLLvJ+@_1A>6&&=V~a9ob$&E8GkR&)rx%edcw+|awO`e`)kt={9^ zRQ*-!1E=~JeV?LtCRkfIHhR;&3puviF%g^Adb-M*iCp`*ZiV}W-sgZ^PpiY5%+qWy z4C~?3;k9veU}u{*m8*KCRSmwn!F}hm*Xm*_f_!i1LktMpPuPP6?$QAB3$O@j$(H& zty!GQ%om~bZn+JNWH7husqBU^LFGvhJ38e z1^Jp>!1Hifnc4-Um7a%EyIsHc5EedU@B;n2vA$?)BC}|vH(2JGwa{^MGV|Z(sW1FW z3@fv_+DMIuaGQJDm)%gMMYVu)LejvZaS{Hg(w|pHLR~J1rwdL#iftK6yTXJXR zhURVwXXh8^ms3l`bFulPA77|e??h8+uo)dTQk8cCbydGKlL@bKy-?=E=&ESxM{rz& zu0%XqmRNNr?{FQ&J%wyxqnagcbr4dOyiGi9Fu!P)t2ipT zSN4Cn=SuFi^;qf$sl(arseexWzzefp>QHtE@FUqRsmHiKn%$XtI`w@w8>Nn< z4rbp3`b6qbYFFx!)V}yR!9J2YoI02~klG8!t=MF9Sn7%2MN)QNnVduL{WNk880BuX z+odP?A|bnp`#zqL%5_in$@s03{Ky_m-HHVVt#>0=>HjFluGD_xu^WrkK9C*2@}gbY z_hfDMe^PhQw?DhpydwLLWZ{x+H;XpK_P{N>jlL(c8_h?D(CIxiLr47gSn6TCfQI;W zu#~5uJE1;BJG&YVgCPe^`rg!0Jc|cY`?8z77G%1$+r>5(wf5}g9AMs5X1I6P4b+#A z>Y;a5H?vv|=UKDATQ4P}dXnXWve?a08sn-P8PY3eDn61!-dA1vz1l_zAa z&g^!qI6%x5k3HB-K4m{k|D)!C#}Z4k>7rl$1=|&+M^fJhCXa|Z&Xw$ZKF(WINd$(7V@Vm3hjkim+z^e*G1`0Q|8lvlJ|UhXG1_CS5q`VMBV)SU=E z3f5eWrlW+u&9I)}V6`$S^W9J%MUTB?z}{lKl1e7M<53aUM`^Ff$`aK?MlH`r zh)qd{W%%`k*;r+ndpPcwm(3s93{~uAIN%c-F&YKR63c+1#}7iMcx6(LXP-2QN3u^z zE>@wjQ6#m=jn`e+d<0zObv@O_NmPzMk$Mts_s8){s4BDagR@xvODGRu@qW`z<40cD z9rHezokB(2rO|}uR-3sKW1C6#KzCR+D<{kr_<+4Hwt7!7qI;diF50oA1F0vAS!fcd zK5rVH8#|UC#&y6Vt=On`$hS65;}Otq+4~q(BFQovHKxgKa=}HfC5a=DDXLwLPn-!F z5ub%CRV|KTGO8p=RY&vYQRK^4Pg$NNmFNkpnQrEcGa{Z_l4|3$X-D6`DEwDG0@mg>Xx!`Ksg`# zL$&{)ye+R;4V7oM8Kr7hoKwzgWa42)lpCMjv>$O5UaoHA) zb|Rj{w9HP+`Xqn%+W0tH91A@*IvIUN?Z&PuiF7X2=%m6cBJnJo`fK8=`lQ;a6-22z z-=6(78XZjCg{-6WXmzBDsF}yD<@%YMH}m$sh8cW)X|Cl9xmMZ9%s%*QxaMiC^Ys3p zwV-}M>5u31ZE)HGFTI-zr#O3Op3S_F`OnNNnddVvcwy!k?H9Q|pW%BQeaA8>+WUjq9W+{Nj2TF0Szf%_@Ay=GiqaS_h^8<3YX zKQoNuw2W`&gi$^Rg{WW8{D;YZhW2yHU7lVs885=?EuNjWFVQbK$1`A}n|^Q5yLg9b zq`se^U0kIzZ)lEzi|mx#Q<;;-`&rXP@R#Y4&L<7?w3@=<6!`CAhdlI*S)W+@obi7h zU4MpWPjY`fw)%MH4Xk?AB>kjFC+{9NZ_D!6uu2>y-&y=D9OS*X=*2$MThy2Yim z9+anxO3`ZBn$Wl?%KyhqzZ2Z!xH>*SU%|4Y;;uNn1kKOUM>;7EHoAa0Yn_Cj zW?n?s*ReqPblhTz@4!}c%?69&%L-Inf7PfmBHr=@$+b7)WFoSW{VJsHR%FXTFz=S#rs;b~U7jcdL2E&*$9dNI%E z@;oIyi6{EuFq`(QxbGaEW~JwWAxX2+7b8P77o}&rXjfzhu}M#dW)5dJ-1sdJ9cG(; zv!R_s3t0JhP0uu`bEF&aE{>^CbwV}C^kqz=V;gozK3^Bog4CH#qMZfbX;zV0#imcE zaiT?gY{wk%7MQnYqwTbG7thnpcb&8@r`>~vvRQUWn(P(#4xTRpE{odI{6>PFGk9v} zX-0Yxy3Cg5&Nt~XJS!I6+$YnL_ouyYM9F93G2M7fOHbu4KZEJcGA^!1F_FA-Tyb&Q ziPu8p$uEl4v{)PIJq>TGr`TH&Kj<ZmRLW1l-Hg^Wh@9Wl2ecq^Ae2%D>4LN#RO! z=cP`gm`RVrwlQjb)6C{6u_jB9Aqy6mj`QTJ7}8-<#ecfRUcAN4{G48bo|lo|i7v{$ znebnfUThl4^G^RtE!_;RuOs@USYK0?^S*l}twqeI`rf>jcE_M^Df8KbpxJga@7jE6 zU=A*yr}Yh6-}Kzuv*zEh`1}18HlJ&jceAy7KTp2R=+Eg4VDI;H z!BLOi;Mx5EZ>06mJ-|YwC;IL7)a{S+r_!3>xA=4X(SDwL53okgc7Lef?YH{I$8V;u%^&Mm0ju&0 zoD=9j$M5nlrQPK(^sD_TTpRtl{&=`7aPr|Z39NC3UFBZ@*HLhqE9@ zAUX0Iz^M1<`C}99V;dX?$xK5z&mRt#h3GsK9^J@}pzlUf2RgRvAhGUJd(b`Ffu;5FNI0er^u)LO>B1v}oSiFvpK>S4s>EcER_pL)LrTJacV zJjVH*_zGW?`Jvk=Wq+f2;2bUkI?4YSvL)GFC(}~jIoy?x^3fsq9^Un!-7cwKK5ThQ%1iC4nW`G#*i@T&avK-BteMV^{S z4VNe98@1l+Ho|G}`{GjUaoC%od;b^S9{lEH=+^;RDSGWf=;hj9dQS}6g0aCnUKrdR zyb}xrg@Dyoa7W$8f+&XF2gc;OmClzze=r>QgTb)iPVV;vcLeW3*%vT31}lP#gE4hs zaA$&DH=<5l-UfSBu!&Yr&{P)%x6}H1@S_9^4xUku3Tgw!VlY3zd+>axF09Mbx}z>1 zY!yb`FmQ*JQJxC!uDhI`r-3#FcmW+8wXoy|g-C#nQh0@?~LJRd)@> zm-+G({+W!&o9MfnY>>al1P^j06M|;bAc6l7>mDr1+=wrS2R@i9gN=0yxhwLu!4z73 zbqkAlPY1uO8xqLtW8=7;Wj-vxZL-1d4z{8J(JIo&?-PO{X6p*9A0Nyz%-Z04@Ht70 zha0YYQ*`UO;&+;c{S7C)uwhTbzJ>=I?xl4v_aAe2@Mjyo-SDbm+~4qc-1`Fe7aJaE zcs%ZTyy5xvsEX9;E#OJjZaXlolapE~eAVh? zRlAb9q&*6*QVMq+ZCA4#d_9sj8;9-ms@kuzd84w*YIb4&2=cYtL7XO{hpMaFi@MIJ zWlc#x;jMw6^NX}B>F4GLRb^H5!M~!Fbkh5Q*5HZ8+U@DIOlp5gs|5E-!;p5a+RuT9 z+rg^2tC$~!MTM$DYvF7!EX<@8ASEnZUO2Zfv~YHztI$>;rwe_BQH2pnWJ|sDOov7o zjbK-Cg}%^S7{xUOWNe|{aBAShs;{uKFvBF(7)_JmH5NL-ZFb%%w8Nzt%GSaR@T=(Q zq%VYCaK}TsjyCQ!g%O4~sxTZ_W5MxF6(ag;pkUP-YiPbN_&~=NnhI1BIP;DUUvaC! z+8Ok86>6bsDpXhW3@L*|^f!Xt4CWB-)v@NHqprssTi|)NX;q5_qv@Mr+Ajt^8gGt5 znk1KNR1;g+W1O7EgYe^MG$Faxs1xsxHI9-V6-Lsgeu3L-wjjr}9}avpaOv5_QD5MV zL~)DtZ=v5et}cEf;U&)}UTri=$)F!w;&EPBj_(95<_zsbuR*y1+&x#(YJ>;+6wX7N zD)WDdcSznJn z$~v@F6p%RFo@J+#;4=PP^R=Ya;J@J<^(7ygRvL{it7Bc^HUij4D9+YN+j+)iViPjS z7`!o~=qZg_$D^4TXl7P!$_;;r15XH;p< zim8-IikLE4pXM;7;EOFW7 zEb6j8m$%NEGd6zs?sS#SeeRzv+Bu}zQ12I8S?R0#CvPJ9$A@Nx(%x6iTkb6-=k?Im zHzLi-;-P;)sDG|e>CGy~(@NXfF%O(R_7LgUqk(wFnF}ZPuM)i%Nt+Gys--s{=~3F3 ztes#x;9L5yPV%-^oT<=9`$y*S-f}TtqZaTEcPZbt7V%G;#q4Wa%0D5lu$@uM*#&%! z_X+P>?~};7kl%6iD^4eS$tLsfk*WMoD6R;|TZs-@0j$OcT9e#}4QtUtbMHoWxH|7` z<-KV;`t9`CG30&6yWiXE9rB*^PI#|+|L*<5d(Zog%a^b&tPjV8=Y~yTa~OuX@cgi? zC0BK2)rzVeRiD!yHg=`lmb#ta`0nSIJM9#DSUXD6ne^G|fG^PXe5GvXt7~U^lH-{3 za@G1LM6NYAF4wF5^)0uye52*Qmi;Y1Wk*~ln#tbdPeivykDfpM{BAG&ud3ht`n>M& z3)!%_I{ilT7ps?6AImQua%@Pu{hCtR@8x!zx__v+b;mY~tKJ9Qf0ioW>B@JYY2~$+ zL+dlWYir-_Dy{8Oe~(@J^$RAyT^_byeziYJzlqzPq_#b6zij(q+u^n!V_yvs-GE=U z|6h5iH(I?#mcQ$2Mdh+a8R6Dl)4@37NAwlv@iWi)_v0A-nbRlUTfW+MAYLP0@qcwb zZhIIr261~a9Yia|Fy5V64jCC$adg_X&T#xFh(<KKwTK68vu z%BV(1bEA0?a{?T;k?C8aPe+$UJED*_|L=*Kc#70(7=I4LX}3w*mFZUHt4A~IElvKMCeh(Nm>6N8;;YjHkuz@EKiwy-bv}($vHZj8nL>H>Z57V7}v|w zUvQqze=DM1dZ?_?A4Yw~g#SJZr)v3?`>hDf;q9U(cdDqt8cw8~q&; I@A7K?7s?-f1poj5 literal 0 HcmV?d00001 diff --git a/eglib/test/UTF-16LE.txt b/eglib/test/UTF-16LE.txt new file mode 100644 index 0000000000000000000000000000000000000000..30fe7b069881f653b17858602581c6cf9f658c89 GIT binary patch literal 15242 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 L|L>sj5$O6K-PL^s literal 0 HcmV?d00001 diff --git a/eglib/test/UTF-32BE.txt b/eglib/test/UTF-32BE.txt new file mode 100644 index 0000000000000000000000000000000000000000..a1fd5437bdc8ca1d5084491b156b5d617605640c GIT binary patch literal 30484 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 literal 0 HcmV?d00001 diff --git a/eglib/test/UTF-32LE.txt b/eglib/test/UTF-32LE.txt new file mode 100644 index 0000000000000000000000000000000000000000..043afc99273a582fd2a26cadbe4f16b4aa75a2ec GIT binary patch literal 30484 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 — 2002-07-25 + + +The ASCII compatible UTF-8 encoding used in this plain-text file +is defined in Unicode, ISO 10646-1, and RFC 2279. + + +Using Unicode/UTF-8, you can write in emails and source code things such as + +Mathematics and sciences: + + ∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ⎧⎡⎛┌─────┐⎞⎤⎫ + ⎪⎢⎜│a²+b³ ⎟⎥⎪ + ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ + ⎪⎢⎜⎷ c₈ ⎟⎥⎪ + ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⎨⎢⎜ ⎟⎥⎬ + ⎪⎢⎜ ∞ ⎟⎥⎪ + ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ + ⎪⎢⎜ ⎳aⁱ-bⁱ⎟⎥⎪ + 2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣⎝i=1 ⎠⎦⎭ + +Linguistics and dictionaries: + + ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn + Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ] + +APL: + + ((V⍳V)=⍳⍴V)/V←,V ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈ + +Nicer typography in plain text files: + + ╔══════════════════════════════════════════╗ + ║ ║ + ║ • ‘single’ and “double” quotes ║ + ║ ║ + ║ • Curly apostrophes: “We’ve been here” ║ + ║ ║ + ║ • Latin-1 apostrophe and accents: '´` ║ + ║ ║ + ║ • ‚deutsche‘ „Anführungszeichen“ ║ + ║ ║ + ║ • †, ‡, ‰, •, 3–4, —, −5/+5, ™, … ║ + ║ ║ + ║ • ASCII safety test: 1lI|, 0OD, 8B ║ + ║ ╭─────────╮ ║ + ║ • the euro symbol: │ 14.95 € │ ║ + ║ ╰─────────╯ ║ + ╚══════════════════════════════════════════╝ + +Combining characters: + + STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ + +Greek (in Polytonic): + + The Greek anthem: + + Σὲ γνωρίζω ἀπὸ τὴν κόψη + τοῦ σπαθιοῦ τὴν τρομερή, + σὲ γνωρίζω ἀπὸ τὴν ὄψη + ποὺ μὲ βία μετράει τὴ γῆ. + + ᾿Απ᾿ τὰ κόκκαλα βγαλμένη + τῶν ῾Ελλήνων τὰ ἱερά + καὶ σὰν πρῶτα ἀνδρειωμένη + χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά! + + From a speech of Demosthenes in the 4th century BC: + + Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι, + ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς + λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ + τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿ + εἰς τοῦτο προήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ + πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν + οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι, + οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν + ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον + τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι + γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν + προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους + σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ + τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ + τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς + τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον. + + Δημοσθένους, Γ´ ᾿Ολυνθιακὸς + +Georgian: + + From a Unicode conference invitation: + + გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო + კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს, + ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს + ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი, + ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება + ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში, + ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში. + +Russian: + + From a Unicode conference invitation: + + Зарегистрируйтесь сейчас на Десятую Международную Конференцию по + Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии. + Конференция соберет широкий круг экспертов по вопросам глобального + Интернета и Unicode, локализации и интернационализации, воплощению и + применению Unicode в различных операционных системах и программных + приложениях, шрифтах, верстке и многоязычных компьютерных системах. + +Thai (UCS Level 2): + + Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese + classic 'San Gua'): + + [----------------------------|------------------------] + ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช พระปกเกศกองบู๊กู้ขึ้นใหม่ + สิบสองกษัตริย์ก่อนหน้าแลถัดไป สององค์ไซร้โง่เขลาเบาปัญญา + ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนักหนา + โฮจิ๋นเรียกทัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัญ + เหมือนขับไสไล่เสือจากเคหา รับหมาป่าเข้ามาเลยอาสัญ + ฝ่ายอ้องอุ้นยุแยกให้แตกกัน ใช้สาวนั้นเป็นชนวนชื่นชวนใจ + พลันลิฉุยกุยกีกลับก่อเหตุ ช่างอาเพศจริงหนาฟ้าร้องไห้ + ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ + + (The above is a two-column text. If combining characters are handled + correctly, the lines of the second column should be aligned with the + | character above.) + +Ethiopian: + + Proverbs in the Amharic language: + + ሰማይ አይታረስ ንጉሥ አይከሰስ። + ብላ ካለኝ እንደአባቴ በቆመጠኝ። + ጌጥ ያለቤቱ ቁምጥና ነው። + ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው። + የአፍ ወለምታ በቅቤ አይታሽም። + አይጥ በበላ ዳዋ ተመታ። + ሲተረጉሙ ይደረግሙ። + ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል። + ድር ቢያብር አንበሳ ያስር። + ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም። + እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም። + የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ። + ሥራ ከመፍታት ልጄን ላፋታት። + ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል። + የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ። + ተንጋሎ ቢተፉ ተመልሶ ባፉ። + ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው። + እግርህን በፍራሽህ ልክ ዘርጋ። + +Runes: + + ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ + + (Old English, which transcribed into Latin reads 'He cwaeth that he + bude thaem lande northweardum with tha Westsae.' and means 'He said + that he lived in the northern land near the Western Sea.') + +Braille: + + ⡌⠁⠧⠑ ⠼⠁⠒ ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌ + + ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞ + ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎ + ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂ + ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙ + ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑ + ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲ + + ⡕⠇⠙ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ + + ⡍⠔⠙⠖ ⡊ ⠙⠕⠝⠰⠞ ⠍⠑⠁⠝ ⠞⠕ ⠎⠁⠹ ⠹⠁⠞ ⡊ ⠅⠝⠪⠂ ⠕⠋ ⠍⠹ + ⠪⠝ ⠅⠝⠪⠇⠫⠛⠑⠂ ⠱⠁⠞ ⠹⠻⠑ ⠊⠎ ⠏⠜⠞⠊⠊⠥⠇⠜⠇⠹ ⠙⠑⠁⠙ ⠁⠃⠳⠞ + ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡊ ⠍⠊⠣⠞ ⠙⠁⠧⠑ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ ⠍⠹⠎⠑⠇⠋⠂ ⠞⠕ + ⠗⠑⠛⠜⠙ ⠁ ⠊⠕⠋⠋⠔⠤⠝⠁⠊⠇ ⠁⠎ ⠹⠑ ⠙⠑⠁⠙⠑⠌ ⠏⠊⠑⠊⠑ ⠕⠋ ⠊⠗⠕⠝⠍⠕⠝⠛⠻⠹ + ⠔ ⠹⠑ ⠞⠗⠁⠙⠑⠲ ⡃⠥⠞ ⠹⠑ ⠺⠊⠎⠙⠕⠍ ⠕⠋ ⠳⠗ ⠁⠝⠊⠑⠌⠕⠗⠎ + ⠊⠎ ⠔ ⠹⠑ ⠎⠊⠍⠊⠇⠑⠆ ⠁⠝⠙ ⠍⠹ ⠥⠝⠙⠁⠇⠇⠪⠫ ⠙⠁⠝⠙⠎ + ⠩⠁⠇⠇ ⠝⠕⠞ ⠙⠊⠌⠥⠗⠃ ⠊⠞⠂ ⠕⠗ ⠹⠑ ⡊⠳⠝⠞⠗⠹⠰⠎ ⠙⠕⠝⠑ ⠋⠕⠗⠲ ⡹⠳ + ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ ⠏⠻⠍⠊⠞ ⠍⠑ ⠞⠕ ⠗⠑⠏⠑⠁⠞⠂ ⠑⠍⠏⠙⠁⠞⠊⠊⠁⠇⠇⠹⠂ ⠹⠁⠞ + ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ + + (The first couple of paragraphs of "A Christmas Carol" by Dickens) + +Compact font selection example text: + + ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 + abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ + –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд + ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა + +Greetings in various languages: + + Hello world, Καλημέρα κόσμε, コンニチハ + +Box drawing alignment tests: █ + ▉ + ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳ + ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳ + ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳ + ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳ + ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎ + ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏ + ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█ + ▝▀▘▙▄▟ diff --git a/eglib/test/utf8.c b/eglib/test/utf8.c index e7f04059d5b..c090864e8da 100644 --- a/eglib/test/utf8.c +++ b/eglib/test/utf8.c @@ -1,3 +1,5 @@ +#include + #include "test.h" /* @@ -241,22 +243,71 @@ test_utf8_to_utf16 () RESULT test_convert () { - gsize n; - char *s = g_convert ("\242\241\243\242\241\243\242\241\243\242\241\243", -1, "UTF-8", "ISO-8859-1", NULL, &n, NULL); - guchar *u = (guchar *) s; + static const char *charsets[] = { "UTF-8", "UTF-16LE", "UTF-16BE", "UTF-32LE", "UTF-32BE" }; + gsize content_length, converted_length, expected_length, k; + char *content, *converted, *expected, *path; + GError *err = NULL; + const char *srcdir; + gboolean loaded; + guint i, j; - if (!s) - return FAILED ("Expected 24 bytes, got: NULL"); - - if (strlen (s) != 24) - return FAILED ("Expected 24 bytes, got: %d", strlen (s)); - - if (u [1] != 162 || u [2] != 194 || - u [3] != 161 || u [4] != 194 || - u [5] != 163 || u [6] != 194) - return FAILED ("Incorrect conversion"); + if (!(srcdir = getenv ("srcdir"))) + return FAILED ("srcdir not defined!"); - g_free (s); + for (i = 0; i < G_N_ELEMENTS (charsets); i++) { + path = g_strdup_printf ("%s%c%s.txt", srcdir, G_DIR_SEPARATOR, charsets[i]); + loaded = g_file_get_contents (path, &content, &content_length, &err); + g_free (path); + + if (!loaded) { + fprintf (stderr, "test_convert(): error loading test file for %s: %s\n", charsets[i], err->message); + g_error_free (err); + err = NULL; + continue; + } + + for (j = 0; j < G_N_ELEMENTS (charsets); j++) { + path = g_strdup_printf ("%s%c%s.txt", srcdir, G_DIR_SEPARATOR, charsets[j]); + loaded = g_file_get_contents (path, &expected, &expected_length, NULL); + g_free (path); + + if (!loaded) { + fprintf (stderr, "test_convert(): error loading test file for %s\n", charsets[i]); + continue; + } + + converted = g_convert (content, content_length, charsets[j], charsets[i], NULL, &converted_length, NULL); + + if (converted == NULL) { + g_free (expected); + g_free (content); + return FAILED ("Failed to convert from %s to %s: NULL", charsets[i], charsets[j]); + } + + if (converted_length != expected_length) { + g_free (converted); + g_free (expected); + g_free (content); + return FAILED ("Failed to convert from %s to %s: expected %u bytes, got %u", + charsets[i], charsets[j], expected_length, converted_length); + } + + for (k = 0; k < converted_length; k++) { + if (converted[k] != expected[k]) { + g_free (converted); + g_free (expected); + g_free (content); + return FAILED ("Failed to convert from %s to %s: expected 0x%x at offset %u, got 0x%x", + charsets[i], charsets[j], expected[k], k, converted[k]); + } + } + + g_free (converted); + g_free (expected); + } + + g_free (content); + } return OK; } -- 2.25.1