1*8462SApril.Chin@Sun.COM#!/usr/bin/ksh93
2*8462SApril.Chin@Sun.COM
3*8462SApril.Chin@Sun.COM#
4*8462SApril.Chin@Sun.COM# CDDL HEADER START
5*8462SApril.Chin@Sun.COM#
6*8462SApril.Chin@Sun.COM# The contents of this file are subject to the terms of the
7*8462SApril.Chin@Sun.COM# Common Development and Distribution License (the "License").
8*8462SApril.Chin@Sun.COM# You may not use this file except in compliance with the License.
9*8462SApril.Chin@Sun.COM#
10*8462SApril.Chin@Sun.COM# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11*8462SApril.Chin@Sun.COM# or http://www.opensolaris.org/os/licensing.
12*8462SApril.Chin@Sun.COM# See the License for the specific language governing permissions
13*8462SApril.Chin@Sun.COM# and limitations under the License.
14*8462SApril.Chin@Sun.COM#
15*8462SApril.Chin@Sun.COM# When distributing Covered Code, include this CDDL HEADER in each
16*8462SApril.Chin@Sun.COM# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17*8462SApril.Chin@Sun.COM# If applicable, add the following below this CDDL HEADER, with the
18*8462SApril.Chin@Sun.COM# fields enclosed by brackets "[]" replaced with your own identifying
19*8462SApril.Chin@Sun.COM# information: Portions Copyright [yyyy] [name of copyright owner]
20*8462SApril.Chin@Sun.COM#
21*8462SApril.Chin@Sun.COM# CDDL HEADER END
22*8462SApril.Chin@Sun.COM#
23*8462SApril.Chin@Sun.COM
24*8462SApril.Chin@Sun.COM#
25*8462SApril.Chin@Sun.COM# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
26*8462SApril.Chin@Sun.COM# Use is subject to license terms.
27*8462SApril.Chin@Sun.COM#
28*8462SApril.Chin@Sun.COM
29*8462SApril.Chin@Sun.COM# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant
30*8462SApril.Chin@Sun.COMexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin
31*8462SApril.Chin@Sun.COM
32*8462SApril.Chin@Sun.COMfunction fatal_error
33*8462SApril.Chin@Sun.COM{
34*8462SApril.Chin@Sun.COM	print -u 2 "${progname}: $*"
35*8462SApril.Chin@Sun.COM	exit 1
36*8462SApril.Chin@Sun.COM}
37*8462SApril.Chin@Sun.COM
38*8462SApril.Chin@Sun.COMfunction attrstrtoattrarray
39*8462SApril.Chin@Sun.COM{
40*8462SApril.Chin@Sun.COM#set -o xtrace
41*8462SApril.Chin@Sun.COM    typeset s="$1"
42*8462SApril.Chin@Sun.COM    nameref aa=$2 # attribute array
43*8462SApril.Chin@Sun.COM    integer aa_count=0
44*8462SApril.Chin@Sun.COM    integer aa_count=0
45*8462SApril.Chin@Sun.COM    typeset nextattr
46*8462SApril.Chin@Sun.COM    integer currattrlen=0
47*8462SApril.Chin@Sun.COM    typeset tagstr
48*8462SApril.Chin@Sun.COM    typeset tagval
49*8462SApril.Chin@Sun.COM
50*8462SApril.Chin@Sun.COM    while (( ${#s} > 0 )) ; do
51*8462SApril.Chin@Sun.COM        # skip whitespaces
52*8462SApril.Chin@Sun.COM        while [[ "${s:currattrlen:1}" == ~(E)[[:blank:][:space:]] ]] ; do
53*8462SApril.Chin@Sun.COM            (( currattrlen++ ))
54*8462SApril.Chin@Sun.COM        done
55*8462SApril.Chin@Sun.COM        s="${s:currattrlen:${#s}}"
56*8462SApril.Chin@Sun.COM
57*8462SApril.Chin@Sun.COM        # anything left ?
58*8462SApril.Chin@Sun.COM        (( ${#s} == 0 )) && break
59*8462SApril.Chin@Sun.COM
60*8462SApril.Chin@Sun.COM        # Pattern tests:
61*8462SApril.Chin@Sun.COM        #x="foo=bar huz=123" ; print "${x##~(E)[[:alnum:]_-:]*=[^[:blank:]\"]*}"
62*8462SApril.Chin@Sun.COM        #x='foo="ba=r o" huz=123' ; print "${x##~(E)[[:alnum:]_-:]*=\"[^\"]*\"}"
63*8462SApril.Chin@Sun.COM        #x="foo='ba=r o' huz=123" ; print "${x##~(E)[[:alnum:]_-:]*=\'[^\"]*\'}"
64*8462SApril.Chin@Sun.COM        #x="foox huz=123" ; print "${x##~(E)[[:alnum:]_-:]*}"
65*8462SApril.Chin@Sun.COM        # All pattern combined via eregex (w|x|y|z):
66*8462SApril.Chin@Sun.COM        #x='foo="bar=o" huz=123' ; print "${x##~(E)([[:alnum:]_-:]*=[^[:blank:]\"]*|[[:alnum:]_-:]*=\"[^\"]*\"|[[:alnum:]_-:]*=\'[^\"]*\')}"
67*8462SApril.Chin@Sun.COM        nextattr="${s##~(E)([[:alnum:]_-:]*=[^[:blank:]\"]*|[[:alnum:]_-:]*=\"[^\"]*\"|[[:alnum:]_-:]*=\'[^\"]*\'|[[:alnum:]_-:]*)}"
68*8462SApril.Chin@Sun.COM        currattrlen=$(( ${#s} - ${#nextattr}))
69*8462SApril.Chin@Sun.COM
70*8462SApril.Chin@Sun.COM        # add entry
71*8462SApril.Chin@Sun.COM        tagstr="${s:0:currattrlen}"
72*8462SApril.Chin@Sun.COM        if [[ "${tagstr}" == *=* ]] ; then
73*8462SApril.Chin@Sun.COM            # normal case: attribute with value
74*8462SApril.Chin@Sun.COM
75*8462SApril.Chin@Sun.COM            tagval="${tagstr#*=}"
76*8462SApril.Chin@Sun.COM
77*8462SApril.Chin@Sun.COM            # strip quotes ('' or "")
78*8462SApril.Chin@Sun.COM            if [[ "${tagval}" == ~(Elr)(\'.*\'|\".*\") ]] ; then
79*8462SApril.Chin@Sun.COM                tagval="${tagval:1:${#tagval}-2}"
80*8462SApril.Chin@Sun.COM            fi
81*8462SApril.Chin@Sun.COM
82*8462SApril.Chin@Sun.COM            aa[${aa_count}]=( name="${tagstr%%=*}" value="${tagval}" )
83*8462SApril.Chin@Sun.COM        else
84*8462SApril.Chin@Sun.COM            # special case for HTML where you have something like <foo baz>
85*8462SApril.Chin@Sun.COM            aa[${aa_count}]=( name="${tagstr}" )
86*8462SApril.Chin@Sun.COM        fi
87*8462SApril.Chin@Sun.COM        (( aa_count++ ))
88*8462SApril.Chin@Sun.COM        (( aa_count > 1000 )) && fatal_error "$0: aa_count too large" # assert
89*8462SApril.Chin@Sun.COM    done
90*8462SApril.Chin@Sun.COM}
91*8462SApril.Chin@Sun.COM
92*8462SApril.Chin@Sun.COM
93*8462SApril.Chin@Sun.COMfunction handle_document
94*8462SApril.Chin@Sun.COM{
95*8462SApril.Chin@Sun.COM#set -o xtrace
96*8462SApril.Chin@Sun.COM    nameref callbacks=${1}
97*8462SApril.Chin@Sun.COM    typeset tag_type="${2}"
98*8462SApril.Chin@Sun.COM    typeset tag_value="${3}"
99*8462SApril.Chin@Sun.COM    typeset tag_attributes="${4}"
100*8462SApril.Chin@Sun.COM    nameref doc=${callbacks["arg_tree"]}
101*8462SApril.Chin@Sun.COM    nameref nodepath="${stack.items[stack.pos]}"
102*8462SApril.Chin@Sun.COM    nameref nodesnum="${stack.items[stack.pos]}num"
103*8462SApril.Chin@Sun.COM
104*8462SApril.Chin@Sun.COM    case "${tag_type}" in
105*8462SApril.Chin@Sun.COM        tag_begin)
106*8462SApril.Chin@Sun.COM            nodepath[${nodesnum}]+=(
107*8462SApril.Chin@Sun.COM                typeset tagtype="element"
108*8462SApril.Chin@Sun.COM                typeset tagname="${tag_value}"
109*8462SApril.Chin@Sun.COM                typeset -A tagattributes=( )
110*8462SApril.Chin@Sun.COM                typeset -A nodes=( )
111*8462SApril.Chin@Sun.COM                integer nodesnum=0
112*8462SApril.Chin@Sun.COM            )
113*8462SApril.Chin@Sun.COM
114*8462SApril.Chin@Sun.COM            # fill attributes
115*8462SApril.Chin@Sun.COM            if [[ "${tag_attributes}" != "" ]] ; then
116*8462SApril.Chin@Sun.COM                attrstrtoattrarray "${tag_attributes}" "nodepath[${nodesnum}].tagattributes"
117*8462SApril.Chin@Sun.COM            fi
118*8462SApril.Chin@Sun.COM
119*8462SApril.Chin@Sun.COM            (( stack.pos++ ))
120*8462SApril.Chin@Sun.COM            stack.items[stack.pos]="${stack.items[stack.pos-1]}[${nodesnum}].nodes"
121*8462SApril.Chin@Sun.COM            (( nodesnum++ ))
122*8462SApril.Chin@Sun.COM            ;;
123*8462SApril.Chin@Sun.COM        tag_end)
124*8462SApril.Chin@Sun.COM            (( stack.pos-- ))
125*8462SApril.Chin@Sun.COM            ;;
126*8462SApril.Chin@Sun.COM        tag_text)
127*8462SApril.Chin@Sun.COM            nodepath[${nodesnum}]+=(
128*8462SApril.Chin@Sun.COM                typeset tagtype="text"
129*8462SApril.Chin@Sun.COM                typeset tagvalue="${tag_value}"
130*8462SApril.Chin@Sun.COM            )
131*8462SApril.Chin@Sun.COM            (( nodesnum++ ))
132*8462SApril.Chin@Sun.COM            ;;
133*8462SApril.Chin@Sun.COM        tag_comment)
134*8462SApril.Chin@Sun.COM            nodepath[${nodesnum}]+=(
135*8462SApril.Chin@Sun.COM                typeset tagtype="comment"
136*8462SApril.Chin@Sun.COM                typeset tagvalue="${tag_value}"
137*8462SApril.Chin@Sun.COM            )
138*8462SApril.Chin@Sun.COM            (( nodesnum++ ))
139*8462SApril.Chin@Sun.COM            ;;
140*8462SApril.Chin@Sun.COM        document_start)
141*8462SApril.Chin@Sun.COM            ;;
142*8462SApril.Chin@Sun.COM        document_end)
143*8462SApril.Chin@Sun.COM            ;;
144*8462SApril.Chin@Sun.COM    esac
145*8462SApril.Chin@Sun.COM
146*8462SApril.Chin@Sun.COM#    print "xmltok: '${tag_type}' = '${tag_value}'"
147*8462SApril.Chin@Sun.COM}
148*8462SApril.Chin@Sun.COM
149*8462SApril.Chin@Sun.COMfunction xml_tok
150*8462SApril.Chin@Sun.COM{
151*8462SApril.Chin@Sun.COM    typeset buf=""
152*8462SApril.Chin@Sun.COM    typeset namebuf=""
153*8462SApril.Chin@Sun.COM    typeset attrbuf=""
154*8462SApril.Chin@Sun.COM    typeset c=""
155*8462SApril.Chin@Sun.COM    typeset isendtag # bool: true/false
156*8462SApril.Chin@Sun.COM    typeset issingletag # bool: true/false (used for tags like "<br />")
157*8462SApril.Chin@Sun.COM    nameref callbacks=${1}
158*8462SApril.Chin@Sun.COM
159*8462SApril.Chin@Sun.COM    [[ ! -z "${callbacks["document_start"]}" ]] && ${callbacks["document_start"]} "${1}" "document_start"
160*8462SApril.Chin@Sun.COM
161*8462SApril.Chin@Sun.COM    while IFS='' read -r -N 1 c ; do
162*8462SApril.Chin@Sun.COM        isendtag=false
163*8462SApril.Chin@Sun.COM
164*8462SApril.Chin@Sun.COM        if [[ "$c" == "<" ]] ; then
165*8462SApril.Chin@Sun.COM	    # flush any text content
166*8462SApril.Chin@Sun.COM            if [[ "$buf" != "" ]] ; then
167*8462SApril.Chin@Sun.COM                [[ ! -z "${callbacks["tag_text"]}" ]] && ${callbacks["tag_text"]} "${1}" "tag_text" "$buf"
168*8462SApril.Chin@Sun.COM                buf=""
169*8462SApril.Chin@Sun.COM            fi
170*8462SApril.Chin@Sun.COM
171*8462SApril.Chin@Sun.COM            IFS='' read -r -N 1 c
172*8462SApril.Chin@Sun.COM            if [[ "$c" == "/" ]] ; then
173*8462SApril.Chin@Sun.COM                isendtag=true
174*8462SApril.Chin@Sun.COM            else
175*8462SApril.Chin@Sun.COM                buf="$c"
176*8462SApril.Chin@Sun.COM            fi
177*8462SApril.Chin@Sun.COM            IFS='' read -r -d '>' c
178*8462SApril.Chin@Sun.COM            buf+="$c"
179*8462SApril.Chin@Sun.COM
180*8462SApril.Chin@Sun.COM	    # handle comments
181*8462SApril.Chin@Sun.COM	    if [[ "$buf" == ~(El)!-- ]] ; then
182*8462SApril.Chin@Sun.COM	        # did we read the comment completely ?
183*8462SApril.Chin@Sun.COM	        if [[ "$buf" != ~(Elr)!--.*-- ]] ; then
184*8462SApril.Chin@Sun.COM		    buf+=">"
185*8462SApril.Chin@Sun.COM	            while [[ "$buf" != ~(Elr)!--.*-- ]] ; do
186*8462SApril.Chin@Sun.COM		        IFS='' read -r -N 1 c || break
187*8462SApril.Chin@Sun.COM		        buf+="$c"
188*8462SApril.Chin@Sun.COM		    done
189*8462SApril.Chin@Sun.COM		fi
190*8462SApril.Chin@Sun.COM
191*8462SApril.Chin@Sun.COM		[[ ! -z "${callbacks["tag_comment"]}" ]] && ${callbacks["tag_comment"]} "${1}" "tag_comment" "${buf:3:${#buf}-5}"
192*8462SApril.Chin@Sun.COM		buf=""
193*8462SApril.Chin@Sun.COM		continue
194*8462SApril.Chin@Sun.COM	    fi
195*8462SApril.Chin@Sun.COM
196*8462SApril.Chin@Sun.COM	    # check if the tag starts and ends at the same time (like "<br />")
197*8462SApril.Chin@Sun.COM	    if [[ "${buf}" == ~(Er).*/ ]] ; then
198*8462SApril.Chin@Sun.COM	        issingletag=true
199*8462SApril.Chin@Sun.COM		buf="${buf%*/}"
200*8462SApril.Chin@Sun.COM	    else
201*8462SApril.Chin@Sun.COM	        issingletag=false
202*8462SApril.Chin@Sun.COM	    fi
203*8462SApril.Chin@Sun.COM
204*8462SApril.Chin@Sun.COM	    # check if the tag has attributes (e.g. space after name)
205*8462SApril.Chin@Sun.COM	    if [[ "$buf" == ~(E)[[:space:][:blank:]] ]] ; then
206*8462SApril.Chin@Sun.COM	        namebuf="${buf%%~(E)[[:space:][:blank:]].*}"
207*8462SApril.Chin@Sun.COM                attrbuf="${buf#~(E).*[[:space:][:blank:]]}"
208*8462SApril.Chin@Sun.COM            else
209*8462SApril.Chin@Sun.COM	        namebuf="$buf"
210*8462SApril.Chin@Sun.COM		attrbuf=""
211*8462SApril.Chin@Sun.COM	    fi
212*8462SApril.Chin@Sun.COM
213*8462SApril.Chin@Sun.COM            if ${isendtag} ; then
214*8462SApril.Chin@Sun.COM                [[ ! -z "${callbacks["tag_end"]}" ]] && ${callbacks["tag_end"]} "${1}" "tag_end" "$namebuf"
215*8462SApril.Chin@Sun.COM            else
216*8462SApril.Chin@Sun.COM                [[ ! -z "${callbacks["tag_begin"]}" ]] && ${callbacks["tag_begin"]} "${1}" "tag_begin" "$namebuf" "$attrbuf"
217*8462SApril.Chin@Sun.COM
218*8462SApril.Chin@Sun.COM                # handle tags like <br/> (which are start- and end-tag in one piece)
219*8462SApril.Chin@Sun.COM                if ${issingletag} ; then
220*8462SApril.Chin@Sun.COM                    [[ ! -z "${callbacks["tag_end"]}" ]] && ${callbacks["tag_end"]} "${1}" "tag_end" "$namebuf"
221*8462SApril.Chin@Sun.COM                fi
222*8462SApril.Chin@Sun.COM            fi
223*8462SApril.Chin@Sun.COM            buf=""
224*8462SApril.Chin@Sun.COM        else
225*8462SApril.Chin@Sun.COM            buf+="$c"
226*8462SApril.Chin@Sun.COM        fi
227*8462SApril.Chin@Sun.COM    done
228*8462SApril.Chin@Sun.COM
229*8462SApril.Chin@Sun.COM    [[ ! -z "${callbacks["document_end"]}" ]] && ${callbacks["document_end"]} "${1}" "document_end" "exit_success"
230*8462SApril.Chin@Sun.COM
231*8462SApril.Chin@Sun.COM    print # final newline to make filters like "sed" happy
232*8462SApril.Chin@Sun.COM}
233*8462SApril.Chin@Sun.COM
234*8462SApril.Chin@Sun.COMfunction print_sample1_xml
235*8462SApril.Chin@Sun.COM{
236*8462SApril.Chin@Sun.COMcat <<EOF
237*8462SApril.Chin@Sun.COM<br />
238*8462SApril.Chin@Sun.COM<score-partwise instrument="flute1">
239*8462SApril.Chin@Sun.COM        <identification>
240*8462SApril.Chin@Sun.COM            <kaiman>nocrocodile</kaiman>
241*8462SApril.Chin@Sun.COM        </identification>
242*8462SApril.Chin@Sun.COM        <!-- a comment -->
243*8462SApril.Chin@Sun.COM        <partlist>
244*8462SApril.Chin@Sun.COM            <foo>myfootext</foo>
245*8462SApril.Chin@Sun.COM            <bar>mybartext</bar>
246*8462SApril.Chin@Sun.COM            <snap />
247*8462SApril.Chin@Sun.COM            <!-- another
248*8462SApril.Chin@Sun.COM                 comment -->
249*8462SApril.Chin@Sun.COM            <ttt>myttttext</ttt>
250*8462SApril.Chin@Sun.COM        </partlist>
251*8462SApril.Chin@Sun.COM</score-partwise>
252*8462SApril.Chin@Sun.COMEOF
253*8462SApril.Chin@Sun.COM}
254*8462SApril.Chin@Sun.COM
255*8462SApril.Chin@Sun.COMfunction usage
256*8462SApril.Chin@Sun.COM{
257*8462SApril.Chin@Sun.COM    OPTIND=0
258*8462SApril.Chin@Sun.COM    getopts -a "${progname}" "${xmldocumenttree1_usage}" OPT '-?'
259*8462SApril.Chin@Sun.COM    exit 2
260*8462SApril.Chin@Sun.COM}
261*8462SApril.Chin@Sun.COM
262*8462SApril.Chin@Sun.COM# program start
263*8462SApril.Chin@Sun.COMbuiltin basename
264*8462SApril.Chin@Sun.COMbuiltin cat
265*8462SApril.Chin@Sun.COMbuiltin date
266*8462SApril.Chin@Sun.COMbuiltin uname
267*8462SApril.Chin@Sun.COM
268*8462SApril.Chin@Sun.COMtypeset progname="${ basename "${0}" ; }"
269*8462SApril.Chin@Sun.COM
270*8462SApril.Chin@Sun.COMtypeset -r xmldocumenttree1_usage=$'+
271*8462SApril.Chin@Sun.COM[-?\n@(#)\$Id: xmldocumenttree1 (Roland Mainz) 2008-10-14 \$\n]
272*8462SApril.Chin@Sun.COM[-author?Roland Mainz <roland.mainz@nrubsig.org>]
273*8462SApril.Chin@Sun.COM[+NAME?xmldocumenttree1 - XML tree demo]
274*8462SApril.Chin@Sun.COM[+DESCRIPTION?\bxmldocumenttree\b is a small ksh93 compound variable demo
275*8462SApril.Chin@Sun.COM        which reads a XML input file, converts it into an internal
276*8462SApril.Chin@Sun.COM        variable tree representation and outputs it in the format
277*8462SApril.Chin@Sun.COM        specified by viewmode (either "list", "namelist" or "tree").]
278*8462SApril.Chin@Sun.COM
279*8462SApril.Chin@Sun.COMfile viewmode
280*8462SApril.Chin@Sun.COM
281*8462SApril.Chin@Sun.COM[+SEE ALSO?\bksh93\b(1)]
282*8462SApril.Chin@Sun.COM'
283*8462SApril.Chin@Sun.COM
284*8462SApril.Chin@Sun.COMwhile getopts -a "${progname}" "${xmldocumenttree1_usage}" OPT ; do
285*8462SApril.Chin@Sun.COM#    printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|"
286*8462SApril.Chin@Sun.COM    case ${OPT} in
287*8462SApril.Chin@Sun.COM        *)    usage ;;
288*8462SApril.Chin@Sun.COM    esac
289*8462SApril.Chin@Sun.COMdone
290*8462SApril.Chin@Sun.COMshift $((OPTIND-1))
291*8462SApril.Chin@Sun.COM
292*8462SApril.Chin@Sun.COMtypeset xmlfile="$1"
293*8462SApril.Chin@Sun.COMtypeset viewmode="$2"
294*8462SApril.Chin@Sun.COM
295*8462SApril.Chin@Sun.COMif [[ "${xmlfile}" == "" ]] ; then
296*8462SApril.Chin@Sun.COM    fatal_error $"No file given."
297*8462SApril.Chin@Sun.COMfi
298*8462SApril.Chin@Sun.COM
299*8462SApril.Chin@Sun.COMif [[ "${viewmode}" != ~(Elr)(list|namelist|tree) ]] ; then
300*8462SApril.Chin@Sun.COM    fatal_error $"Invalid view mode \"${viewmode}\"."
301*8462SApril.Chin@Sun.COMfi
302*8462SApril.Chin@Sun.COM
303*8462SApril.Chin@Sun.COMtypeset -C xdoc
304*8462SApril.Chin@Sun.COMtypeset -A xdoc.nodes
305*8462SApril.Chin@Sun.COMinteger xdoc.nodesnum=0
306*8462SApril.Chin@Sun.COM
307*8462SApril.Chin@Sun.COMtypeset -C stack
308*8462SApril.Chin@Sun.COMtypeset -a stack.items=( [0]="doc.nodes" )
309*8462SApril.Chin@Sun.COMinteger stack.pos=0
310*8462SApril.Chin@Sun.COM
311*8462SApril.Chin@Sun.COM# setup callbacks for xml_tok
312*8462SApril.Chin@Sun.COMtypeset -A document_cb # callbacks for xml_tok
313*8462SApril.Chin@Sun.COMdocument_cb["document_start"]="handle_document"
314*8462SApril.Chin@Sun.COMdocument_cb["document_end"]="handle_document"
315*8462SApril.Chin@Sun.COMdocument_cb["tag_begin"]="handle_document"
316*8462SApril.Chin@Sun.COMdocument_cb["tag_end"]="handle_document"
317*8462SApril.Chin@Sun.COMdocument_cb["tag_text"]="handle_document"
318*8462SApril.Chin@Sun.COMdocument_cb["tag_comment"]="handle_document"
319*8462SApril.Chin@Sun.COM# argument for "handle_document"
320*8462SApril.Chin@Sun.COMdocument_cb["arg_tree"]="xdoc"
321*8462SApril.Chin@Sun.COM
322*8462SApril.Chin@Sun.COM
323*8462SApril.Chin@Sun.COMif [[ "${xmlfile}" == "#sample1" ]] ; then
324*8462SApril.Chin@Sun.COM    print_sample1_xml | xml_tok document_cb
325*8462SApril.Chin@Sun.COMelif [[ "${xmlfile}" == "#sample2" ]] ; then
326*8462SApril.Chin@Sun.COM    /usr/sfw/bin/wget \
327*8462SApril.Chin@Sun.COM            --user-agent='ksh93_xmldocumenttree' \
328*8462SApril.Chin@Sun.COM	    --output-document=- \
329*8462SApril.Chin@Sun.COM	    'http://www.google.com/custom?q=gummi+bears' |
330*8462SApril.Chin@Sun.COM        /usr/bin/iconv -f "ISO8859-1" |
331*8462SApril.Chin@Sun.COM        xml_tok document_cb
332*8462SApril.Chin@Sun.COMelse
333*8462SApril.Chin@Sun.COM    cat "${xmlfile}" | xml_tok document_cb
334*8462SApril.Chin@Sun.COMfi
335*8462SApril.Chin@Sun.COM
336*8462SApril.Chin@Sun.COMprint -u2 "#parsing completed."
337*8462SApril.Chin@Sun.COM
338*8462SApril.Chin@Sun.COMcase "${viewmode}" in
339*8462SApril.Chin@Sun.COM    list)
340*8462SApril.Chin@Sun.COM        set | egrep "xdoc.*(tagname|tagtype|tagval|tagattributes)" | fgrep -v ']=$'
341*8462SApril.Chin@Sun.COM        ;;
342*8462SApril.Chin@Sun.COM    namelist)
343*8462SApril.Chin@Sun.COM        typeset + | egrep "xdoc.*(tagname|tagtype|tagval|tagattributes)"
344*8462SApril.Chin@Sun.COM        ;;
345*8462SApril.Chin@Sun.COM    tree)
346*8462SApril.Chin@Sun.COM        print -- "${xdoc}"
347*8462SApril.Chin@Sun.COM        ;;
348*8462SApril.Chin@Sun.COM       *)
349*8462SApril.Chin@Sun.COM        fatal_error $"Invalid view mode \"${viewmode}\"."
350*8462SApril.Chin@Sun.COM        ;;
351*8462SApril.Chin@Sun.COMesac
352*8462SApril.Chin@Sun.COM
353*8462SApril.Chin@Sun.COMprint -u2 "#done."
354*8462SApril.Chin@Sun.COM
355*8462SApril.Chin@Sun.COMexit 0
356*8462SApril.Chin@Sun.COM# EOF.
357