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