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