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