Blame os400/libxmlmain.c

Packit Service a31ea6
/**
Packit Service a31ea6
***     QADRT/QADRTMAIN2 substitution program.
Packit Service a31ea6
***     This is needed because the IBM-provided QADRTMAIN2 does not
Packit Service a31ea6
***     properly translate arguments by default or if no locale is provided.
Packit Service a31ea6
***
Packit Service a31ea6
***     See Copyright for the status of this software.
Packit Service a31ea6
***
Packit Service a31ea6
***     Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A.
Packit Service a31ea6
**/
Packit Service a31ea6
Packit Service a31ea6
#include <stdlib.h>
Packit Service a31ea6
#include <string.h>
Packit Service a31ea6
#include <iconv.h>
Packit Service a31ea6
#include <errno.h>
Packit Service a31ea6
#include <locale.h>
Packit Service a31ea6
Packit Service a31ea6
/* Do not use qadrt.h since it defines unneeded static procedures. */
Packit Service a31ea6
extern void     QadrtInit(void);
Packit Service a31ea6
extern int      QadrtFreeConversionTable(void);
Packit Service a31ea6
extern int      QadrtFreeEnviron(void);
Packit Service a31ea6
extern char *   setlocale_a(int, const char *);
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
/* The ASCII main program. */
Packit Service a31ea6
extern int      main_a(int argc, char * * argv);
Packit Service a31ea6
Packit Service a31ea6
/* Global values of original EBCDIC arguments. */
Packit Service a31ea6
int             ebcdic_argc;
Packit Service a31ea6
char * *        ebcdic_argv;
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
int
Packit Service a31ea6
main(int argc, char * * argv)
Packit Service a31ea6
Packit Service a31ea6
{
Packit Service a31ea6
        int i;
Packit Service a31ea6
        int j;
Packit Service a31ea6
        iconv_t cd;
Packit Service a31ea6
        size_t bytecount = 0;
Packit Service a31ea6
        char * inbuf;
Packit Service a31ea6
        char * outbuf;
Packit Service a31ea6
        size_t inbytesleft;
Packit Service a31ea6
        size_t outbytesleft;
Packit Service a31ea6
        char dummybuf[128];
Packit Service a31ea6
        char tocode[32];
Packit Service a31ea6
        char fromcode[32];
Packit Service a31ea6
Packit Service a31ea6
        ebcdic_argc = argc;
Packit Service a31ea6
        ebcdic_argv = argv;
Packit Service a31ea6
Packit Service a31ea6
        /* Build the encoding converter. */
Packit Service a31ea6
        strncpy(tocode, "IBMCCSID01208", sizeof tocode);
Packit Service a31ea6
        strncpy(fromcode, "IBMCCSID000000000010", sizeof fromcode);
Packit Service a31ea6
        cd = iconv_open(tocode, fromcode);
Packit Service a31ea6
Packit Service a31ea6
        /* Measure the arguments. */
Packit Service a31ea6
        for (i = 0; i < argc; i++) {
Packit Service a31ea6
                inbuf = argv[i];
Packit Service a31ea6
                do {
Packit Service a31ea6
                        inbytesleft = 0;
Packit Service a31ea6
                        outbuf = dummybuf;
Packit Service a31ea6
                        outbytesleft = sizeof dummybuf;
Packit Service a31ea6
                        j = iconv(cd,
Packit Service a31ea6
                                  &inbuf, &inbytesleft, &outbuf, &outbytesleft);
Packit Service a31ea6
                        bytecount += outbuf - dummybuf;
Packit Service a31ea6
                } while (j == -1 && errno == E2BIG);
Packit Service a31ea6
                /* Reset the shift state. */
Packit Service a31ea6
                iconv(cd, NULL, &inbytesleft, &outbuf, &outbytesleft);
Packit Service a31ea6
                }
Packit Service a31ea6
Packit Service a31ea6
        /* Allocate memory for the ASCII arguments and vector. */
Packit Service a31ea6
        argv = (char * *) malloc((argc + 1) * sizeof *argv + bytecount);
Packit Service a31ea6
Packit Service a31ea6
        /* Build the vector and convert argument encoding. */
Packit Service a31ea6
        outbuf = (char *) (argv + argc + 1);
Packit Service a31ea6
        outbytesleft = bytecount;
Packit Service a31ea6
Packit Service a31ea6
        for (i = 0; i < argc; i++) {
Packit Service a31ea6
                argv[i] = outbuf;
Packit Service a31ea6
                inbuf = ebcdic_argv[i];
Packit Service a31ea6
                inbytesleft = 0;
Packit Service a31ea6
                iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
Packit Service a31ea6
                iconv(cd, NULL, &inbytesleft, &outbuf, &outbytesleft);
Packit Service a31ea6
                }
Packit Service a31ea6
Packit Service a31ea6
        iconv_close(cd);
Packit Service a31ea6
        argv[argc] = NULL;
Packit Service a31ea6
Packit Service a31ea6
        /* Try setting the locale regardless of QADRT_ENV_LOCALE. */
Packit Service a31ea6
        setlocale_a(LC_ALL, "");
Packit Service a31ea6
Packit Service a31ea6
        /* Call the program. */
Packit Service a31ea6
        i = main_a(argc, argv);
Packit Service a31ea6
Packit Service a31ea6
        /* Clean-up allocated items. */
Packit Service a31ea6
        free((char *) argv);
Packit Service a31ea6
        QadrtFreeConversionTable();
Packit Service a31ea6
        QadrtFreeEnviron();
Packit Service a31ea6
Packit Service a31ea6
        /* Terminate. */
Packit Service a31ea6
        return i;
Packit Service a31ea6
}