From 3df751f37b8cb67c05b5ebde609010bc3047418e Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Mon, 4 Mar 2024 07:37:33 -0500 Subject: [PATCH] SAX callback now returns a boolean (Issue #51) --- CHANGES.md | 2 ++ doc/body.man | 4 ++-- doc/body.md | 24 ++++++++++++++++-------- doc/mxml.3 | 8 ++++---- doc/mxml.epub | Bin 719876 -> 719928 bytes doc/mxml.html | 25 +++++++++++++++++-------- mxml-file.c | 29 ++++++++++++++++++++--------- mxml.h | 2 +- 8 files changed, 62 insertions(+), 32 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index c2f4714..d36b2c2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,8 @@ `MXML_TYPE_DIRECTIVE` node types (Issue #250) - Renamed `mxml_type_t` enumerations to `MXML_TYPE_xxx` (Issue #251) - Updated APIs to use bool type instead of an int representing a boolean value. +- Updated the SAX callback to return a `bool` value to control processing + (Issue #51) # Changes in Mini-XML 3.3.2 diff --git a/doc/body.man b/doc/body.man index 55bf45a..f9a6179 100644 --- a/doc/body.man +++ b/doc/body.man @@ -154,13 +154,13 @@ functions retrieve the value from a node: mxml_node_t *node; - int intvalue = mxmlGetInteger(node); + long intvalue = mxmlGetInteger(node); const char *opaquevalue = mxmlGetOpaque(node); double realvalue = mxmlGetReal(node); - int whitespacevalue; + bool whitespacevalue; const char *textvalue = mxmlGetText(node, &whitespacevalue); .fi .PP diff --git a/doc/body.md b/doc/body.md index 87495e0..aa30a83 100644 --- a/doc/body.md +++ b/doc/body.md @@ -88,7 +88,7 @@ The Mini-XML library is included with your program using the `-lmxml` option: If you have the `pkg-config` software installed, you can use it to determine the proper compiler and linker options for your installation: - gcc `pkg-config --cflags mxml` -o myprogram myprogram.c `pkg-config --libs mxml` + gcc `pkg-config --cflags mxml4` -o myprogram myprogram.c `pkg-config --libs mxml4` Loading an XML File @@ -1172,14 +1172,18 @@ mxmlSAXLoadString(mxml_node_t *top, const char *s, Each function works like the corresponding `mxmlLoad` function but uses a callback to process each node as it is read. The callback function receives the -node, an event code, and a user data pointer you supply: +node, an event code, and a user data pointer you supply and returns `true` to +continue processing or `false` to stop: ```c -void +bool sax_cb(mxml_node_t *node, mxml_sax_event_t event, void *data) { ... do something ... + + // Continue processing... + return (true); } ``` @@ -1187,8 +1191,7 @@ The event will be one of the following: - `MXML_SAX_EVENT_CDATA`: CDATA was just read. - `MXML_SAX_EVENT_COMMENT`: A comment was just read. -- `MXML_SAX_EVENT_DATA`: Data ( ---------------------, integer, opaque, real, or text) was just read. +- `MXML_SAX_EVENT_DATA`: Data (integer, opaque, real, or text) was just read. - `MXML_SAX_EVENT_DECLARATION`: A declaration was just read. - `MXML_SAX_EVENT_DIRECTIVE`: A processing directive/instruction was just read. - `MXML_SAX_EVENT_ELEMENT_CLOSE` - A close element was just read \(``) @@ -1200,12 +1203,14 @@ using the `mxmlRetain` function. For example, the following SAX callback will retain all nodes, effectively simulating a normal in-memory load: ```c -void +bool sax_cb(mxml_node_t *node, mxml_sax_event_t event, void *data) { if (event != MXML_SAX_ELEMENT_CLOSE) mxmlRetain(node); + + return (true); } ``` @@ -1216,7 +1221,7 @@ will retain the title and headings in an XHTML file. It also retains the directives like `` and declarations like ``: ```c -void +bool sax_cb(mxml_node_t *node, mxml_sax_event_t event, void *data) { @@ -1256,6 +1261,8 @@ sax_cb(mxml_node_t *node, mxml_sax_event_t event, mxmlRetain(node); } } + + return (true); } ``` @@ -1320,7 +1327,8 @@ Migrating from Mini-XML v3.x The following incompatible API changes were made in Mini-XML v4.0: -- SAX events are not named `MXML_SAX_EVENT_foo` instead of `MXML_SAX_foo`. +- SAX events are now named `MXML_SAX_EVENT_foo` instead of `MXML_SAX_foo`. +- SAX callbacks now return a boolean value. - Node types are now named `MXML_TYPE_foo` instead of `MXML_foo`. - Functions that returned `0` on success and `-1` on error now return `true` on success and `false` on error. diff --git a/doc/mxml.3 b/doc/mxml.3 index 963a10a..1f82030 100644 --- a/doc/mxml.3 +++ b/doc/mxml.3 @@ -1,4 +1,4 @@ -.TH mxml 3 "Mini-XML API" "2024-03-02" "Mini-XML API" +.TH mxml 3 "Mini-XML API" "2024-03-04" "Mini-XML API" .SH NAME mxml \- Mini-XML API .SH INCLUDE FILE @@ -157,13 +157,13 @@ functions retrieve the value from a node: mxml_node_t *node; - int intvalue = mxmlGetInteger(node); + long intvalue = mxmlGetInteger(node); const char *opaquevalue = mxmlGetOpaque(node); double realvalue = mxmlGetReal(node); - int whitespacevalue; + bool whitespacevalue; const char *textvalue = mxmlGetText(node, &whitespacevalue); .fi .PP @@ -1505,7 +1505,7 @@ typedef const char *(*)(mxml_node_t *, int) mxml_save_cb_t; SAX callback function .PP .nf -typedef void(*)(mxml_node_t *, mxml_sax_event_t, void *) mxml_sax_cb_t; +typedef bool(*)(mxml_node_t *, mxml_sax_event_t, void *) mxml_sax_cb_t; .fi .SS mxml_sax_event_t SAX event type. diff --git a/doc/mxml.epub b/doc/mxml.epub index dd235933a2fe9ee400eaefaa84b5b891b75c2ef5..761980ec672bbc904d9f7743b0a3778679281bd4 100644 GIT binary patch delta 20409 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 Xo2Tar#7=mexqJoUCDFox@YDYX*L7J4 delta 20368 zcmV)1K+V6n_$!3?D-BRf0|XQR00000I-p{a4L1Wipkk3nBm+92Vv%m#13I8$lT863 z4mzM>SW2_2+gwfn0DmNtd;u$6vve|mrHUFXvYT;m@PK8>@NJJ)$Wd$zZ?SS$vMM}s82+I#qa+u#0n?=!x$ zgD*Xs_}E$)_di_hc;*GR6#4=D$)kJ{9=?m>sQ<@zZ@tHZeeZpmT&4bW3PbVU`SIMJ zyx8N{IxnVS?t8I64PWkDg>jhrd6MpUqa@D5IDfeV69|K3Nu`SYvS zN0&!`?hKP)>HVLM=MDYQr>iuX$H6miaUJF1bGSK5CQ16t8&2SVAzqK6{r=dWMw8_; zFZ1K94?~K^>QNT`EqvxZJecLrJOAkT)Ue$K+jb7|ysB^bqdd9^txre$Bm5L+)bnON@A@J9cL4uAg8yJCub;qwPwA7Ic|gBm|2o7a zhnWl>W0R{|T8P(whsh+sHf8_?{b3sVpZZapMFFgdf0IN3x23=1|F8Jf)K9OX z_?fp)uN~CC*3Xj}j_*l0rPm*oUf;J~A0~O8Ordf9qN<28W2IC))rBaU*l>%oqfiqL3A@f;u59=FvjJ7jNV72>HCxD3U+1$xD}@I zD}ihof5c#izs5-dZ_&pFAPmECk|H2X7XC8BHU^`KpTXCIFrH75HUSF5)p#C{#Lp~G z=c62cApQp77=F!Tc*F>sq%cag23azR0`Fk<*#m00r1pa_8>P`KmtUBxvoBXi^=H1K z7M2idl8ioo{dEqLGWwMr=GRdydc;Sc``NW0B#UR>BNz$(_XPe+uZDj2;lYnR`QQHF z;K{BD^AE!*c7`h!AX9-m`?x>#xHR*Sg7*Mt#gExQ{7vDX`Gl_UX$j}2Nt|Ree?(O7 zdO5oe;|%T+`@ma((!)ntfOlpXT!n z$JJk?{;ZnT5=aN(C}Eg;=95VUA{=L4lmk|co>$ROYff<@X9VO^jS`8nb@j-)dhC;j z1x*!0`wc-98R^aU;4Rmn#r@*2?ExKdlj#K=0Z@|%1}rY?CIr~TWu}AAEBY)?hufsS z(r0mg-5*^?lb{>kgz;`;LL>HNfRMI&a|B;}NRwd(Avr;L`4k>j0fR9G8_49?t*#D4 zPZGq+@Kf2-^#KbQNP-MeVUH31##YI8}x-`Crp8h|uZeYCslpFX*=P!Rbe6dHg z95k*yp{nA9P;q_ek(>vA>K6jW&T8fL`XPKaJ1nT1FZO11yN#mA-+)Xihk#=uZTi3- zlotgrccM5?lVDE5;LhQRaRp;K5MvT!k1|;M3@~=$;pNN+1r(+*iH514E`enDxwlN_ z-pG%=c?Jq-;(-Vg(93}jit9L<0DL5=$6%FtAV|OmsprpTAQq5+U;;D=RPcEYpZ;|o z5%f)fmxYMGz&iaHpeGQ0MqxJa)bM6$azg-^Uxz?vCX-}=UrSLJus2^mHp+G5A^HdQ~J3`quhE1bz3WGj>lPSP#kA?nu$|5H2B=(6DQHysSfx3{6u9uEJE{^`_b)k*W2gKW@ zRTpD+juLkUpf8$&nC4BxX#%@9&j7JqP0weuBn1HT(_xg;Mu(G-NEF&3K+f@VXmvQx z={IzuuDu(7GKZdVM`8PTW;slL8limjKXaJ9f8$3Jk|cP49CafASPicbIbnX2o|nx0 zzs^Ii`){bGJSWoz|J>zqAT8&mLs^S}jh|0Kf6TvNQ~)rJKHmtS$pDa2Zv-6@5MZ;Q z6!=%PJFsyXt}*uEXoI_W6UBk(48P`|3xD!S+#Fjyg?!960|2J&(P z8Q|?m3?>{yuhc%u-N4iFw-_GC=VhvM9U(RVRr)>u09y0N9{$3|4TDC3+AN`mn{bkV zI!ud%gM0x90n9~N7_R`{;u%19KFG#{IL!BU4u4U9_g?Jzhd9&!0j|kpX$CANq?SM* z!uc?f!S$ZUizu7`V|syzeh8%I^K^3XVvnvAwIiU;l4*$Q(3J-wGZH5;ULumvC^m;% zN*YEVXyU*-0hk8@It;IXN`goN+%t`_1pv?gJ%?*pP^9pn3x% zhLU7|JR&+v`z97C{UIYoL(n>{$Mwypa?jATu7J=w1T7`eg+doN{Zd%P-EJF2xf$<=pN@Uz1Dt-CIKuh;7N3U13Q5$Lu!*xFf^_ibqsxK=%*p3KwfWu zXsWco11VZu!ghV4K~9pKIva;!fYKOq3?{zb82ST3LKD=G22@;idJPyG-Xs(31jq?v zS1e|aj2U+UVFe^ykW+JJZ4v%PZo>45=v}h#h|vRt!PsHDli3WR@Nw_aj}Prd=}~Jw z?jdya@W&^;pZ0&UU!lzqvzDhB-ofC1;lsg?btDRS6;rq!5D~;rMW!xc8}-D22$02w zpnr%R&WR1$L@E>KAkz#bJ30%Q!kBgrYaSxq8hCGT?U6`@O1ugH1}BNn05zJYDe_}E zISZ2f5t4TXyeyj|ZouA>hzo-R!W{^Lt|nZ!Dia`E6A;7Za+X!@MK$t(Mz1(MN4C~TOW-RONdg13$ z$YxN03?GRmiCx51uly(m;p3P0Zx8m~;=lbQMzWoZ^92CYz`F>UIWW^>R{i$m)$!@Y zafz9qo?XHd$<6`T2+AFt&?SF=&yn-?i8>K5d>~FNSFkLDDYGz6Nb;URG|IRbfX)gSE~zCcY+K2VzF&f&j^HoSkENWRs6^j1}mV;=Icu0^}+)3;o8{sc`ZKbH&1Ss+Qk0_mg%)JL4 zv$d}EC{JcR@6E~EWADLu)+1eA{f}NmK^I=^J{S#m?N4`ipSyvWXD}Mdaf4(yCxs`Q zg`;R35%#GQ6cV6d{LvNcGnwqXE-5~{q+JL}n}vHoPN_UaLfB4!M%4De!=6U~8pL`9 zCo#G~Ae4+0g>aS>u?eLVYgIxKPeM6~l)y=F6rX+Mxjkn2f`zDkWHN?7QM((!dI`dY z24SF@w9BYiNmbHP_|@XQg9bmIy+8Vo562&09ld?~yQ5eCz7813oqgW1cOCSg=bg@Y z=DmcKorQ7NB4Rv$ww=SO$p{kG^J>0Ityck5NKb$1S)h3O;VrOO06fn%Vfbh~nj~4+ z9nV~_rii6K$r4T3^)|{KBH@cQFi)QEAq+@E$}JEoaG;a5D$-22b4Yp=t%f%aEL3ZN zXdQR|7c~CnV*n`3)F`Unx%N}}%7d&x6V{;$*N+vU>`M%P&6q}dujDn5$H$6-z>soH zHiUj=6UHJoWUNss3ZM|5c{)6tXDsE~%!fz~5gDWhL}EyRC)$IG4ijljXS9U?)pmfl z45axK1UW@V)EtRwWh9~(jCf@`nt}HxrQ~J5 z^7xOJx9rwsrIePVKM6uEnaolu{Uwmhw3N%b+-D2KvVr#}{MG@=5sVe&%McCgzDILM z**>w<7-e20%^fXnXedm>e4fS*kSEP%N(T<0QxXGzhGvAJ$hVt&X0j*rS^N0v!^P#< zJF%L*(qjS2mCqUeDjy@HsE071;&a?m@tg$!wN$7wk@)Go2&aes7}n{<9{i%|$|;em zgr-?#fn@=A7?O#_2iX-Ei{#J~G++3+)dKRx1{T~Zk=NJ>vZ~=08I}dpT2+Py91nvM z3{H1{i9?dA6}Bwo4`KH+2VP4Iv0YpnmdFS<8na2}4juY48ru8;|L%71RA^Hy3cCRY zX}>Fu0e24f9w>#&`P}m!cz-f>cs?`10d{i_7D5VV*0!&1R~7iV<*lEL;I)>r8?<oD88DCQdD75{V33jk*h7)ZPo=Dba5ALR z8x{=F8RLe`_he)T9bTN1&Jy(W;)5%HgIg*-ZW#?C!;WSy$t3y|+UHXx>lT_3t&jp< zq=$oj!QxeL0bf&u0ss6N4UZjc04GWph;euW$BH*#Ssvo`p1k3D<6z|*kKAvdXUa_7 zaeVi<{GH>iCym~E>K?{CFCmQapC|n1X?f2UbVkIh))(taR)vD5WfBJCAmi^fpNyjvlrSa_ z01F14vE+SC)LQSF~41BUDCyBD(tq z-5BPE>ak1H6Jxj%C(_l;8`g^I=IL;tJ5K#8T=QLS-)V3{dLiftc^X*K3W`j8bd5*A zj>9ED{`d58!T2Jcox(5zF1V9R6dr#K63|!Jh&tX(?Kj@~g%?^$?PdGA)v1$6cAOun zakTixSnd{I@dmc}05+_yo0{W1(ZUD7E%eBA^Ci@qNS^K*BzKq1tFYq9C?Yc|*^Q-u z)cS~BtA-fTqs%~^!U&s8(5c)=Z$&!JRYuvJ!&lOa5ozLUdEYwLMI#b@E~p3)eeJhTqRi z%DQ1}^At}S3|d{t9Yz^-Zp|E_FA%IsB*ko5a}MI%akFs*brQP!_v z!(i#_bb7^>wSG=gxo$w3*WiDuR?nwJDK@2K=2CO4+}5;5>r*lpda|8MAWkluqejHB zuWdQCJ&~5_=;kJDTU(UJRlVJr89cf3GkAJu ziP(>Kl@|O|?5QO3{YoBDX^z^n3fy4-c&z}_RFOj}_fR8J#wEcsdt86Vh3S?o)-^wJ ztTtpOtxZdDLk^VYNsc3I!HY62Tvbd{?0a#lLU1TM&50wWWhZ02UT7(jfs|;ORpqh?c~u@4@MZ-K*W6ZA1rAk- z)Ao*lc3S!6%H6`>a=CxGb+J>94PRV`JO>PgD`602pYUB@n4juA{-NQLckq7&-K%sC&WeXaE~tk# z!gZa4E4E;mBok9Vl3kQF>3Wx89RJ7B5MHLk#ZCDL^Fc7fwShI=2n|ZhU4DuDUf~ecUUV1fEL?tcN)FbqvwSS@f83O2T^Xm#v*UR#h2C;iCeXUZ*~i;uzZcw zw2qUG7Z-nwGUC_=+pivZlT{eb$776u;zm8V#9wYt;d){qT!Yc+Qp8I3DVG>#u9*>d zz0!}ox9F$#t9YawhJQs8&Scg$wHd*6oGD|n^swQ~OXm4(o{Km)pcG}yS{h(?HAL~!xNy@BhA3MmGkH=eriKBAj}AnGjcxKZ<7KbkokM7~ zMikIub76eI#c@|NPXZfiJTPdb@aS>xZ*a8xm17mifEZ)?$s@k5=O>R}uJ0%B&+`QR zcSe7NILuW|#_Mv9uX9`;hSDW>KEw9M_--CeUC});o3=41v3QcM4&8m33;<8<1*hb5 zKqbTzyZQCv);i{lEHWYvuMQXw!&Er|%W z7H-+x3c6+~1!#;M-&k%Poefev%c>l`L(F?Fkgc^fBgL=fQ6v4m@LEpM4^A=^KOz;Uq?+4wGD#^824?sbzAS@jvl$w zSGft-B?#QCQ?o#X+xa#B$|2RLf=2A^28c{)@mO90C?FmvC1q4;*i(L0%Ovgc5C^rLekvG+A`zfH8X7g}ZVhm| zfZa`ym!0umzVsYSTrZI4mEJRW@UD2PnQMP}&D#D~T(;2vW7D4bO*T2GBvP&6CD~k4 z^T`%K@BKVy9%Zs94SJOPs|9;$3W9eLD1wdcWRP#HsY$dopa9WU0tB8OKu=fs^B+LA zr8AsBUXg3=geGO&@tgD`!H!`KWaR0Wr*fO4Ub*XhaU)>*6{+uSB;zxw^+*K_RWE;1 zL*qo~SB4q4rR>^lz7%7(_3$M!j^2^*rFt7O4uFlwmd3V5^b(&1^(hfy$UFFskB8o= zTk1gO3^Q@z%2E&#o&+iHMH$lHDFCz5bA&Wf1JDv>IJE%en!PDiZLgDrbL4M+Hw?24a*Kk8`cXqG+ zC1h7-ICe^AWoJ|3^$U)Xc0-f>&bSO!l#CGeJgpe7Xn?oc?B{m5nT%6*>mmCXY%ZG% z(&Uf(U%#U*vfxx53J`3D%(^Cob77esgJ+P+&9((2MPDkUEIZGUg>~Z z4ih2SY(3BUJehgjG)Z!iS&Z_c3_~Lv1vxpBY)Q0A;l}GbvN_SdODg4Ezw-pWXxr{igV8Mp-l<2%AuJ{mTV!o{D`gecJlQ;-J*HV1( z>MLZUWvVa7YOm#Gv>=U z0GAoS zARE5)X6l#DHncpYwR9@SKHm7?zm(mroQ%p5LRUay6EGwSQwg{Vu=vXOT?VdNi-);8 z5A>88QUgq?*=HAUNfgfEmUqfkCT-e4PelF6ZcUP+7GwaM+!%+!##%vkkj#e@TgD!u-Txu-UM!?A$YR4EzBSvuGED*xQ==x-}iDDTGD81$}6TT={$F&ZXU%gB+ zQ&Yxfif8?W8hElYdVJOMvJevx(@)BFjRvw(piEu-B33vu#G^NSSpZmj=kT5Petuor zI&6!#txI9IBDR*=BP(V?e5{LIdaJ^8C^m!YSm`{4#du!57pj<4 zDH(`9L*X{Ww#Cpnrh+NLNVf9n(YLi%XP6WE=3RmuIsD}s6 z)>nT}JnW+CT&56mLHi}oP}IW9oVJrC!-&`bYb^M`t9Zj%C3$5hj*NSep41=B~0y zn$bt>y@JmqdS*Q@99#`rb5_&x^TtJG`~rW8(Iy*I@8$EUALXH~5yLZ_I*H9rky#axYy+nQ)yh=3Z0y)0jIK`0XG!};59V?8=e zjs}a7LsUU`%5@l1u0VMObDa+dQL@*p{dHH`T3ab2W$CC0ZLJoUQKe?es)Ox<(Tab` zy_6Xfl4S5dv#XK`csnz#b9*%h(sIY^{VPG+#0o^(Ga^H;-&>uKRG-C<6UDl^w?jpX zRW*YZ`X6sgVTE*Vv)^!q67yDhh%A$Q$suwCDCWJa)Gg(@>cZFXy3+?-NrpluC?!fU z4Fh5Xh2%*>>d!oXnB0WBlJBe1hv_iSU}gAc$!-PK8r5&` zq$u>IaYAG&&b%%`@dT?O?-sJ6!$UD@bS0j!eW~ET#i!hsV2Za zwwz82hpBPP%GEwrUb;Q4yNEC3L@4h42T-F_nhE8l}t-{4kaurX=*>~bTVeP{ERj`LwnJqFyMYjC$O~t#%C{5W6Fj^oESy7XO z8#8~%R?2K?o5~>FTK2${(@mJa0#k+$veRspKl6W*$=oLF)}T{u z>%~t}AjM7AsZ`IQMXF0(0H!WZS677*pE)W6ndup+xJ&8ILFvw;j$P%a`22C{&Xdxe zr=>eTmhSx2(6587-00H5zbY)%^w{Ar&h_q@k^@~;Dc#wAjwmCz9HnK<@SsZ>+6jl1 z4Za0}P}_?1$)Ro2PAz}UXxlkqMBTIA=owa}?extE9&NYcRA3@gk&<+{+B{|9Q^-ea zIq*)#?w){ZV(vbN-3#TCB%UmF^IGK+nF#|9xzy1JA~BKZ)9_`C#*X>4>Dw$CZjHb& z=~fIw6DSIrO47WzI?noJ4z|J2pIP9Kj6+my49wI^nIkJydjx+#NsDQ^!UCe^E4B3~ zSZQ*ncuutlMsC@n>nU}OGGRkoyt25rD#v7rJF3fWX+5@$^cxRmYMn05K8I4KpX($G zi=ZY>%p&PS`1oMW6G20I&}&bty%N+OAFKqmqX{sE7+|aH*G#>g!wOc2{Pg@7n8-?* zUviqTEX6gBU#T>JL>gZi6y2h_8nN?(G80(Nq%7vUl*mEO88Y+2#dXzdc^ zf$2E%U#|uOPh8YQ$7-u($Ab43#(^)BO(so$4Oc9XohB)!tV!4e{o(RW|0n%jRxtEN zV{ZX%`>|+1a#~;Vw<{_4Tvq^jVhu zr%=YaCl_ZPGyPo_^X#>)t#-Y2!pxy^5*lkV^v>ffx{5=EBg@cFd$pAg{}f`tu<|y4 zFrhPv^Xp#Sx9{)`_s4<1?0K~vzxJ2zPp<*a>c{+h6ye-sj^cR^;8Zhadc*xS*SV=H zp?JZSaLlg}`~XcoZyraV>#ItBI6e6z3#qz+e*mN=9}$p0a!buhED(Wll8$YfT9GKQ zDp(jaJfd>*P2ktdfu>BUZsx7B-%;^@3N#rIsp2l?Y3n?90Y*3@o+qP<#Qbij8Dn;! zTP6~PyM>k6-M!r`FF|!oIW)<8>Ph^Tv5A=`(Q*~AlFw#R{TT@ovkdg4@#^A9|2pr} z|1bY_{*3}b_-ttX(`@9l2P9fVSVv`GsgGb zU9^HYxBjWLi)|w5=ZBc`#Z&S;U@hE7*3)^_Y&b?1-K1HO`Vn2!(=8^maffSeLz(P?h34sT*ZGQ8>Z2}u*TJ>t_fcN*md-f++m7g5wZv=E|Aa2(c zeNfraqlZ-;A!^k0v|sLtzo_h5>fljTSBzxsI+Nd2cK77BRo#iIbgjCR-&A(@bbpg5 z{~FnoWlW-~Jt%Oe2-x2lvc6&!z(ZM@rSim(d7@YdSglc*rG-I0{fHa`*tNkwynY1= z{dQk&<#UtpC>LEXO=K$cA6fkq{M&E9Dj9DGp_D}xx`ToyJinUavUZ81@yE9mHI6bA zF6!TNs$ry268GXPrleYXU4+zKWxZP6zff9RgNJQQV2PI{l`&_1y%hsu_Nt24A&*3eJMtei!7rjJJyOFlk})bhw9 zL~$6x%E}LcH-tZ*tP=q16h#|^)PT)^c6q$!$Hv;qFizWLqk26!GlFMVTe3$nk`U4`)9X6fAr*uci7?X`}Qn8+B2A9&*Xrv&!wrx z*2SJTCzmjpU_Rq1y9px(pQPbcl!@vG=#ImXu%^qB`v#fM^oIDwD0lmsCcyC>yeJ0g!iByrhho zY|d2^Dola`lk733l*!%0X%mQud73`Nf8tCZ=R5Hcx^!l$n-y?%oy#DVhgP}|M#JKXmh*jp zXL$zlx!I8rejz2{>PeNVLDRG}x}IAE5N7?J zIFId7W+1B2ifO5K*X;iI)!U=y=4dZlvu)`Hgyz9L86JCu0xi1%wd~rcsf#_wTtaYVf6psA<`6+u zkA%IFUW8K+b*W?v;2m7(@?C`qN10r3R6vg~3<@hk86Hlu9o@u|?i-(73Yo#Gi_2r+ zf;Kn;r9isGWxMi?E`3ttD{Xa1m@kAb6XX9YkWv0@d@oBqN$Okrf9f}{&t9S9B7JFm z_qxcrfNKIs><{2>pZ(z+6K$fmMM-Q8&|Q^?e#4M=r7+hC?tx$HfTX55FP8F z8MuB=ESE>STjvI0f1IhyPH#chk+7ezOd_%jp#06kfQW#MwM>C$G{BUaH7gbVML3xZ z8hv7O2=^{B1plK-|Ai&TcoIA~`GluQAaZG0i_+WpF;8kJ)4YJ#MfwIw4yZAs2wV|Y z;Ie)c-EV!AtXMM12^agAb9t)nT&6kc4$fAFUNU(sJ$v?h2di(ZwN3Z@Jt??)(xm~wK)!PnFxtz6$ z#!3IQVtNdNm&JV?XL-#3p2pLY)5$*0U6)G-@ARi}xzdq5Ne6P>|FLvd^f@?$zlSHSL<1B8;xcI7m$zhm0mBE>^zeTw} ziZ)!?e^qTaZ`7Hd;KU*w4}ZV!@Ziz5ivC06F}d8(Fq^mm=|(I+AlZ&%pln?iN$v#w z*A|RF)8jvblKq#z7#0kEZ@EMgAesjv0t8ig>+SB<0JCnHL~f2%>* zrR*HTcx~9ytA+yOxXmESMts*m+!fCDl!dBle{?^?=zhM{@QNkV9D|cJsKgjnSE5=J zO44)nB#~zZhT-VrQkHwkR+gSAw$98*x30X&jLIKoAs8#mUx9EQzVL~5zWH$a3b*WH zM`QMjJ^!#&!Cdlx^(C^Kqaa`b7=DPaDF2iE2$Q#^(Tu-?cSM{v`?^szb|Fe=^=#NU0?fi=&30QJBcCF(`Bg$t2lp3VMhM$W3a7|xly-8Gacr3>b{R6#4 z|InSo_v$w+$zymeCpSeYC`B1G`yxj{51*y*`}&Z_|6&h*!o9$`hVOOKI(RXF1&5DS z3pDHc27bj?X#InrXA=FR*RMbR?)c5wf4MrpQl6LU`O%w81^$liX%*|c*L9`|cxk|n zjxNtWzCSwGB+b#8Sc00qP9>xvZ0hg#c-i4EZi%&nL6nW=Sw>&KR=>p#&RlN+d}hV0 zRiaz1{SQ284dB$BDz_}>sOpq*RP|6s5-0WHf?FJhsuD2|1jmTnF~+#+x#_}cB@T(}V!b%W1M@Y{v)lcR%3tlL=u zLB)JNymU+D*K1}7;~@z5hf>iNCn4mNCQK@1zLgc^kYDr6aA!^v8DT~;p%ty7k0O=I z*CkxdQ85rpvn6a40A0YvYx3BWf82rWZAPh_ln%wGiExeKZ04jX;64cRonf`IR{ESi z+&MIln(>YzTfTAJ+z60_WrOz>OIYt5I&U`yFQYEWDqt#g(h9EZTGL#b`^!U`D(q5b z7|>h&w?``5pLn+hN*nE>s6uXSp}4nl|KPnQn^!EVU8ppFXE(4)#96(If2Wu=61{8X z$~7c6tc4QC#G-MelKug&N)*QpGlJKqWrk8*#P)>k(jrRp1b(9`q`Dz7xXbR$=i}Eva70 zHXD555Cbk6iUAkR#DJm-Y#M%jgUz54##uOfT(qV1145}V9KuO*8 zCdnVN7Cm)(RGrLTf8{s5d)TT$RwPXlLCp4Dg}WWbUGG-7+bL-c4RIHf>@8sjUJ1Wx zfxX4s4G#&-cqfszPv`N&oE>pAGV;9^uo%xtJZJYsJf=1|;i5oh;|^i;Xt;SC9Sv6) z$xFdot*qGV2|0DAuf2++*RdZ>=4sdhLeP-`*2{zrajUt2e~aXY&YpENU8YhxsJ~EH&|x9{&d6|{Z{vz=gh0Q9is&hMi`VfFUVS5RK#b7ekYVm zbGXzMmT64AdKGNY4&460>r%eg7~nKa+2NaXh-nVI0@@Is%H4OrfU#{QD>r~(tH4$O zYz=T_kC4r1fBK;T-Kx6hkWO2$jzct32SyA9#=}Sj$ZCC3rxk?%KCPB!*_J2Tnm21@~f)3Ryp{JJ!q;h6g^toDH=`Rrs#W< z;HUry^CneiFRT1)5LIRTzP!frN+gG_&{(KeU)}eYf61)sTUD^Ck;YWTE4c(gymWNH zC8?SlReRMP#7Vpv!$q&{BvcK?x=vp6OG5v^sDQp#SvF?G;=?T$N?FD;ycB z)7Fl3R7G6QqXp_5XVQ`?AVGs)fDZH%pxIz$+GW{wgkGbpX`)aV`hw=7jD$~Re}a*p z1{qdTfAxZBJPrxBK1C=+C*zI?-%tfiR5ltO8HPrXFKxnQEmbfpmDatAZo-&`&?!C_ zb{Jte9~l-+Qfmc>X*ZMr$;cEIBGln*!BJOit92oOfQ1tFR3p*>I zNx9NRF({cJwTgbU+o>B;JE}05Ha>`=!(xbXe{rOS&C|^VNmBFeC4aV-+61;q-8a zf2~Y6$@yZM%oN?>sHk~nGz%?Sfn%MWagyx8CwuuK+39&ZLqElzcndEn zdjwu^_e@}cGD1fP;=|P2gQ@eM%RT$^~gn#n$;>T9;-=4 zO`{bkj_LW(6Mg5#*ns-P5XO>vz2z_uK{Mx&0P&$I+=k2Fny~rjG1~bCB$w5X>BY_cG`t|K$Mm} zW7)q+IK*L@Zb=x!6(=q2p0N2Mf1+E#sJLznpd#I^i&iSb^lg6Nn8MvR)qAeU!y{_VjF z8d>wO&DiEvq)+DIHh^o~E{t75G=Ky;D2`yH^DNxOTAi5ZS;5@ukajaI_&$?9b?y zEBz9Mh(+-z6-g1e#EHBTj+LFl6dD6OW_47+ju(vqos#!%REMDi!0qA)C}Q$~nJM_2 zA+Rd7p&VO%E9Edopmsukp=wm&h-v~2mqyl1cYGuI95145y9i0?K<|Qn#ehmAx1*gt z^%@G-PvyTY+{a73e;0fzPm?@+<{3#*$?uarMRnu-Ae=Iukhdi3$T4;Pm-h>rQpJ%qFONB{BR*ct@Usw*XUsZtCye}t@4m7C76vSkTh0A&h^2HZ4a--{e0a8*F%nU3F6K{%o7&(xCIW~u+r$;`TeOY9#%NW<9F4VUTGR$hd>qfG#scGIgP3C4 zdixkbaIv}tZ(~_fqq#df5>lABzvbkSr)tHW0huhDrQ&=q-T*a6sVTdr8b=sIUXU1Q z_UB<1=BCJ?@0v2hERE3il&I9WW_B5-L>+CdDnpg$f1MgNU?mITH?kx}Ne=`$&bo#X z_$Dki!37L0GjQPzZGGbaZ`_xupN}X#&V~&8Y8>sbph4XBmJ+iy#}*D&+(>w}h^Oo! z@VkSN*NJy7H@10Pu0vzQUJenvGdK*Al7YZ^G*zk8jBr$F5D}E6Jy}XxD1v}X{F7Fa ze|Ch@e=_ji`|R234nrS;^4+{uq>tfW=Mmh(NLmaChJ~Tl%WK0-vamGFD%HxgpfePq zq%57*tu<113R79UO5BktWvu@02zQm!{6Z-^)sjY>hq&p+o`wr!PvL6icD|x0dsHvN zMH|_vW}nRdZ;^wrGTX=3&{fd>!Rmh+-Z~`*f7x^iswy*DOeVKX%dxtTVrGsl2#N~} zem9Z_napPZ5q4R7nOZGY70<17H%Ni^fHfHD8?cT@1A>iTC?lc6Feu8R=GOQ+YJ5^E zlwssXhC^j`Q($F^mmTrpaA}2})5ww;=WLiPDGga6m%Ffy7Kh&{)Ni4xeJxmq;Lb(9 zf4ovr%R*^_WZeYoW>M}5Y1}XcY@D9kAvx6=UzKpaAz_z>e0Oxdl=orle)nHe;j^=T z3bAn*l7Iv_QIG)F6qjH!9ml7vf)zexMa-~03l9b@W;VklE}pw{sDH1-AbgGM2y?m_ ze1In&m_bGy4QK*#dlV4meOskALAh>Re=bCZwUf;ZZR&b!`Ppuh0cE@b;ocNBfKU&% z2BRxnRmEDTic3H))T8a2yFo!w#Z0l471n7j5mkVw00%=?OkRa~-F`YtsZJ z{bV|YMT8x_0va&IhPmu2or~&|e?wKub`lL!KV4!19)Ot%QB331v{=2pT$Ws|z~VX@ zU90VjV$jFK4xPzTIj$^BBc4&`@lqf*9UH&7w+ZYED z?QM?-ndM#XxzIfqx@%nMG+Y?TN99$!^Rks$N84~6IfTYMM;3=R*$x5T#u>>>#Fo}4 z2zCTK%KXz-RdZLac5;xce@)bm{(G5_61IG3wHYVWOHmO^0|{lxHHo`XL0*#wUTm2! zyMsGYC>vk5xK$-uC{e?jT-t#Ep)rT4au z+O3P~@dplEU$3NI`)Yc3op5lbZf}Exqa$(KPGV6>K&&m4B&1U&AviCMdSxoom;#sy zpY?S+8qgrqb6ebRnFZQ~{9;sh5b;NH6Kd5!vFLY_vzrj}&G2?>P%h*gSxdeygKvqN z<05XZ&7cdz-#E73fAi{lUcEjkFgfEr)2^osMlyYM*^*^*26)m}Hb@BCrP-HcfP?UG zEG5$~kMko;Bu^8oY@y=`wJL6Wm#X}G;rWL#Wc;$DbQ{io#ZjmcxFbF&wRaaNhpq&1 z3mIagB7~KXu|O)y_HxnU3}%QHKIFPJ(@}9bE~`l>VC|EbCNHa2ok^J9m*ln7dM6n^BjkxRd%pvChUf zqa&0C=ClHqmfzA9I%TQg*2;ph<6{>VudOsRta!3MKHqB%_gcf3CJ_I8Dnp?(jd`aX zWoTcMrY&h`e_gM}$>?P(cahEOovCH=^0m9k;%fk@5i)mdZoeU9?wH)Zc8pDq|2j_V z;AR-U-2HJGqt|BkUk0sZbc0+y!Q^00UY*< zG+$IWZ2Uzkhi@KPEnC>PZ=Y+5NLGm{ecd))1Q!t6e;gvUtt2H8iKH-khi%fYyq5s&H)Vp1ZupsoX}KFl3M zB!^sf$3#Z^wPl=FG#uQ!#))Xd=p@?cL)1vLglL0AZyBP7Xwjlaw2aeJXni>C8;(1V`Kue14T$ zOXY~`SngGI$3%2+Y{ToP6eXC*XR!K5G^1rXu-Gn`ZW7T`PhvOO!oo_&KMOCgO?;;e z3Y%H&gX3+}w1HlP)NW%G2tK4^HqMY4)%%4X%;^@@AC#@a^;HtqD);WwPl$nt?yn)=^6h{7PT|-E$K=^b?ja3mz_6cxaHdl=oyLqdrMn< zAcCh4GwVsO2vgOlpPVhmZCL6BvNO5~&jNWgR^2=+j{nGeq1Ha~Ga-9Xa);`A9fhWO z^E0gXp*=)nngy}jrE~%*s&usXB-D;zABH@312jAJ_N8vQYWE?s zhEkShv5901b`m$;mHA2^eCq)Gi;P;d2AMQmD?lbtCurvi(n2s3+MPAwr>{D~YHWG7 zMnB<#>Uc__h2TGD!^zWX-AQ7>t@B_9ilhXHOivrM`JU$o;fxWAG^XdcWP*HgDNm`Z zgc1M6DWQ}WQ2_|jay&uYY{&sw?x^clcB-O8w%k%|G$mI4-tQ&`{JLn=AdPt_e@{bx z#6H%a68(G*DZwsP%IKdMJ6{N+d~jWRj%hBKIadr9Uz>XCP8JZa+Eh3flj<5aH-J}C z^T6zD0(7hwo1p$fc`Bt@`={^6wG#^78OIzb<+j7>ozks1oE1>5(ZdLo;0pJB____B zPvQDZdsVR55G>1d*J6)&DdThZB7!H;-dvEjT*`=uik?$Clbf-(6K4f;BHeV359wEq z3j*;HVOOOIE0FZG(79GPbGix}{665xh^=7;5XUe!5Wq;l%Rp>D+|fIq4utmX{?`^9ItD-2ZQwPWf9_!iWqDk`Kj zSvoDd^YIskStfCpFZi+nLoBzo6{0$I+h+vSZfl5?zeVj%I+Y(|@@j20bCkpc(>#%3 z8Zrn2?j}3*nGST9yC=FoNi}BJR1gvuvEvXiy|gM3+L_E{AP&nEHDyu`6;x!jVc?uC zdAGFC+MlVf>jhA0o%xi}Oj}M4bWS87K`}ss?xkekj6`mD; z|3laWEiDKU+QNbF7cxn>+s_~TOItismNOrK%u_QZX&Z3EWa0hzDRTdOsKSC?i!Se?v97(QSk?5?~ zf_+UeW2MY>NaXNnF1lx*rLTq;CA66Iyq9}MH)C|&HACHML~$oP*We~XU)X`NEwKw6 z&=BS;;XgvZnrOzHx~8=)uyOqGdOjN@VgA$H*)XfAI2FcFNAB_IEVtQM^IoUvwgE3< z1?y{Lyg}3Qr7*#yQg}A|tBobbpd0^K5{S{kZ};NP{^#edp;4bC!-)+ggn8AZo$O~O zhTV|&-$@VsG1v4m8qpAV}X+ofujv1kae${5M#{@%3|)x zY7;NwohmzQv83jNP}$gxyYUUZki*l1!q7}V>Ny@x<~lUd-r?S9;6vJ5yxV&{XWnqO z+!#pu;i%Wz2NVn)B*hJ$#L!qZ_G3qhP3Ur%GT1 z1q~DU>M%!RHXSk@^~hj^SS*7B@`^7NL~5;HttJUuVdYdgnor0(guN){zIzm&>p-l!pd z;{cf5?P{I8K6D*Oz5+rqZ)l3<4L|L=Uymi+{oaE$5OkQy_5Oh^Qvi3Ngh-zg&Fsie^mG8_ZM-fJwGKvJ#Z^(uwk5c?B>0#>QGw_*@p9<1r#Y!@)lM+#ciRrOU^(^Dg zs$V4y_I8lQTpy~wFr^P=Dr4P+bQq>snH1dz%9L#0H&kRQ)e~;Jly8hKhHX8N5+~ep z!_Vxk$G59}(TB#W&AZDk7a;Y3KVM4w{brre+ow_79hX{r1$^#c%--9TZZPF?*9?X- zzSu(X{i;YoHP${w(%(oWdD%0$Ra0=6FZ=?^H$cZ2iB>E1+_zA<0WWp8q~*&wEhIaO ztHX5GO)MwBbwHb<`GHh>S*dmV1BDA@{wAHflt$^8-ySdX>YB&y)fMUTg&Vx`N85tEc2d~ zW*U!0)xbx)4A~A1i}btSc33-zvS-O{$B%wfJK-&slKJ>KVys%DDH0STwUoDbk=Txj zQF`;=S!3{*SAE6$Jf;KXDf6)+zGZ9FI%TTv^zh3lcJJ&s2gpg}M(&$5*r>f1#rtfF zyTmU;NLn(B`5UuB0E=KmUOM#ZwDO!sw;Mo!y0HDc`JV+;Gy4Ut5jE|-GxMLv>sg4S zm;n*$RlhRpac3I@fTv{VnXv|Q3K%hnNa>Yos(kgsls)m5=EVJ-HhxM7T*kIVIYV&N ziHTc8j>fW^tfx5+Hh9ThUX6b#)_Znp|L&70sM6T-l3X@2$p_{9xi@Ih>gvg~WE<|3 zhP#z?@MFd&eDW~VZH}E6p=}ePZMXt_(Ve?pZRH$9#O`39WGgjx1=9Qee{O-}g1>LN zGxX<%5yS*qa1P>WTa)9)WFHh`vh%1N3Lu6H#}M)evGDy6*rKo_MH4hY?tqT;)uMl9 z=rge#QlE2anLAk9urj*g{#@u1!F)sYcNU{2ABm`q*D~7Ce6JsA=cw5iH4Tr6WixM~ zhlE~;?SIZ56K$D)3zC;`quIO?MZbA`>3ficYd7@i6KiMhU4f1OdqLd_XGTC%(+ZZ8 z#6*rr4C5pvES)subZm$FXb{94hmt^?WBm_=(lXF(G4Vcx&GpJ_fS{sX<9Z_-2Q$G3 zr<1O+br~rJyzvg|TI5u36SUjL%|<{f>-NvLswzK*W`NPGj~RN9IG{^lk^f*}h0_d^ zPRwrP+gQdZX*gKC{3omi0Fms*`t8l-8($rHeyn08^0u-A|*Mn z{9+g4MeXZ44@;;z;BSbmznQ?fR|s@r=ErQdR#g!RzV^( z!;&tzA6Gx^Yg0uZ&6FYXr%LpKY8(@z;cFy34;^Dc{&@2?CYAYWu%ZYUh@1#^J}{i; z6Xvmz=3V|foOqNdFM9F1XgOjScl7~sUJi4sXA>44S*qB9erKt3t_breENwfqWb*tx z=LD$l?0t1D2N{t&U>W~d#6`siU6$*pj(xeZ#`%EW++hB!Po&sxTVU(0J3X&GiAzCW z$I+cXHK~KHwWeTeP1`{aJux3bLtix@!MffXT*Do$rhEPgNL>jr`wZr?z71JMn{H;~*wS}&jj zsLX@?EgU0&hK?QJ0ww{12;q%wVNAVYGKG&c9+;7YA zIr5{2$<*3N1XAn;9*2Ydo*sOM?lznao3O(oB_PU8R10y{6T8U*yO|5PROje5p;}~~ zwHUUSBqPZp*n#dW+JSo<`fDy_;VHM@eza zlr2n;553+So6;NX?}AWRU+iRJ)|(=&>9#cNHe&u8c4c(7_c(Or1~HRKAUr)M|~ zp|RAIAHB@E2k+MJSVLFYyc8bjggaQgpwYqiJQlxvrn;RMHFMcWmQFmzPCwEymq+i7 zGz=y-Rbh~8jlOskuibt>rb@1m(je!~-tM34HJD>d$pI%Lr19aNdUvFyX!9}8YSFQ~ zYkwR3v09!&zi6VZY2Q|Bqxlulzm~d%NAkC?uKxN6pilI-q%IAL13dg^h`|BG{uw%O z0EK@Bq6>iN|0%FbQ@#M)H~s6eJ1uO{VR-<&zfk_ugZJ-I5VWuT-;T3#d28b??E1z| zM;-qbh=307Kl1<2pnsp<_!X}pC^v2F0>IApS3$GEsfw2f53h&|?|&5jy@W}lx&&|% K(cl0#Z~hBFc^+y2 diff --git a/doc/mxml.html b/doc/mxml.html index 3414cf1..eed8ec7 100644 --- a/doc/mxml.html +++ b/doc/mxml.html @@ -437,7 +437,7 @@ span.string {
gcc -o myprogram myprogram.c -lmxml
 

If you have the pkg-config software installed, you can use it to determine the proper compiler and linker options for your installation:

-
gcc `pkg-config --cflags mxml` -o myprogram myprogram.c `pkg-config --libs mxml`
+
gcc `pkg-config --cflags mxml4` -o myprogram myprogram.c `pkg-config --libs mxml4`
 

Loading an XML File

You load an XML file using the mxmlLoadFile function:

@@ -1151,12 +1151,15 @@ mxmlSAXLoadString(mxml_node_t *top, const void *sax_data);
-

Each function works like the corresponding mxmlLoad function but uses a callback to process each node as it is read. The callback function receives the node, an event code, and a user data pointer you supply:

-
void
+

Each function works like the corresponding mxmlLoad function but uses a callback to process each node as it is read. The callback function receives the node, an event code, and a user data pointer you supply and returns true to continue processing or false to stop:

+
bool
 sax_cb(mxml_node_t *node, mxml_sax_event_t event,
        void *data)
 {
   ... do something ...
+
+  // Continue processing...
+  return (true);
 }
 

The event will be one of the following:

@@ -1165,7 +1168,7 @@ sax_cb(mxml_node_t *node, mxml_sax_event_t event,
  • MXML_SAX_EVENT_COMMENT: A comment was just read.

  • -
  • MXML_SAX_EVENT_DATA: Data ( --------------------, integer, opaque, real, or text) was just read.

    +
  • MXML_SAX_EVENT_DATA: Data (integer, opaque, real, or text) was just read.

  • MXML_SAX_EVENT_DECLARATION: A declaration was just read.

  • @@ -1177,16 +1180,18 @@ sax_cb(mxml_node_t *node, mxml_sax_event_t event,

    Elements are released after the close element is processed. All other nodes are released after they are processed. The SAX callback can retain the node using the mxmlRetain function. For example, the following SAX callback will retain all nodes, effectively simulating a normal in-memory load:

    -
    void
    +
    bool
     sax_cb(mxml_node_t *node, mxml_sax_event_t event,
            void *data)
     {
       if (event != MXML_SAX_ELEMENT_CLOSE)
         mxmlRetain(node);
    +
    +  return (true);
     }
     

    More typically the SAX callback will only retain a small portion of the document that is needed for post-processing. For example, the following SAX callback will retain the title and headings in an XHTML file. It also retains the (parent) elements like <html>, <head>, and <body>, and processing directives like <?xml ... ?> and declarations like <!DOCTYPE ... >:

    -
    void
    +
    bool
     sax_cb(mxml_node_t *node, mxml_sax_event_t event,
            void *data)
     {
    @@ -1226,6 +1231,8 @@ sax_cb(mxml_node_t *node, mxml_sax_event_t event,
           mxmlRetain(node);
         }
       }
    +
    +  return (true);
     }
     

    The resulting skeleton document tree can then be searched just like one loaded using the mxmlLoad functions. For example, a filter that reads an XHTML document from stdin and then shows the title and headings in the document would look like:

    @@ -1277,7 +1284,9 @@ print_children(mxml_node_t *parent)

    Migrating from Mini-XML v3.x

    The following incompatible API changes were made in Mini-XML v4.0:

      -
    • SAX events are not named MXML_SAX_EVENT_foo instead of MXML_SAX_foo.

      +
    • SAX events are now named MXML_SAX_EVENT_foo instead of MXML_SAX_foo.

      +
    • +
    • SAX callbacks now return a boolean value.

    • Node types are now named MXML_TYPE_foo instead of MXML_foo.

    • @@ -2874,7 +2883,7 @@ typedef const char *(*mxml_save_cb_t)(mxml_node_t *,

      mxml_sax_cb_t

      SAX callback function

      -typedef void (*mxml_sax_cb_t)(mxml_node_t *, mxml_sax_event_t, void *); +typedef bool (*mxml_sax_cb_t)(mxml_node_t *, mxml_sax_event_t, void *);

      mxml_sax_event_t

      SAX event type.

      diff --git a/mxml-file.c b/mxml-file.c index 5f7f78b..8a93ab6 100644 --- a/mxml-file.c +++ b/mxml-file.c @@ -1341,7 +1341,8 @@ mxml_load_data( if (sax_cb) { - (*sax_cb)(node, MXML_SAX_EVENT_DATA, sax_data); + if (!(*sax_cb)(node, MXML_SAX_EVENT_DATA, sax_data)) + goto error; if (!mxmlRelease(node)) node = NULL; @@ -1367,7 +1368,8 @@ mxml_load_data( if (sax_cb) { - (*sax_cb)(node, MXML_SAX_EVENT_DATA, sax_data); + if (!(*sax_cb)(node, MXML_SAX_EVENT_DATA, sax_data)) + goto error; if (!mxmlRelease(node)) node = NULL; @@ -1464,7 +1466,8 @@ mxml_load_data( if (sax_cb) { - (*sax_cb)(node, MXML_SAX_EVENT_COMMENT, sax_data); + if (!(*sax_cb)(node, MXML_SAX_EVENT_COMMENT, sax_data)) + goto error; if (!mxmlRelease(node)) node = NULL; @@ -1520,7 +1523,8 @@ mxml_load_data( if (sax_cb) { - (*sax_cb)(node, MXML_SAX_EVENT_CDATA, sax_data); + if (!(*sax_cb)(node, MXML_SAX_EVENT_CDATA, sax_data)) + goto error; if (!mxmlRelease(node)) node = NULL; @@ -1570,7 +1574,8 @@ mxml_load_data( if (sax_cb) { - (*sax_cb)(node, MXML_SAX_EVENT_DIRECTIVE, sax_data); + if (!(*sax_cb)(node, MXML_SAX_EVENT_DIRECTIVE, sax_data)) + goto error; if (strncmp(node->value.directive, "xml ", 4) && !mxmlRelease(node)) node = NULL; @@ -1645,7 +1650,8 @@ mxml_load_data( if (sax_cb) { - (*sax_cb)(node, MXML_SAX_EVENT_DECLARATION, sax_data); + if (!(*sax_cb)(node, MXML_SAX_EVENT_DECLARATION, sax_data)) + goto error; if (!mxmlRelease(node)) node = NULL; @@ -1686,7 +1692,8 @@ mxml_load_data( if (sax_cb) { - (*sax_cb)(node, MXML_SAX_EVENT_ELEMENT_CLOSE, sax_data); + if (!(*sax_cb)(node, MXML_SAX_EVENT_ELEMENT_CLOSE, sax_data)) + goto error; if (!mxmlRelease(node)) { @@ -1737,7 +1744,10 @@ mxml_load_data( } if (sax_cb) - (*sax_cb)(node, MXML_SAX_EVENT_ELEMENT_OPEN, sax_data); + { + if (!(*sax_cb)(node, MXML_SAX_EVENT_ELEMENT_OPEN, sax_data)) + goto error; + } if (!first) first = node; @@ -1757,7 +1767,8 @@ mxml_load_data( } else if (sax_cb) { - (*sax_cb)(node, MXML_SAX_EVENT_ELEMENT_CLOSE, sax_data); + if (!(*sax_cb)(node, MXML_SAX_EVENT_ELEMENT_CLOSE, sax_data)) + goto error; if (!mxmlRelease(node)) { diff --git a/mxml.h b/mxml.h index 71427e4..71634b1 100644 --- a/mxml.h +++ b/mxml.h @@ -120,7 +120,7 @@ typedef mxml_type_t (*mxml_load_cb_t)(mxml_node_t *); typedef const char *(*mxml_save_cb_t)(mxml_node_t *, int); // Save callback function -typedef void (*mxml_sax_cb_t)(mxml_node_t *, mxml_sax_event_t, void *); +typedef bool (*mxml_sax_cb_t)(mxml_node_t *, mxml_sax_event_t, void *); // SAX callback function