midrange.com code scratchpad
Name:
wellformed.rpgle
Scriptlanguage:
Plain Text
Tabwidth:
4
Date:
09/14/2021 06:53:45 pm
IP:
Logged
Description:
Utilizes the XML-SAX opcode to determine whether or not an XML document is 'well formed'
Code:
  1.  
  2.       //--------------------------------------------------------------------------------------------------------------//
  3.       //                        "If it's squinky, then you know it's BrilligWare!"                                    // 
  4.       //                                                                                                              //
  5.       //                         Brillig Enterprises (aka Chris Pando) (C)2021                                        //         
  6.       //                                                                                                              //
  7.       //                         This work is licensed under a Creative Commons                                       //
  8.       //                         Attribution-NonCommercial-ShareAlike License:                                        //
  9.       //                         http://creativecommons.org/licenses/by-nc-sa/2.0/legalcode                           // 
  10.       //--------------------------------------------------------------------------------------------------------------//
  11.       //                                                                                                              //
  12.       //                                                                                                              //
  13.       //                   If XML-SAX chokes on the document, return the error as a notify message                    //
  14.       //                                                                                                              //
  15.       //                                                                                                              //
  16.       //--------------------------------------------------------------------------------------------------------------//
  17.        Ctl-Opt dftActGrp(*No) actGrp(*Caller)
  18.                debug(*Yes) option(*SrcStmt:*NoDebugIO)
  19.                Main(wellformed)                                                ;
  20.       //--------------------------------------------------------------------------------------------------------------//
  21.       //                                                                                                              //
  22.       //... procedure interfaces ...                                                                                  //
  23.       //                                                                                                              //
  24.       //--------------------------------------------------------------------------------------------------------------//
  25.        Dcl-PR rcvPgmMsg                                     ExtPgm('QMHRCVPM') ;
  26.          *n                 Char(256)                                          ;
  27.          *n                 Int(10)                         Const              ;
  28.          *n                 Char(8)                         Const              ;
  29.          *n                 Char(10)                        Const              ;
  30.          *n                 Int(10)                         Const              ;
  31.          *n                 Char(10)                        Const              ;
  32.          *n                 Char(4)                         Const              ;
  33.          *n                 Int(10)                         Const              ;
  34.          *n                 Char(10)                        Const              ;
  35.          *n                 Char(256)                                          ;
  36.        End-PR                                                                  ;
  37.        Dcl-PR sndPgmMsg                                     ExtPgm('QMHSNDPM') ;
  38.          *n                 Char(7)                         Const              ;
  39.          *n                 Char(20)                        Const              ;
  40.          *n                 Char(208)                       Const              ;
  41.          *n                 Int(10)                         Const              ;
  42.          *n                 Char(10)                        Const              ;
  43.          *n                 Char(10)                        Const              ;
  44.          *n                 Int(10)                         Const              ;
  45.          *n                 Char(4)                                            ;
  46.          *n                 Char(256)                                          ;
  47.        End-PR                                                                  ;
  48.       //--------------------------------------------------------------------------------------------------------------//
  49.       //                                                                                                              //
  50.       // ... data structures ...                                                                                      //
  51.       //                                                                                                              //
  52.       //--------------------------------------------------------------------------------------------------------------//
  53.       //
  54.       //... standard API error date structure (QUSEC)
  55.       //
  56.        Dcl-DS errDS                                                            ;
  57.          *n                  Int(10)    Inz(%Len(errDS))                       ;
  58.          errAvl              Int(10)                                           ;
  59.          *n                  Char(7)                                           ;
  60.          *n                  Char(1)                                           ;
  61.          *n                  Char(240)                                         ;
  62.        End-DS                                                                  ;
  63.  
  64.        Dcl-DS handlerInfo   Len(1)                          End-DS             ;
  65.       //--------------------------------------------------------------------------------------------------------------//
  66.       //                                                                                                              //
  67.       //                                                  Procedures                                                  //
  68.       //                                                                                                              //
  69.       //--------------------------------------------------------------------------------------------------------------//
  70.       //                                                   Mainline                                                   //
  71.       //--------------------------------------------------------------------------------------------------------------//
  72.        Dcl-Proc wellformed                                                     ;
  73.          Dcl-PI *n                                          ExtPgm             ;
  74.            xmlDocument      Char(80)                                           ;
  75.          End-PI                                                                ;
  76.  
  77.        Monitor                                                                 ;
  78.          XML-SAX  %Handler(handler:handlerInfo)
  79.                   %XML(%Trim(xmlDocument) : 'ccsid=37 ' +
  80.                                             'doc=file ')                       ;
  81.        On-Error                                                                ;
  82.          relayMsg()                                                            ;
  83.        Return                                                                  ;
  84.        EndMon                                                                  ;
  85.  
  86.        Return                                                                  ;
  87.        End-Proc                                                                ;
  88.       //--------------------------------------------------------------------------------------------------------------//
  89.       //                                                   Handler                                                    //
  90.       //--------------------------------------------------------------------------------------------------------------//
  91.        Dcl-Proc handler                                                        ;
  92.          Dcl-PI *n          Int(10)                                            ;
  93.            handlerInfoDS    LikeDS(handlerInfo)                                ;
  94.            event            Int(10)         Value                              ;
  95.            dta@             Pointer         Value                              ;
  96.            dtaLen           Int(20)         Value                              ;
  97.            exceptionID      Int(10)         Value                              ;
  98.          End-PI                                                                ;
  99.  
  100.          Dcl-S  dta         Char(1024)      Based(dta@)                        ;
  101.  
  102.          Select                                                                ;
  103.  
  104.          When ( event = *XML_START_DOCUMENT   )                                ;
  105.          When ( event = *XML_START_ELEMENT    )                                ;
  106.          When ( event = *XML_CHARS            )                                ;
  107.          When ( event = *XML_END_ELEMENT      )                                ;
  108.          EndSl                                                                 ;
  109.  
  110.          Return 0                                                              ;
  111.        End-Proc                                                                ;
  112.       //--------------------------------------------------------------------------------------------------------------//
  113.       //                                                relay message                                                 //
  114.       //--------------------------------------------------------------------------------------------------------------//
  115.        Dcl-Proc relayMsg                                                       ;
  116.        Dcl-DS msgDta        Len(256)        Qualified                          ;
  117.          *n                 Int(10)                                            ;// bytes returned
  118.          *n                 Int(10)                                            ;// bytes available
  119.          *n                 Int(10)                                            ;// message severity
  120.          msgID              Char(7)                                            ;// message identifier
  121.          *n                 Char(2)                                            ;// message type
  122.          *n                 Char(4)                                            ;// message key
  123.          *n                 Char(7)                                            ;// reserved
  124.          *n                 Int(10)                                            ;// CCSID conversion status
  125.          *n                 Int(10)                                            ;// CCSID of replacement data
  126.          *n                 Int(10)                                            ;// length of replacement data
  127.          lenData            Int(10)                                            ;// length of replacement data available
  128.          data               Char(208)                                          ;// replacement data
  129.        End-DS                                                                  ;
  130.        Dcl-S  msgKey        Char(4)                                            ;
  131.  
  132.        rcvPgmMsg( msgDta                                                        // message data
  133.                 : %Size(msgDta)                                                 // message data length
  134.                 : 'RCVM0100'                                                    // format name
  135.                 : '*'                                                           // call stack entry
  136.                 : 1                                                             // call stack counter
  137.                 : '*ESCAPE   '                                                  // message type
  138.                 : '    '                                                        // message key
  139.                 : 0                                                             // wait time
  140.                 : '*REMOVE   '                                                  // message action
  141.                 : errDS                                                         // QUSEC
  142.                  )                                                             ;
  143.        sndPgmMsg( msgDta.msgID                    // always gonna be RNX0351       message identifier
  144.                 : 'QRNXMSG   *LIBL     '          // hard coded, so ugly           qualified message file name
  145.                 : msgDta.data                                                   // message data
  146.                 : msgDta.lenData                                                // message data length
  147.                 : '*NOTIFY   '                                                  // message type
  148.                 : '*EXT      '                                                  // call stack entry
  149.                 : 0                                                             // call stack counter
  150.                 : msgKey                                                        // message key
  151.                 : errDS                                                         // QUSEC
  152.                  )                                                             ;
  153.  
  154.        Return                                                                  ;
  155.        End-Proc                                                                ;
  156.  
© 2004-2019 by midrange.com generated in 0.007s valid xhtml & css