/ libxml2 / os400 / libxmlmain.c
libxmlmain.c
  1  /**
  2  ***     QADRT/QADRTMAIN2 substitution program.
  3  ***     This is needed because the IBM-provided QADRTMAIN2 does not
  4  ***     properly translate arguments by default or if no locale is provided.
  5  ***
  6  ***     See Copyright for the status of this software.
  7  ***
  8  ***     Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A.
  9  **/
 10  
 11  #include <stdlib.h>
 12  #include <string.h>
 13  #include <iconv.h>
 14  #include <errno.h>
 15  #include <locale.h>
 16  
 17  /* Do not use qadrt.h since it defines unneeded static procedures. */
 18  extern void     QadrtInit(void);
 19  extern int      QadrtFreeConversionTable(void);
 20  extern int      QadrtFreeEnviron(void);
 21  extern char *   setlocale_a(int, const char *);
 22  
 23  
 24  /* The ASCII main program. */
 25  extern int      main_a(int argc, char * * argv);
 26  
 27  /* Global values of original EBCDIC arguments. */
 28  int             ebcdic_argc;
 29  char * *        ebcdic_argv;
 30  
 31  
 32  int
 33  main(int argc, char * * argv)
 34  
 35  {
 36          int i;
 37          int j;
 38          iconv_t cd;
 39          size_t bytecount = 0;
 40          char * inbuf;
 41          char * outbuf;
 42          size_t inbytesleft;
 43          size_t outbytesleft;
 44          char dummybuf[128];
 45          char tocode[32];
 46          char fromcode[32];
 47  
 48          ebcdic_argc = argc;
 49          ebcdic_argv = argv;
 50  
 51          /* Build the encoding converter. */
 52          strncpy(tocode, "IBMCCSID01208", sizeof tocode);
 53          strncpy(fromcode, "IBMCCSID000000000010", sizeof fromcode);
 54          cd = iconv_open(tocode, fromcode);
 55  
 56          /* Measure the arguments. */
 57          for (i = 0; i < argc; i++) {
 58                  inbuf = argv[i];
 59                  do {
 60                          inbytesleft = 0;
 61                          outbuf = dummybuf;
 62                          outbytesleft = sizeof dummybuf;
 63                          j = iconv(cd,
 64                                    &inbuf, &inbytesleft, &outbuf, &outbytesleft);
 65                          bytecount += outbuf - dummybuf;
 66                  } while (j == -1 && errno == E2BIG);
 67                  /* Reset the shift state. */
 68                  iconv(cd, NULL, &inbytesleft, &outbuf, &outbytesleft);
 69                  }
 70  
 71          /* Allocate memory for the ASCII arguments and vector. */
 72          argv = (char * *) malloc((argc + 1) * sizeof *argv + bytecount);
 73  
 74          /* Build the vector and convert argument encoding. */
 75          outbuf = (char *) (argv + argc + 1);
 76          outbytesleft = bytecount;
 77  
 78          for (i = 0; i < argc; i++) {
 79                  argv[i] = outbuf;
 80                  inbuf = ebcdic_argv[i];
 81                  inbytesleft = 0;
 82                  iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
 83                  iconv(cd, NULL, &inbytesleft, &outbuf, &outbytesleft);
 84                  }
 85  
 86          iconv_close(cd);
 87          argv[argc] = NULL;
 88  
 89          /* Try setting the locale regardless of QADRT_ENV_LOCALE. */
 90          setlocale_a(LC_ALL, "");
 91  
 92          /* Call the program. */
 93          i = main_a(argc, argv);
 94  
 95          /* Clean-up allocated items. */
 96          free((char *) argv);
 97          QadrtFreeConversionTable();
 98          QadrtFreeEnviron();
 99  
100          /* Terminate. */
101          return i;
102  }