From 35a201cc8ef0c3f5b2df88d2e528aabee1048348 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Fri, 30 Apr 2021 18:47:09 +0200 Subject: Initial/Final commit --- libxml2-2.9.10/os400/libxmlmain.c | 102 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 libxml2-2.9.10/os400/libxmlmain.c (limited to 'libxml2-2.9.10/os400/libxmlmain.c') diff --git a/libxml2-2.9.10/os400/libxmlmain.c b/libxml2-2.9.10/os400/libxmlmain.c new file mode 100644 index 0000000..91c848a --- /dev/null +++ b/libxml2-2.9.10/os400/libxmlmain.c @@ -0,0 +1,102 @@ +/** +*** 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; +} -- cgit v1.2.3