[libxml2] os400: properly process SGML add in XMLCATALOG command.



commit c04785d5f55a9e6e12ca07643be6ff46866ece88
Author: Patrick Monnerat <pm datasphere ch>
Date:   Tue Apr 21 16:56:54 2015 +0200

    os400: properly process SGML add in XMLCATALOG command.

 os400/xmlcatalog.cmd |   27 ++++++++++++++++++++---
 os400/xmlcatlgcl.c   |   57 +++++++++++++++++++++++++++++++++++++------------
 2 files changed, 66 insertions(+), 18 deletions(-)
---
diff --git a/os400/xmlcatalog.cmd b/os400/xmlcatalog.cmd
index aac523f..92f0270 100644
--- a/os400/xmlcatalog.cmd
+++ b/os400/xmlcatalog.cmd
@@ -30,11 +30,18 @@
                           CHOICE('*STDOUT, *INSTMF or file path')              +
                           PROMPT('Output stream file path')
 
+             /* Convert SGML to XML catalog. */
+
+             PARM       KWD(CONVERT) TYPE(*CHAR) LEN(10) VARY(*YES *INT2)      +
+                          RSTD(*YES) SPCVAL((*YES '--convert') (*NO ''))       +
+                          EXPR(*YES) DFT(*NO) PMTCTL(TYPEXML)                  +
+                          PROMPT('Convert SGML to XML catalog')
+
              /* SGML super catalog update. */
 
              PARM       KWD(SUPERUPD) TYPE(*CHAR) LEN(17) VARY(*YES *INT2)     +
                           SPCVAL((*YES '') (*NO '--no-super-update'))          +
-                          EXPR(*YES) DFT(*YES) RSTD(*YES)                      +
+                          EXPR(*YES) DFT(*YES) RSTD(*YES) PMTCTL(TYPESGML)     +
                           PROMPT('Update the SGML super catalog')
 
              /* Verbose/debug output. */
@@ -55,9 +62,9 @@
 
              /* Values to add. */
 
-             PARM       KWD(ADD) TYPE(ADDELEM) MAX(10)                         +
+             PARM       KWD(ADD) TYPE(XMLELEM) MAX(10) PMTCTL(TYPEXML)         +
                           PROMPT('Add definition')
-ADDELEM:     ELEM       TYPE(*CHAR) LEN(16) VARY(*YES *INT2) DFT(*PUBLIC)      +
+XMLELEM:     ELEM       TYPE(*CHAR) LEN(16) VARY(*YES *INT2) DFT(*PUBLIC)      +
                           PROMPT('Entry type')                                 +
                           EXPR(*YES) RSTD(*YES) SPCVAL(                        +
                             (*PUBLIC         'public')                         +
@@ -69,13 +76,19 @@ ADDELEM:     ELEM       TYPE(*CHAR) LEN(16) VARY(*YES *INT2) DFT(*PUBLIC)      +
                             (*DELEGATESYSTEM 'delegateSystem')                 +
                             (*DELEGATEURI    'delegateURI')                    +
                             (*NEXTCATALOG    'nextCatalog')                    +
-                            (*FILENAME       '')                               +
                           )
              ELEM       TYPE(*PNAME) LEN(256) VARY(*YES *INT2) EXPR(*YES)      +
                           CASE(*MIXED) PROMPT('Original reference/file name')
              ELEM       TYPE(*PNAME) LEN(256) VARY(*YES *INT2) EXPR(*YES)      +
                           CASE(*MIXED) PROMPT('Replacement entity URI')
 
+             PARM       KWD(SGMLADD) TYPE(SGMLELEM) MAX(10)                    +
+                          PMTCTL(TYPESGML) PROMPT('Add SGML definition')
+SGMLELEM:    ELEM       TYPE(*PNAME) LEN(256) VARY(*YES *INT2) EXPR(*YES)      +
+                          CASE(*MIXED) PROMPT('SGML catalog file name')
+             ELEM       TYPE(*PNAME) LEN(256) VARY(*YES *INT2) EXPR(*YES)      +
+                          CASE(*MIXED) PROMPT('SGML definition')
+
              /* Entities to resolve. */
 
              PARM       KWD(ENTITY) TYPE(*PNAME) LEN(256) VARY(*YES *INT2)     +
@@ -91,3 +104,9 @@ ADDELEM:     ELEM       TYPE(*CHAR) LEN(16) VARY(*YES *INT2) DFT(*PUBLIC)      +
                             (*DEFAULT       '/etc/xml/catalog')                +
                             (*NONE          '')                                +
                           )
+
+
+             /* Conditional prompting. */
+
+TYPEXML:     PMTCTL     CTL(KIND) COND((*EQ ''))
+TYPESGML:    PMTCTL     CTL(KIND) COND((*NE ''))
diff --git a/os400/xmlcatlgcl.c b/os400/xmlcatlgcl.c
index c178b41..6f1e4ff 100644
--- a/os400/xmlcatlgcl.c
+++ b/os400/xmlcatlgcl.c
@@ -44,6 +44,13 @@ typedef struct {
         paramlist(256, char) replace;   /* vary2(256). */
 }               addelement;
 
+/* SGML add element list structure. */
+typedef struct {
+        short           elcount;        /* Element count (=3). */
+        paramlist(256, char) catalog;   /* vary2(256). */
+        paramlist(256, char) ident;     /* vary2(256). */
+}               sgmladdelement;
+
 
 /* Arguments from CL command. */
 typedef struct {
@@ -51,10 +58,12 @@ typedef struct {
         vary2 *         instmf;         /* Input catalog file name. */
         vary2 *         kind;           /* Catalog kind. */
         vary2 *         outstmf;        /* Output catalog file name. */
+        vary2 *         convert;        /* Convert SGML to XML. */
         vary2 *         superupd;       /* --no-super-update. */
         vary2 *         verbose;        /* Verbose output. */
         paramlist(256 + 2, vary2) * delete; /* Identifiers to delete. */
         paramlist(2, unsigned short) * add; /* Items to add. */
+        paramlist(2, unsigned short) * sgmladd; /* SGML items to add. */
         paramlist(256 + 2, vary2) * resolve; /* Identifiers to resolve. */
         paramlist(5000 + 2, vary2) * catalog; /* Additional catalog files. */
 }               arguments;
@@ -141,6 +150,7 @@ main(int argsc, arguments * args)
         int i;
         char c;
         addelement * aelp;
+        sgmladdelement * saelp;
 
         /* Specify additional catalogs. */
         cmd.len = 0;
@@ -178,9 +188,6 @@ main(int argsc, arguments * args)
         if (args->kind && args->kind->len)
                 vary4varg(&cmd, args->kind);
 
-        if (args->superupd && args->superupd->len)
-                vary4varg(&cmd, args->superupd);
-
         if (args->verbose && args->verbose->len)
                 vary4varg(&cmd, args->verbose);
 
@@ -190,19 +197,39 @@ main(int argsc, arguments * args)
                         vary4vargquote(&cmd, &args->delete->item[i].param);
                         }
 
-        if (args->add)
-                for (i = 0; i < args->add->len; i++) {
-                        aelp = OFFSETBY(addelement,
-                                        args->add, args->add->item[i].param);
-                        vary4arg(&cmd, "--add");
-                        if (((vary2 *) &aelp->type)->len) {
+        if (args->kind && args->kind->len) {
+                /* Process SGML-specific parameters. */
+                if (args->superupd && args->superupd->len)
+                        vary4varg(&cmd, args->superupd);
+
+                if (args->sgmladd)
+                        for (i = 0; i < args->sgmladd->len; i++) {
+                                saelp = OFFSETBY(sgmladdelement, args->sgmladd,
+                                                args->sgmladd->item[i].param);
+                                if (!((vary2 *) &saelp->catalog)->len)
+                                        continue;
+                                vary4arg(&cmd, "--add");
+                                vary4vargquote(&cmd, (vary2 *) &saelp->catalog);
+                                vary4vargquote(&cmd, (vary2 *) &saelp->ident);
+                                }
+                }
+        else {
+                /* Process XML-specific parameters. */
+                if (args->convert && args->convert->len)
+                        vary4varg(&cmd, args->convert);
+
+                if (args->add)
+                        for (i = 0; i < args->add->len; i++) {
+                                aelp = OFFSETBY(addelement, args->add,
+                                                args->add->item[i].param);
+                                if (!((vary2 *) &aelp->origin)->len)
+                                        continue;
+                                vary4arg(&cmd, "--add");
                                 vary4varg(&cmd, (vary2 *) &aelp->type);
                                 vary4vargquote(&cmd, (vary2 *) &aelp->origin);
                                 vary4vargquote(&cmd, (vary2 *) &aelp->replace);
                                 }
-                        else
-                                vary4vargquote(&cmd, (vary2 *) &aelp->origin);
-                        }
+                }
 
         /* Avoid INSTMF(*NEW) and OUTSMTF(*INSTMF). */
         if (args->outstmf && args->outstmf->len && !args->outstmf->string[0])
@@ -233,11 +260,13 @@ main(int argsc, arguments * args)
         /* If no input file create catalog, else specify the input file name. */
         /* Specify the input file name: my be a dummy one. */
         if (!args->instmf || !args->instmf->len) {
-                vary4arg(&cmd, "--create");
+                vary4arg(&cmd, "--create -");
                 vary4arg(&cmd, ".dmyxmlcatalog");
                 }
-        else
+        else {
+                vary4arg(&cmd, "-");
                 vary4vargquote(&cmd, args->instmf);
+                }
 
         /* Query entities. */
 


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