PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i5h-3LL

HOME


5h-3LL 1.0
DIR: /usr/sbin
/usr/sbin/
Upload File:
Current File : /usr/sbin/update-xmlcatalog
#!/usr/bin/perl
## ----------------------------------------------------------------------
## Debian update-xmlcatalog
## ----------------------------------------------------------------------
## Copyright (c) 2003-2004 Ardo van Rangelrooij
##
## This is free software; see the GNU General Public Licence version 2
## or later for copying conditions.  There is NO warranty.
## ----------------------------------------------------------------------

=head1 NAME

update-xmlcatalog - maintain XML catalog files

=head1 SYNOPSIS

B<update-xmlcatalog> B<--add> B<--root> S<B<--package> I<package>>
S<B<--type> I<type>> S<B<--id> I<id>>

B<update-xmlcatalog> B<--del> B<--root> S<B<--package> I<package>>
S<B<--type> I<type>> S<B<--id> I<id>>

B<update-xmlcatalog> B<--add> S<B<--package> I<package>> S<B<--local>
I<local>> S<B<--type> I<type>> S<B<--id> I<id>>

B<update-xmlcatalog> B<--del> S<B<--package> I<package>> S<B<--local>
I<local>> S<B<--type> I<type>> S<B<--id> I<id>>

B<update-xmlcatalog> B<--add> S<B<--local> I<local>> S<B<--file>
I<file>> S<B<--type> I<type>> S<B<--id> I<id>>

B<update-xmlcatalog> B<--del> S<B<--local> I<local>> S<B<--file>
I<file>> S<B<--type> I<type>> S<B<--id> I<id>>

B<update-xmlcatalog> B<--help>

=head1 DESCRIPTION

B<update-xmlcatalog> add entries to and removes entries from the root
XML catalog file, a package XML catalog file or a local XML catalog
file.

=head1 OPTIONS

=over 4

=item B<--add>

Adds the entry to the root XML catalog file, a package XML catalog
file or a local XML catalog file.  If the XML catalog file does not
exist yet, it is automatically created.

=item B<--del>

Deletes the entry from the root XML catalog file, the package XML
catalog file or the local XML catalog file.  A resulting empty XML
catalog is not automatically deleted from the filesystem.

=item B<--file> I<file>

Indicates a local filename.

=item B<--id> I<id>

Indicates the XML catalog file entry identifier.

=item B<--local> I<local>

Indicates a local XML catalog file.

=item B<--package> I<package>

Indicates a package XML catalog file.

=item B<--root>

Indicates the root XML catalog file.

=item B<--type> I<type>

Indicates the XML catalog file entry type (public, system, uri).

=item B<--help>

Displays the usage information.

=back

=head1 NOTES

B<update-xmlcatalog> is the de-facto standard tool to be used to
maintain XML catalog files on a Debian system, similar to that
L<update-catalog(8)> is the standard tool to be used to main SGML
catalog files on a Debian system.  A Debian XML Policy document to
this effect is currently under development.

B<update-xmlcatalog> and L<xmlcatalog(1)> are incompatible.  The
former has an internal database of all the entries in all the XML
catalog files it maintains and regenerates the indicated XML catalog
file completely from scratch upon an update.  The latter updates the
indicated XML catalog file directly.  This means that any change made
to an XML catalog file using L<xmlcatalog(1)> is overwritten the next
time that XML catalog file is updated using B<update-xmlcatalog>.

=head1 SEE ALSO

F</usr/share/doc/xml-core/README.Debian>

=head1 AUTHOR

B<Ardo van Rangelrooij> E<lt>ardo@debian.orgE<gt>

=cut

## ----------------------------------------------------------------------
use strict;

## ----------------------------------------------------------------------
use File::Spec;
use Getopt::Long;

## ----------------------------------------------------------------------
$0  =~ m|[^/]+$|;

## ----------------------------------------------------------------------
my $name = $&;

## ----------------------------------------------------------------------
use vars qw( $catalog_data $catalog_data_dir );
use vars qw( $catalog $catalog_dir );
use vars qw( %catalog $key $entry );

## ----------------------------------------------------------------------
$catalog_data_dir = '/var/lib/xml-core';
$catalog_dir      = '/etc/xml';

## ----------------------------------------------------------------------
use vars qw( $add );
use vars qw( $del );
use vars qw( $file );
use vars qw( $help );
use vars qw( $local );
use vars qw( $package );
use vars qw( $root );
use vars qw( $type $id );
use vars qw( $verbose );

## ----------------------------------------------------------------------
if ( ! GetOptions(
		  'add'       => \$add,
		  'del'       => \$del,
		  'file=s'    => \$file,
		  'help'      => \$help,
		  'id=s'      => \$id,
		  'local=s'   => \$local,
		  'package=s' => \$package,
		  'root'      => \$root,
		  'type=s'    => \$type,
		  'verbose'   => \$verbose,
		  )
     )
{
    &help;
    exit 1;
}


## ----------------------------------------------------------------------
if ( defined( $help ) )
{
    &help;
    exit -1;
}

## ----------------------------------------------------------------------
if  ( ! ( defined( $add ) || defined( $del ) ) )
{
    print STDERR "$name: error: either 'add' or 'del' must be given\n";
    exit 1;
}
elsif  ( ( defined( $add ) && defined( $del ) ) )
{
    print STDERR "$name: error: only one of 'add' and 'del' can be given\n";
    exit 1;
}

## ----------------------------------------------------------------------
if ( defined( $add ) )
{
    if ( defined( $root ) )
    {
	if ( defined( $package ) )
	{
	    my $catalog = File::Spec->catfile( $catalog_dir, "$package.xml" );
	    if ( ! -f $catalog )
	    {
		print STDERR "$name: error: package catalog $catalog not found\n";
		exit 1;
	    }
	}
	else
	{
	    print STDERR "$name: error: package catalog not given\n";
	    exit 1;
	}
	if ( defined( $local) || defined( $file ) )
	{
	    print STDERR "$name: error: local catalog and file not for adding to root catalog file\n";
	    exit 1;
	}
    }
    elsif ( defined( $package ) )
    {
	if ( defined( $local ) )
	{
	    if ( ! -f $local )
	    {
		print STDERR "$name: error: local catalog $local not found\n";
		exit 1;
	    }
	}
	else
	{
	    print STDERR "$name: error: local catalog not given\n";
	    exit 1;
	}
	if ( defined( $file ) )
	{
	    print STDERR "$name: error: file not for adding to package catalog file\n";
	    exit 1;
	}
    }
    elsif ( defined( $local ) )
    {
	if ( defined( $file ) )
	{
	    if ( ! -f $file )
	    {
		print STDERR "$name: error: file $file not found\n";
		exit 1;
	    }
	}
	else
	{
	    print STDERR "$name: error: file not given\n";
	    exit 1;
	}
    }
    else
    {
	print STDERR "$name: error: catalog not given\n";
	exit 1;
    }
}
elsif ( defined( $del ) )
{
    if ( defined( $root ) )
    {
	my $catalog = File::Spec->catfile( $catalog_dir, 'catalog' );
	if ( ! -f $catalog )
	{
	    print STDERR "$name: error: root catalog $catalog not found\n";
	    exit 1;
	}
	if ( defined( $package) || defined( $local ) || defined( $file ) )
	{
	    print STDERR "$name: error: package catalog, local catalog or file not for deleting from root catalog file\n";
	    exit 1;
	}
    }
    elsif ( defined( $package ) )
    {
	my $catalog = File::Spec->catfile( $catalog_dir, "$package.xml" );
	if ( ! -f $catalog )
	{
	    print STDERR "$name: error: package catalog $catalog not found\n";
	    exit 1;
	}
	if ( defined( $local ) || defined( $file ) )
	{
	    print STDERR "$name: error: local catalog or file not for deleting from package catalog file\n";
	    exit 1;
	}
    }
    elsif ( defined( $local ) )
    {
	if ( ! -f $local )
	{
	    print STDERR "$name: error: local catalog $local not found\n";
	    exit 1;
	}
	if ( defined( $file ) )
	{
	    print STDERR "$name: error: file not for deleting from local catalog file\n";
	    exit 1;
	}
    }
    else
    {
	print STDERR "$name: error: catalog not given\n";
	exit 1;
    }
}

## ----------------------------------------------------------------------
if ( defined( $type ) )
{
    if ( $type !~ /^(public|system|uri)$/ )
    {
        print STDERR "$name: error: wrong type\n";
        exit 1;
    }
}
else
{
    print STDERR "$name: error: type not given\n";
    exit 1;
}

## ----------------------------------------------------------------------
if ( ! defined( $id ) )
{
    print STDERR "$name: error: id not given\n";
    exit 1;
}

## ----------------------------------------------------------------------
if ( defined( $root ) )
{
    $catalog = 'catalog';
    $catalog_data = File::Spec->catfile( $catalog_data_dir, $catalog );
    $catalog = File::Spec->catfile( $catalog_dir, $catalog );
    my $start = $type;
    $start .= 'Id' unless $type eq 'uri';
    $start .= 'StartString';
    $id = "$start=\"$id\"";
    $type = ( $type eq 'uri' ) ? "\U$type" : "\u$type";
    $type = "delegate$type";
    $package = "catalog=\"file:///etc/xml/$package.xml\"";
    $key = "$type $id";
    $entry = "$package";
}
elsif ( defined( $package ) )
{
    $catalog_data = File::Spec->catfile( $catalog_data_dir, $package );
    $catalog = File::Spec->catfile( $catalog_dir, "$package.xml" );
    my $start = $type;
    $start .= 'Id' unless $type eq 'uri';
    $start .= 'StartString';
    $id = "$start=\"$id\"";
    $type = ( $type eq 'uri' ) ? "\U$type" : "\u$type";
    $type = "delegate$type";
    $local = "catalog=\"file://$local\"";
    $key = "$type $id";
    $entry = "$local";
}
elsif ( defined( $local ) )
{
    $catalog = $local;
    $catalog_data = $local;
    $catalog_data =~ tr|/|_|;
    $catalog_data = File::Spec->catfile( $catalog_data_dir, $catalog_data );
    my $start = ( $type eq 'uri' ) ? 'name' : $type;
    $start .= 'Id' unless $type eq 'uri';
    $id = "$start=\"$id\"";
    $file = "uri=\"$file\"";
    $key = "$type $id";
    $entry = "$file";
}

## ----------------------------------------------------------------------
if ( defined( $add ) )
{
    &read_catalog_data if -f $catalog_data;
    if ( &add_entry )
    {
	&create_backup if -f $catalog;
	&write_catalog_data;
	&write_catalog;
    }
    else
    {
	exit 1;
    }
}
elsif ( defined( $del ) )
{
    &read_catalog_data;
    if ( &del_entry )
    {
	&create_backup;
	&write_catalog_data;
	&write_catalog;
    }
    else
    {
	exit 1;
    }
}

## ----------------------------------------------------------------------
exit 0;

## ----------------------------------------------------------------------
sub add_entry
{

    ## ------------------------------------------------------------------
    if ( exists( $catalog{ $key } ) )
    {
	if ( $catalog{ $key } ne $entry )
	{
	    print STDERR "$name: error: entity already registered with a different value\n";
	    print STDERR " Entity   : [$key]\n";
	    print STDERR " Old value: [$catalog{$key}]\n";
	    print STDERR " New value: [$entry]\n";
	    return;
	}
	else
	{
	    print STDERR "$name: notice: entity already registered\n"
		if $verbose;
	    return 1;
	}
    }
    else
    {
	print "$name: adding entity to catalog data $catalog_data with the same value\n"
	    if $verbose;
	$catalog{ $key } = $entry;
	return 1;
    }

} ## add_entry

## ----------------------------------------------------------------------
sub del_entry
{

    ## ------------------------------------------------------------------
    if ( exists( $catalog{ $key } ) )
    {
	print "$name: removing entity from catalog data $catalog_data\n"
	    if $verbose;
	delete( $catalog{ $key } );
	return 1;
    }
    else
    {
	print STDERR "$name: error: entity not registered\n";
	return;
    }

} ## del_entry

## ----------------------------------------------------------------------
sub read_catalog_data
{

    ## ------------------------------------------------------------------
    print "$name: reading catalog data $catalog_data\n" if $verbose;
    open( CATALOG_DATA, '<', $catalog_data )
	or die "$name: cannot open catalog data $catalog_data for reading: $!";
    while ( <CATALOG_DATA> )
    {
	chop;
	my ( $key, $entry ) = split( />/ );
	$key =~ s/^<//;
	$entry =~ s/^<//;
	$catalog{ $key } = $entry;
    }
    close( CATALOG_DATA )
	or die "$name: cannot close catalog data $catalog_data: $!";

} ## read_catalog_data

## ----------------------------------------------------------------------
sub write_catalog_data
{

    ## ------------------------------------------------------------------
    print "$name: writing catalog data $catalog_data\n" if $verbose;
    open( CATALOG_DATA, '>', $catalog_data )
	or die "$name: cannot open catalog data $catalog_data for writing: $!";
    my $counter = 0;
    for my $key ( keys %catalog )
    {
	print( CATALOG_DATA "<$key><$catalog{ $key }>\n" );
	$counter++;
    }
    close( CATALOG_DATA )
	or die "$name: cannot close catalog data $catalog_data: $!";

    ## ------------------------------------------------------------------
    if ( $counter == 0 )
    {
	print "$name: removing catalog data $catalog_data\n" if $verbose;
	unlink( $catalog_data );
    }

} ## write_catalog_data

## ----------------------------------------------------------------------
sub create_backup
{

    ## ------------------------------------------------------------------
    my $backup = $catalog . '.old';

    ## ------------------------------------------------------------------
    if ( -f $backup )
    {
	print "$name: removing backup $backup\n" if $verbose;
	unlink( $backup )
	    or die "$name: cannot remove backup $backup: $!";
    }

    ## ------------------------------------------------------------------
    print "$name: moving catalog $catalog to backup $backup\n" if $verbose;
    rename( $catalog, $backup )
	or die "$name: cannot move catalog $catalog to backup $backup: $!";

} ## create_backup

## ----------------------------------------------------------------------
sub write_catalog
{

    ## ------------------------------------------------------------------
    my @catalog = ();

    ## ------------------------------------------------------------------
    my $header = '/usr/share/xml-core/catalog.header';
    open( HEADER, '<', $header )
	or die "$name: cannot open catalog header $header for reading: $!";
    while ( <HEADER> )
    {
	chop;
	push( @catalog, $_ );
    }
    close( HEADER )
	or die "$name: cannot close catalog header $header: $!";

    ## ------------------------------------------------------------------
    my $counter = 0;
    for my $key ( keys %catalog )
    {
	push( @catalog, "<$key $catalog{ $key }/>" );
	$counter++;
    }

    ## ------------------------------------------------------------------
    my $footer = '/usr/share/xml-core/catalog.footer';
    open( FOOTER, '<', $footer )
	or die "$name: cannot open catalog footer $footer for reading: $!";
    while ( <FOOTER> )
    {
	chop;
	push( @catalog, $_ );
    }
    close( FOOTER )
	or die "$name: cannot close catalog footer $footer: $!";

    ## ------------------------------------------------------------------
    print "$name: writing catalog $catalog\n" if $verbose;
    open( CATALOG, '>', $catalog )
	or die "$name: cannot open catalog $catalog for writing: $!";
    for ( @catalog )
    {
	print( CATALOG $_, "\n" );
    }
    close( CATALOG )
	or die "$name: cannot close catalog $catalog: $!";

    ## ------------------------------------------------------------------
    if ( $counter == 0 )
    {
	print "$name: removing catalog $catalog\n" if $verbose;
	unlink( $catalog );
    }

} ## write_catalog

## ----------------------------------------------------------------------
sub help
{

    ## ------------------------------------------------------------------
    print <<END;
Usage:
    $name <options> --add --root --type <type> \\
                                                --id <id> --package <package>
    $name <options> --del --root --type <type> \\
                                                --id <id>

    $name <options> --add --package <package> --type <type> \\
                                                --id <id> --local <local>
    $name <options> --del --package <package> --type <type> \\
                                                --id <id>

    $name <options> --add --local <local> --type <type> \\
                                                --id <id> --file <file>
    $name <options> --del --local <local> --type <type> \\
                                                --id <id>

    $name --help

With:
    --file <file>       = a local filename
    --id <id>           = catalog entry idenitifier
    --local <local>     = a local XML catalog
    --package <package> = a package XML catalog
    --root              = the root XML catalog (= /etc/xml/catalog)
    --type <type>       = catalog entry type (= public, system, uri)

Options:
    --verbose = be verbose

END

} ## help

## ----------------------------------------------------------------------
__END__

## ----------------------------------------------------------------------