Blame os400/libxmlmain.c

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