transcode.c revision 5621c81b49cf2c2eb7b110d862f4b52b916f82b2
15621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat/** 25621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** Transcoding support and wrappers. 35621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** 45621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** See Copyright for the status of this software. 55621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** 65621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A. 75621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat**/ 85621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 95621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat#define IN_LIBXML 105621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat#include "libxml.h" 115621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 125621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat#include <sys/types.h> 135621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat#include <iconv.h> 145621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat#include "libxml/xmlmemory.h" 155621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat#include "libxml/dict.h" 165621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat#include "transcode.h" 175621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 185621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 195621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat/** 205621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** Destroy a dictionary and mark as destroyed. 215621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat**/ 225621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 235621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monneratvoid 245621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick MonneratxmlZapDict(xmlDictPtr * dict) 255621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 265621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat{ 275621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (dict && *dict) { 285621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat xmlDictFree(*dict); 295621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat *dict = (xmlDictPtr) NULL; 305621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat } 315621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat} 325621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 335621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 345621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat/** 355621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** Support for inline conversion from/to UTF-8. 365621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** This is targetted to function parameter encoding conversion. 375621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** Method is: 385621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** - Convert string from/to UTF-8. 395621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** - Keep it in a dictionary. 405621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** - Free original string if a release procedure is provided. 415621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** Can also be called without dictionary to convert a string from/to UTF-8 425621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** into xmlMalloc'ed dynamic storage. 435621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat**/ 445621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 455621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monneratconst char * 465621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick MonneratxmlTranscodeResult(const xmlChar * s, const char * encoding, 475621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat xmlDictPtr * dict, void (*freeproc)(const void *)) 485621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 495621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat{ 505621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat size_t l; 515621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat iconv_t cd; 525621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat char * srcp; 535621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat char * dstp; 545621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat size_t srcc; 555621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat size_t dstc; 565621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat char * ts; 575621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat const char * ret; 585621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat int err; 595621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat static const int nullstring[] = { 0 }; 605621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 615621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat /* Convert from UTF-8. */ 625621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 635621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!s) 645621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return (const char *) NULL; 655621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 665621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat ret = (const char *) NULL; 675621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat ts = (char *) NULL; 685621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat err = 0; 695621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat l = xmlStrlen(s); 705621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 715621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!l && dict) 725621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat ret = (const char *) nullstring; 735621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat else { 745621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (dict && !*dict) 755621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat err = !(*dict = xmlDictCreate()); 765621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 775621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!err) 785621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat err = !(ts = xmlMalloc(4 * l + 4)); 795621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 805621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat dstp = ts; 815621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat dstc = 4 * l; 825621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 835621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!err && l) { 845621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!encoding) 855621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat encoding = "ibm-0"; /* Job's encoding. */ 865621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 875621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat cd = iconv_open(encoding, "UTF-8"); 885621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 895621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (cd == (iconv_t) -1) 905621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat err = 1; 915621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat else { 925621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat srcp = (char *) s; 935621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat srcc = l; 945621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat srcc = iconv(cd, &srcp, &srcc, &dstp, &dstc); 955621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat iconv_close(cd); 965621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat err = srcc == (size_t) -1; 975621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat } 985621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat } 995621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1005621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!err) { 1015621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat dstp[0] = dstp[1] = dstp[2] = dstp[3] = '\0'; 1025621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1035621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!dict) { 1045621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (dstc) 1055621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat ts = xmlRealloc(ts, (dstp - ts) + 4); 1065621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1075621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat ret = (const char *) ts; 1085621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat ts = (char *) NULL; 1095621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat } 1105621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat else 1115621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat ret = (char *) xmlDictLookup(*dict, 1125621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat (xmlChar *) ts, dstp - ts + 1); 1135621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat } 1145621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat } 1155621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1165621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (ts) 1175621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat xmlFree(ts); 1185621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1195621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (freeproc) 1205621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat (*freeproc)(s); 1215621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1225621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return ret; 1235621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat} 1245621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1255621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1265621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat/** 1275621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** Support for inline conversion to UTF-8. 1285621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** Method is: 1295621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** - Convert string to UTF-8. 1305621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** - Keep it in a dictionary. 1315621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** Can also be called without dictionary to convert a string to UTF-8 into 1325621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** xmlMalloc'ed dynamic storage. 1335621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat**/ 1345621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1355621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monneratstatic const xmlChar * 1365621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick MonneratinTranscode(const char * s, size_t l, const char * encoding, xmlDictPtr * dict) 1375621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1385621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat{ 1395621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat iconv_t cd; 1405621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat char * srcp; 1415621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat char * dstp; 1425621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat size_t srcc; 1435621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat size_t dstc; 1445621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat xmlChar * ts; 1455621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat const xmlChar * ret; 1465621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat static const xmlChar nullstring[] = { 0 }; 1475621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1485621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!l && dict) 1495621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return nullstring; 1505621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1515621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (dict && !*dict) 1525621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!(*dict = xmlDictCreate())) 1535621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return (const xmlChar *) NULL; 1545621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1555621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat ts = (xmlChar *) xmlMalloc(6 * l + 1); 1565621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1575621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!ts) 1585621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return (const xmlChar *) NULL; 1595621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1605621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat dstp = (char *) ts; 1615621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat dstc = 6 * l; 1625621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1635621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (l) { 1645621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!encoding) 1655621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat encoding = "ibm-0"; /* Use job's encoding. */ 1665621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1675621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat cd = iconv_open("UTF-8", encoding); 1685621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1695621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (cd == (iconv_t) -1) { 1705621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat xmlFree((char *) ts); 1715621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return (const xmlChar *) NULL; 1725621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat } 1735621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1745621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat srcp = (char *) s; 1755621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat srcc = l; 1765621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat srcc = iconv(cd, &srcp, &srcc, &dstp, &dstc); 1775621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat iconv_close(cd); 1785621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1795621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (srcc == (size_t) -1) { 1805621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat xmlFree((char *) ts); 1815621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return (const xmlChar *) NULL; 1825621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat } 1835621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat } 1845621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1855621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat *dstp = '\0'; 1865621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1875621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!dict) { 1885621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (dstc) 1895621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat ts = xmlRealloc(ts, (dstp - ts) + 1); 1905621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1915621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return ts; 1925621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat } 1935621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1945621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat ret = xmlDictLookup(*dict, ts, dstp - ts + 1); 1955621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat xmlFree((char *) ts); 1965621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return ret; 1975621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat} 1985621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 1995621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2005621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat/** 2015621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** Input 8-bit character string parameter. 2025621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat**/ 2035621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2045621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monneratconst xmlChar * 2055621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick MonneratxmlTranscodeString(const char * s, const char * encoding, xmlDictPtr * dict) 2065621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2075621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat{ 2085621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!s) 2095621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return (const xmlChar *) NULL; 2105621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2115621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return inTranscode(s, xmlStrlen(s), encoding, dict); 2125621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat} 2135621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2145621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2155621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat/** 2165621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** Input 16-bit character string parameter. 2175621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat**/ 2185621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2195621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monneratconst xmlChar * 2205621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick MonneratxmlTranscodeWString(const char * s, const char * encoding, xmlDictPtr * dict) 2215621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2225621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat{ 2235621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat size_t i; 2245621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2255621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!s) 2265621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return (const xmlChar *) NULL; 2275621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2285621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat for (i = 0; s[i] && s[i + 1]; i += 2) 2295621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat ; 2305621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2315621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return inTranscode(s, i, encoding, dict); 2325621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat} 2335621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2345621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2355621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat/** 2365621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** Input 32-bit character string parameter. 2375621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat**/ 2385621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2395621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monneratconst xmlChar * 2405621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick MonneratxmlTranscodeHString(const char * s, const char * encoding, xmlDictPtr * dict) 2415621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2425621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat{ 2435621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat size_t i; 2445621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2455621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat if (!s) 2465621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return (const xmlChar *) NULL; 2475621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2485621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat for (i = 0; s[i] && s[i + 1] && s[i + 2] && s[i + 3]; i += 4) 2495621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat ; 2505621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2515621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return inTranscode(s, i, encoding, dict); 2525621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat} 2535621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2545621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2555621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat/** 2565621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat*** vasprintf() implementation with result transcoding. 2575621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat**/ 2585621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2595621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monneratconst char * 2605621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick MonneratxmlVasprintf(xmlDictPtr * dict, const char * encoding, 2615621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat const xmlChar * fmt, va_list args) 2625621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2635621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat{ 2645621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat char * s = NULL; 2655621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat 2665621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat vasprintf(&s, fmt, args); 2675621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat return xmlTranscodeResult((const xmlChar *) s, encoding, dict, free); 2685621c81b49cf2c2eb7b110d862f4b52b916f82b2Patrick Monnerat} 269