[libxml2] os400: compile and install program xmllint (qshell-only).



commit b1682bdb93f473bc82c5e8cde4fcfb01dc8165bf
Author: Patrick Monnerat <pm datasphere ch>
Date:   Fri Apr 17 17:17:58 2015 +0200

    os400: compile and install program xmllint (qshell-only).

 os400/libxmlmain.c |  102 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 os400/make-src.sh  |   32 ++++++++++++++++
 2 files changed, 134 insertions(+), 0 deletions(-)
---
diff --git a/os400/libxmlmain.c b/os400/libxmlmain.c
new file mode 100644
index 0000000..91c848a
--- /dev/null
+++ b/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 <pm datasphere ch>, DATASPHERE S.A.
+**/
+
+#include <stdlib.h>
+#include <string.h>
+#include <iconv.h>
+#include <errno.h>
+#include <locale.h>
+
+/* 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;
+}
diff --git a/os400/make-src.sh b/os400/make-src.sh
index 62b7a36..10b6629 100644
--- a/os400/make-src.sh
+++ b/os400/make-src.sh
@@ -239,3 +239,35 @@ then    rm -rf "${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR"
         CMD="${CMD} OBJ((*LIBL/${SRVPGM} *SRVPGM))"
         system "${CMD}"
 fi
+
+
+#       Compile the ASCII main() stub.
+
+make_module     --ebcdic --sysiconv     LIBXMLMAIN  "${SCRIPTDIR}/libxmlmain.c"
+
+
+#       Compile and link program xmllint.
+
+if action_needed "${LIBIFSNAME}/XMLLINT.PGM" "xmllint.c" ||
+   action_needed "${LIBIFSNAME}/XMLLINT.PGM" "${LIBIFSNAME}/${SRVPGM}.SRVPGM" ||
+   action_needed "${LIBIFSNAME}/XMLLINT.PGM" "${LIBIFSNAME}/LIMXMLMAIN.MODULE"
+then    make_module XMLLINT xmllint.c
+        CMD="CRTPGM PGM(${TARGETLIB}/XMLLINT) MODULE(${TARGETLIB}/XMLLINT)"
+        CMD="${CMD} ENTMOD(${TARGETLIB}/LIBXMLMAIN)"
+        CMD="${CMD} BNDSRVPGM(QADRTTS) BNDDIR((${TARGETLIB}/${STATBNDDIR})"
+        if [ "${WITH_ZLIB}" -ne 0 ]
+        then    CMD="${CMD} (${ZLIB_LIB}/${ZLIB_BNDDIR})"
+        fi
+        CMD="${CMD}) ACTGRP(*NEW) TEXT('XML tool')"
+        CMD="${CMD} TGTRLS(${TGTRLS})"
+        system "${CMD}"
+        rm -f "${LIBIFSNAME}/XMLLINT.MODULE"
+fi
+
+#       Install xmllint in IFS.
+
+if [ ! -d "${IFSDIR}/bin" ]
+then    mkdir -p "${IFSDIR}/bin"
+fi
+rm -f "${IFSDIR}/bin/xmllint"
+ln -s "${LIBIFSNAME}/XMLLINT.PGM" "${IFSDIR}/bin/xmllint"


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]