Edit

kc3-lang/libxml2/os400/wrappers.c

Branch :

  • Show log

    Commit

  • Author : Patrick Monnerat
    Date : 2014-03-04 17:11:02
    Hash : 6e4d8703
    Message : OS400: UTF8<-->EBCDIC wrappers for system and external library calls

  • os400/wrappers.c
  • /**
    ***     UTF-8/EBCDIC wrappers to system and C library procedures.
    ***
    ***     See Copyright for the status of this software.
    ***
    ***     Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A.
    **/
    
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <dlfcn.h>
    #include <netdb.h>
    #include <errno.h>
    
    #include "config.h"
    
    #include "libxml/xmlmemory.h"
    
    #include "transcode.h"
    
    
    static const char *     lxdles = NULL;
    
    
    int
    _lx_getaddrinfo(const char * node, const char * service,
            const struct addrinfo * hints, struct addrinfo * * res)
    
    {
            xmlDictPtr d = NULL;
            int i;
    
            i = getaddrinfo(xmlTranscodeResult(node, NULL, &d, NULL),
                xmlTranscodeResult(service, NULL, &d, NULL), hints, res);
            xmlZapDict(&d);
            return i;
    }
    
    
    const char *
    _lx_inet_ntop(int af, const void * src, char * dst, socklen_t size)
    
    {
            const char * cp1 = inet_ntop(af, src, dst, size);
            char const * cp2;
            int i;
    
            if (!cp1)
                    return cp1;
    
            if (!(cp2 = xmlTranscodeString(cp1, NULL, NULL)))
                    return cp2;
    
            i = strlen(cp2);
    
            if (i >= size) {
                    xmlFree((char *) cp2);
                    errno = ENOSPC;
                    return (const char *) NULL;
                    }
    
            memcpy(dst, cp2, i + 1);
            xmlFree((char *) cp2);
            return dst;
    }
    
    
    void *
    _lx_dlopen(const char * filename, int flag)
    
    {
            xmlDictPtr d = NULL;
            void * result;
    
            result = dlopen(xmlTranscodeResult(filename, NULL, &d, NULL), flag);
            xmlZapDict(&d);
            return result;
    }
    
    
    void *
    _lx_dlsym(void * handle, const char * symbol)
    
    {
            xmlDictPtr d = NULL;
            void * result;
    
            result = dlsym(handle, xmlTranscodeResult(symbol, NULL, &d, NULL));
            xmlZapDict(&d);
            return result;
    }
    
    
    char *
    _lx_dlerror(void)
    
    {
            char * cp1 = (char *) dlerror();
    
            if (!cp1)
                    return cp1;
    
            if (lxdles)
                    xmlFree((char *) lxdles);
    
            lxdles = (const char *) xmlTranscodeString(cp1, NULL, NULL);
            return (char *) lxdles;
    }
    
    
    #ifdef HAVE_ZLIB_H
    #include <zlib.h>
    
    gzFile
    _lx_gzopen(const char * path, const char * mode)
    
    {
            xmlDictPtr d = NULL;
            gzFile f;
    
            f = gzopen(xmlTranscodeResult(path, NULL, &d, NULL),
                xmlTranscodeResult(mode, NULL, &d, NULL));
            xmlZapDict(&d);
            return f;
    }
    
    
    gzFile
    _lx_gzdopen(int fd, const char * mode)
    
    {
            xmlDictPtr d = NULL;
            gzFile f;
    
            f = gzdopen(fd, xmlTranscodeResult(mode, NULL, &d, NULL));
            xmlZapDict(&d);
            return f;
    }
    
    int
    _lx_inflateInit2_(z_streamp strm, int windowBits,
                                            const char * version, int stream_size)
    
    {
            xmlDictPtr d = NULL;
            int r;
    
            r = inflateInit2_(strm, windowBits,
                xmlTranscodeResult(version, NULL, &d, NULL), stream_size);
            xmlZapDict(&d);
            return r;
    }
    
    int
    _lx_deflateInit2_(z_streamp strm, int level, int method, int windowBits,
            int memLevel, int strategy, const char * version, int stream_size)
    
    {
            xmlDictPtr d = NULL;
            int r;
    
            r = deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
                xmlTranscodeResult(version, NULL, &d, NULL), stream_size);
            xmlZapDict(&d);
            return r;
    }
    
    #endif