From 8f4d870657423efc03b85ada77a176d7740933cf Mon Sep 17 00:00:00 2001 From: Michael Sweet Date: Wed, 29 Mar 2017 10:38:33 -0400 Subject: [PATCH] Remove old web site files. --- www/.htaccess | 1 - www/0.gif | Bin 1483 -> 0 bytes www/1.gif | Bin 1272 -> 0 bytes www/2.gif | Bin 1417 -> 0 bytes www/3.gif | Bin 1450 -> 0 bytes www/4.gif | Bin 1380 -> 0 bytes www/A.gif | Bin 1478 -> 0 bytes www/B.gif | Bin 1427 -> 0 bytes www/C.gif | Bin 1479 -> 0 bytes www/D.gif | Bin 1463 -> 0 bytes www/account.php | 653 ------ www/articles.php | 857 ------- www/comment.php | 377 ---- www/data/.htaccess | 3 - www/data/make-form.php | 598 ----- www/data/makedb | 12 - www/data/mxml.sql | 242 -- www/data/software.md5 | 4 - www/docfiles/.htaccess | 2 - www/docfiles/0.gif | Bin 1483 -> 0 bytes www/docfiles/1.gif | Bin 1272 -> 0 bytes www/docfiles/2.gif | Bin 1417 -> 0 bytes www/docfiles/3.gif | Bin 1450 -> 0 bytes www/docfiles/4.gif | Bin 1380 -> 0 bytes www/docfiles/A.gif | Bin 1478 -> 0 bytes www/docfiles/B.gif | Bin 1427 -> 0 bytes www/docfiles/C.gif | Bin 1479 -> 0 bytes www/docfiles/D.gif | Bin 1463 -> 0 bytes www/docfiles/advanced.html | 581 ----- www/docfiles/basics.html | 520 ----- www/docfiles/index.html | 210 -- www/docfiles/install.html | 115 - www/docfiles/intro.html | 175 -- www/docfiles/license.html | 467 ---- www/docfiles/mxmldoc.html | 187 -- www/docfiles/reference.html | 1747 --------------- www/docfiles/relnotes.html | 329 --- www/docfiles/schema.html | 223 -- www/docfiles/search.index | Bin 13261 -> 0 bytes www/documentation.php | 267 --- www/forums.php | 1199 ---------- www/images/.htaccess | 2 - www/images/black.gif | Bin 35 -> 0 bytes www/images/favicon.xcf.gz | Bin 42450 -> 0 bytes www/images/graph.gif | Bin 44 -> 0 bytes www/images/logo-large.gif | Bin 2281 -> 0 bytes www/images/logo.gif | Bin 846 -> 0 bytes www/images/private.gif | Bin 84 -> 0 bytes www/index.php | 93 - www/login.php | 264 --- www/mxml.html | 4222 ----------------------------------- www/mxmldoc.xsd | 189 -- www/org.minixml.atom | 16 - www/org.minixml.xar | Bin 48828 -> 0 bytes www/phplib/.htaccess | 3 - www/phplib/auth.php | 183 -- www/phplib/common.php | 681 ------ www/phplib/db.php | 159 -- www/phplib/globals.php | 49 - www/phplib/html.php | 465 ---- www/phplib/mirrors.php | 71 - www/phplib/poll.php | 114 - www/phplib/str.php | 82 - www/poll.php | 395 ---- www/software.php | 182 -- www/str.php | 1934 ---------------- www/strfiles/.htaccess | 2 - www/style.css | 241 -- www/swfiles/.htaccess | 2 - 69 files changed, 18118 deletions(-) delete mode 100644 www/.htaccess delete mode 100644 www/0.gif delete mode 100644 www/1.gif delete mode 100644 www/2.gif delete mode 100644 www/3.gif delete mode 100644 www/4.gif delete mode 100644 www/A.gif delete mode 100644 www/B.gif delete mode 100644 www/C.gif delete mode 100644 www/D.gif delete mode 100644 www/account.php delete mode 100644 www/articles.php delete mode 100644 www/comment.php delete mode 100644 www/data/.htaccess delete mode 100755 www/data/make-form.php delete mode 100755 www/data/makedb delete mode 100644 www/data/mxml.sql delete mode 100644 www/data/software.md5 delete mode 100644 www/docfiles/.htaccess delete mode 100644 www/docfiles/0.gif delete mode 100644 www/docfiles/1.gif delete mode 100644 www/docfiles/2.gif delete mode 100644 www/docfiles/3.gif delete mode 100644 www/docfiles/4.gif delete mode 100644 www/docfiles/A.gif delete mode 100644 www/docfiles/B.gif delete mode 100644 www/docfiles/C.gif delete mode 100644 www/docfiles/D.gif delete mode 100644 www/docfiles/advanced.html delete mode 100644 www/docfiles/basics.html delete mode 100644 www/docfiles/index.html delete mode 100644 www/docfiles/install.html delete mode 100644 www/docfiles/intro.html delete mode 100644 www/docfiles/license.html delete mode 100644 www/docfiles/mxmldoc.html delete mode 100644 www/docfiles/reference.html delete mode 100644 www/docfiles/relnotes.html delete mode 100644 www/docfiles/schema.html delete mode 100644 www/docfiles/search.index delete mode 100644 www/documentation.php delete mode 100644 www/forums.php delete mode 100644 www/images/.htaccess delete mode 100644 www/images/black.gif delete mode 100644 www/images/favicon.xcf.gz delete mode 100644 www/images/graph.gif delete mode 100644 www/images/logo-large.gif delete mode 100644 www/images/logo.gif delete mode 100644 www/images/private.gif delete mode 100644 www/index.php delete mode 100644 www/login.php delete mode 100644 www/mxml.html delete mode 100644 www/mxmldoc.xsd delete mode 100644 www/org.minixml.atom delete mode 100644 www/org.minixml.xar delete mode 100644 www/phplib/.htaccess delete mode 100644 www/phplib/auth.php delete mode 100644 www/phplib/common.php delete mode 100644 www/phplib/db.php delete mode 100644 www/phplib/globals.php delete mode 100644 www/phplib/html.php delete mode 100644 www/phplib/mirrors.php delete mode 100644 www/phplib/poll.php delete mode 100644 www/phplib/str.php delete mode 100644 www/poll.php delete mode 100644 www/software.php delete mode 100644 www/str.php delete mode 100644 www/strfiles/.htaccess delete mode 100644 www/style.css delete mode 100644 www/swfiles/.htaccess diff --git a/www/.htaccess b/www/.htaccess deleted file mode 100644 index 38dcd05..0000000 --- a/www/.htaccess +++ /dev/null @@ -1 +0,0 @@ -RewriteEngine Off diff --git a/www/0.gif b/www/0.gif deleted file mode 100644 index d5e883c2afa5c72045c080dea0a9f1fb4ed786ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1483 zcmV;+1vL6cNk%w1VPpVg0Otk(000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui0Av7U000R70RIUbNU&f*H3t$ZT*$DY!-o(fDpX^zqQ#2_he_PX zv7^TW!!U}xXyv2HlPIl>T=}mL%9k)Z_F;K3rp=oWX%-}fv!~C5q;&pk^0O$;CNyCf zU1}4?N}^1ozC?&dtmu+!9hQ{3&Mb%(fzW{t zuof&Sb>CgOQdJI=D&%iPKT-#3WO~i8#d}dh{)?*5F~+C@nclN3l4)k6k~v>IxAY&v zq9;U;Ok(tOQPnHe!ZZhaBxKnqb>e6UL?>>O>{!N&D32w--yVf;jK>l=$1%-0vgG4j zB1;J!Aw;kKaJ%%_+#UX=9;xJGm6bNaH~a?P>qvC!8G7$HUw!?J_qnfpcG6e-_%p2J znn&l2R6~3Tjj|GUCfPO8CI}wT&wuWTv`>Wj;YXo<8`9UIa~WFqA#x!`RHAGrb~oa0 zDLT|*S1-!9B5pA*RO3}QCX^#)Gv?HzT08FO*^e#~38RrRj)WnSHZqB$lR84lqmn2I zS(=nq8Wp6JLsFR=msfgeQkJh_38t22iW%OPYI4}7hi^LPO_~^u6X6;wDPA_Wqm zgCbpWQY6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui0Av7U000R70RIUbNU&f*H3t$ZT*$DY!-o(fDpX^zqQ#2_he_PX zv7^TW!!U}xXyv2HlPIl>T=}mL%9k)Z_F;K3rp=oWX%-}fv!~C5q;&pk^0O$;CNyCf zU1}4?N}^1ozC?~lmq z(TGW(RG@)H7fI+)8&rK#_F~!|Z3D*LQTJTl5q(<(-dp%=;v0=0M;=@`LFN*jKZl-E zdTQ!7HDk|SdAm*R-eKN?507#@d6VYP=kBf^J^S|SA;b6jetz=$_M6Mke}6xJ{kQ#B zoqqy4lwN^&;fJ6?2QGL(g9}24po9fdD4>P^VaT6``Eh8Uhx365pNQ>|sGf=Ep-7&J z;j!qQi`&77os87c2%U}0;fS1$#PJB6kGuit&}C)`$q+?%8JS>`3Nm$Fkxeco5MNLd z7?oh7Iar)PZ)v$vU3Pid-#}!E`4C!ZnfcIfYF4G@LRwt}m6}wEq?DOXu{5WHb+TmD if^iBJp>Ac`ho)~`st2ZXRC6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui0Av7U000R70RIUbNU&f*H3t$ZT*$DY!-o(fDpX^zqQ#2_he_PX zv7^TW!!U}xXyv2HlPIl>T=}mL%9k)Z_F;K3rp=oWX%-}fv!~C5q;&pk^0O$;CNyCf zU1}4?N}^1ozC?R$m3F$$EQocE(1F3Q7AzUH)!T|v zRSt|g;_gLvQ3q;V8qKdr2}?u%W6IC)$S_LhxEF;gYwpJ7!T0QGrf5xi`{WC$@C(h{lVrJPy$a%a0FO8e;A+ z-b!{RlT%mt+~ke!+qwQPKM6kkf$|>FZ(j)trF!Zsowy%w{`|-e^GDWCxH3V0k^9*P z;C~neNMCjb2KZTm3igD+dkxwI&q~omxZp_sS=iG(5NdeRcPokF;Y|;AIAVG%y>Vhp zysdar0xi1uQ4Bg^Afrj4=tRYhA2mkP9z3E*lNmvBgoRKy6uD77LP4NpL@)~VWJHw+ zHP4he2{i|n4ml?j0$es^olf+G+0a`%nyC@8W+DTsI+-! z5jw$hr+6$`Gbn#Fm2>C;aB6pFjCYDc(UR@GIMr&aO_}kkYk@cQO6#u{<@(QH!xC%IO^Pj6sc-|) z_3T4>?KSN~29b5`LTj6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui0Av7U000R70RIUbNU&f*H3t$ZT*$DY!-o(fDpX^zqQ#2_he_PX zv7^TW!!U}xXyv2HlPIl>T=}mL%9k)Z_F;K3rp=oWX%-}fv!~C5q;&pk^0O$;CNyCf zU1}4?N}^1ozC?pF9jMVL7Q`a&F%9`|X(-4mnF=(z2lL8)OE>?#;F)DA zqyG^8EKSp>YM)Vjx3S0Bz`>N?~x}uMqtUS zdBo(xv0Hbza>~a!+PD5Q%xp5ec(x;JlRv+3efIS1+r#(jK7M_U=GouhxRPIdsU)lv z#(z=Gvmb#y<%b|n(X7PWfuF*)#xPAqU(9%L4XIAUNXswb2# zDXOT`BrTqpmku#1hnPP#^5+=>Ip$Ov1U+)c8jnFPgunt3c#uOI%OF-HM->Q#&yyT! zppybr;x}8C#a+myLIJK+$d_FnNM=GVczLFpWU~3Cn_$7&kepo6Dc^kO*@+&W;^~=? zpNp9p(E@;KCgw^06uQ(sb{?jvQA4ma=6fSSLEvyU3VNJQPw2R1d?yH1!b9{31;T>1 z0k>ccsj{>Ig^{g}qz{L&VkBaywHid^Pp|o8My>=s=o3XtJq9dps8zO<1-S+))jp{z z7HDHkLBN_ZS5c;{R0tRt*noTu6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~EC2ui0Av7U000R70RIUbNU&f*H3t$ZT*$DY!-o(fDpX^zqQ#2_he_PX zv7^TW!!U}xXyv2HlPIl>T=}mL%9k)Z_F;K3rp=oWX%-}fv!~C5q;&pk^0O$;CNyCf zU1}4?N}^1ozC?@haOuHwQ5V@o*jxf0et4XO z<5g&)a9~`tO-CHsmLhjA+D6VrKzLLmYJau3VUDfccps6aEpbs_J|Y>Kkw=1v+-p?A zW>%H2p@!vZT5h>nmtHbfT9}uONhV-mp4pa}YOeWYn{IXnXPo>kC}o|pIf-Y0dhY37 zpMK(aXP_kxN~nv59?EB;ivG!Hqk^soshyGQP;G$=W1AWZ5baT50JzWPQFaT9H-3E~M2(P!)RsRU#=>tWzu{ mYb&!X5$o!)dQG}ou7vWsTC8}|iY2P)v8v{!ys-sXKma>1>785v diff --git a/www/A.gif b/www/A.gif deleted file mode 100644 index 7f2a147fdae0a38279bbf97e01a47c4aa421a225..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1478 zcmd6mi9Ztx0DxCNH_bN9mDJp}DaYJrwmF6znIpIG(4&YPX|Cl??m3ckj$-Br)7%mw zCU=fp$<-rNE$7dL<#U=09ZVq;}yXJg@DXXWHzNK&=p}} z*wrf{u&bgXBI07A65?W#5@J%4;?hzQaA`>dTv`SRzb1o}y)Gjsdre;Mx`MncNG2d#SpgVx1j(0W*m zz8=;?T)Lvo4e;<9$ucFcfIfW`uNp1+@8z=ME? z4+DdO9tH;og@go$hK7cPg%Jpk!@~&?5#f=M5m8Z5#OUZJL}JX7C$TXxaj~)Sad8Rp z@reluNr_3xPoF+ZPEL9DEHx!1Ej2YgEiFAgJtHF{Gcz+QD~m)TWoKvSu5WB?Y;JCDZEbCDZ-3kVXXl@tot@p? z-MziN{r&xegM%MGe*FCT^VhFmhlhtpM@PSZ|2{rGJ~=r#Jv}`;JNpyf|3M_+5C6RY zU^@kn*@XBBxQa63ckr(7!4(^qv|$ob%g0_xMo;t% z94t>zoK>v?`teeeIm~Ye;F)4%XPWPjD_#{;Wftkc>b;WtmC_($kH*z+22t(02z!FP zGcTzqq&v7*W)LrL#gx1o(>j2xM=9lzLnnl0Dn2sEq-0(LsX)efslx*C{G-~x^Inr3 zS{|pnBeUptMs3*4QNne^}M> zlIVH6LvL6}DsWVPzb%EVaLA1)v<@byoyH((qa%;_Lw2s9_hHQo;Tp(_5d?66?=zao z(Xu;|U7XFCI9t8CfCdrboF0Jjo~b;n-d{l`XRxkCT?(CFC?1kyW6mc^X_(bRmQ7~I zflq84Ly@(ksZUwPVZt6dxG~Ydd_{rMq)O-^IE`6a_cFUBWy;;gG_+@c6t^moA=$_9 z@NiY2tWPF4(bh>a^dXpJUftX}>73t&bcS4=?OM4#9ta;}s&w)4#4<`7=Zn>#99|Yh z=Caa7?g?TMrY>*^abwg8$SNAK{XHF+?}+_arcH(m=2Sb@VzAbZ)Qm)Pz2=vKMpbPr z2;cVJ7Knfitr>F7xbn~olNE^Jd9Jt40me!gCi0jNdX5;`2!;TZcfwa{%V6YNOBLyn zPtOWXlfh)DA2rR(kVlS3;rSN{${>4wd91a=iM%_=_S_lK>Nazew|UpLqZ_na)+-Qf z2`a#38sPB93@=l!S;kwW=GHD6a!1YoaSk}_d*_Q?yWRHJWV`$HASHw_mcYyeQ2!U| C5{YmC diff --git a/www/B.gif b/www/B.gif deleted file mode 100644 index 54f81f4b99735a64185fdc5a128410f2bf5aaef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1427 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 diff --git a/www/D.gif b/www/D.gif deleted file mode 100644 index dd8f8295e883925f72172deb18d335de8fa2331f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1463 zcmbW01z*z%06=%gloYAaA>G~KNsJsdI;BPoq)P+^j&4Q^Y?KmGf4W1uTlkSD-5mlF z$9;u+zxNT|Q&v@ykhDU85TI=k2#kaM3>W7)9xgUM9u5IM?h67u!WZ~22?>Z^z91$d zBq4rDN<*A%~DskdskRKqx86si-KZsVHfvsc31a>1b)_>1Y|~>0U9=GrnSA zVtmES#K^+T#LB|V#>&jj#_}WwJ1Zv#8y6=#Hx~yFHzzL-7auRLpa7qcAiuDXfQYb= zn5eLrn25Nzn53k*l$3M%78b(p4xx|XJfww5MbTT2J7t*Zmq)78<}(=#y8H#9UbGBPwaHZn0W zHZ?UdGcz?eH+%cm+`_`b%F@!>%F4#t8ewB?i?Fe?McCWfI@sGG9qb*E4o;59cTSGZ z@0?tm-?_RtySci!ySaL}yLo!JdwF_zd3kz!d-?cy`}+F&`Mv+}!O!3SLqI^lr%xXP z13v`?1qKHPhlKnc8WIu~8Ws^A9vKl46&V>F6%`X59UBu97aJQN7ncwppO}zl&PJor7z`#SCnq;IH!m+QKR>Uapy2D*FNK9) ziwX;ii;7B$i@%kWlz#hGR$5wKR#s77URhBAR9032Ky_7Bb#+Z`ZEam$U44ChLqkJj zV`EcOQ*(23OG`^@YinCuTYGzZM@L6z=l8CzuI}#co}QlG-rl~xzW)CHfq{X+!NH-S zq2Zz7k>Qcikysi~>y>FJr7nIAuX%+1Zs&(AL`EG#ZAE-fuB zFE6jGto(dpb#--ZZEbyhePd%|b8~ZRYioOZduL~7cXxMhZ*PBp|KQ-@@bK{H@aXvH z_~iKHpPyR(^toqgg~q^6b!>qVdpVuL_#88jdkW5nW1iN8w(zeD#8M zXfrj$KowrA*aeYV0<(!gt1zj)qzqt6m;e6lg$fF%m$HJV~sYT3u*)t4kp?g&01OnjnQv0huN9lK|$5`Az z|9~w{IH2I{Ky7S1gi3K)tq_Dvgu4PPktk=#GdvhnKs6D*1t5Y_K0+W?wiNYqc|qoV z6or;Hn2qIh&s3xi8;@=N&&Y(T+RiLak0`rL-~5gKG@q`)e^gKz+uIt_C-e4baisEg zj0CGfGW}dh6N)sN&tx4Yy93tr3d#S1=b6pqn1p4A7B<5W4W7O=^3iKu2OmZ!6u%-Inp*=-mEEeHk#9+{4TE#z zWrT`K^9X{?QZuZVtI5@=TxV?$oC9ocT#9)|OQ}sY7Vy8cKNuq*9dM*Ku^xyjLtF-EVAot6ck|;CaP{tD6v_K&S7Xv!Xr;+25v$?Z6HOID_yUUd&%hw*e*qM_ BvB&@b diff --git a/www/account.php b/www/account.php deleted file mode 100644 index bcd6e00..0000000 --- a/www/account.php +++ /dev/null @@ -1,653 +0,0 @@ - "User", - AUTH_DEVEL => "Devel", - AUTH_ADMIN => "Admin" -); - - -// -// 'account_header()' - Show standard account page header... -// - -function -account_header($title) -{ - global $PHP_SELF, $LOGIN_USER, $LOGIN_LEVEL; - - html_header("$title"); - - html_start_links(1); - html_link("$LOGIN_USER", "$PHP_SELF"); - html_link("Change Password", "$PHP_SELF?P"); - if ($LOGIN_LEVEL == AUTH_ADMIN) - html_link("Manage Accounts", "$PHP_SELF?A"); - if ($LOGIN_LEVEL > AUTH_USER) - html_link("New/Pending", "$PHP_SELF?L"); - html_link("Logout", "$PHP_SELF?X"); - html_end_links(); -} - - -if ($argc == 1 && $argv[0] == "X") - auth_logout(); - -if ($LOGIN_USER == "") -{ - header("Location: login.php"); - exit(0); -} - -if ($argc >= 1) -{ - $op = $argv[0][0]; - $data = substr($argv[0], 1); -} -else - $op = ""; - -switch ($op) -{ - case 'A' : - // Manage accounts... - if ($LOGIN_LEVEL < AUTH_ADMIN) - { - header("Location: $PHP_SELF"); - exit(); - } - - if ($data == "add") - { - if ($REQUEST_METHOD == "POST") - { - // Get data from form... - if (array_key_exists("IS_PUBLISHED", $_POST)) - $is_published = (int)$_POST["IS_PUBLISHED"]; - else - $is_published = 1; - - if (array_key_exists("NAME", $_POST)) - $name = $_POST["NAME"]; - else - $name = ""; - - if (array_key_exists("EMAIL", $_POST)) - $email = $_POST["EMAIL"]; - else - $email = ""; - - if (array_key_exists("PASSWORD", $_POST)) - $password = $_POST["PASSWORD"]; - else - $password = ""; - - if (array_key_exists("PASSWORD2", $_POST)) - $password2 = $_POST["PASSWORD2"]; - else - $password2 = ""; - - if (array_key_exists("LEVEL", $_POST)) - $level = (int)$_POST["LEVEL"]; - else - $level = AUTH_USER; - - if ($name != "" && $email != "" && - (($password == "" && $password2 == "") || - $password == $password2)) - $havedata = 1; - else - $havedata = 0; - } - else - { - // Use blank account info... - $name = ""; - $is_published = 0; - $email = $row["email"]; - $level = $row["level"]; - $password = ""; - $password2 = ""; - $havedata = 0; - } - - account_header("Add Account"); - - if ($havedata) - { - // Store new data... - $hash = md5("$name:$password"); - $name = db_escape($name); - $email = db_escape($email); - $date = time(); - - db_query("INSERT INTO users VALUES(NULL,$is_published," - ."'$name','$email','$hash',$level,$date,'$LOGIN_USER'," - ."$date,'$LOGIN_USER')"); - - print("

Account added successfully!

\n"); - - html_start_links(1); - html_link("Return to Manage Accounts", "$PHP_SELF?A"); - html_end_links(); - } - else - { - $name = htmlspecialchars($name, ENT_QUOTES); - $email = htmlspecialchars($email, ENT_QUOTES); - - print("
" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."\n" - ."
Published:"); - select_is_published($is_published); - print("
Username:
EMail:
Access Level:
Password:
Password Again:
" - ."
\n"); - } - - html_footer(); - } - else if ($data == "batch") - { - // Disable/enable/expire/etc. accounts... - if ($REQUEST_METHOD == "POST" && array_key_exists("OP", $_POST)) - { - $op = $_POST["OP"]; - - db_query("BEGIN TRANSACTION"); - - reset($_POST); - while (list($key, $val) = each($_POST)) - if (substr($key, 0, 3) == "ID_") - { - $id = (int)substr($key, 3); - - if ($op == "disable") - db_query("UPDATE users SET is_published = 0 WHERE id = $id"); - else if ($op == "enable") - db_query("UPDATE users SET is_published = 1 WHERE id = $id"); - } - - db_query("COMMIT TRANSACTION"); - } - - header("Location: $PHP_SELF?A"); - } - else if ($data == "modify") - { - // Modify account... - if ($argc != 2 || $argv[1] == "") - { - header("Location: $PHP_SELF?A"); - exit(); - } - - $name = $argv[1]; - - if ($REQUEST_METHOD == "POST") - { - // Get data from form... - if (array_key_exists("IS_PUBLISHED", $_POST)) - $is_published = (int)$_POST["IS_PUBLISHED"]; - else - $is_published = 1; - - if (array_key_exists("EMAIL", $_POST)) - $email = $_POST["EMAIL"]; - else - $email = ""; - - if (array_key_exists("PASSWORD", $_POST)) - $password = $_POST["PASSWORD"]; - else - $password = ""; - - if (array_key_exists("PASSWORD2", $_POST)) - $password2 = $_POST["PASSWORD2"]; - else - $password2 = ""; - - if (array_key_exists("LEVEL", $_POST)) - $level = (int)$_POST["LEVEL"]; - else - $level = AUTH_USER; - - if ($email != "" && - (($password == "" && $password2 == "") || - $password == $password2)) - $havedata = 1; - else - $havedata = 0; - } - else - { - // Get data from existing account... - $result = db_query("SELECT * FROM users WHERE " - ."name='" . db_escape($name) ."'"); - if (db_count($result) != 1) - { - header("Location: $PHP_SELF?A"); - exit(); - } - - $row = db_next($result); - $is_published = $row["is_published"]; - $email = $row["email"]; - $level = $row["level"]; - $password = ""; - $password2 = ""; - $havedata = 0; - - db_free($result); - } - - account_header("Modify $name"); - - if ($havedata) - { - // Store new data... - if ($password != "") - $hash = ", hash='" . md5("$name:$password") . "'"; - else - $hash = ""; - - $name = db_escape($name); - $email = db_escape($email); - $date = time(); - - db_query("UPDATE users SET " - ."email='$email'$hash, level='$level', " - ."is_published=$is_published, modify_user='$LOGIN_USER', " - ."modify_date = $date WHERE name='$name'"); - - print("

Account modified successfully!

\n"); - - html_start_links(1); - html_link("Return to Manage Accounts", "$PHP_SELF?A"); - html_end_links(); - } - else - { - $name = htmlspecialchars($name, ENT_QUOTES); - $email = htmlspecialchars($email, ENT_QUOTES); - - print("
" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."\n" - ."
Published:"); - select_is_published($is_published); - print("
Username:$name
EMail:
Access Level:"); - - if ($LOGIN_USER == $name) - print("" - . $levels[$level]); - else - { - print(""); - } - - print("
Password:
Password Again:
" - ."
\n"); - } - - html_footer(); - } - else - { - // List accounts... - account_header("Manage Accounts"); - - $result = db_query("SELECT * FROM users ORDER BY name"); - - print("
\n"); - - html_start_table(array("Username", "EMail", "Level")); - - while ($row = db_next($result)) - { - $name = htmlspecialchars($row["name"], ENT_QUOTES); - $email = htmlspecialchars($row["email"], ENT_QUOTES); - $level = $levels[$row["level"]]; - - if ($row["is_published"] == 0) - $email .= " Private"; - - html_start_row(); - print("" - ."$name" - ."" - ."$email" - ."" - ."$level"); - html_end_row(); - } - - html_end_table(); - - print("

" - ."

"); - - html_start_links(1); - html_link("Add Account", "$PHP_SELF?Aadd"); - html_end_links(); - - html_footer(); - } - break; - - case 'L' : - // List - if ($LOGIN_LEVEL < AUTH_DEVEL) - { - header("Location: $PHP_SELF"); - exit(); - } - - account_header("New/Pending"); - - $email = db_escape($_COOKIE["FROM"]); - - print("

New/Pending Articles:

\n"); - - $result = db_query("SELECT * FROM article WHERE is_published = 0 " - ."ORDER BY modify_date"); - $count = db_count($result); - - if ($count == 0) - print("

No new/pending articles found.

\n"); - else - { - html_start_table(array("Id", "Title", "Last Updated")); - - while ($row = db_next($result)) - { - $id = $row['id']; - $title = htmlspecialchars($row['title'], ENT_QUOTES) . - " Private"; - $abstract = htmlspecialchars($row['abstract'], ENT_QUOTES); - $date = date("M d, Y", $row['modify_date']); - - html_start_row(); - - print("$id" - ."$title" - ."$date"); - - html_end_row(); - - html_start_row(); - - print("$abstract"); - - html_end_row(); - } - - html_end_table(); - } - - db_free($result); - - print("

New/Pending Links:

\n"); - - $result = db_query("SELECT * FROM link WHERE is_published = 0 " - ."ORDER BY modify_date"); - $count = db_count($result); - - if ($count == 0) - print("

No new/pending links found.

\n"); - else - { - html_start_table(array("Id", "Name/Version", "Last Updated")); - - while ($row = db_next($result)) - { - $id = $row['id']; - $title = htmlspecialchars($row['name'], ENT_QUOTES) . " " . - htmlspecialchars($row['version'], ENT_QUOTES) . - " Private"; - $date = date("M d, Y", $row['modify_date']); - - if ($row["is_category"]) - $link = ""; - else - $link = ""; - - html_start_row(); - - print("$link$id" - ."$link$title" - ."$link$date"); - - html_end_row(); - } - - html_end_table(); - } - - db_free($result); - - print("

New/Pending STRs:

\n"); - - $result = db_query("SELECT * FROM str WHERE status >= $STR_STATUS_PENDING " - ."AND (manager_email == '' OR manager_email = '$email') " - ."ORDER BY status DESC, priority DESC, scope DESC, " - ."modify_date"); - $count = db_count($result); - - if ($count == 0) - print("

No new/pending STRs found.

\n"); - else - { - html_start_table(array("Id", "Priority", "Status", "Scope", - "Summary", "Version", "Last Updated", - "Assigned To")); - - while ($row = db_next($result)) - { - $date = date("M d, Y", $row['modify_date']); - $summary = htmlspecialchars($row['summary'], ENT_QUOTES); - $summabbr = htmlspecialchars(abbreviate($row['summary'], 80), ENT_QUOTES); - $prtext = $priority_text[$row['priority']]; - $sttext = $status_text[$row['status']]; - $sctext = $scope_text[$row['scope']]; - - if ($row['is_published'] == 0) - $summabbr .= " Private"; - - html_start_row(); - - print("" - ."" - ."$row[id]" - ."$prtext" - ."$sttext" - ."$sctext" - ."$summabbr" - ."$row[str_version]" - ."$date"); - - if ($row['manager_email'] != "") - $email = sanitize_email($row['manager_email']); - else - $email = "Unassigned"; - - print("$email"); - - html_end_row(); - } - - html_end_table(); - } - - db_free($result); - - // Show hidden comments... - print("

Hidden Comments:

\n"); - - $result = db_query("SELECT * FROM comment WHERE status = 0 ORDER BY id"); - - if (db_count($result) == 0) - print("

No hidden comments.

\n"); - else - { - print("
    \n"); - - while ($row = db_next($result)) - { - $create_date = date("M d, Y", $row['create_date']); - $create_user = sanitize_email($row['create_user']); - $contents = sanitize_text($row['contents']); - $location = str_replace("_", "?", $row['url']); - - print("
  • $row[url] " - ." by $create_user on $create_date " - ."Edit " - ."· Delete" - ."
    $contents
  • \n"); - } - - print("
\n"); - } - - db_free($result); - - html_footer(); - break; - - case 'P' : - // Change password - account_header("Change Password"); - - if ($REQUEST_METHOD == "POST" && - array_key_exists("PASSWORD", $_POST) && - array_key_exists("PASSWORD2", $_POST) && - $_POST["PASSWORD"] == $_POST["PASSWORD2"]) - { - // Store new password and re-login... - print("

Password changed successfully!

\n"); - } - else - { - print("" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."\n" - ."
Password:
Password Again:
" - ."
\n"); - } - - html_footer(); - break; - - default : - // Show account info... - account_header($LOGIN_USER); - - if (array_key_exists("FROM", $_COOKIE)) - $email = htmlspecialchars($_COOKIE["FROM"]); - else - $email = "unknown"; - - print("
\n" - ."\n" - ."\n" - ."" - ."\n" - ."
Username:$LOGIN_USER
EMail:$email
Access Level:$levels[$LOGIN_LEVEL]
\n"); - - html_footer(); - break; -} - - -// -// End of "$Id$". -// -?> diff --git a/www/articles.php b/www/articles.php deleted file mode 100644 index 0cac248..0000000 --- a/www/articles.php +++ /dev/null @@ -1,857 +0,0 @@ -Bad command '$op'!\n"); - html_footer(); - exit(); - } - - if ($op != 'L' && $LOGIN_USER == "") - { - header("Location: login.php"); - exit(); - } - - if (($op == 'D' || $op == 'M') && !$id) - { - html_header("Article Error"); - print("

Command '$op' requires an ID!\n"); - html_footer(); - exit(); - } - - if ($op == 'B' && $LOGIN_LEVEL < AUTH_DEVEL) - { - html_header("Article Error"); - print("

You don't have permission to use command '$op'!\n"); - html_footer(); - exit(); - } - - if (($op == 'D' || $op == 'M') && $LOGIN_LEVEL < AUTH_DEVEL) - { - $result = db_query("SELECT * FROM article WHERE id = $id"); - if (db_count($result) != 1) - { - db_free($result); - - html_header("Article Error"); - print("

Article #$id does not exist!\n"); - html_footer(); - exit(); - } - - $row = db_next($result); - - if ($row['create_user'] != $LOGIN_USER && - $row['create_user'] != $LOGIN_EMAIL) - { - db_free($result); - - html_header("Article Error"); - print("

You don't have permission to use command '$op'!\n"); - html_footer(); - exit(); - } - - db_free($result); - } - - if ($op == 'N' && $id) - { - html_header("Article Error"); - print("

Command '$op' may not have an ID!\n"); - html_footer(); - exit(); - } - - for ($i = 1; $i < $argc; $i ++) - { - $option = substr($argv[$i], 1); - - switch ($argv[$i][0]) - { - case 'Q' : // Set search text - $search = urldecode($option); - $i ++; - while ($i < $argc) - { - $search .= urldecode(" $argv[$i]"); - $i ++; - } - break; - case 'I' : // Set first STR - $index = (int)$option; - if ($index < 0) - $index = 0; - break; - default : - html_header("Article Error"); - print("

Bad option '$argv[$i]'!

\n"); - html_footer(); - exit(); - break; - } - } -} -else -{ - $op = 'L'; - $id = 0; -} - -if ($REQUEST_METHOD == "POST") -{ - if (array_key_exists("SEARCH", $_POST)) - $search = $_POST["SEARCH"]; -} - -$options = "+I$index+Q" . urlencode($search); - -switch ($op) -{ - case 'B' : // Batch update selected articles - if ($REQUEST_METHOD != "POST") - { - header("Location: $PHP_SELF?L$options"); - break; - } - - if (array_key_exists("IS_PUBLISHED", $_POST) && - $_POST["IS_PUBLISHED"] != "") - { - $modify_date = time(); - $modify_user = db_escape($LOGIN_USER); - $is_published = (int)$_POST["IS_PUBLISHED"]; - - $query = "is_published = $is_published, modify_date = $modify_date, " - ."modify_user = '$modify_user'"; - - db_query("BEGIN TRANSACTION"); - - reset($_POST); - while (list($key, $val) = each($_POST)) - if (substr($key, 0, 3) == "ID_") - { - $id = (int)substr($key, 3); - - db_query("UPDATE article SET $query WHERE id = $id"); - } - - db_query("COMMIT TRANSACTION"); - } - - header("Location: $PHP_SELF?L$options"); - break; - - case 'D' : // Delete Article - if ($REQUEST_METHOD == "POST") - { - db_query("DELETE FROM article WHERE id = $id"); - - header("Location: $PHP_SELF?L$options"); - } - else - { - $result = db_query("SELECT * FROM article WHERE id = $id"); - if (db_count($result) != 1) - { - print("

Error: Article #$id was not found!

\n"); - html_footer(); - exit(); - } - - $row = db_next($result); - - html_header("Delete Article #$id"); - - html_start_links(1); - html_link("Return to Articles", "$PHP_SELF?L$options"); - html_link("View Article #$id", "$PHP_SELF?L$id$options"); - html_link("Modify Article #$id", "$PHP_SELF?M$id$options"); - html_end_links(); - - print("
" - ."\n"); - - if (!$row['is_published']) - print("\n"); - - $temp = htmlspecialchars($row["title"]); - print("\n"); - - $temp = htmlspecialchars($row["abstract"]); - print("\n"); - - $temp = format_text($row["contents"]); - print("\n"); - - print("\n"); - print("
This article is " - ."currently hidden from public view.
Title:$temp
Abstract:$temp
Contents:$temp
" - ."
\n"); - - html_footer(); - } - break; - - case 'L' : // List (all) Article(s) - if ($id) - { - $result = db_query("SELECT * FROM article WHERE id = $id"); - if (db_count($result) != 1) - { - html_header("Article Error"); - print("

Error: Article #$id was not found!

\n"); - html_footer(); - exit(); - } - - $row = db_next($result); - $title = htmlspecialchars($row['title']); - $abstract = htmlspecialchars($row['abstract']); - $contents = format_text($row['contents']); - $create_user = sanitize_email($row['create_user']); - $date = date("H:i M d, Y", $row['modify_date']); - - html_header("Article #$id: $title"); - - html_start_links(1); - html_link("Return to Articles", "$PHP_SELF?L$options"); - html_link("Show Comments", "#_USER_COMMENTS"); - html_link("Submit Comment", "comment.php?r0+particles.php_L$id"); - - if ($LOGIN_LEVEL >= AUTH_DEVEL || - $row['create_user'] == $LOGIN_USER) - { - html_link("Modify Article", "$PHP_SELF?M$id$options"); - html_link("Delete Article", "$PHP_SELF?D$id$options"); - } - html_end_links(); - - if (!$row['is_published']) - print("

This article is currently hidden from " - ."public view.

\n"); - - print("

$date by $create_user
$abstract

\n" - ."$contents\n" - ."

Comments

\n"); - - html_start_links(); - html_link("Submit Comment", "comment.php?r0+particles.php_L$id"); - html_end_links(); - - show_comments("articles.php_L$id"); - - db_free($result); - } - else - { - html_header("Articles"); - - html_start_links(1); - html_link("Submit Article", "$PHP_SELF?N$options"); - html_end_links(); - - $htmlsearch = htmlspecialchars($search, ENT_QUOTES); - - print("

" - ."Search Words:  " - ."

\n"); - - $query = ""; - $prefix = "WHERE "; - - if ($LOGIN_LEVEL < AUTH_DEVEL) - { - $query .= "${prefix}(is_published = 1 OR create_user = '" - . db_escape($LOGIN_USER) . "')"; - $prefix = " AND "; - } - - if ($search) - { - $search_string = str_replace("'", " ", $search); - $search_string = str_replace("\"", " ", $search_string); - $search_string = str_replace("\\", " ", $search_string); - $search_string = str_replace("%20", " ", $search_string); - $search_string = str_replace("%27", " ", $search_string); - $search_string = str_replace(" ", " ", $search_string); - $search_words = explode(' ', $search_string); - - // Loop through the array of words, adding them to the - $query .= "${prefix}("; - $prefix = ""; - $next = " OR"; - $logic = ""; - - reset($search_words); - while ($keyword = current($search_words)) - { - next($search_words); - $keyword = db_escape(ltrim(rtrim($keyword))); - - if (strcasecmp($keyword, 'or') == 0) - { - $next = ' OR'; - if ($prefix != '') - $prefix = ' OR'; - } - else if (strcasecmp($keyword, 'and') == 0) - { - $next = ' AND'; - if ($prefix != '') - $prefix = ' AND'; - } - else if (strcasecmp($keyword, 'not') == 0) - { - $logic = ' NOT'; - } - else - { - $keyword = db_escape($keyword); - - if ($keyword == (int)$keyword) - $idsearch = " OR id = " . (int)$keyword; - else - $idsearch = ""; - - $query .= "$prefix$logic (title LIKE \"%$keyword%\"$idsearch" - ." OR abstract LIKE \"%$keyword%\"" - ." OR contents LIKE \"%$keyword%\")"; - $prefix = $next; - $logic = ''; - } - } - - $query .= ")"; - } - - $result = db_query("SELECT * FROM article $query " - ."ORDER BY modify_date DESC"); - $count = db_count($result); - - if ($count == 0) - { - print("

No Articles found.

\n"); - - html_footer(); - exit(); - } - - if ($index >= $count) - $index = $count - ($count % $PAGE_MAX); - if ($index < 0) - $index = 0; - - $start = $index + 1; - $end = $index + $PAGE_MAX; - if ($end > $count) - $end = $count; - - $prev = $index - $PAGE_MAX; - if ($prev < 0) - $prev = 0; - $next = $index + $PAGE_MAX; - - print("

$count article(s) found, showing $start to $end:

\n"); - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - print("
\n"); - - if ($count > $PAGE_MAX) - { - print("\n"); - - print("\n"); - print("
"); - if ($index > 0) - print("Previous $PAGE_MAX"); - print(""); - if ($end < $count) - { - $next_count = min($PAGE_MAX, $count - $end); - print("Next $next_count"); - } - print("
\n"); - } - - html_start_table(array("ID","Title","Last Modified", "Comment(s)")); - - db_seek($result, $index); - for ($i = 0; $i < $PAGE_MAX && $row = db_next($result); $i ++) - { - html_start_row(); - - $id = $row['id']; - $link = ""; - - print(""); - if ($LOGIN_LEVEL >= AUTH_DEVEL) - print(""); - print("$link$id"); - - $temp = htmlspecialchars($row['title']); - if ($row['is_published'] == 0) - $temp .= " Private"; - - print("$link$temp"); - - $temp = date("M d, Y", $row['modify_date']); - print("$link$temp"); - - $ccount = count_comments("articles.php_L$id"); - print("$link$ccount"); - - html_end_row(); - - html_start_row(); - $temp = htmlspecialchars($row['abstract']); - print("$temp"); - html_end_row(); - } - - html_end_table(); - - if ($LOGIN_LEVEL > 0) - { - print("

Published: "); - select_is_published(); - print("

\n"); - } - - if ($count > $PAGE_MAX) - { - print("\n"); - - print("\n"); - print("
"); - if ($index > 0) - print("Previous $PAGE_MAX"); - print(""); - if ($end < $count) - { - $next_count = min($PAGE_MAX, $count - $end); - print("Next $next_count"); - } - print("
\n"); - } - - print("

private = hidden from public view

\n"); - } - - html_footer(); - break; - - case 'M' : // Modify Article - if ($REQUEST_METHOD == "POST") - { - if ($LOGIN_LEVEL < AUTH_DEVEL) - $is_published = 0; - else if (array_key_exists("IS_PUBLISHED", $_POST)) - $is_published = (int)$_POST["IS_PUBLISHED"]; - else - $is_published = 0; - - if (array_key_exists("TITLE", $_POST)) - $title = $_POST["TITLE"]; - else - $title = ""; - - if (array_key_exists("ABSTRACT", $_POST)) - $abstract = $_POST["ABSTRACT"]; - else - $abstract = ""; - - if (array_key_exists("CONTENTS", $_POST)) - $contents = $_POST["CONTENTS"]; - else - $contents = ""; - - if (($is_published == 0 || $LOGIN_LEVEL >= AUTH_DEVEL) && - $title != "" && $abstract != "" && $contents != "") - $havedata = 1; - else - $havedata = 0; - } - else - { - $result = db_query("SELECT * FROM article WHERE id = $id"); - if (db_count($result) != 1) - { - print("

Error: Article #$id was not found!

\n"); - html_footer(); - exit(); - } - - $row = db_next($result); - - $is_published = $row["is_published"]; - $title = $row["title"]; - $abstract = $row["abstract"]; - $contents = $row["contents"]; - - db_free($row); - - $havedata = 0; - } - - if ($havedata) - { - $title = db_escape($title); - $abstract = db_escape($abstract); - $contents = db_escape($contents); - $modify_date = time(); - - db_query("UPDATE article SET " - ."is_published = $is_published, " - ."title = '$title', " - ."abstract = '$abstract', " - ."contents = '$contents', " - ."modify_date = $modify_date, " - ."modify_user = '$LOGIN_USER' " - ."WHERE id = $id"); - - if (!$is_published) - notify_users($id, "modified"); - - header("Location: $PHP_SELF?L$id$options"); - } - else - { - html_header("Modify Article #$id"); - - html_start_links(1); - html_link("Return to Articles", "$PHP_SELF?L$options"); - html_link("Article #$id", "$PHP_SELF?L$id$options"); - html_end_links(); - - if ($REQUEST_METHOD == "POST") - { - print("

Error: Please fill in the fields marked in " - ."bold red below and resubmit " - ."your article.

\n"); - - $hstart = ""; - $hend = ""; - } - else - { - $hstart = ""; - $hend = ""; - } - - print("" - ."\n"); - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - { - print("\n"); - } - else - print("\n"); - - $title = htmlspecialchars($title, ENT_QUOTES); - - if ($title == "") - print(""); - else - print(""); - print("\n"); - - $abstract = htmlspecialchars($abstract, ENT_QUOTES); - - if ($abstract == "") - print(""); - else - print(""); - print("\n"); - - $contents = htmlspecialchars($contents, ENT_QUOTES); - - if ($contents == "") - print(""); - else - print(""); - print("\n"); - - print("\n"); - print("
Published:"); - select_is_published($is_published); - print("
${hstart}Title:${hend}
Title:
${hstart}Abstract:${hend}
Abstract:
${hstart}Contents:${hend}
Contents:\n" - ."

The contents of the article may contain the following " - ."HTML elements: A, B, BLOCKQUOTE, " - ."CODE, EM, H1, H2, " - ."H3, H4, H5, H6, I, " - ."IMG, LI, OL, P, PRE, " - ."TT, U, UL

" - ."
\n"); - - html_footer(); - } - break; - - case 'N' : // Post new Article - if ($REQUEST_METHOD == "POST") - { - if ($LOGIN_LEVEL < AUTH_DEVEL) - $is_published = 0; - else if (array_key_exists("IS_PUBLISHED", $_POST)) - $is_published = (int)$_POST["IS_PUBLISHED"]; - else - $is_published = 0; - - if (array_key_exists("TITLE", $_POST)) - $title = $_POST["TITLE"]; - else - $title = ""; - - if (array_key_exists("ABSTRACT", $_POST)) - $abstract = $_POST["ABSTRACT"]; - else - $abstract = ""; - - if (array_key_exists("CONTENTS", $_POST)) - $contents = $_POST["CONTENTS"]; - else - $contents = ""; - - if ($LOGIN_USER != "" && $LOGIN_LEVEL < AUTH_DEVEL) - $create_user = $LOGIN_USER; - else if (array_key_exists("CREATE_USER", $_POST)) - $create_user = $_POST["CREATE_USER"]; - else - $create_user = ""; - - if (($is_published == 0 || $LOGIN_LEVEL >= AUTH_DEVEL) && - $title != "" && $abstract != "" && $contents != "" && - $create_user != "") - $havedata = 1; - else - $havedata = 0; - } - else - { - $is_published = 0; - $title = ""; - $abstract = ""; - $contents = ""; - - if ($LOGIN_USER != "") - $create_user = $LOGIN_USER; - else if (array_key_exists("FROM", $_COOKIE)) - $create_user = $_COOKIE["FROM"]; - else - $create_user = ""; - - $havedata = 0; - } - - if ($havedata) - { - $title = db_escape($title); - $abstract = db_escape($abstract); - $contents = db_escape($contents); - $create_date = time(); - $create_user = db_escape($create_user); - - db_query("INSERT INTO article VALUES(NULL," - ."$is_published,'$title','$abstract','$contents'," - ."$create_date,'$create_user',$create_date,'$create_user')"); - - $id = db_insert_id(); - - if (!$is_published) - notify_users($id); - - header("Location: $PHP_SELF?L$id$options"); - break; - } - - html_header("Submit Article"); - - html_start_links(1); - html_link("Return to Articles", "$PHP_SELF?L$options"); - html_end_links(); - - if ($REQUEST_METHOD == "POST") - { - print("

Error: Please fill in the fields marked in " - ."bold red below and resubmit " - ."your article.

\n"); - - $hstart = ""; - $hend = ""; - } - else - { - print("

Please use this form to post announcements, how-to's, " - ."examples, and case studies showing how you use $PROJECT_NAME. " - ."We will proofread your article, and if we determine it is " - ."appropriate for the site, we will make the article public " - ."on the site. Thank you for supporting $PROJECT_NAME!

\n"); - - $hstart = ""; - $hend = ""; - } - - print("
" - ."\n"); - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - { - print("\n"); - } - else - print("\n"); - - $title = htmlspecialchars($title, ENT_QUOTES); - - if ($title == "") - print(""); - else - print(""); - print("\n"); - - $abstract = htmlspecialchars($abstract, ENT_QUOTES); - - if ($abstract == "") - print(""); - else - print(""); - print("\n"); - - $create_user = htmlspecialchars($create_user, ENT_QUOTES); - - if ($create_user == "") - print(""); - else - print(""); - - if ($LOGIN_USER != "" && $LOGIN_LEVEL < AUTH_DEVEL) - print("\n"); - else - print("\n"); - - $contents = htmlspecialchars($contents, ENT_QUOTES); - - if ($contents == "") - print(""); - else - print(""); - print("\n"); - - print("\n"); - print("
Published:"); - select_is_published($is_published); - print("
${hstart}Title:${hend}
Title:
${hstart}Abstract:${hend}
Abstract:
${hstart}Author:${hend}
Author:$create_user
${hstart}Contents:${hend}
Contents:\n" - ."

The contents of the article may contain the following " - ."HTML elements: A, B, BLOCKQUOTE, " - ."CODE, EM, H1, H2, " - ."H3, H4, H5, H6, I, " - ."IMG, LI, OL, P, PRE, " - ."TT, U, UL

" - ."
\n"); - - html_footer(); - break; -} - - -// -// End of "$Id$". -// -?> diff --git a/www/comment.php b/www/comment.php deleted file mode 100644 index a393eca..0000000 --- a/www/comment.php +++ /dev/null @@ -1,377 +0,0 @@ -Click the button below to confirm the deletion.

\n" - ."
" - ."
" - ."
\n"); - html_footer(); - break; - - case 'D' : // Delete comment (confirmed) - db_query("DELETE FROM comment WHERE id = $id"); - header("Location: $PHP_SELF"); - break; - - case 'e' : // Edit comment - case 'r' : // New comment - if ($LOGIN_USER == "") - { - header("Location: login.php?PAGE=comment.php?$op$id+p" . - urlencode($path)); - return; - } - - $havedata = 0; - - if ($REQUEST_METHOD == "POST") - { - if ($LOGIN_USER != "" && $LOGIN_LEVEL < AUTH_DEVEL) - $create_user = $LOGIN_USER; - else if (array_key_exists("AUTHOR", $_POST)) - $create_user = trim($_POST["AUTHOR"]); - else - $create_user = ""; - - if (array_key_exists("FILE", $_POST)) - $file = $_POST["FILE"]; - else - $file = ""; - - if (array_key_exists("STATUS", $_POST)) - $status = (int)$_POST["STATUS"]; - else - $status = 2; - - if (array_key_exists("MESSAGE", $_POST)) - $contents = trim($_POST["MESSAGE"]); - else - $contents = ""; - - if (strpos($contents, "http:") === FALSE && - strpos($contents, "https:") === FALSE && - strpos($contents, "ftp:") === FALSE && - strpos($contents, "mailto:") === FALSE && - $contents != "" && $create_user != "" && $file != "") - $havedata = 1; - - if ($create_user != "" && $id == 0 && !$LOGIN_USER) - setcookie("FROM", $create_user, time() + 90 * 86400, "/"); - } - else - { - if ($id) - { - $result = db_query("SELECT * FROM comment WHERE id = $id"); - if (db_count($result) > 0) - { - $row = db_next($result); - $create_user = $row['create_user']; - $contents = $row['contents']; - $status = $row['status']; - } - else - { - if ($LOGIN_USER != "") - $create_user = $LOGIN_USER; - else if (array_key_exists("FROM", $_COOKIE)) - $create_user = $_COOKIE["FROM"]; - else - $create_user = "Anonymous "; - - $contents = ""; - $status = 2; - } - - db_free($result); - } - else - { - if ($LOGIN_USER != "") - $create_user = $LOGIN_USER; - else if (array_key_exists("FROM", $_COOKIE)) - $create_user = $_COOKIE["FROM"]; - else - $create_user = "Anonymous "; - - $contents = ""; - $status = 2; - } - } - - if ($havedata) - { - $create_user = db_escape($create_user); - $file = db_escape($file); - $contents = db_escape($contents); - - if ($id) - { - // Update existing record. - db_query("UPDATE comment SET create_user='$create_user',url='$file'," - ."status=$status,contents='$contents' WHERE id = $id"); - } - else - { - // Add new record. - $create_date = time(); - db_query("INSERT INTO comment VALUES(NULL,$refer_id,2,'$file'," - ."'$contents',$create_date,'$create_user')"); - $id = db_insert_id(); - } - - $location = str_replace("_", "?", $path); - header("Location: $location#_USER_COMMENT_$id"); - } - else - { - if ($id) - html_header("Edit Comment"); - else - html_header("Add Comment"); - - if ($REQUEST_METHOD == "POST") - { - print("

Your comment posting is missing required information. " - ."Please fill in all fields marked in " - ."red and resubmit your comments.

\n"); - $hstart = ""; - $hend = ""; - } - else - { - $hstart = ""; - $hend = ""; - } - - if ($op == "e") - print("
\n" - ."
\n"); - else - print("\n" - ."
\n"); - - $create_user = htmlspecialchars($create_user); - if ($create_user == "") - print("" - ."\n"); - else - print("" - ."\n"); - - $contents = htmlspecialchars($contents); - if ($contents == "") - print("" - ."" - ."\n"); - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - { - print("" - ."\n"); - print("" - ."\n"); - } - else - { - print("\n"); - print("\n"); - } - - if ($id) - print("\n"); - else - print("\n"); - - print("
${hstart}Author:${hend}
Author:
${hstart}Message:${hend}"); - else - print("
Message:"); - - print("

Comments may contain the following " - ."HTML elements: A, B, BLOCKQUOTE, " - ."CODE, EM, H1, H2, " - ."H3, H4, H5, H6, I, " - ."IMG, LI, OL, P, PRE, " - ."TT, U, UL

File Path:
Score:
\n" - ."
\n"); - - html_footer(); - } - break; - - case 'L' : // List all comments... - case 'l' : // List unapproved comments... - html_header("Comments"); - - if ($LOGIN_LEVEL < AUTH_DEVEL) - { - $result = db_query("SELECT * FROM comment WHERE status = 1 AND " - ."url LIKE '${listpath}%' ORDER BY id"); - } - else - { - if ($op == 'L') - { - $result = db_query("SELECT * FROM comment WHERE " - ."url LIKE '${listpath}%' ORDER BY id"); - print("

Show Hidden Comments

\n"); - } - else - { - $result = db_query("SELECT * FROM comment WHERE status = 0 AND " - ."url LIKE '${listpath}%' ORDER BY id"); - print("

Show All Comments

\n"); - } - } - - if (db_count($result) == 0) - { - if ($LOGIN_LEVEL >= AUTH_DEVEL && $op == 'l') - print("

No hidden comments.

\n"); - else - print("

No visible comments.

\n"); - } - else - { - print("
    \n"); - - while ($row = db_next($result)) - { - $create_date = date("M d, Y", $row['create_date']); - $create_user = sanitize_email($row['create_user']); - $contents = sanitize_text($row['contents']); - $location = str_replace("_", "?", $row['url']); - - print("
  • $row[url] " - ." by $create_user on $create_date " - ."Edit " - ."· Delete" - ."
    $contents
  • \n"); - } - - print("
\n"); - } - - db_free($result); - - html_footer(); - break; - - case 'm' : // Moderate - if (array_key_exists("MODPOINTS", $_COOKIE)) - $modpoints = $_COOKIE["MODPOINTS"]; - else - $modpoints = 5; - - if ($modpoints > 0) - { - $modpoints --; - - setcookie("MODPOINTS", $modpoints, time() + 2 * 86400, "/"); - - $result = db_query("SELECT status FROM comment WHERE id=$id"); - $row = db_next($result); - - if ($dir == 'd') - { - // Moderate down... - if ($row['status'] > 0) - db_query("UPDATE comment SET status = status - 1 WHERE id=$id"); - } - else - { - // Moderate down... - if ($row['status'] < 5) - db_query("UPDATE comment SET status = status + 1 WHERE id=$id"); - } - - db_free($result); - } - - $location = str_replace("_", "?", $path); - header("Location: $location#_USER_COMMENT_$id"); - break; - } -} - -// -// End of "$Id$". -// -?> diff --git a/www/data/.htaccess b/www/data/.htaccess deleted file mode 100644 index 0a35203..0000000 --- a/www/data/.htaccess +++ /dev/null @@ -1,3 +0,0 @@ -Order deny,allow -Allow from none - diff --git a/www/data/make-form.php b/www/data/make-form.php deleted file mode 100755 index dfd10bc..0000000 --- a/www/data/make-form.php +++ /dev/null @@ -1,598 +0,0 @@ -#!/usr/bin/php -q -Bad command '\$op'!\\n\");\n"); -print(" html_footer();\n"); -print(" exit();\n"); -print(" }\n"); -print("\n"); -print(" if ((\$op == 'D' || \$op == 'M') && !\$id)\n"); -print(" {\n"); -print(" html_header(\"$tname Error\");\n"); -print(" print(\"

Command '\$op' requires an ID!\\n\");\n"); -print(" html_footer();\n"); -print(" exit();\n"); -print(" }\n"); -print("\n"); -print(" if ((\$op == 'D' || \$op == 'M') && \$LOGIN_USER == \"\")\n"); -print(" {\n"); -print(" html_header(\"$tname Error\");\n"); -print(" print(\"

Command '\$op' requires a login!\\n\");\n"); -print(" html_footer();\n"); -print(" exit();\n"); -print(" }\n"); -print("\n"); -print(" if (\$op == 'N' && \$id)\n"); -print(" {\n"); -print(" html_header(\"$tname Error\");\n"); -print(" print(\"

Command '\$op' may not have an ID!\\n\");\n"); -print(" html_footer();\n"); -print(" exit();\n"); -print(" }\n"); -print("}\n"); -print("else\n"); -print("{\n"); -print(" \$op = 'L';\n"); -print(" \$id = 0;\n"); -print("}\n"); -print("\n"); -print("switch (\$op)\n"); -print("{\n"); -print(" case 'D' : // Delete $tname\n"); -print(" if (\$REQUEST_METHOD == \"POST\")\n"); -print(" {\n"); -print(" db_query(\"DELETE FROM $table WHERE id = \$id\");\n"); -print("\n"); -print(" header(\"Location: \$PHP_SELF?L\");\n"); -print(" }\n"); -print(" else\n"); -print(" {\n"); -print(" \$result = db_query(\"SELECT * FROM $table WHERE id = \$id\");\n"); -print(" if (db_count(\$result) != 1)\n"); -print(" {\n"); -print(" print(\"

Error: $tname #\$id was not found!

\\n\");\n"); -print(" html_footer();\n"); -print(" exit();\n"); -print(" }\n"); -print("\n"); -print(" \$row = db_next(\$result);\n"); -print("\n"); -print(" html_header(\"Delete $tname #\$id\");\n"); -print("\n"); -print(" html_start_links(1);\n"); -print(" html_link(\"Return to $tname List\", \"\$PHP_SELF?L\");\n"); -print(" html_link(\"View $tname #\$id\", \"\$PHP_SELF?L\$id\");\n"); -print(" html_link(\"Modify $tname #\$id\", \"\$PHP_SELF?M\$id\");\n"); -print(" html_end_links();\n"); -print("\n"); -print(" print(\"

Delete $tname #\$id

\\n\");\n"); -print(" print(\"
\"\n"); -print(" .\"

\\n\");\n"); -print("\n"); - -print(" if (!\$row['is_published'])\n"); -print(" print(\"\\n\");\n"); -print("\n"); - -sqlite_seek($result, 0); -while ($row = sqlite_fetch_array($result)) -{ - switch ($row['name']) - { - case "id" : - case "create_date" : - case "create_user" : - case "modify_date" : - case "modify_user" : - case "is_published" : - break; - - default : - $name = ucwords(str_replace('_', ' ', $row['name'])); - - print(" \$temp = htmlspecialchars(\$row[\"$row[name]\"]);\n"); - print(" print(\"" - ."\\n\");\n"); - print("\n"); - break; - } -} - -print(" print(\"\\n\");\n"); -print(" print(\"
This $tname is \"\n"); -print(" .\"currently hidden from public view.
$name:\$temp
\"\n"); -print(" .\"

\\n\");\n"); -print("\n"); -print(" html_footer();\n"); -print(" }\n"); -print(" break;\n"); -print("\n"); -print(" case 'L' : // List (all) $tname(s)\n"); -print(" if (\$id)\n"); -print(" {\n"); -print(" html_header(\"$tname #\$id\");\n"); -print("\n"); -print(" \$result = db_query(\"SELECT * FROM $table WHERE id = \$id\");\n"); -print(" if (db_count(\$result) != 1)\n"); -print(" {\n"); -print(" print(\"

Error: $tname #\$id was not found!

\\n\");\n"); -print(" html_footer();\n"); -print(" exit();\n"); -print(" }\n"); -print("\n"); -print(" \$row = db_next(\$result);\n"); -print("\n"); -print(" html_start_links(1);\n"); -print(" html_link(\"Return to $tname List\", \"\$PHP_SELF?L\");\n"); -print(" html_link(\"Modify $tname\", \"\$PHP_SELF?M\$id\");\n"); -print(" html_link(\"Delete $tname #\$id\", \"\$PHP_SELF?D\$id\");\n"); -print(" html_end_links();\n"); -print("\n"); -print(" print(\"

$tname #\$id

\\n\");\n"); -print(" print(\"

\\n\");\n"); -print("\n"); -print(" if (!\$row['is_published'])\n"); -print(" print(\"\\n\");\n"); -print("\n"); - -sqlite_seek($result, 0); -while ($row = sqlite_fetch_array($result)) -{ - switch ($row['name']) - { - case "id" : - case "create_date" : - case "create_user" : - case "modify_date" : - case "modify_user" : - case "is_published" : - break; - - default : - $name = ucwords(str_replace('_', ' ', $row['name'])); - - if ($row['type'] == "TEXT") - print(" \$temp = format_text(\$row['$row[name]']);\n"); - else - print(" \$temp = htmlspecialchars(\$row['$row[name]']);\n"); - print(" print(\"" - ."\\n\");\n"); - print("\n"); - break; - } -} - -print(" print(\"
This $tname is \"\n"); -print(" .\"currently hidden from public view.
$name:\$temp

\\n\");\n"); -print(" db_free(\$result);\n"); -print(" }\n"); -print(" else\n"); -print(" {\n"); -print(" html_header(\"$tname List\");\n"); -print("\n"); -print(" html_start_links(1);\n"); -print(" html_link(\"New $tname\", \"\$PHP_SELF?N\");\n"); -print(" html_end_links();\n"); -print("\n"); -print(" \$result = db_query(\"SELECT * FROM $table\");\n"); -print(" \$count = db_count(\$result);\n"); -print("\n"); -print(" print(\"

$tname List

\\n\");\n"); -print(" if (\$count == 0)\n"); -print(" {\n"); -print(" print(\"

No ${tname}s found.

\\n\");\n"); -print("\n"); -print(" html_footer();\n"); -print(" exit();\n"); -print(" }\n"); -print("\n"); -print(" html_start_table(array(\"ID\""); - -sqlite_seek($result, 0); - -$list_columns = 0; -while ($row = sqlite_fetch_array($result)) - switch ($row['name']) - { - case "id" : - case "create_date" : - case "create_user" : - case "modify_user" : - case "is_published" : - case "abstract" : - case "contents" : - break; - - case "modify_date" : - print(",\"Last Modified\""); - $list_columns ++; - break; - - default : - $name = ucwords(str_replace('_', ' ', $row['name'])); - print(",\"$name\""); - $list_columns ++; - break; - } - -print("));\n"); -print("\n"); -print(" while (\$row = db_next(\$result))\n"); -print(" {\n"); -print(" html_start_row();\n"); -print("\n"); - -sqlite_seek($result, 0); -while ($row = sqlite_fetch_array($result)) - switch ($row['name']) - { - case "id" : - print(" \$id = \$row['id'];\n\n"); - print(" print(\"\"\n"); - print(" .\"\$id\");\n"); - print("\n"); - break; - - case "modify_date" : - print(" \$temp = date(\"M d, Y\", \$row['modify_date']);\n"); - print(" print(\"\"\n"); - print(" .\"\$temp\");\n"); - print("\n"); - break; - - case "create_date" : - case "create_user" : - case "modify_user" : - case "is_published" : - case "contents" : - case "abstract" : - break; - - default : - print(" \$temp = htmlspecialchars(\$row['$row[name]']);\n"); - print(" print(\"\"\n"); - print(" .\"\$temp\");\n"); - print("\n"); - break; - } - -print(" html_end_row();\n"); - -sqlite_seek($result, 0); -while ($row = sqlite_fetch_array($result)) - if ($row['name'] == "abstract") - { - print("\n"); - print(" html_start_row();\n"); - print(" \$temp = htmlspecialchars(\$row['abstract']);\n"); - print(" print(\"\$temp\");\n"); - print(" html_end_row();\n"); - } - -print(" }\n"); -print("\n"); -print(" html_end_table();\n"); -print(" }\n"); -print("\n"); -print(" html_footer();\n"); -print(" break;\n"); -print("\n"); - -print(" case 'M' : // Modify $tname\n"); -print(" if (\$REQUEST_METHOD == \"POST\")\n"); -print(" {\n"); -print(" \$date = time();\n"); - -sqlite_seek($result, 0); -while ($row = sqlite_fetch_array($result)) - switch ($row['name']) - { - case "id" : - case "create_date" : - case "create_user" : - case "modify_date" : - case "modify_user" : - break; - - default : - $form = strtoupper($row['name']); - - print(" \$$row[name] = db_escape(\$_POST[\"$form\"]);\n"); - break; - } - -print("\n"); -print(" db_query(\"UPDATE $table SET \"\n"); - -sqlite_seek($result, 0); -while ($row = sqlite_fetch_array($result)) - switch ($row['name']) - { - case "id" : - case "create_date" : - case "create_user" : - case "modify_date" : - case "modify_user" : - break; - - default : - if ($row['type'] == "INTEGER") - print(" .\"$row[name] = \$$row[name], \"\n"); - else - print(" .\"$row[name] = '\$$row[name]', \"\n"); - break; - } - -print(" .\"modify_date = \$date, \"\n"); -print(" .\"modify_user = '\$LOGIN_USER' \"\n"); -print(" .\"WHERE id = \$id\");\n"); -print("\n"); -print(" header(\"Location: \$PHP_SELF?L\$id\");\n"); -print(" }\n"); -print(" else\n"); -print(" {\n"); -print(" html_header(\"Modify $tname #\$id\");\n"); -print("\n"); -print(" html_start_links(1);\n"); -print(" html_link(\"Return to $tname List\", \"\$PHP_SELF?L\");\n"); -print(" html_link(\"$tname #\$id\", \"\$PHP_SELF?L\$id\");\n"); -print(" html_end_links();\n"); -print("\n"); -print(" print(\"

Modify $tname #\$id

\\n\");\n"); -print(" \$result = db_query(\"SELECT * FROM $table WHERE id = \$id\");\n"); -print(" if (db_count(\$result) != 1)\n"); -print(" {\n"); -print(" print(\"

Error: $tname #\$id was not found!

\\n\");\n"); -print(" html_footer();\n"); -print(" exit();\n"); -print(" }\n"); -print("\n"); -print(" \$row = db_next(\$result);\n"); -print("\n"); -print(" print(\"
\"\n"); -print(" .\"

\\n\");\n"); -print("\n"); -print(" print(\"\\n\");\n"); -print("\n"); - -sqlite_seek($result, 0); -while ($row = sqlite_fetch_array($result)) - switch ($row['name']) - { - case "id" : - case "create_date" : - case "create_user" : - case "modify_date" : - case "modify_user" : - case "is_published" : - break; - - default : - $form = strtoupper($row['name']); - $name = ucwords(str_replace('_', ' ', $row['name'])); - print(" \$temp = htmlspecialchars(\$row['$row[name]'], ENT_QUOTES);\n"); - print(" print(\"\"\n"); - - if ($row['type'] == "TEXT") - { - print(" .\"\\n\");\n"); - } - else - { - print(" .\"\\n\");\n"); - } - - print("\n"); - break; - } - -print(" print(\"\\n\");\n"); -print(" print(\"
Published:\");\n"); -print(" select_is_published(\$row['is_published']);\n"); -print(" print(\"
$name:
\"\n"); -print(" .\"

\\n\");\n"); -print("\n"); -print(" html_footer();\n"); -print(" }\n"); -print(" break;\n"); -print("\n"); -print(" case 'N' : // Post new $tname\n"); -print(" if (\$REQUEST_METHOD == \"POST\")\n"); -print(" {\n"); -print(" \$date = time();\n"); - -sqlite_seek($result, 0); -while ($row = sqlite_fetch_array($result)) - switch ($row['name']) - { - case "id" : - case "create_date" : - case "create_user" : - case "modify_date" : - case "modify_user" : - break; - - default : - $form = strtoupper($row['name']); - if ($row['type'] == "INTEGER") - print(" \$$row[name] = db_escape(\$_POST[\"$form\"]);\n"); - else - print(" \$$row[name] = db_escape(\$_POST[\"$form\"]);\n"); - break; - } - -print("\n"); -print(" db_query(\"INSERT INTO $table VALUES(NULL,\"\n"); - -sqlite_seek($result, 0); -while ($row = sqlite_fetch_array($result)) - switch ($row['name']) - { - case "id" : - case "create_date" : - case "create_user" : - case "modify_date" : - case "modify_user" : - break; - - default : - if ($row['type'] == "INTEGER") - print(" .\"\$$row[name],\"\n"); - else - print(" .\"'\$$row[name]',\"\n"); - break; - } - -print(" .\"\$date,'\$LOGIN_USER',\$date,'\$LOGIN_USER')\");\n"); -print("\n"); -print(" \$id = db_insert_id();\n"); -print("\n"); -print(" header(\"Location: \$PHP_SELF?L\$id\");\n"); -print(" break;\n"); -print(" }\n"); -print("\n"); -print(" html_header(\"New $tname\");\n"); -print("\n"); -print(" html_start_links(1);\n"); -print(" html_link(\"Return to $tname List\", \"\$PHP_SELF?L\");\n"); -print(" html_end_links();\n"); -print("\n"); -print(" print(\"

New $tname

\\n\");\n"); -print(" print(\"
\"\n"); -print(" .\"

\\n\");\n"); -print("\n"); -print(" if (\$LOGIN_USER != \"\")\n"); -print(" {\n"); -print(" print(\"\\n\");\n"); -print(" }\n"); -print(" else\n"); -print(" print(\"\\n\");\n"); -print("\n"); - -sqlite_seek($result, 0); -while ($row = sqlite_fetch_array($result)) - switch ($row['name']) - { - case "id" : - case "create_date" : - case "create_user" : - case "modify_date" : - case "modify_user" : - case "is_published" : - break; - - default : - $form = strtoupper($row['name']); - $name = ucwords(str_replace('_', ' ', $row['name'])); - - print(" print(\"\"\n"); - - if ($row['type'] == "TEXT") - { - print(" .\"\\n\");\n"); - } - else - { - print(" .\"\\n\");\n"); - } - - print("\n"); - break; - } - -print(" print(\"\\n\");\n"); -print(" print(\"
Published:\");\n"); -print(" select_is_published();\n"); -print(" print(\"
$name:
\"\n"); -print(" .\"

\\n\");\n"); -print("\n"); -print(" html_footer();\n"); -print(" break;\n"); -print("}\n"); -print("\n"); -print("\n"); -print("//\n"); -print("// End of \"\$Id\$\".\n"); -print("//\n"); -print("?>\n"); - -?> diff --git a/www/data/makedb b/www/data/makedb deleted file mode 100755 index c8ed87b..0000000 --- a/www/data/makedb +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -if test -f mxml.db; then - rm -f mxml.db.old - mv mxml.db mxml.db.old -fi - -sqlite mxml.db 6ciK{6%`g178e&67#J8C85tTH8XFrM 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 diff --git a/www/docfiles/A.gif b/www/docfiles/A.gif deleted file mode 100644 index 7f2a147fdae0a38279bbf97e01a47c4aa421a225..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1478 zcmd6mi9Ztx0DxCNH_bN9mDJp}DaYJrwmF6znIpIG(4&YPX|Cl??m3ckj$-Br)7%mw zCU=fp$<-rNE$7dL<#U=09ZVq;}yXJg@DXXWHzNK&=p}} z*wrf{u&bgXBI07A65?W#5@J%4;?hzQaA`>dTv`SRzb1o}y)Gjsdre;Mx`MncNG2d#SpgVx1j(0W*m zz8=;?T)Lvo4e;<9$ucFcfIfW`uNp1+@8z=ME? z4+DdO9tH;og@go$hK7cPg%Jpk!@~&?5#f=M5m8Z5#OUZJL}JX7C$TXxaj~)Sad8Rp z@reluNr_3xPoF+ZPEL9DEHx!1Ej2YgEiFAgJtHF{Gcz+QD~m)TWoKvSu5WB?Y;JCDZEbCDZ-3kVXXl@tot@p? z-MziN{r&xegM%MGe*FCT^VhFmhlhtpM@PSZ|2{rGJ~=r#Jv}`;JNpyf|3M_+5C6RY zU^@kn*@XBBxQa63ckr(7!4(^qv|$ob%g0_xMo;t% z94t>zoK>v?`teeeIm~Ye;F)4%XPWPjD_#{;Wftkc>b;WtmC_($kH*z+22t(02z!FP zGcTzqq&v7*W)LrL#gx1o(>j2xM=9lzLnnl0Dn2sEq-0(LsX)efslx*C{G-~x^Inr3 zS{|pnBeUptMs3*4QNne^}M> zlIVH6LvL6}DsWVPzb%EVaLA1)v<@byoyH((qa%;_Lw2s9_hHQo;Tp(_5d?66?=zao z(Xu;|U7XFCI9t8CfCdrboF0Jjo~b;n-d{l`XRxkCT?(CFC?1kyW6mc^X_(bRmQ7~I zflq84Ly@(ksZUwPVZt6dxG~Ydd_{rMq)O-^IE`6a_cFUBWy;;gG_+@c6t^moA=$_9 z@NiY2tWPF4(bh>a^dXpJUftX}>73t&bcS4=?OM4#9ta;}s&w)4#4<`7=Zn>#99|Yh z=Caa7?g?TMrY>*^abwg8$SNAK{XHF+?}+_arcH(m=2Sb@VzAbZ)Qm)Pz2=vKMpbPr z2;cVJ7Knfitr>F7xbn~olNE^Jd9Jt40me!gCi0jNdX5;`2!;TZcfwa{%V6YNOBLyn zPtOWXlfh)DA2rR(kVlS3;rSN{${>4wd91a=iM%_=_S_lK>Nazew|UpLqZ_na)+-Qf z2`a#38sPB93@=l!S;kwW=GHD6a!1YoaSk}_d*_Q?yWRHJWV`$HASHw_mcYyeQ2!U| C5{YmC diff --git a/www/docfiles/B.gif b/www/docfiles/B.gif deleted file mode 100644 index 54f81f4b99735a64185fdc5a128410f2bf5aaef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1427 zcmbu8hd&ey06?$g;}V^{OU4=5&baIyGUCpby}6J*%bjo{=ZKP%J9}kT_Bi8Gvd)Z@ zy=PWke0_hz_kQnBcu(IzPYLSm25Tp* zZr-@X$0xvlOHhDcNKgPQBp?hH6b1{4ih#vLg>Q?Ah~E~K5Eqk_xGg0qE-fV?BP}T_ zBPAy*4UvDtA;>l+{#K)YViq)YY{#HMF%f zb+ol~b+q+#b@cW04DRY18r(H9G&H_vWMX{J)Wq1#)a1UIsrh{~3-kLh3v)Qk0uF~+ zTEeZYEUm4rY;3G;ZEfuAZ0+ss931Q)JaBMyeBk8d=f++&>f-L^=IP~3; z?d9v^?dR*`@8^r~_j`!&4|s?O40sq681N`4F!<4Vi^?BNJ zOnQ0-27}GWz+$nPnVDHxFS4_QCzI>IN`#LW#4~N6$=f5c^D8STPv(&D*!NHMMnhb@lc24Gj&Ajg9Z#z5npx zLsL^zb8~Y`OG|5OYg=1edwY9FM@MI8XIEEOcXv0DNbKq9>Fw?9>+9?9?HdGk0e|`L1pw_iUx5lYU3cw_0PpT;(CV~XSC@wYl-jshF3}#8S1bslYG`e+d ziSQ9ClK0F$*@R&rTUvR*IYOp*Fc;*_mWiq_8A4?Q;{^`tMNIf1790*fa=nK5dxUl! zG^T`HA&i{p88}*;sCI%{278;APRAEAN$1&smZ#rS({o5z9|+F2P;pXV&^@7V9rLja zy>sd(N3@O10IUfAj-LFK;XzE+NU`bor(IP%I^N+&fe$0q@z z&O`$BlD|#@U5Q(_f@u(QGRSqxAXAC-_hL*xjN!$Zky@{#GJ7iK)G&VpZYrfR8W~2K zEIRk>fU0eUViA@ZhmuSb(!c`oYXkgS^dD@KwO%LvcS;{O1WI&_JJE!6QX40^Ogz3) z_l^(AphoMA5;q|7`LU!0_atz5oU$g;M_Myp;adSO=niLwyF~F+i;M!l23)pRNuGGiKQhV_(D0g{DXOq8bA7`wC|5GS$7e*^Z zV3y78f`A@Y?xBzsd*8?qu$4FZ2y7XMAQwA@l|xtIA$mOqxE%xNG7f&3i%}?MCeuqB zIvm`e9p4QZ2uQD^WyWjimJxJiy_(B3jbg>jfCcCoLg^bEdP8F`%g2>2QYpb>vV1KV zwCO_jNAp(C`j-Q78SABVxu`+0MLHwVK3^ODSS_l2s&P2pJNii8KZqI=B4Op%*eLOu zErza2*D~2R(^B!39SfXav`Es#q!zWD=H`~D=953DlRQ6FD@)FFD)@JE;2DM zGcqtVGch$ZGB!0cHa0XjH#ImoHaR&rIyyKzJ2^Z&Iz2o)K0Q1?K0QD`K0!b~LP0=7 zLP11BLPbPFMnyzNMnyHgocHMhlYrXiHVDf zij0ekjf{+rjg60vj*yR!k&uv*k&%;VZo}ZteprD|kp`oIpp`)Xsq@<&zrKF~&rKhH*sHdl?sHm!`sjI50tgEZ7 ztgWxEuCTAKv9PeRv9YqUva_?Zw6wLhwzjvox45{txw*Nzy1Ki&yS%)-y}iA@zP`V| zzreu2!NI}8!otJD!^FhI#l^+O#>U6T$H>UY$;rve%F4^i%goEn&CJct&Cbux&(P1% z(a_P+(bCe=)6>(`)YR40)z;S5*VotB*x1?G+1lFL+uPgR+}z#W-QM2b-{0Th;Nall z;o;)q;^X7vlt)=I7_<=;-L_>FMg~>g((4?Ck9A?d|UE?(gpJ@bB>O@bU5S z^78WY^Yird^!4@i_V)Jo_xJet`1$$y`uh6&`}_R-{Qdp?{{H^||NjIC2LuQQ1PBKN z2nPfR2LuQQEC2ui0Av7U000R70P_hPNU&f*G5``PT*$DY!-o(fDkNjDqQ#2_cS+pH zv7<)-yD*Bp80DkMlPIH%T$v9K%9k)Z;$e9)rp=oWX%_T^v!~C5o^<9*^0O$;Bs5nT zU21d1N}^1ozC?FRT0 z%`r#cyka`Cv#t>bw8jhs_QS~R=;(;BU`8Kyplvf8r+3OmI(mgGEFhP|M<{Cf3Rj!$ zrCQ}Lgl35;RJqV0p=ti+u{}ZODatf$ckd}EJ#3wbS;E#sGgVPz^1H&XyRwCTmclH> z(iU8`;2wV?(ZSU@2P*d-ON%%-U49ZixKf3%;m{z4QeDE*G8}S64@+8vh}DKB3P@p! zOrgkPVJp5E--R-&NMnsNj)WtEI_?PLjXrJ`W02epNu+f~9(fXjD;1%nO^2`)%abvU z;3AbCU5O<}T5c&3O=d9F%u2U#MNF4Pj`Rsv44?@UOKbeM(j_*EqDB6{5I*9?(4?1Dvpjzml1k8G) zs#Rh~Hpo>WA+CBQ697a3+>#uIvtbq>hq(sFA#=T6mtqRR>O{heH59wj5;&=b(*??6 zltZ(Q1sbhD2B5c8IM)h1utq)!f94y6~iWJbrDn$cSMy)N>#j(Q!G)eu|pTL^zg?E hNsKDV07OP`#Ro@5Z^8PuW-gWND(h^G6v-7306Pdx#lQdn diff --git a/www/docfiles/D.gif b/www/docfiles/D.gif deleted file mode 100644 index dd8f8295e883925f72172deb18d335de8fa2331f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1463 zcmbW01z*z%06=%gloYAaA>G~KNsJsdI;BPoq)P+^j&4Q^Y?KmGf4W1uTlkSD-5mlF z$9;u+zxNT|Q&v@ykhDU85TI=k2#kaM3>W7)9xgUM9u5IM?h67u!WZ~22?>Z^z91$d zBq4rDN<*A%~DskdskRKqx86si-KZsVHfvsc31a>1b)_>1Y|~>0U9=GrnSA zVtmES#K^+T#LB|V#>&jj#_}WwJ1Zv#8y6=#Hx~yFHzzL-7auRLpa7qcAiuDXfQYb= zn5eLrn25Nzn53k*l$3M%78b(p4xx|XJfww5MbTT2J7t*Zmq)78<}(=#y8H#9UbGBPwaHZn0W zHZ?UdGcz?eH+%cm+`_`b%F@!>%F4#t8ewB?i?Fe?McCWfI@sGG9qb*E4o;59cTSGZ z@0?tm-?_RtySci!ySaL}yLo!JdwF_zd3kz!d-?cy`}+F&`Mv+}!O!3SLqI^lr%xXP z13v`?1qKHPhlKnc8WIu~8Ws^A9vKl46&V>F6%`X59UBu97aJQN7ncwppO}zl&PJor7z`#SCnq;IH!m+QKR>Uapy2D*FNK9) ziwX;ii;7B$i@%kWlz#hGR$5wKR#s77URhBAR9032Ky_7Bb#+Z`ZEam$U44ChLqkJj zV`EcOQ*(23OG`^@YinCuTYGzZM@L6z=l8CzuI}#co}QlG-rl~xzW)CHfq{X+!NH-S zq2Zz7k>Qcikysi~>y>FJr7nIAuX%+1Zs&(AL`EG#ZAE-fuB zFE6jGto(dpb#--ZZEbyhePd%|b8~ZRYioOZduL~7cXxMhZ*PBp|KQ-@@bK{H@aXvH z_~iKHpPyR(^toqgg~q^6b!>qVdpVuL_#88jdkW5nW1iN8w(zeD#8M zXfrj$KowrA*aeYV0<(!gt1zj)qzqt6m;e6lg$fF%m$HJV~sYT3u*)t4kp?g&01OnjnQv0huN9lK|$5`Az z|9~w{IH2I{Ky7S1gi3K)tq_Dvgu4PPktk=#GdvhnKs6D*1t5Y_K0+W?wiNYqc|qoV z6or;Hn2qIh&s3xi8;@=N&&Y(T+RiLak0`rL-~5gKG@q`)e^gKz+uIt_C-e4baisEg zj0CGfGW}dh6N)sN&tx4Yy93tr3d#S1=b6pqn1p4A7B<5W4W7O=^3iKu2OmZ!6u%-Inp*=-mEEeHk#9+{4TE#z zWrT`K^9X{?QZuZVtI5@=TxV?$oC9ocT#9)|OQ}sY7Vy8cKNuq*9dM*Ku^xyjLtF-EVAot6ck|;CaP{tD6v_K&S7Xv!Xr;+25v$?Z6HOID_yUUd&%hw*e*qM_ BvB&@b diff --git a/www/docfiles/advanced.html b/www/docfiles/advanced.html deleted file mode 100644 index 1796695..0000000 --- a/www/docfiles/advanced.html +++ /dev/null @@ -1,581 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
-

3More Mini-XML Programming - Techniques

-

This chapter shows additional ways to use the Mini-XML library in - your programs.

-

Load Callbacks

-

Chapter 2 introduced the -mxmlLoadFile() and -mxmlLoadString() functions. The last argument to these - functions is a callback function which is used to determine the value - type of each data node in an XML document.

-

Mini-XML defines several standard callbacks for simple XML data - files:

-
    -
  • MXML_INTEGER_CALLBACK - All data nodes contain - whitespace-separated integers.
  • -
  • MXML_OPAQUE_CALLBACK - All data nodes contain opaque - strings ("CDATA").
  • -
  • MXML_REAL_CALLBACK - All data nodes contain - whitespace-separated floating-point numbers.
  • -
  • MXML_TEXT_CALLBACK - All data nodes contain - whitespace-separated strings.
  • -
-

You can provide your own callback functions for more complex XML - documents. Your callback function will receive a pointer to the current - element node and must return the value type of the immediate children - for that element node: MXML_INTEGER, MXML_OPAQUE, -MXML_REAL, or MXML_TEXT. The function is called after - the element and its attributes have been read, so you can look at the - element name, attributes, and attribute values to determine the proper - value type to return.

- - -

The following callback function looks for an attribute named "type" - or the element name to determine the value type for its child nodes:

-
-    mxml_type_t
-    type_cb(mxml_node_t *node)
-    {
-      const char *type;
-
-     /*
-      * You can lookup attributes and/or use the
-      * element name, hierarchy, etc...
-      */
-
-      type = mxmlElementGetAttr(node, "type");
-      if (type == NULL)
-	type = mxmlGetElement(node);
-
-      if (!strcmp(type, "integer"))
-	return (MXML_INTEGER);
-      else if (!strcmp(type, "opaque"))
-	return (MXML_OPAQUE);
-      else if (!strcmp(type, "real"))
-	return (MXML_REAL);
-      else
-	return (MXML_TEXT);
-    }
-
-

To use this callback function, simply use the name when you call any - of the load functions:

-
-    FILE *fp;
-    mxml_node_t *tree;
-
-    fp = fopen("filename.xml", "r");
-    tree = mxmlLoadFile(NULL, fp, type_cb);
-    fclose(fp);
-
-

Save Callbacks

-

Chapter 2 also introduced the -mxmlSaveFile(), -mxmlSaveString(), and -mxmlSaveAllocString() functions. The last argument to these - functions is a callback function which is used to automatically insert - whitespace in an XML document.

-

Your callback function will be called up to four times for each - element node with a pointer to the node and a "where" value of -MXML_WS_BEFORE_OPEN, MXML_WS_AFTER_OPEN, -MXML_WS_BEFORE_CLOSE, or MXML_WS_AFTER_CLOSE. The callback - function should return NULL if no whitespace should be added - and the string to insert (spaces, tabs, carriage returns, and newlines) - otherwise.

-

The following whitespace callback can be used to add whitespace to - XHTML output to make it more readable in a standard text editor:

-
-    const char *
-    whitespace_cb(mxml_node_t *node,
-                  int where)
-    {
-      const char *name;
-
-     /*
-      * We can conditionally break to a new line
-      * before or after any element. These are
-      * just common HTML elements...
-      */
-
-      name = mxmlGetElement(node);
-
-      if (!strcmp(name, "html") ||
-          !strcmp(name, "head") ||
-          !strcmp(name, "body") ||
-	  !strcmp(name, "pre") ||
-          !strcmp(name, "p") ||
-	  !strcmp(name, "h1") ||
-          !strcmp(name, "h2") ||
-          !strcmp(name, "h3") ||
-	  !strcmp(name, "h4") ||
-          !strcmp(name, "h5") ||
-          !strcmp(name, "h6"))
-      {
-       /*
-	* Newlines before open and after
-        * close...
-	*/
-
-	if (where == MXML_WS_BEFORE_OPEN ||
-            where == MXML_WS_AFTER_CLOSE)
-	  return ("\n");
-      }
-      else if (!strcmp(name, "dl") ||
-               !strcmp(name, "ol") ||
-               !strcmp(name, "ul"))
-      {
-       /*
-	* Put a newline before and after list
-        * elements...
-	*/
-
-	return ("\n");
-      }
-      else if (!strcmp(name, "dd") ||
-               !strcmp(name, "dt") ||
-               !strcmp(name, "li"))
-      {
-       /*
-	* Put a tab before <li>'s, * <dd>'s,
-        * and <dt>'s, and a newline after them...
-	*/
-
-	if (where == MXML_WS_BEFORE_OPEN)
-	  return ("\t");
-	else if (where == MXML_WS_AFTER_CLOSE)
-	  return ("\n");
-      }
-
-     /*
-      * Return NULL for no added whitespace...
-      */
-
-      return (NULL);
-    }
-
-

To use this callback function, simply use the name when you call any - of the save functions:

-
-    FILE *fp;
-    mxml_node_t *tree;
-
-    fp = fopen("filename.xml", "w");
-    mxmlSaveFile(tree, fp, whitespace_cb);
-    fclose(fp);
-
- - -

Custom Data Types

-

Mini-XML supports custom data types via global load and save - callbacks. Only a single set of callbacks can be active at any time, - however your callbacks can store additional information in order to - support multiple custom data types as needed. The MXML_CUSTOM - node type identifies custom data nodes.

-

The load callback receives a pointer to the current data node and a - string of opaque character data from the XML source with character - entities converted to the corresponding UTF-8 characters. For example, - if we wanted to support a custom date/time type whose value is encoded - as "yyyy-mm-ddThh:mm:ssZ" (ISO format), the load callback would look - like the following:

-
-    typedef struct
-    {
-      unsigned      year,    /* Year */
-                    month,   /* Month */
-                    day,     /* Day */
-                    hour,    /* Hour */
-                    minute,  /* Minute */
-                    second;  /* Second */
-      time_t        unix;    /* UNIX time */
-    } iso_date_time_t;
-
-    int
-    load_custom(mxml_node_t *node,
-                const char *data)
-    {
-      iso_date_time_t *dt;
-      struct tm tmdata;
-
-     /*
-      * Allocate data structure...
-      */
-
-      dt = calloc(1, sizeof(iso_date_time_t));
-
-     /*
-      * Try reading 6 unsigned integers from the
-      * data string...
-      */
-
-      if (sscanf(data, "%u-%u-%uT%u:%u:%uZ",
-                 &(dt->year), &(dt->month),
-                 &(dt->day), &(dt->hour),
-                 &(dt->minute),
-                 &(dt->second)) != 6)
-      {
-       /*
-        * Unable to read numbers, free the data
-        * structure and return an error...
-        */
-
-        free(dt);
-
-        return (-1);
-      }
-
-     /*
-      * Range check values...
-      */
-
-      if (dt->month <1 || dt->month > 12 ||
-          dt->day  <1 || dt->day > 31 ||
-          dt->hour  <0 || dt->hour > 23 ||
-          dt->minute  <0 || dt->minute > 59 ||
-          dt->second  <0 || dt->second > 59)
-      {
-       /*
-        * Date information is out of range...
-        */
-
-        free(dt);
-
-        return (-1);
-      }
-
-     /*
-      * Convert ISO time to UNIX time in
-      * seconds...
-      */
-
-      tmdata.tm_year = dt->year - 1900;
-      tmdata.tm_mon  = dt->month - 1;
-      tmdata.tm_day  = dt->day;
-      tmdata.tm_hour = dt->hour;
-      tmdata.tm_min  = dt->minute;
-      tmdata.tm_sec  = dt->second;
-
-      dt->unix = gmtime(&tmdata);
-
-     /*
-      * Assign custom node data and destroy
-      * function pointers...
-      */
-
-      mxmlSetCustom(node, data, destroy);
-
-     /*
-      * Return with no errors...
-      */
-
-      return (0);
-    }
-
-

The function itself can return 0 on success or -1 if it is unable to - decode the custom data or the data contains an error. Custom data nodes - contain a void pointer to the allocated custom data for the - node and a pointer to a destructor function which will free the custom - data when the node is deleted.

- - -

The save callback receives the node pointer and returns an allocated - string containing the custom data value. The following save callback - could be used for our ISO date/time type:

-
-    char *
-    save_custom(mxml_node_t *node)
-    {
-      char data[255];
-      iso_date_time_t *dt;
-
-
-      dt = (iso_date_time_t *)mxmlGetCustom(node);
-
-      snprintf(data, sizeof(data),
-               "%04u-%02u-%02uT%02u:%02u:%02uZ",
-               dt->year, dt->month, dt->day,
-               dt->hour, dt->minute, dt->second);
-
-      return (strdup(data));
-    }
-
-

You register the callback functions using the -mxmlSetCustomHandlers() function:

-
-    mxmlSetCustomHandlers(load_custom,
-                          save_custom);
-
- - -

Changing Node Values

-

All of the examples so far have concentrated on creating and loading - new XML data nodes. Many applications, however, need to manipulate or - change the nodes during their operation, so Mini-XML provides functions - to change node values safely and without leaking memory.

-

Existing nodes can be changed using the -mxmlSetElement(), -mxmlSetInteger(), -mxmlSetOpaque(), -mxmlSetReal(), -mxmlSetText(), and -mxmlSetTextf() functions. For example, use the following - function call to change a text node to contain the text "new" with - leading whitespace:

-
-    mxml_node_t *node;
-
-    mxmlSetText(node, 1, "new");
-
-

Formatted Text

-

The mxmlNewTextf() - and mxmlSetTextf() - functions create and change text nodes, respectively, using printf --style format strings and arguments. For example, use the following - function call to create a new text node containing a constructed - filename:

-
-    mxml_node_t *node;
-
-    node = mxmlNewTextf(node, 1, "%s/%s",
-                        path, filename);
-
-

Indexing

-

Mini-XML provides functions for managing indices of nodes. The - current implementation provides the same functionality as -mxmlFindElement(). The advantage of using an index is that - searching and enumeration of elements is significantly faster. The only - disadvantage is that each index is a static snapshot of the XML - document, so indices are not well suited to XML data that is updated - more often than it is searched. The overhead of creating an index is - approximately equal to walking the XML document tree. Nodes in the - index are sorted by element name and attribute value.

-

Indices are stored in -mxml_index_t structures. The -mxmlIndexNew() function creates a new index:

-
-    mxml_node_t *tree;
-    mxml_index_t *ind;
-
-    ind = mxmlIndexNew(tree, "element",
-                       "attribute");
-
-

The first argument is the XML node tree to index. Normally this will - be a pointer to the ?xml element.

-

The second argument contains the element to index; passing NULL - indexes all element nodes alphabetically.

-

The third argument contains the attribute to index; passing NULL - causes only the element name to be indexed.

-

Once the index is created, the -mxmlIndexEnum(), -mxmlIndexFind(), and -mxmlIndexReset() functions are used to access the nodes in the - index. The mxmlIndexReset() - function resets the "current" node pointer in the index, allowing - you to do new searches and enumerations on the same index. Typically - you will call this function prior to your calls to -mxmlIndexEnum() and -mxmlIndexFind().

-

The mxmlIndexEnum() - function enumerates each of the nodes in the index and can be used in a - loop as follows:

-
-    mxml_node_t *node;
-
-    mxmlIndexReset(ind);
-
-    while ((node = mxmlIndexEnum(ind)) != NULL)
-    {
-      // do something with node
-    }
-
-

The mxmlIndexFind() - function locates the next occurrence of the named element and attribute - value in the index. It can be used to find all matching elements in an - index, as follows:

-
-    mxml_node_t *node;
-
-    mxmlIndexReset(ind);
-
-    while ((node = mxmlIndexFind(ind, "element",
-                                 "attr-value"))
-                != NULL)
-    {
-      // do something with node
-    }
-
-

The second and third arguments represent the element name and - attribute value, respectively. A NULL pointer is used to - return all elements or attributes in the index. Passing NULL - for both the element name and attribute value is equivalent to calling -mxmlIndexEnum.

-

When you are done using the index, delete it using the -mxmlIndexDelete() function:

-
-    mxmlIndexDelete(ind);
-
-

SAX (Stream) Loading of Documents

-

Mini-XML supports an implementation of the Simple API for XML (SAX) - which allows you to load and process an XML document as a stream of - nodes. Aside from allowing you to process XML documents of any size, - the Mini-XML implementation also allows you to retain portions of the - document in memory for later processing.

-

The mxmlSAXLoadFd, -mxmlSAXLoadFile, and -mxmlSAXLoadString functions provide the SAX loading APIs. - 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
-    sax_cb(mxml_node_t *node,
-           mxml_sax_event_t event,
-           void *data)
-    {
-      ... do something ...
-    }
-
-

The event will be one of the following:

-
    -
  • MXML_SAX_CDATA - CDATA was just read
  • -
  • MXML_SAX_COMMENT - A comment was just read
  • -
  • MXML_SAX_DATA - Data (custom, integer, opaque, real, or - text) was just read
  • -
  • MXML_SAX_DIRECTIVE - A processing directive was just read
  • -
  • MXML_SAX_ELEMENT_CLOSE - A close element was just read ( -</element>)
  • -
  • MXML_SAX_ELEMENT_OPEN - An open element was just read ( -<element>)
  • -
-

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
-    sax_cb(mxml_node_t *node,
-           mxml_sax_event_t event,
-           void *data)
-    {
-      if (event != MXML_SAX_ELEMENT_CLOSE)
-        mxmlRetain(node);
-    }
-
-

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 <!DOCTYPE ... >:

- - -
-    void
-    sax_cb(mxml_node_t *node,
-           mxml_sax_event_t event,
-           void *data)
-    {
-      if (event == MXML_SAX_ELEMENT_OPEN)
-      {
-       /*
-        * Retain headings and titles...
-        */
-
-        char *name = mxmlGetElement(node);
-
-        if (!strcmp(name, "html") ||
-            !strcmp(name, "head") ||
-            !strcmp(name, "title") ||
-            !strcmp(name, "body") ||
-            !strcmp(name, "h1") ||
-            !strcmp(name, "h2") ||
-            !strcmp(name, "h3") ||
-            !strcmp(name, "h4") ||
-            !strcmp(name, "h5") ||
-            !strcmp(name, "h6"))
-          mxmlRetain(node);
-      }
-      else if (event == MXML_SAX_DIRECTIVE)
-        mxmlRetain(node);
-      else if (event == MXML_SAX_DATA)
-      {
-        if (mxmlGetRefCount(mxmlGetParent(node)) > 1)
-        {
-         /*
-          * If the parent was retained, then retain
-          * this data node as well.
-          */
-
-          mxmlRetain(node);
-        }
-      }
-    }
-
-

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:

-
-    mxml_node_t *doc, *title, *body, *heading;
-
-    doc = mxmlSAXLoadFd(NULL, 0,
-                        MXML_TEXT_CALLBACK,
-                        sax_cb, NULL);
-
-    title = mxmlFindElement(doc, doc, "title",
-                            NULL, NULL,
-                            MXML_DESCEND);
-
-    if (title)
-      print_children(title);
-
-    body = mxmlFindElement(doc, doc, "body",
-                           NULL, NULL,
-                           MXML_DESCEND);
-
-    if (body)
-    {
-      for (heading = mxmlGetFirstChild(body);
-           heading;
-           heading = mxmlGetNextSibling(heading))
-        print_children(heading);
-    }
-
-
-Contents -Previous -Next - - diff --git a/www/docfiles/basics.html b/www/docfiles/basics.html deleted file mode 100644 index c3e3521..0000000 --- a/www/docfiles/basics.html +++ /dev/null @@ -1,520 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
-

2Getting Started with Mini-XML

-

This chapter describes how to write programs that use Mini-XML to - access data in an XML file. Mini-XML provides the following - functionality:

-
    -
  • Functions for creating and managing XML documents in memory.
  • -
  • Reading of UTF-8 and UTF-16 encoded XML files and strings.
  • -
  • Writing of UTF-8 encoded XML files and strings.
  • -
  • Support for arbitrary element names, attributes, and attribute - values with no preset limits, just available memory.
  • -
  • Support for integer, real, opaque ("CDATA"), and text data types in - "leaf" nodes.
  • -
  • "Find", "index", and "walk" functions for easily accessing data in - an XML document.
  • -
-

Mini-XML doesn't do validation or other types of processing on the - data based upon schema files or other sources of definition - information, nor does it support character entities other than those - required by the XML specification.

-

The Basics

-

Mini-XML provides a single header file which you include:

-
-    #include <mxml.h>
-
-

The Mini-XML library is included with your program using the --lmxml option:

-
-    gcc -o myprogram myprogram.c -lmxml ENTER
-
-

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

-
-    pkg-config --cflags mxml ENTER
-    pkg-config --libs mxml ENTER
-
-

Nodes

-

Every piece of information in an XML file is stored in memory in - "nodes". Nodes are defined by the -mxml_node_t structure. Each node has a typed value, optional - user data, a parent node, sibling nodes (previous and next), and - potentially child nodes.

-

For example, if you have an XML file like the following:

-
-    <?xml version="1.0" encoding="utf-8"?>
-    <data>
-        <node>val1</node>
-        <node>val2</node>
-        <node>val3</node>
-        <group>
-            <node>val4</node>
-            <node>val5</node>
-            <node>val6</node>
-        </group>
-        <node>val7</node>
-        <node>val8</node>
-    </data>
-
-

the node tree for the file would look like the following in memory:

-
-    ?xml version="1.0" encoding="utf-8"?
-      |
-    data
-      |
-    node - node - node - group - node - node
-      |      |      |      |       |      |
-    val1   val2   val3     |     val7   val8
-                           |
-                         node - node - node
-                           |      |      |
-                         val4   val5   val6
-
-

where "-" is a pointer to the sibling node and "|" is a pointer to - the first child or parent node.

-

The mxmlGetType - function gets the type of a node, one of MXML_CUSTOM, -MXML_ELEMENT, MXML_INTEGER, MXML_OPAQUE, -MXML_REAL, or MXML_TEXT. The parent and sibling nodes are - accessed using the -mxmlGetParent, mxmlGetNext, - and mxmlGetPrevious functions. - The mxmlGetUserData - function gets any user data associated with the node.

-

CDATA Nodes

-

CDATA (MXML_ELEMENT) nodes are created using the -mxmlNewCDATA function. The -mxmlGetCDATA function retrieves the CDATA string pointer - for a node.

-
Note: -

CDATA nodes are currently stored in memory as special elements. This - will be changed in a future major release of Mini-XML.

-
-

Custom Nodes

-

Custom (MXML_CUSTOM) nodes are created using the -mxmlNewCustom function or using a custom load callback - specified using the -mxmlSetCustomHandlers function. The -mxmlGetCustom function retrieves the custom value pointer - for a node.

-

Comment Nodes

-

Comment (MXML_ELEMENT) nodes are created using the -mxmlNewElement function. The -mxmlGetElement function retrieves the comment string - pointer for a node, including the surrounding "!--" and "--" - characters.

-
Note: -

Comment nodes are currently stored in memory as special elements. - This will be changed in a future major release of Mini-XML.

-
-

Element Nodes

-

Element (MXML_ELEMENT) nodes are created using the -mxmlNewElement function. The -mxmlGetElement function retrieves the element name, the -mxmlElementGetAttr function retrieves the value string for - a named attribute associated with the element, and the -mxmlGetFirstChild and -mxmlGetLastChild functions retrieve the first and last - child nodes for the element, respectively.

-

Integer Nodes

-

Integer (MXML_INTEGER) nodes are created using the -mxmlNewInteger function. The -mxmlGetInteger function retrieves the integer value for a - node.

-

Opaque Nodes

-

Opaque (MXML_OPAQUE) nodes are created using the -mxmlNewOpaque function. The -mxmlGetOpaque function retrieves the opaque string pointer - for a node. Opaque nodes are like string nodes but preserve all - whitespace between nodes.

-

Text Nodes

-

Text (MXML_TEXT) nodes are created using the -mxmlNewText and -mxmlNewTextf functions. Each text node consists of a text - string and (leading) whitespace value - the -mxmlGetText function retrieves the text string pointer and - whitespace value for a node.

- - -

Processing Instruction Nodes

-

Processing instruction (MXML_ELEMENT) nodes are created - using the mxmlNewElement - function. The -mxmlGetElement function retrieves the processing instruction - string for a node, including the surrounding "?" characters.

-
Note: -

Processing instruction nodes are currently stored in memory as - special elements. This will be changed in a future major release of - Mini-XML.

-
-

Real Number Nodes

-

Real number (MXML_REAL) nodes are created using the -mxmlNewReal function. The -mxmlGetReal function retrieves the CDATA string pointer for - a node.

- - -

XML Declaration Nodes

-

XML declaration (MXML_ELEMENT) nodes are created using the mxmlNewXML function. The mxmlGetElement - function retrieves the XML declaration string for a node, including the - surrounding "?" characters.

-
Note: -

XML declaration nodes are currently stored in memory as special - elements. This will be changed in a future major release of Mini-XML.

-
- -

Creating XML Documents

-

You can create and update XML documents in memory using the various -mxmlNew functions. The following code will create the XML document - described in the previous section:

-
-    mxml_node_t *xml;    /* <?xml ... ?> */
-    mxml_node_t *data;   /* <data> */
-    mxml_node_t *node;   /* <node> */
-    mxml_node_t *group;  /* <group> */
-
-    xml = mxmlNewXML("1.0");
-
-    data = mxmlNewElement(xml, "data");
-
-        node = mxmlNewElement(data, "node");
-        mxmlNewText(node, 0, "val1");
-        node = mxmlNewElement(data, "node");
-        mxmlNewText(node, 0, "val2");
-        node = mxmlNewElement(data, "node");
-        mxmlNewText(node, 0, "val3");
-
-        group = mxmlNewElement(data, "group");
-
-            node = mxmlNewElement(group, "node");
-            mxmlNewText(node, 0, "val4");
-            node = mxmlNewElement(group, "node");
-            mxmlNewText(node, 0, "val5");
-            node = mxmlNewElement(group, "node");
-            mxmlNewText(node, 0, "val6");
-
-        node = mxmlNewElement(data, "node");
-        mxmlNewText(node, 0, "val7");
-        node = mxmlNewElement(data, "node");
-        mxmlNewText(node, 0, "val8");
-
- - -

We start by creating the declaration node common to all XML files - using the mxmlNewXML - function:

-
-    xml = mxmlNewXML("1.0");
-
-

We then create the <data> node used for this document using - the mxmlNewElement - function. The first argument specifies the parent node (xml) - while the second specifies the element name (data):

-
-    data = mxmlNewElement(xml, "data");
-
-

Each <node>...</node> in the file is created using the -mxmlNewElement and -mxmlNewText functions. The first argument of mxmlNewText - specifies the parent node (node). The second argument - specifies whether whitespace appears before the text - 0 or false in - this case. The last argument specifies the actual text to add:

-
-    node = mxmlNewElement(data, "node");
-    mxmlNewText(node, 0, "val1");
-
-

The resulting in-memory XML document can then be saved or processed - just like one loaded from disk or a string.

- - -

Loading XML

-

You load an XML file using the -mxmlLoadFile function:

-
-    FILE *fp;
-    mxml_node_t *tree;
-
-    fp = fopen("filename.xml", "r");
-    tree = mxmlLoadFile(NULL, fp,
-                        MXML_TEXT_CALLBACK);
-    fclose(fp);
-
-

The first argument specifies an existing XML parent node, if any. - Normally you will pass NULL for this argument unless you are - combining multiple XML sources. The XML file must contain a complete - XML document including the ?xml element if the parent node is -NULL.

-

The second argument specifies the stdio file to read from, as opened - by fopen() or popen(). You can also use stdin - if you are implementing an XML filter program.

-

The third argument specifies a callback function which returns the - value type of the immediate children for a new element node: -MXML_CUSTOM, MXML_IGNORE, MXML_INTEGER, -MXML_OPAQUE, MXML_REAL, or MXML_TEXT. Load - callbacks are described in detail in -Chapter 3. The example code uses the MXML_TEXT_CALLBACK - constant which specifies that all data nodes in the document contain - whitespace-separated text values. Other standard callbacks include -MXML_IGNORE_CALLBACK, MXML_INTEGER_CALLBACK, -MXML_OPAQUE_CALLBACK, and MXML_REAL_CALLBACK.

-

The mxmlLoadString - function loads XML node trees from a string:

- - -
-    char buffer[8192];
-    mxml_node_t *tree;
-
-    ...
-    tree = mxmlLoadString(NULL, buffer,
-                          MXML_TEXT_CALLBACK);
-
-

The first and third arguments are the same as used for -mxmlLoadFile(). The second argument specifies the string or - character buffer to load and must be a complete XML document including - the ?xml element if the parent node is NULL.

- - -

Saving XML

-

You save an XML file using the -mxmlSaveFile function:

-
-    FILE *fp;
-    mxml_node_t *tree;
-
-    fp = fopen("filename.xml", "w");
-    mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
-    fclose(fp);
-
-

The first argument is the XML node tree to save. It should normally - be a pointer to the top-level ?xml node in your XML document.

-

The second argument is the stdio file to write to, as opened by -fopen() or popen(). You can also use stdout if - you are implementing an XML filter program.

-

The third argument is the whitespace callback to use when saving the - file. Whitespace callbacks are covered in detail in -Chapter 3. The previous example code uses the MXML_NO_CALLBACK - constant to specify that no special whitespace handling is required.

-

The -mxmlSaveAllocString, and -mxmlSaveString functions save XML node trees to strings:

-
-    char buffer[8192];
-    char *ptr;
-    mxml_node_t *tree;
-
-    ...
-    mxmlSaveString(tree, buffer, sizeof(buffer),
-                   MXML_NO_CALLBACK);
-
-    ...
-    ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
-
-

The first and last arguments are the same as used for -mxmlSaveFile(). The mxmlSaveString function takes pointer - and size arguments for saving the XML document to a fixed-size buffer, - while mxmlSaveAllocString() returns a string buffer that was - allocated using malloc().

- - -

Controlling Line Wrapping

-

When saving XML documents, Mini-XML normally wraps output lines at - column 75 so that the text is readable in terminal windows. The -mxmlSetWrapMargin function overrides the default wrap - margin:

-
-    /* Set the margin to 132 columns */
-    mxmlSetWrapMargin(132);
-
-    /* Disable wrapping */
-    mxmlSetWrapMargin(0);
-
-

Memory Management

-

Once you are done with the XML data, use the -mxmlDelete function to recursively free the memory that is - used for a particular node or the entire tree:

-
-    mxmlDelete(tree);
-
-

You can also use reference counting to manage memory usage. The -mxmlRetain and -mxmlRelease functions increment and decrement a node's use - count, respectively. When the use count goes to 0, mxmlRelease - will automatically call mxmlDelete to actually free the memory - used by the node tree. New nodes automatically start with a use count - of 1.

- - -

Finding and Iterating Nodes

-

The mxmlWalkPrev - and mxmlWalkNext -functions can be used to iterate through the XML node tree:

-
-    mxml_node_t *node;
-    
-    node = mxmlWalkPrev(current, tree,
-                        MXML_DESCEND);
-
-    node = mxmlWalkNext(current, tree,
-                        MXML_DESCEND);
-
-

In addition, you can find a named element/node using the -mxmlFindElement function:

-
-    mxml_node_t *node;
-    
-    node = mxmlFindElement(tree, tree, "name",
-                           "attr", "value",
-                           MXML_DESCEND);
-
-

The name, attr, and value arguments can be - passed as NULL to act as wildcards, e.g.:

- - -
-    /* Find the first "a" element */
-    node = mxmlFindElement(tree, tree, "a",
-                           NULL, NULL,
-                           MXML_DESCEND);
-
- - -
-    /* Find the first "a" element with "href"
-       attribute */
-    node = mxmlFindElement(tree, tree, "a",
-                           "href", NULL,
-                           MXML_DESCEND);
-
- - -
-    /* Find the first "a" element with "href"
-       to a URL */
-    node = mxmlFindElement(tree, tree, "a",
-                           "href",
-                           "http://www.easysw.com/",
-                           MXML_DESCEND);
-
- - -
-    /* Find the first element with a "src"
-       attribute */
-    node = mxmlFindElement(tree, tree, NULL,
-                           "src", NULL,
-                           MXML_DESCEND);
-
- - -
-    /* Find the first element with a "src"
-       = "foo.jpg" */
-    node = mxmlFindElement(tree, tree, NULL,
-                           "src", "foo.jpg",
-                           MXML_DESCEND);
-
-

You can also iterate with the same function:

-
-    mxml_node_t *node;
-
-    for (node = mxmlFindElement(tree, tree,
-                                "name",
-                                NULL, NULL,
-                                MXML_DESCEND);
-         node != NULL;
-         node = mxmlFindElement(node, tree,
-                                "name",
-                                NULL, NULL,
-                                MXML_DESCEND))
-    {
-      ... do something ...
-    }
-
- - -

The MXML_DESCEND argument can actually be one of three - constants:

-
    -
  • MXML_NO_DESCEND means to not to look at any child nodes in - the element hierarchy, just look at siblings at the same level or - parent nodes until the top node or top-of-tree is reached. -

    The previous node from "group" would be the "node" element to the - left, while the next node from "group" would be the "node" element to - the right. -
    -

    -
  • -
  • MXML_DESCEND_FIRST means that it is OK to descend to the - first child of a node, but not to descend further when searching. - You'll normally use this when iterating through direct children of a - parent node, e.g. all of the "node" and "group" elements under the - "?xml" parent node in the example above. -

    This mode is only applicable to the search function; the walk - functions treat this as MXML_DESCEND since every call is a - first time. -
    -

    -
  • -
  • MXML_DESCEND means to keep descending until you hit the - bottom of the tree. The previous node from "group" would be the "val3" - node and the next node would be the first node element under "group". -

    If you were to walk from the root node "?xml" to the end of the tree - with mxmlWalkNext(), the order would be:

    -

    ?xml data node val1 node val2 node val3 group node val4 node val5 - node val6 node val7 node val8

    -

    If you started at "val8" and walked using mxmlWalkPrev(), - the order would be reversed, ending at "?xml".

    -
  • -
-

Finding Specific Nodes

-

You can find specific nodes in the tree using the -mxmlFindPath, for example:

-
-    mxml_node_t *value;
-
-    value = mxmlFindPath(tree, "path/to/*/foo/bar");
-
-

The second argument is a "path" to the parent node. Each component of - the path is separated by a slash (/) and represents a named element in - the document tree or a wildcard (*) path representing 0 or more - intervening nodes.

-
-Contents -Previous -Next - - diff --git a/www/docfiles/index.html b/www/docfiles/index.html deleted file mode 100644 index 357fb88..0000000 --- a/www/docfiles/index.html +++ /dev/null @@ -1,210 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - -

Table of Contents

-
-
Introduction - -Building, Installing, and Packaging - Mini-XML - -Getting Started with Mini-XML - -More Mini-XML Programming Techniques - - -Using the mxmldoc Utility - -Mini-XML License -
-
Release Notes -
    -Library Reference - -XML Schema -
      - - diff --git a/www/docfiles/install.html b/www/docfiles/install.html deleted file mode 100644 index 25e07a3..0000000 --- a/www/docfiles/install.html +++ /dev/null @@ -1,115 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
      -

      1Building, Installing, and - Packaging Mini-XML

      -

      This chapter describes how to build, install, and package Mini-XML on - your system from the source archive. You will need an ANSI/ISO-C - compatible compiler to build Mini-XML - GCC works, as do most vendors' - C compilers. If you are building Mini-XML on Windows, we recommend - using the Visual C++ environment with the supplied solution file. For - other operating systems, you'll need a POSIX-compatible shell and -make program in addition to the C compiler.

      -

      Compiling Mini-XML

      -

      Mini-XML comes with both an autoconf-based configure script and a - Visual C++ solution that can be used to compile the library and - associated tools.

      -

      Compiling with Visual C++

      -

      Open the mxml.sln solution in the vcnet folder. - Choose the desired build configuration, "Debug" (the default) or - "Release", and then choose Build Solution from the - Build menu.

      -

      Compiling with Command-Line Tools

      -

      Type the following command to configure the Mini-XML source code for - your system:

      -
      -    ./configure ENTER
      -
      -

      The default install prefix is /usr/local, which can be - overridden using the --prefix option:

      -
      -    ./configure --prefix=/foo ENTER
      -
      -

      Other configure options can be found using the --help - option:

      -
      -    ./configure --help ENTER
      -
      -

      Once you have configured the software, use the make(1) - program to do the build and run the test program to verify that things - are working, as follows:

      -
      -    make ENTER
      -
      -

      Installing Mini-XML

      -

      If you are using Visual C++, copy the mxml.lib and and - mxml.h files to the Visual C++ lib and include - directories, respectively.

      -

      Otherwise, use the make command with the install - target to install Mini-XML in the configured directories:

      -
      -    make install ENTER
      -
      -

      Creating Mini-XML Packages

      -

      Mini-XML includes two files that can be used to create binary - packages. The first file is mxml.spec which is used by the -rpmbuild(8) software to create Red Hat Package Manager ("RPM") - packages which are commonly used on Linux. Since rpmbuild - wants to compile the software on its own, you can provide it with the - Mini-XML tar file to build the package:

      -
      -    rpmbuild -ta mxml-version.tar.gz ENTER
      -
      -

      The second file is mxml.list which is used by the -epm(1) program to create software packages in a variety of formats. - The epm program is available from the following URL:

      -
      -    http://www.epmhome.org/
      -
      -

      Use the make command with the epm target to - create portable and native packages for your system:

      -
      -    make epm ENTER
      -
      -

      The packages are stored in a subdirectory named dist for - your convenience. The portable packages utilize scripts and tar files - to install the software on the target system. After extracting the - package archive, use the mxml.install script to install the - software.

      -

      The native packages will be in the local OS's native format: RPM for - Red Hat Linux, DPKG for Debian Linux, PKG for Solaris, and so forth. - Use the corresponding commands to install the native packages.

      -
      -Contents -Previous -Next - - diff --git a/www/docfiles/intro.html b/www/docfiles/intro.html deleted file mode 100644 index 865c6b8..0000000 --- a/www/docfiles/intro.html +++ /dev/null @@ -1,175 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - -Contents -Next -
      -

      0Introduction

      -

      This programmers manual describes Mini-XML version 2.7, a small XML - parsing library that you can use to read and write XML data files in - your C and C++ applications.

      -

      Mini-XML was initially developed for the -Gutenprint project to replace the rather large and unwieldy -libxml2 library with something substantially smaller and - easier-to-use. It all began one morning in June of 2003 when Robert - posted the following sentence to the developer's list:

      -
      It's bad enough that we require libxml2, but rolling our - own XML parser is a bit more than we can handle.
      -

      I then replied with:

      -
      Given the limited scope of what you use in XML, it - should be trivial to code a mini-XML API in a few hundred lines of - code.
      -

      I took my own challenge and coded furiously for two days to produced - the initial public release of Mini-XML, total lines of code: 696. - Robert promptly integrated Mini-XML into Gutenprint and removed - libxml2.

      -

      Thanks to lots of feedback and support from various developers, - Mini-XML has evolved since then to provide a more complete XML - implementation and now stands at a whopping 3,965 lines of code, - compared to 103,893 lines of code for libxml2 version 2.6.9.

      -

      Aside from Gutenprint, Mini-XML is used for the following - projects/software applications:

      - -

      Please email me (mxml @ easysw . com) if you would like your project - added or removed from this list, or if you have any comments/quotes you - would like me to publish about your experiences with Mini-XML.

      - - -

      Organization of This Document

      -

      This manual is organized into the following chapters and appendices:

      - - - -

      Notation Conventions

      -

      Various font and syntax conventions are used in this guide. Examples - and their meanings and uses are explained below:

      -
      -
      mxmldoc -
      mxmldoc(1)
      -
      The names of commands; the first mention of a command or function in - a chapter is followed by a manual page section number. -
      -
      -
      /var -
      /etc/hosts
      -
      File and directory names. -
      -
      -
      Request ID is Printer-123
      -
      Screen output. -
      -
      -
      lp -d printer filename ENTER
      -
      Literal user input; special keys like ENTER are in ALL - CAPS. -
      -
      -
      12.3
      -
      Numbers in the text are written using the period (.) to indicate the - decimal point. -
      -
      -
      - - -

      Abbreviations

      -

      The following abbreviations are used throughout this manual:

      -
      -
      Gb
      -
      Gigabytes, or 1073741824 bytes -
      -
      -
      kb
      -
      Kilobytes, or 1024 bytes -
      -
      -
      Mb
      -
      Megabytes, or 1048576 bytes -
      -
      -
      UTF-8, UTF-16
      -
      Unicode Transformation Format, 8-bit or 16-bit -
      -
      -
      W3C
      -
      World Wide Web Consortium -
      -
      -
      XML
      -
      Extensible Markup Language -
      -
      -
      - - -

      Other References

      -
      -
      The Unicode Standard, Version 4.0, Addison-Wesley, ISBN - 0-321-18578-1
      -
      The definition of the Unicode character set which is used for XML. -
      -
      -
      Extensible - Markup Language (XML) 1.0 (Third Edition)
      -
      The XML specification from the World Wide Web Consortium (W3C) -
      -
      -
      - - -

      Legal Stuff

      -

      The Mini-XML library is copyright 2003-2011 by Michael Sweet. License - terms are described in Appendix A - - Mini-XML License.

      -
      -Contents -Next - - diff --git a/www/docfiles/license.html b/www/docfiles/license.html deleted file mode 100644 index 7d526fd..0000000 --- a/www/docfiles/license.html +++ /dev/null @@ -1,467 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
      -

      AMini-XML License

      -

      The Mini-XML library and included programs are provided under the - terms of the GNU Library General Public License version 2 (LGPL2) with - the following exceptions:

      -

      1. Static linking of applications to the Mini-XML library does - not constitute a derivative work and does not require the author to - provide source code for the application, use the shared Mini-XML - libraries, or link their applications against a user-supplied version - of Mini-XML.

      -

      If you link the application to a modified version of Mini-XML, - then the changes to Mini-XML must be provided under the terms of the - LGPL2 in sections 1, 2, and 4.

      -

      2. You do not have to provide a copy of the Mini-XML license - with programs that are linked to the Mini-XML library, nor do you have - to identify the Mini-XML license in your program or documentation as - required by section 6 of the LGPL2.

      -

       

      -

      GNU LIBRARY GENERAL PUBLIC LICENSE

      -

      Version 2, June 1991 -
      Copyright (C) 1991 Free Software Foundation, Inc. -
      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA -
      Everyone is permitted to copy and distribute verbatim copies of - this license document, but changing it is not allowed. -
      [This is the first released version of the library GPL. It is - numbered 2 because it goes with version 2 of the ordinary GPL.]

      -

      Preamble

      -

      The licenses for most software are designed to take away your freedom - to share and change it. By contrast, the GNU General Public Licenses - are intended to guarantee your freedom to share and change free - software--to make sure the software is free for all its users.

      -

      This license, the Library General Public License, applies to some - specially designated Free Software Foundation software, and to any - other libraries whose authors decide to use it. You can use it for your - libraries, too.

      -

      When we speak of free software, we are referring to freedom, not - price. Our General Public Licenses are designed to make sure that you - have the freedom to distribute copies of free software (and charge for - this service if you wish), that you receive source code or can get it - if you want it, that you can change the software or use pieces of it in - new free programs; and that you know you can do these things.

      -

      To protect your rights, we need to make restrictions that forbid - anyone to deny you these rights or to ask you to surrender the rights. - These restrictions translate to certain responsibilities for you if you - distribute copies of the library, or if you modify it.

      -

      For example, if you distribute copies of the library, whether gratis - or for a fee, you must give the recipients all the rights that we gave - you. You must make sure that they, too, receive or can get the source - code. If you link a program with the library, you must provide complete - object files to the recipients so that they can relink them with the - library, after making changes to the library and recompiling it. And - you must show them these terms so they know their rights.

      -

      Our method of protecting your rights has two steps: (1) copyright the - library, and (2) offer you this license which gives you legal - permission to copy, distribute and/or modify the library.

      -

      Also, for each distributor's protection, we want to make certain that - everyone understands that there is no warranty for this free library. - If the library is modified by someone else and passed on, we want its - recipients to know that what they have is not the original version, so - that any problems introduced by others will not reflect on the original - authors' reputations.

      -

      Finally, any free program is threatened constantly by software - patents. We wish to avoid the danger that companies distributing free - software will individually obtain patent licenses, thus in effect - transforming the program into proprietary software. To prevent this, we - have made it clear that any patent must be licensed for everyone's free - use or not licensed at all.

      -

      Most GNU software, including some libraries, is covered by the - ordinary GNU General Public License, which was designed for utility - programs. This license, the GNU Library General Public License, applies - to certain designated libraries. This license is quite different from - the ordinary one; be sure to read it in full, and don't assume that - anything in it is the same as in the ordinary license.

      -

      The reason we have a separate public license for some libraries is - that they blur the distinction we usually make between modifying or - adding to a program and simply using it. Linking a program with a - library, without changing the library, is in some sense simply using - the library, and is analogous to running a utility program or - application program. However, in a textual and legal sense, the linked - executable is a combined work, a derivative of the original library, - and the ordinary General Public License treats it as such.

      -

      Because of this blurred distinction, using the ordinary General - Public License for libraries did not effectively promote software - sharing, because most developers did not use the libraries. We - concluded that weaker conditions might promote sharing better.

      -

      However, unrestricted linking of non-free programs would deprive the - users of those programs of all benefit from the free status of the - libraries themselves. This Library General Public License is intended - to permit developers of non-free programs to use free libraries, while - preserving your freedom as a user of such programs to change the free - libraries that are incorporated in them. (We have not seen how to - achieve this as regards changes in header files, but we have achieved - it as regards changes in the actual functions of the Library.) The hope - is that this will lead to faster development of free libraries.

      -

      The precise terms and conditions for copying, distribution and - modification follow. Pay close attention to the difference between a - "work based on the libary" and a "work that uses the library". The - former contains code derived from the library, while the latter only - works together with the library.

      -

      Note that it is possible for a library to be covered by the ordinary - General Public License rather than by this special one.

      -

      TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND - MODIFICATION

      -

      0. This License Agreement applies to any software - library which contains a notice placed by the copyright holder or other - authorized party saying it may be distributed under the terms of this - Library General Public License (also called "this License"). Each - licensee is addressed as "you".

      -

      A "library" means a collection of software functions and/or data - prepared so as to be conveniently linked with application programs - (which use some of those functions and data) to form executables.

      -

      The "Library", below, refers to any such software library or work - which has been distributed under these terms. A "work based on the - Library" means either the Library or any derivative work under - copyright law: that is to say, a work containing the Library or a - portion of it, either verbatim or with modifications and/or translated - straightforwardly into another language. (Hereinafter, translation is - included without limitation in the term "modification".)

      -

      "Source code" for a work means the preferred form of the work for - making modifications to it. For a library, complete source code means - all the source code for all modules it contains, plus any associated - interface definition files, plus the scripts used to control - compilation and installation of the library.

      -

      Activities other than copying, distribution and modification are not - covered by this License; they are outside its scope. The act of running - a program using the Library is not restricted, and output from such a - program is covered only if its contents constitute a work based on the - Library (independent of the use of the Library in a tool for writing - it). Whether that is true depends on what the Library does and what the - program that uses the Library does.

      -

      1. You may copy and distribute verbatim copies of - the Library's complete source code as you receive it, in any medium, - provided that you conspicuously and appropriately publish on each copy - an appropriate copyright notice and disclaimer of warranty; keep intact - all the notices that refer to this License and to the absence of any - warranty; and distribute a copy of this License along with the Library.

      -

      You may charge a fee for the physical act of transferring a copy, and - you may at your option offer warranty protection in exchange for a fee.

      -

      2. You may modify your copy or copies of the Library - or any portion of it, thus forming a work based on the Library, and - copy and distribute such modifications or work under the terms of - Section 1 above, provided that you also meet all of these conditions:

      -
        -

        a) The modified work must itself be a software - library.

        -

        b) You must cause the files modified to carry - prominent notices stating that you changed the files and the date of - any change.

        -

        c) You must cause the whole of the work to be - licensed at no charge to all third parties under the terms of this - License.

        -

        d) If a facility in the modified Library refers to a - function or a table of data to be supplied by an application program - that uses the facility, other than as an argument passed when the - facility is invoked, then you must make a good faith effort to ensure - that, in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of its - purpose remains meaningful.

        -

        (For example, a function in a library to compute square roots has a - purpose that is entirely well-defined independent of the application. - Therefore, Subsection 2d requires that any application-supplied - function or table used by this function must be optional: if the - application does not supply it, the square root function must still - compute square roots.)

        -
      -

      These requirements apply to the modified work as a whole. If - identifiable sections of that work are not derived from the Library, - and can be reasonably considered independent and separate works in - themselves, then this License, and its terms, do not apply to those - sections when you distribute them as separate works. But when you - distribute the same sections as part of a whole which is a work based - on the Library, the distribution of the whole must be on the terms of - this License, whose permissions for other licensees extend to the - entire whole, and thus to each and every part regardless of who wrote - it.

      -

      Thus, it is not the intent of this section to claim rights or contest - your rights to work written entirely by you; rather, the intent is to - exercise the right to control the distribution of derivative or - collective works based on the Library.

      -

      In addition, mere aggregation of another work not based on the - Library with the Library (or with a work based on the Library) on a - volume of a storage or distribution medium does not bring the other - work under the scope of this License.

      -

      3. You may opt to apply the terms of the ordinary - GNU General Public License instead of this License to a given copy of - the Library. To do this, you must alter all the notices that refer to - this License, so that they refer to the ordinary GNU General Public - License, version 2, instead of to this License. (If a newer version - than version 2 of the ordinary GNU General Public License has appeared, - then you can specify that version instead if you wish.) Do not make any - other change in these notices.

      -

      Once this change is made in a given copy, it is irreversible for that - copy, so the ordinary GNU General Public License applies to all - subsequent copies and derivative works made from that copy.

      -

      This option is useful when you wish to copy part of the code of the - Library into a program that is not a library.

      -

      4. You may copy and distribute the Library (or a - portion or derivative of it, under Section 2) in object code or - executable form under the terms of Sections 1 and 2 above provided that - you accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections 1 - and 2 above on a medium customarily used for software interchange.

      -

      If distribution of object code is made by offering access to copy - from a designated place, then offering equivalent access to copy the - source code from the same place satisfies the requirement to distribute - the source code, even though third parties are not compelled to copy - the source along with the object code.

      -

      5. A program that contains no derivative of any - portion of the Library, but is designed to work with the Library by - being compiled or linked with it, is called a "work that uses the - Library". Such a work, in isolation, is not a derivative work of the - Library, and therefore falls outside the scope of this License.

      -

      However, linking a "work that uses the Library" with the Library - creates an executable that is a derivative of the Library (because it - contains portions of the Library), rather than a "work that uses the - library". The executable is therefore covered by this License. Section - 6 states terms for distribution of such executables.

      -

      When a "work that uses the Library" uses material from a header file - that is part of the Library, the object code for the work may be a - derivative work of the Library even though the source code is not. - Whether this is true is especially significant if the work can be - linked without the Library, or if the work is itself a library. The - threshold for this to be true is not precisely defined by law.

      -

      If such an object file uses only numerical parameters, data structure - layouts and accessors, and small macros and small inline functions (ten - lines or less in length), then the use of the object file is - unrestricted, regardless of whether it is legally a derivative work. - (Executables containing this object code plus portions of the Library - will still fall under Section 6.)

      -

      Otherwise, if the work is a derivative of the Library, you may - distribute the object code for the work under the terms of Section 6. - Any executables containing that work also fall under Section 6, whether - or not they are linked directly with the Library itself.

      -

      6. As an exception to the Sections above, you may - also compile or link a "work that uses the Library" with the Library to - produce a work containing portions of the Library, and distribute that - work under terms of your choice, provided that the terms permit - modification of the work for the customer's own use and reverse - engineering for debugging such modifications.

      -

      You must give prominent notice with each copy of the work that the - Library is used in it and that the Library and its use are covered by - this License. You must supply a copy of this License. If the work - during execution displays copyright notices, you must include the - copyright notice for the Library among them, as well as a reference - directing the user to the copy of this License. Also, you must do one - of these things:

      -
        a) Accompany the work with the complete - corresponding machine-readable source code for the Library including - whatever changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked with - the Library, with the complete machine-readable "work that uses the - Library", as object code and/or source code, so that the user can - modify the Library and then relink to produce a modified executable - containing the modified Library. (It is understood that the user who - changes the contents of definitions files in the Library will not - necessarily be able to recompile the application to use the modified - definitions.) -

        b) Accompany the work with a written offer, valid - for at least three years, to give the same user the materials specified - in Subsection 6a, above, for a charge no more than the cost of - performing this distribution.

        -

        c) If distribution of the work is made by offering - access to copy from a designated place, offer equivalent access to copy - the above specified materials from the same place.

        -

        d) Verify that the user has already received a copy - of these materials or that you have already sent this user a copy.

        -
      -

      For an executable, the required form of the "work that uses the - Library" must include any data and utility programs needed for - reproducing the executable from it. However, as a special exception, - the source code distributed need not include anything that is normally - distributed (in either source or binary form) with the major components - (compiler, kernel, and so on) of the operating system on which the - executable runs, unless that component itself accompanies the - executable.

      -

      It may happen that this requirement contradicts the license - restrictions of other proprietary libraries that do not normally - accompany the operating system. Such a contradiction means you cannot - use both them and the Library together in an executable that you - distribute.

      -

      7. You may place library facilities that are a work - based on the Library side-by-side in a single library together with - other library facilities not covered by this License, and distribute - such a combined library, provided that the separate distribution of the - work based on the Library and of the other library facilities is - otherwise permitted, and provided that you do these two things:

      -
        a) Accompany the combined library with a copy of - the same work based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the Sections - above. -

        b) Give prominent notice with the combined library - of the fact that part of it is a work based on the Library, and - explaining where to find the accompanying uncombined form of the same - work.

        -
      -

      8. You may not copy, modify, sublicense, link with, - or distribute the Library except as expressly provided under this - License. Any attempt otherwise to copy, modify, sublicense, link with, - or distribute the Library is void, and will automatically terminate - your rights under this License. However, parties who have received - copies, or rights, from you under this License will not have their - licenses terminated so long as such parties remain in full compliance.

      -

      9. You are not required to accept this License, - since you have not signed it. However, nothing else grants you - permission to modify or distribute the Library or its derivative works. - These actions are prohibited by law if you do not accept this License. - Therefore, by modifying or distributing the Library (or any work based - on the Library), you indicate your acceptance of this License to do so, - and all its terms and conditions for copying, distributing or modifying - the Library or works based on it.

      -

      10. Each time you redistribute the Library (or any - work based on the Library), the recipient automatically receives a - license from the original licensor to copy, distribute, link with or - modify the Library subject to these terms and conditions. You may not - impose any further restrictions on the recipients' exercise of the - rights granted herein. You are not responsible for enforcing compliance - by third parties to this License.

      -

      11. If, as a consequence of a court judgment or - allegation of patent infringement or for any other reason (not limited - to patent issues), conditions are imposed on you (whether by court - order, agreement or otherwise) that contradict the conditions of this - License, they do not excuse you from the conditions of this License. If - you cannot distribute so as to satisfy simultaneously your obligations - under this License and any other pertinent obligations, then as a - consequence you may not distribute the Library at all. For example, if - a patent license would not permit royalty-free redistribution of the - Library by all those who receive copies directly or indirectly through - you, then the only way you could satisfy both it and this License would - be to refrain entirely from distribution of the Library.

      -

      If any portion of this section is held invalid or unenforceable under - any particular circumstance, the balance of the section is intended to - apply, and the section as a whole is intended to apply in other - circumstances.

      -

      It is not the purpose of this section to induce you to infringe any - patents or other property right claims or to contest validity of any - such claims; this section has the sole purpose of protecting the - integrity of the free software distribution system which is implemented - by public license practices. Many people have made generous - contributions to the wide range of software distributed through that - system in reliance on consistent application of that system; it is up - to the author/donor to decide if he or she is willing to distribute - software through any other system and a licensee cannot impose that - choice.

      -

      This section is intended to make thoroughly clear what is believed to - be a consequence of the rest of this License.

      -

      12. If the distribution and/or use of the Library is - restricted in certain countries either by patents or by copyrighted - interfaces, the original copyright holder who places the Library under - this License may add an explicit geographical distribution limitation - excluding those countries, so that distribution is permitted only in or - among countries not thus excluded. In such case, this License - incorporates the limitation as if written in the body of this License.

      -

      13. The Free Software Foundation may publish revised - and/or new versions of the Library General Public License from time to - time. Such new versions will be similar in spirit to the present - version, but may differ in detail to address new problems or concerns.

      -

      Each version is given a distinguishing version number. If the Library - specifies a version number of this License which applies to it and "any - later version", you have the option of following the terms and - conditions either of that version or of any later version published by - the Free Software Foundation. If the Library does not specify a license - version number, you may choose any version ever published by the Free - Software Foundation.

      -

      14. If you wish to incorporate parts of the Library - into other free programs whose distribution conditions are incompatible - with these, write to the author to ask for permission. For software - which is copyrighted by the Free Software Foundation, write to the Free - Software Foundation; we sometimes make exceptions for this. Our - decision will be guided by the two goals of preserving the free status - of all derivatives of our free software and of promoting the sharing - and reuse of software generally.

      -

      NO WARRANTY

      -

      15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, - THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY - APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT - HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT - WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE - OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU - ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

      -

      16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR - AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO - MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE - LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL - OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE - LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING - RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A - FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF - SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - DAMAGES.

      -

      END OF TERMS AND CONDITIONS

      -

      How to Apply These Terms to Your New Libraries

      -

      If you develop a new library, and you want it to be of the greatest - possible use to the public, we recommend making it free software that - everyone can redistribute and change. You can do so by permitting - redistribution under these terms (or, alternatively, under the terms of - the ordinary General Public License).

      -

      To apply these terms, attach the following notices to the library. It - is safest to attach them to the start of each source file to most - effectively convey the exclusion of warranty; and each file should have - at least the "copyright" line and a pointer to where the full notice is - found.

      -
        -

        one line to give the library's name and an idea of what it does. -
        Copyright (C) year name of author

        -

        This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version.

        -

        This library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser - General Public License for more details.

        -

        You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

        -
      -

      Also add information on how to contact you by electronic and paper - mail.

      -

      You should also get your employer (if you work as a programmer) or - your school, if any, to sign a "copyright disclaimer" for the library, - if necessary. Here is a sample; alter the names:

      -
        -

        Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random - Hacker.

        -

        signature of Ty Coon, 1 April 1990 Ty Coon, President of - Vice

        -
      -

      That's all there is to it!

      -
      -Contents -Previous -Next - - diff --git a/www/docfiles/mxmldoc.html b/www/docfiles/mxmldoc.html deleted file mode 100644 index a799343..0000000 --- a/www/docfiles/mxmldoc.html +++ /dev/null @@ -1,187 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
      -

      4Using the mxmldoc Utility

      -

      This chapter describes how to use mxmldoc(1) program to - automatically generate documentation from C and C++ source files.

      -

      The Basics

      -

      Originally developed to generate the Mini-XML and CUPS API - documentation, mxmldoc is now a general-purpose utility which - scans C and C++ source files to produce HTML and man page documentation - along with an XML file representing the functions, types, and - definitions in those source files. Unlike popular documentation - generators like Doxygen or Javadoc, mxmldoc uses in-line - comments rather than comment headers, allowing for more "natural" code - documentation.

      -

      By default, mxmldoc produces HTML documentation. For - example, the following command will scan all of the C source and header - files in the current directory and produce a HTML documentation file - called filename.html:

      -
      -    mxmldoc *.h *.c >filename.html ENTER
      -
      -

      You can also specify an XML file to create which contains all of the - information from the source files. For example, the following command - creates an XML file called filename.xml in addition to the - HTML file:

      -
      -    mxmldoc filename.xml *.h *.c >filename.html ENTER
      -
      -

      The --no-output option disables the normal HTML output:

      -
      -    mxmldoc --no-output filename.xml *.h *.c ENTER
      -
      -

      You can then run mxmldoc again with the XML file alone to - generate the HTML documentation:

      -
      -    mxmldoc filename.xml >filename.html ENTER
      -
      -

      Creating Man Pages

      -

      The --man filename option tells mxmldoc to create a - man page instead of HTML documentation, for example:

      -
      -    mxmldoc --man filename filename.xml \
      -        >filename.man ENTER
      -
      -    mxmldoc --man filename *.h *.c \
      -        >filename.man ENTER
      -
      -

      Creating Xcode Documentation Sets

      -

      The --docset directory.docset option tells mxmldoc - to create an Xcode documentation set containing the HTML documentation, - for example:

      -
      -    mxmldoc --docset foo.docset *.h *.c foo.xml ENTER
      -
      -

      Xcode documentation sets can only be built on Mac OS X with Xcode 3.0 - or higher installed.

      -

      Commenting Your Code

      -

      As noted previously, mxmldoc looks for in-line comments to - describe the functions, types, and constants in your code. Mxmldoc - will document all public names it finds in your source files - any - names starting with the underscore character (_) or names that are - documented with the @private@ directive are - treated as private and are not documented.

      -

      Comments appearing directly before a function or type definition are - used to document that function or type. Comments appearing after - argument, definition, return type, or variable declarations are used to - document that argument, definition, return type, or variable. For - example, the following code excerpt defines a key/value structure and a - function that creates a new instance of that structure:

      -
      -    /* A key/value pair. This is used with the
      -       dictionary structure. */
      -
      -    struct keyval
      -    {
      -      char *key; /* Key string */
      -      char *val; /* Value string */
      -    };
      -
      -    /* Create a new key/value pair. */
      -
      -    struct keyval * /* New key/value pair */
      -    new_keyval(
      -        const char *key, /* Key string */
      -	const char *val) /* Value string */
      -    {
      -      ...
      -    }
      -
      -

      Mxmldoc also knows to remove extra asterisks (*) from the - comment string, so the comment string:

      -
      -    /*
      -     * Compute the value of PI.
      -     *
      -     * The function connects to an Internet server
      -     * that streams audio of mathematical monks
      -     * chanting the first 100 digits of PI.
      -     */
      -
      -

      will be shown as:

      -
      -    Compute the value of PI.
      -
      -    The function connects to an Internet server
      -    that streams audio of mathematical monks
      -    chanting the first 100 digits of PI.
      -
      -

      Comments can also include the following - special @name ...@ directive strings:

      -
        -
      • @deprecated@ - flags the item as deprecated to discourage - its use
      • -
      • @private@ - flags the item as private so it will not be - included in the documentation
      • -
      • @since ...@ - flags the item as new since a particular - release. The text following the @since up to the closing @ - is highlighted in the generated documentation, e.g. @since Mini-XML - 2.7@.
      • -
      - - -

      Titles, Sections, and Introductions

      -

      Mxmldoc also provides options to set the title, section, and - introduction text for the generated documentation. The --title text - option specifies the title for the documentation. The title string is - usually put in quotes:

      -
      -    mxmldoc filename.xml \
      -        --title "My Famous Documentation" \
      -        >filename.html ENTER
      -
      -

      The --section name option specifies the section for the - documentation. For HTML documentation, the name is placed in a HTML - comment such as:

      -
      -    <!-- SECTION: name -->
      -
      -

      For man pages, the section name is usually just a number ("3"), or a - number followed by a vendor name ("3acme"). The section name is used in - the .TH directive in the man page:

      -
      -    .TH mylibrary 3acme "My Title" ...
      -
      -

      The default section name for man page output is "3". There is no - default section name for HTML output.

      -

      Finally, the --intro filename option specifies a file to - embed after the title and section but before the generated - documentation. For HTML documentation, the file must consist of valid - HTML without the usual DOCTYPE, html, and body - elements. For man page documentation, the file must consist of valid -nroff(1) text.

      -
      -Contents -Previous -Next - - diff --git a/www/docfiles/reference.html b/www/docfiles/reference.html deleted file mode 100644 index a8f9aa9..0000000 --- a/www/docfiles/reference.html +++ /dev/null @@ -1,1747 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
      -
      -

      CLibrary Reference

      -

      Contents

      - -

      Functions

      -

      mxmlAdd

      -

      Add a node to a tree.

      -

      void mxmlAdd ( -
          mxml_node_t *parent, -
          int where, -
          mxml_node_t *child, -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node
      -
      where
      -
      Where to add, MXML_ADD_BEFORE or MXML_ADD_AFTER
      -
      child
      -
      Child node for where or MXML_ADD_TO_PARENT
      -
      node
      -
      Node to add
      -
      -

      Discussion

      -

      Adds the specified node to the parent. If the - child argument is not NULL, puts the new node before or after the - specified child depending on the value of the where argument. If the - child argument is NULL, puts the new node at the beginning of the child - list (MXML_ADD_BEFORE) or at the end of the child list - (MXML_ADD_AFTER). The constant MXML_ADD_TO_PARENT can be used to - specify a NULL child pointer.

      -

      mxmlDelete

      -

      Delete a node and all of its children.

      -

      void mxmlDelete ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to delete
      -
      -

      Discussion

      -

      If the specified node has a parent, this function - first removes the node from its parent using the mxmlRemove() function.

      -

      - - Mini-XML 2.4 mxmlElementDeleteAttr -

      -

      Delete an attribute.

      -

      void mxmlElementDeleteAttr ( -
          mxml_node_t *node, -
          const char *name -
      );

      -

      Parameters

      -
      -
      node
      -
      Element
      -
      name
      -
      Attribute name
      -
      -

      mxmlElementGetAttr

      -

      Get an attribute.

      -

      const char *mxmlElementGetAttr ( -
          mxml_node_t *node, -
          const char *name -
      );

      -

      Parameters

      -
      -
      node
      -
      Element node
      -
      name
      -
      Name of attribute
      -
      -

      Return Value

      -

      Attribute value or NULL

      -

      Discussion

      -

      This function returns NULL if the node is not an - element or the named attribute does not exist.

      -

      mxmlElementSetAttr

      -

      Set an attribute.

      -

      void mxmlElementSetAttr ( -
          mxml_node_t *node, -
          const char *name, -
          const char *value -
      );

      -

      Parameters

      -
      -
      node
      -
      Element node
      -
      name
      -
      Name of attribute
      -
      value
      -
      Attribute value
      -
      -

      Discussion

      -

      If the named attribute already exists, the value - of the attribute is replaced by the new string value. The string value - is copied into the element node. This function does nothing if the node - is not an element.

      -

      - - Mini-XML 2.3 mxmlElementSetAttrf

      -

      Set an attribute with a formatted value.

      -

      void mxmlElementSetAttrf ( -
          mxml_node_t *node, -
          const char *name, -
          const char *format, -
          ... -
      );

      -

      Parameters

      -
      -
      node
      -
      Element node
      -
      name
      -
      Name of attribute
      -
      format
      -
      Printf-style attribute value
      -
      ...
      -
      Additional arguments as needed
      -
      -

      Discussion

      -

      If the named attribute already exists, the value - of the attribute is replaced by the new formatted string. The formatted - string value is copied into the element node. This function does - nothing if the node is not an element.

      -

      -mxmlEntityAddCallback

      -

      Add a callback to convert entities to Unicode.

      -

      int mxmlEntityAddCallback ( -
          mxml_entity_cb_t cb -
      );

      -

      Parameters

      -
      -
      cb
      -
      Callback function to add
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      mxmlEntityGetName

      -

      Get the name that corresponds to the character - value.

      -

      const char *mxmlEntityGetName ( -
          int val -
      );

      -

      Parameters

      -
      -
      val
      -
      Character value
      -
      -

      Return Value

      -

      Entity name or NULL

      -

      Discussion

      -

      If val does not need to be represented by a named - entity, NULL is returned.

      -

      mxmlEntityGetValue

      -

      Get the character corresponding to a named - entity.

      -

      int mxmlEntityGetValue ( -
          const char *name -
      );

      -

      Parameters

      -
      -
      name
      -
      Entity name
      -
      -

      Return Value

      -

      Character value or -1 on error

      -

      Discussion

      -

      The entity name can also be a numeric constant. -1 - is returned if the name is not known.

      -

      -mxmlEntityRemoveCallback

      -

      Remove a callback.

      -

      void mxmlEntityRemoveCallback ( -
          mxml_entity_cb_t cb -
      );

      -

      Parameters

      -
      -
      cb
      -
      Callback function to remove
      -
      -

      mxmlFindElement

      -

      Find the named element.

      -

      mxml_node_t *mxmlFindElement - ( -
          mxml_node_t *node, -
          mxml_node_t *top, -
          const char *name, -
          const char *attr, -
          const char *value, -
          int descend -
      );

      -

      Parameters

      -
      -
      node
      -
      Current node
      -
      top
      -
      Top node
      -
      name
      -
      Element name or NULL for any
      -
      attr
      -
      Attribute name, or NULL for none
      -
      value
      -
      Attribute value, or NULL for any
      -
      descend
      -
      Descend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
      -
      -

      Return Value

      -

      Element node or NULL

      -

      Discussion

      -

      The search is constrained by the name, attribute - name, and value; any NULL names or values are treated as wildcards, so - different kinds of searches can be implemented by looking for all - elements of a given name or all elements with a specific attribute. The - descend argument determines whether the search descends into child - nodes; normally you will use MXML_DESCEND_FIRST for the initial search - and MXML_NO_DESCEND to find additional direct descendents of the node. - The top node argument constrains the search to a particular node's - children.

      -

      - - Mini-XML 2.7 mxmlFindPath

      -

      Find a node with the given path.

      -

      mxml_node_t *mxmlFindPath ( -
          mxml_node_t *top, -
          const char *path -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      path
      -
      Path to element
      -
      -

      Return Value

      -

      Found node or NULL

      -

      Discussion

      -

      The "path" is a slash-separated list of element - names. The name "*" is considered a wildcard for one or more levels of - elements. For example, "foo/one/two", "bar/two/one", "*/one", and so - forth. -
      -
      The first child node of the found node is returned if the given - node has children and the first child is a value node.

      -

      - - Mini-XML 2.7 mxmlGetCDATA

      -

      Get the value for a CDATA node.

      -

      const char *mxmlGetCDATA ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      CDATA value or NULL

      -

      Discussion

      -

      NULL is returned if the node is not a - CDATA element.

      -

      - - Mini-XML 2.7 mxmlGetCustom

      -

      Get the value for a custom node.

      -

      const void *mxmlGetCustom ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Custom value or NULL

      -

      Discussion

      -

      NULL is returned if the node (or its - first child) is not a custom value node.

      -

      - - Mini-XML 2.7 mxmlGetElement

      -

      Get the name for an element node.

      -

      const char *mxmlGetElement ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Element name or NULL

      -

      Discussion

      -

      NULL is returned if the node is not - an element node.

      -

      - - Mini-XML 2.7 mxmlGetFirstChild

      -

      Get the first child of an element node.

      -

      mxml_node_t - *mxmlGetFirstChild ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      First child or NULL

      -

      Discussion

      -

      NULL is returned if the node is not - an element node or if the node has no children.

      -

      - - Mini-XML 2.7 mxmlGetInteger

      -

      Get the integer value from the specified node or - its first child.

      -

      int mxmlGetInteger ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Integer value or 0

      -

      Discussion

      -

      0 is returned if the node (or its first child) is - not an integer value node.

      -

      - - Mini-XML 2.7 mxmlGetLastChild

      -

      Get the last child of an element node.

      -

      mxml_node_t - *mxmlGetLastChild ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Last child or NULL

      -

      Discussion

      -

      NULL is returned if the node is not - an element node or if the node has no children.

      -

      mxmlGetNextSibling

      -

      Return the node type...

      -

      mxml_node_t - *mxmlGetNextSibling ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Get the next node for the current parent.

      -

      NULL is returned if this is the last - child for the current parent.

      -

      - - Mini-XML 2.7 mxmlGetOpaque

      -

      Get an opaque string value for a node or its - first child.

      -

      const char *mxmlGetOpaque ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Opaque string or NULL

      -

      Discussion

      -

      NULL is returned if the node (or its - first child) is not an opaque value node.

      -

      - - Mini-XML 2.7 mxmlGetParent

      -

      Get the parent node.

      -

      mxml_node_t *mxmlGetParent ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Parent node or NULL

      -

      Discussion

      -

      NULL is returned for a root node.

      -

      - - Mini-XML 2.7 mxmlGetPrevSibling

      -

      Get the previous node for the current parent.

      -

      mxml_node_t - *mxmlGetPrevSibling ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Previous node or NULL

      -

      Discussion

      -

      NULL is returned if this is the first - child for the current parent.

      -

      - - Mini-XML 2.7 mxmlGetReal

      -

      Get the real value for a node or its first child.

      -

      double mxmlGetReal ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Real value or 0.0

      -

      Discussion

      -

      0.0 is returned if the node (or its first child) - is not a real value node.

      -

      - - Mini-XML 2.7 mxmlGetRefCount

      -

      Get the current reference (use) count for a node.

      -

      int mxmlGetRefCount ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node
      -
      -

      Return Value

      -

      Reference count

      -

      Discussion

      -

      The initial reference count of new nodes is 1. Use - the mxmlRetain and -mxmlRelease functions to increment and decrement a - node's reference count. .

      -

      - - Mini-XML 2.7 mxmlGetText

      -

      Get the text value for a node or its first child.

      -

      const char *mxmlGetText ( -
          mxml_node_t *node, -
          int *whitespace -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      whitespace
      -
      1 if string is preceded by whitespace, 0 - otherwise
      -
      -

      Return Value

      -

      Text string or NULL

      -

      Discussion

      -

      NULL is returned if the node (or its - first child) is not a text node. The "whitespace" argument can be NULL.

      -

      - - Mini-XML 2.7 mxmlGetType

      -

      Get the node type.

      -

      mxml_type_t mxmlGetType ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      Type of node

      -

      Discussion

      -

      MXML_IGNORE is returned if "node" is -NULL.

      -

      - - Mini-XML 2.7 mxmlGetUserData

      -

      Get the user data pointer for a node.

      -

      void *mxmlGetUserData ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to get
      -
      -

      Return Value

      -

      User data pointer

      -

      mxmlIndexDelete

      -

      Delete an index.

      -

      void mxmlIndexDelete ( -
          mxml_index_t *ind -
      );

      -

      Parameters

      -
      -
      ind
      -
      Index to delete
      -
      -

      mxmlIndexEnum

      -

      Return the next node in the index.

      -

      mxml_node_t *mxmlIndexEnum ( -
          mxml_index_t *ind -
      );

      -

      Parameters

      -
      -
      ind
      -
      Index to enumerate
      -
      -

      Return Value

      -

      Next node or NULL if there is none

      -

      Discussion

      -

      Nodes are returned in the sorted order of the - index.

      -

      mxmlIndexFind

      -

      Find the next matching node.

      -

      mxml_node_t *mxmlIndexFind ( -
          mxml_index_t *ind, -
          const char *element, -
          const char *value -
      );

      -

      Parameters

      -
      -
      ind
      -
      Index to search
      -
      element
      -
      Element name to find, if any
      -
      value
      -
      Attribute value, if any
      -
      -

      Return Value

      -

      Node or NULL if none found

      -

      Discussion

      -

      You should call mxmlIndexReset() prior to using - this function for the first time with a particular set of "element" and - "value" strings. Passing NULL for both "element" and "value" is - equivalent to calling mxmlIndexEnum().

      -

      - - Mini-XML 2.7 mxmlIndexGetCount

      -

      Get the number of nodes in an index.

      -

      int mxmlIndexGetCount ( -
          mxml_index_t *ind -
      );

      -

      Parameters

      -
      -
      ind
      -
      Index of nodes
      -
      -

      Return Value

      -

      Number of nodes in index

      -

      mxmlIndexNew

      -

      Create a new index.

      -

      mxml_index_t *mxmlIndexNew - ( -
          mxml_node_t *node, -
          const char *element, -
          const char *attr -
      );

      -

      Parameters

      -
      -
      node
      -
      XML node tree
      -
      element
      -
      Element to index or NULL for all
      -
      attr
      -
      Attribute to index or NULL for none
      -
      -

      Return Value

      -

      New index

      -

      Discussion

      -

      The index will contain all nodes that contain the - named element and/or attribute. If both "element" and "attr" are NULL, - then the index will contain a sorted list of the elements in the node - tree. Nodes are sorted by element name and optionally by attribute - value if the "attr" argument is not NULL.

      -

      mxmlIndexReset

      -

      Reset the enumeration/find pointer in the index - and return the first node in the index.

      -

      mxml_node_t *mxmlIndexReset - ( -
          mxml_index_t *ind -
      );

      -

      Parameters

      -
      -
      ind
      -
      Index to reset
      -
      -

      Return Value

      -

      First node or NULL if there is none

      -

      Discussion

      -

      This function should be called prior to using - mxmlIndexEnum() or mxmlIndexFind() for the first time.

      -

      mxmlLoadFd

      -

      Load a file descriptor into an XML node tree.

      -

      mxml_node_t *mxmlLoadFd ( -
          mxml_node_t *top, -
          int fd, -
          mxml_load_cb_t cb -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      fd
      -
      File descriptor to read from
      -
      cb
      -
      Callback function or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      First node or NULL if the file could not be read.

      -

      Discussion

      -

      The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
      -
      The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type.

      -

      mxmlLoadFile

      -

      Load a file into an XML node tree.

      -

      mxml_node_t *mxmlLoadFile ( -
          mxml_node_t *top, -
          FILE *fp, -
          mxml_load_cb_t cb -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      fp
      -
      File to read from
      -
      cb
      -
      Callback function or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      First node or NULL if the file could not be read.

      -

      Discussion

      -

      The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
      -
      The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type.

      -

      mxmlLoadString

      -

      Load a string into an XML node tree.

      -

      mxml_node_t *mxmlLoadString - ( -
          mxml_node_t *top, -
          const char *s, -
          mxml_load_cb_t cb -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      s
      -
      String to load
      -
      cb
      -
      Callback function or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      First node or NULL if the string has errors.

      -

      Discussion

      -

      The nodes in the specified string are added to the - specified top node. If no top node is provided, the XML string MUST be - well-formed with a single parent node like <?xml> for the entire - string. The callback function returns the value type that should be - used for child nodes. If MXML_NO_CALLBACK is specified then all child - nodes will be either MXML_ELEMENT or MXML_TEXT nodes. -
      -
      The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type.

      -

      - - Mini-XML 2.3 mxmlNewCDATA

      -

      Create a new CDATA node.

      -

      mxml_node_t *mxmlNewCDATA ( -
          mxml_node_t *parent, -
          const char *data -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      data
      -
      Data string
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new CDATA node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new CDATA node has no parent. The data string must - be nul-terminated and is copied into the new node. CDATA nodes use the - MXML_ELEMENT type.

      -

      - - Mini-XML 2.1 mxmlNewCustom

      -

      Create a new custom data node.

      -

      mxml_node_t *mxmlNewCustom ( -
          mxml_node_t *parent, -
          void *data, -
          mxml_custom_destroy_cb_t - destroy -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      data
      -
      Pointer to data
      -
      destroy
      -
      Function to destroy data
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new custom node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new element node has no parent. NULL can be passed - when the data in the node is not dynamically allocated or is separately - managed.

      -

      mxmlNewElement

      -

      Create a new element node.

      -

      mxml_node_t *mxmlNewElement - ( -
          mxml_node_t *parent, -
          const char *name -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      name
      -
      Name of element
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new element node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new element node has no parent.

      -

      mxmlNewInteger

      -

      Create a new integer node.

      -

      mxml_node_t *mxmlNewInteger - ( -
          mxml_node_t *parent, -
          int integer -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      integer
      -
      Integer value
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new integer node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new integer node has no parent.

      -

      mxmlNewOpaque

      -

      Create a new opaque string.

      -

      mxml_node_t *mxmlNewOpaque ( -
          mxml_node_t *parent, -
          const char *opaque -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      opaque
      -
      Opaque string
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new opaque node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new opaque node has no parent. The opaque string - must be nul-terminated and is copied into the new node.

      -

      mxmlNewReal

      -

      Create a new real number node.

      -

      mxml_node_t *mxmlNewReal ( -
          mxml_node_t *parent, -
          double real -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      real
      -
      Real number value
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new real number node is added to the end of - the specified parent's child list. The constant MXML_NO_PARENT can be - used to specify that the new real number node has no parent.

      -

      mxmlNewText

      -

      Create a new text fragment node.

      -

      mxml_node_t *mxmlNewText ( -
          mxml_node_t *parent, -
          int whitespace, -
          const char *string -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      whitespace
      -
      1 = leading whitespace, 0 = no whitespace
      -
      string
      -
      String
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new text node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new text node has no parent. The whitespace - parameter is used to specify whether leading whitespace is present - before the node. The text string must be nul-terminated and is copied - into the new node.

      -

      mxmlNewTextf

      -

      Create a new formatted text fragment node.

      -

      mxml_node_t *mxmlNewTextf ( -
          mxml_node_t *parent, -
          int whitespace, -
          const char *format, -
          ... -
      );

      -

      Parameters

      -
      -
      parent
      -
      Parent node or MXML_NO_PARENT
      -
      whitespace
      -
      1 = leading whitespace, 0 = no whitespace
      -
      format
      -
      Printf-style frmat string
      -
      ...
      -
      Additional args as needed
      -
      -

      Return Value

      -

      New node

      -

      Discussion

      -

      The new text node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new text node has no parent. The whitespace - parameter is used to specify whether leading whitespace is present - before the node. The format string must be nul-terminated and is - formatted into the new node.

      -

      - - Mini-XML 2.3 mxmlNewXML

      -

      Create a new XML document tree.

      -

      mxml_node_t *mxmlNewXML ( -
          const char *version -
      );

      -

      Parameters

      -
      -
      version
      -
      Version number to use
      -
      -

      Return Value

      -

      New ?xml node

      -

      Discussion

      -

      The "version" argument specifies the version - number to put in the ?xml element node. If NULL, version 1.0 is - assumed.

      -

      - - Mini-XML 2.3 mxmlRelease

      -

      Release a node.

      -

      int mxmlRelease ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node
      -
      -

      Return Value

      -

      New reference count

      -

      Discussion

      -

      When the reference count reaches zero, the node - (and any children) is deleted via mxmlDelete().

      -

      mxmlRemove

      -

      Remove a node from its parent.

      -

      void mxmlRemove ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to remove
      -
      -

      Discussion

      -

      Does not free memory used by the node - use - mxmlDelete() for that. This function does nothing if the node has no - parent.

      -

      - - Mini-XML 2.3 mxmlRetain

      -

      Retain a node.

      -

      int mxmlRetain ( -
          mxml_node_t *node -
      );

      -

      Parameters

      -
      -
      node
      -
      Node
      -
      -

      Return Value

      -

      New reference count

      -

      - - Mini-XML 2.3 mxmlSAXLoadFd

      -

      Load a file descriptor into an XML node tree - using a SAX callback.

      -

      mxml_node_t *mxmlSAXLoadFd ( -
          mxml_node_t *top, -
          int fd, -
          mxml_load_cb_t cb, -
          mxml_sax_cb_t sax_cb, -
          void *sax_data -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      fd
      -
      File descriptor to read from
      -
      cb
      -
      Callback function or MXML_NO_CALLBACK
      -
      sax_cb
      -
      SAX callback or MXML_NO_CALLBACK
      -
      sax_data
      -
      SAX user data
      -
      -

      Return Value

      -

      First node or NULL if the file could not be read.

      -

      Discussion

      -

      The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
      -
      The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type. -
      -
      The SAX callback must call mxmlRetain() for any nodes that need to - be kept for later use. Otherwise, nodes are deleted when the parent - node is closed or after each data, comment, CDATA, or directive node.

      -

      - - Mini-XML 2.3 mxmlSAXLoadFile

      -

      Load a file into an XML node tree using a SAX - callback.

      -

      mxml_node_t *mxmlSAXLoadFile - ( -
          mxml_node_t *top, -
          FILE *fp, -
          mxml_load_cb_t cb, -
          mxml_sax_cb_t sax_cb, -
          void *sax_data -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      fp
      -
      File to read from
      -
      cb
      -
      Callback function or MXML_NO_CALLBACK
      -
      sax_cb
      -
      SAX callback or MXML_NO_CALLBACK
      -
      sax_data
      -
      SAX user data
      -
      -

      Return Value

      -

      First node or NULL if the file could not be read.

      -

      Discussion

      -

      The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
      -
      The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type. -
      -
      The SAX callback must call mxmlRetain() for any nodes that need to - be kept for later use. Otherwise, nodes are deleted when the parent - node is closed or after each data, comment, CDATA, or directive node.

      -

      - - Mini-XML 2.3 mxmlSAXLoadString

      -

      Load a string into an XML node tree using a SAX - callback.

      -

      mxml_node_t - *mxmlSAXLoadString ( -
          mxml_node_t *top, -
          const char *s, -
          mxml_load_cb_t cb, -
          mxml_sax_cb_t sax_cb, -
          void *sax_data -
      );

      -

      Parameters

      -
      -
      top
      -
      Top node
      -
      s
      -
      String to load
      -
      cb
      -
      Callback function or MXML_NO_CALLBACK
      -
      sax_cb
      -
      SAX callback or MXML_NO_CALLBACK
      -
      sax_data
      -
      SAX user data
      -
      -

      Return Value

      -

      First node or NULL if the string has errors.

      -

      Discussion

      -

      The nodes in the specified string are added to the - specified top node. If no top node is provided, the XML string MUST be - well-formed with a single parent node like <?xml> for the entire - string. The callback function returns the value type that should be - used for child nodes. If MXML_NO_CALLBACK is specified then all child - nodes will be either MXML_ELEMENT or MXML_TEXT nodes. -
      -
      The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type. -
      -
      The SAX callback must call mxmlRetain() for any nodes that need to - be kept for later use. Otherwise, nodes are deleted when the parent - node is closed or after each data, comment, CDATA, or directive node.

      -

      mxmlSaveAllocString -

      -

      Save an XML tree to an allocated string.

      -

      char *mxmlSaveAllocString ( -
          mxml_node_t *node, -
          mxml_save_cb_t cb -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to write
      -
      cb
      -
      Whitespace callback or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      Allocated string or NULL

      -

      Discussion

      -

      This function returns a pointer to a string - containing the textual representation of the XML node tree. The string - should be freed using the free() function when you are done with it. - NULL is returned if the node would produce an empty string or if the - string cannot be allocated. -
      -
      The callback argument specifies a function that returns a - whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

      -

      mxmlSaveFd

      -

      Save an XML tree to a file descriptor.

      -

      int mxmlSaveFd ( -
          mxml_node_t *node, -
          int fd, -
          mxml_save_cb_t cb -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to write
      -
      fd
      -
      File descriptor to write to
      -
      cb
      -
      Whitespace callback or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      0 on success, -1 on error.

      -

      Discussion

      -

      The callback argument specifies a function that - returns a whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

      -

      mxmlSaveFile

      -

      Save an XML tree to a file.

      -

      int mxmlSaveFile ( -
          mxml_node_t *node, -
          FILE *fp, -
          mxml_save_cb_t cb -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to write
      -
      fp
      -
      File to write to
      -
      cb
      -
      Whitespace callback or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      0 on success, -1 on error.

      -

      Discussion

      -

      The callback argument specifies a function that - returns a whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

      -

      mxmlSaveString

      -

      Save an XML node tree to a string.

      -

      int mxmlSaveString ( -
          mxml_node_t *node, -
          char *buffer, -
          int bufsize, -
          mxml_save_cb_t cb -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to write
      -
      buffer
      -
      String buffer
      -
      bufsize
      -
      Size of string buffer
      -
      cb
      -
      Whitespace callback or MXML_NO_CALLBACK
      -
      -

      Return Value

      -

      Size of string

      -

      Discussion

      -

      This function returns the total number of bytes - that would be required for the string but only copies (bufsize - 1) - characters into the specified buffer. -
      -
      The callback argument specifies a function that returns a - whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

      -

      - - Mini-XML 2.3 mxmlSetCDATA

      -

      Set the element name of a CDATA node.

      -

      int mxmlSetCDATA ( -
          mxml_node_t *node, -
          const char *data -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      data
      -
      New data string
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not a CDATA element node.

      -

      - - Mini-XML 2.1 mxmlSetCustom

      -

      Set the data and destructor of a custom data - node.

      -

      int mxmlSetCustom ( -
          mxml_node_t *node, -
          void *data, -
          mxml_custom_destroy_cb_t - destroy -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      data
      -
      New data pointer
      -
      destroy
      -
      New destructor function
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not a custom node.

      -

      -mxmlSetCustomHandlers

      -

      Set the handling functions for custom data.

      -

      void mxmlSetCustomHandlers ( -
          mxml_custom_load_cb_t - load, -
          mxml_custom_save_cb_t save -
      );

      -

      Parameters

      -
      -
      load
      -
      Load function
      -
      save
      -
      Save function
      -
      -

      Discussion

      -

      The load function accepts a node pointer and a - data string and must return 0 on success and non-zero on error. -
      -
      The save function accepts a node pointer and must return a malloc'd - string on success and NULL on error.

      -

      mxmlSetElement

      -

      Set the name of an element node.

      -

      int mxmlSetElement ( -
          mxml_node_t *node, -
          const char *name -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      name
      -
      New name string
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it is not an element - node.

      -

      mxmlSetErrorCallback -

      -

      Set the error message callback.

      -

      void mxmlSetErrorCallback ( -
          mxml_error_cb_t cb -
      );

      -

      Parameters

      -
      -
      cb
      -
      Error callback function
      -
      -

      mxmlSetInteger

      -

      Set the value of an integer node.

      -

      int mxmlSetInteger ( -
          mxml_node_t *node, -
          int integer -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      integer
      -
      Integer value
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not an integer node.

      -

      mxmlSetOpaque

      -

      Set the value of an opaque node.

      -

      int mxmlSetOpaque ( -
          mxml_node_t *node, -
          const char *opaque -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      opaque
      -
      Opaque string
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not an opaque node.

      -

      mxmlSetReal

      -

      Set the value of a real number node.

      -

      int mxmlSetReal ( -
          mxml_node_t *node, -
          double real -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      real
      -
      Real number value
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not a real number node.

      -

      mxmlSetText

      -

      Set the value of a text node.

      -

      int mxmlSetText ( -
          mxml_node_t *node, -
          int whitespace, -
          const char *string -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      whitespace
      -
      1 = leading whitespace, 0 = no whitespace
      -
      string
      -
      String
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not a text node.

      -

      mxmlSetTextf

      -

      Set the value of a text node to a formatted - string.

      -

      int mxmlSetTextf ( -
          mxml_node_t *node, -
          int whitespace, -
          const char *format, -
          ... -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      whitespace
      -
      1 = leading whitespace, 0 = no whitespace
      -
      format
      -
      Printf-style format string
      -
      ...
      -
      Additional arguments as needed
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      Discussion

      -

      The node is not changed if it (or its first child) - is not a text node.

      -

      - - Mini-XML 2.7 mxmlSetUserData

      -

      Set the user data pointer for a node.

      -

      int mxmlSetUserData ( -
          mxml_node_t *node, -
          void *data -
      );

      -

      Parameters

      -
      -
      node
      -
      Node to set
      -
      data
      -
      User data pointer
      -
      -

      Return Value

      -

      0 on success, -1 on failure

      -

      - - Mini-XML 2.3 mxmlSetWrapMargin

      -

      Set the wrap margin when saving XML data.

      -

      void mxmlSetWrapMargin ( -
          int column -
      );

      -

      Parameters

      -
      -
      column
      -
      Column for wrapping, 0 to disable wrapping
      -
      -

      Discussion

      -

      Wrapping is disabled when "column" is 0.

      -

      mxmlWalkNext

      -

      Walk to the next logical node in the tree.

      -

      mxml_node_t *mxmlWalkNext ( -
          mxml_node_t *node, -
          mxml_node_t *top, -
          int descend -
      );

      -

      Parameters

      -
      -
      node
      -
      Current node
      -
      top
      -
      Top node
      -
      descend
      -
      Descend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
      -
      -

      Return Value

      -

      Next node or NULL

      -

      Discussion

      -

      The descend argument controls whether the first - child is considered to be the next node. The top node argument - constrains the walk to the node's children.

      -

      mxmlWalkPrev

      -

      Walk to the previous logical node in the tree.

      -

      mxml_node_t *mxmlWalkPrev ( -
          mxml_node_t *node, -
          mxml_node_t *top, -
          int descend -
      );

      -

      Parameters

      -
      -
      node
      -
      Current node
      -
      top
      -
      Top node
      -
      descend
      -
      Descend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
      -
      -

      Return Value

      -

      Previous node or NULL

      -

      Discussion

      -

      The descend argument controls whether the previous - node's last child is considered to be the previous node. The top node - argument constrains the walk to the node's children.

      -

      Data Types

      -

      -mxml_custom_destroy_cb_t

      -

      Custom data destructor

      -

      typedef void (*mxml_custom_destroy_cb_t)(void *);

      -

      -mxml_custom_load_cb_t

      -

      Custom data load callback function

      -

      typedef int (*mxml_custom_load_cb_t)( -mxml_node_t *, const char *);

      -

      -mxml_custom_save_cb_t

      -

      Custom data save callback function

      -

      typedef char *(*mxml_custom_save_cb_t)( -mxml_node_t *);

      -

      mxml_entity_cb_t

      -

      Entity callback function

      -

      typedef int (*mxml_entity_cb_t)(const char *);

      -

      mxml_error_cb_t

      -

      Error callback function

      -

      typedef void (*mxml_error_cb_t)(const char *);

      -

      mxml_index_t

      -

      An XML node index.

      -

      typedef struct mxml_index_s - mxml_index_t;

      -

      mxml_load_cb_t

      -

      Load callback function

      -

      typedef mxml_type_t - (*mxml_load_cb_t)(mxml_node_t *);

      -

      mxml_node_t

      -

      An XML node.

      -

      typedef struct mxml_node_s - mxml_node_t;

      -

      mxml_save_cb_t

      -

      Save callback function

      -

      typedef const char *(*mxml_save_cb_t)( -mxml_node_t *, int);

      -

      mxml_sax_cb_t

      -

      SAX callback function

      -

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

      -

      mxml_sax_event_t

      -

      SAX event type.

      -

      typedef enum -mxml_sax_event_e mxml_sax_event_t;

      -

      mxml_type_t

      -

      The XML node type.

      -

      typedef enum mxml_type_e - mxml_type_t;

      -

      Constants

      -

      mxml_sax_event_e

      -

      SAX event type.

      -

      Constants

      -
      -
      MXML_SAX_CDATA
      -
      CDATA node
      -
      MXML_SAX_COMMENT
      -
      Comment node
      -
      MXML_SAX_DATA
      -
      Data node
      -
      MXML_SAX_DIRECTIVE
      -
      Processing directive node
      -
      MXML_SAX_ELEMENT_CLOSE
      -
      Element closed
      -
      MXML_SAX_ELEMENT_OPEN
      -
      Element opened
      -
      -

      mxml_type_e

      -

      The XML node type.

      -

      Constants

      -
      -
      MXML_CUSTOM - -  Mini-XML 2.1 
      -
      Custom data
      -
      MXML_ELEMENT
      -
      XML element with attributes
      -
      MXML_IGNORE - -  Mini-XML 2.3 
      -
      Ignore/throw away node
      -
      MXML_INTEGER
      -
      Integer value
      -
      MXML_OPAQUE
      -
      Opaque string
      -
      MXML_REAL
      -
      Real value
      -
      MXML_TEXT
      -
      Text fragment
      -
      -

      -Contents -Previous -Next - - diff --git a/www/docfiles/relnotes.html b/www/docfiles/relnotes.html deleted file mode 100644 index 5b2cc59..0000000 --- a/www/docfiles/relnotes.html +++ /dev/null @@ -1,329 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - - -Contents -Previous -Next -
      -

      BRelease Notes

      -

      Changes in Mini-XML 2.7

      -
        -
      • Fixed conformance of mxmldoc's HTML and CSS output.
      • -
      • Added data accessor ("get") functions and made the mxml_node_t and - mxml_index_t structures private but still available in the Mini-XML - header to preserve source compatibility (STR #118)
      • -
      • Updated the source headers to reference the Mini-XML license and its - exceptions to the LGPL2 (STR #108)
      • -
      • Added a new mxmlFindPath() function to find the value node of a - named element (STR #110)
      • -
      • Building a static version of the library did not work on Windows - (STR #112)
      • -
      • The shared library did not include a destructor for the thread- - specific data key on UNIX-based operating systems (STR #103)
      • -
      • mxmlLoad* did not error out on XML with multiple root nodes (STR - #101)
      • -
      • Fixed an issue with the _mxml_vstrdupf function (STR #107)
      • -
      • mxmlSave* no longer write all siblings of the passed node, just that - node and its children (STR #109)
      • -
      -

      Changes in Mini-XML 2.6

      -
        -
      • Documentation fixes (STR #91, STR #92)
      • -
      • The mxmldoc program did not handle typedef comments properly (STR - #72)
      • -
      • Added support for "long long" printf formats.
      • -
      • The XML parser now ignores BOMs in UTF-8 XML files (STR #89)
      • -
      • The mxmldoc program now supports generating Xcode documentation - sets.
      • -
      • mxmlSave*() did not output UTF-8 correctly on some platforms.
      • -
      • mxmlNewXML() now adds encoding="utf-8" in the ?xml directive to - avoid problems with non-conformant XML parsers that assume something - other than UTF-8 as the default encoding.
      • -
      • Wrapping was not disabled when mxmlSetWrapMargin(0) was called, and - "<?xml ... ?>" was always followed by a newline (STR #76)
      • -
      • The mxml.pc.in file was broken (STR #79)
      • -
      • The mxmldoc program now handles "typedef enum name {} name" - correctly (STR #72)
      • -
      -

      Changes in Mini-XML 2.5

      -
        -
      • The mxmldoc program now makes greater use of CSS and supports a - --css option to embed an alternate stylesheet.
      • -
      • The mxmldoc program now supports --header and --footer options to - insert documentation content before and after the generated content.
      • -
      • The mxmldoc program now supports a --framed option to generate - framed HTML output.
      • -
      • The mxmldoc program now creates a table of contents including any - headings in the --intro file when generating HTML output.
      • -
      • The man pages and man page output from mxmldoc did not use "\-" for - dashes (STR #68)
      • -
      • The debug version of the Mini-XML DLL could not be built (STR #65)
      • -
      • Processing instructions and directives did not work when not at the - top level of a document (STR #67)
      • -
      • Spaces around the "=" in attributes were not supported (STR #67)
      • -
      -

      Changes in Mini-XML 2.4

      -
        -
      • Fixed shared library build problems on HP-UX and Mac OS X.
      • -
      • The mxmldoc program did not output argument descriptions for - functions properly.
      • -
      • All global settings (custom, error, and entity callbacks and the - wrap margin) are now managed separately for each thread.
      • -
      • Added mxmlElementDeleteAttr() function (STR #59)
      • -
      • mxmlElementSetAttrf() did not work (STR #57)
      • -
      • mxmlLoad*() incorrectly treated declarations as parent elements (STR - #56)
      • -
      • mxmlLoad*() incorrectly allowed attributes without values (STR #47)
      • -
      • Fixed Visual C++ build problems (STR #49)
      • -
      • mxmlLoad*() did not return NULL when an element contained an error - (STR #46)
      • -
      • Added support for the apos character entity (STR #54)
      • -
      • Fixed whitespace detection with Unicode characters (STR #48)
      • -
      • mxmlWalkNext() and mxmlWalkPrev() did not work correctly when called - with a node with no children as the top node (STR #53)
      • -
      -

      Changes in Mini-XML 2.3

      -
        -
      • Added two exceptions to the LGPL to support static linking of - applications against Mini-XML
      • -
      • The mxmldoc utility can now generate man pages, too.
      • -
      • Added a mxmlNewXML() function
      • -
      • Added a mxmlElementSetAttrf() function (STR #43)
      • -
      • Added a snprintf() emulation function for the test program (STR #32)
      • -
      • Added the _CRT_SECURE_NO_DEPRECATE definition when building on VC++ - 2005 (STR #36)
      • -
      • mxmlLoad*() did not detect missing > characters in elements (STR - #41)
      • -
      • mxmlLoad*() did not detect missing close tags at the end of an XML - document (STR #45)
      • -
      • Added user_data and ref_count members to mxml_node_t structure
      • -
      • Added mxmlReleaseNode() and mxmlRetainNode() APIs for - reference-counted nodes
      • -
      • Added mxmlSetWrapMargin() to control the wrapping of XML output
      • -
      • Added conditional check for EINTR error code for certain Windows - compilers that do not define it (STR #33)
      • -
      • The mxmldoc program now generates correct HTML 4.0 output - - previously it generated invalid XHTML
      • -
      • The mxmldoc program now supports "@deprecated@, "@private@", and - "@since version@" comments
      • -
      • Fixed function and enumeration type bugs in mxmldoc
      • -
      • Fixed the XML schema for mxmldoc
      • -
      • The mxmldoc program now supports --intro, --section, and --title - options
      • -
      • The mxmlLoad*() functions could leak a node on an error (STR #27)
      • -
      • The mxml_vsnprintf() function could get in an infinite loop on a - buffer overflow (STR #25)
      • -
      • Added new mxmlNewCDATA() and mxmlSetCDATA() functions to create and - set CDATA nodes, which are really just special element nodes
      • -
      • Added new MXML_IGNORE type and MXML_IGNORE_CB callback to ignore - non-element nodes, e.g. whitespace
      • -
      • mxmlLoad*() did not treat custom data as opaque, so whitespace - characters would be lost
      • -
      -

      Changes in Mini-XML 2.2.2

      -
        -
      • mxmlLoad*() did not treat custom data as opaque, so whitespace - characters would be lost.
      • -
      -

      Changes in Mini-XML 2.2.1

      -
        -
      • mxmlLoadFd(), mxmlLoadFile(), and mxmlLoadString() now correctly - return NULL on error (STR #21)
      • -
      • mxmlNewInteger(), mxmlNewOpaque(), mxmlNewReal(), mxmlNewText(), and - mxmlNewTextf() incorrectly required a parent node (STR #22)
      • -
      • Fixed an XML output bug in mxmldoc.
      • -
      • The "make install" target now uses the install command to set the - proper permissions on UNIX/Linux/OSX.
      • -
      • Fixed a MingW/Cygwin compilation problem (STR #18)
      • -
      -

      Changes in Mini-XML 2.2

      -
        -
      • Added shared library support (STR #17)
      • -
      • mxmlLoad*() now returns an error when an XML stream contains illegal - control characters (STR #10)
      • -
      • mxmlLoad*() now returns an error when an element contains two - attributes with the same name in conformance with the XML spec (STR - #16)
      • -
      • Added support for CDATA (STR #14, STR #15)
      • -
      • Updated comment and processing instruction handling - no entity - support per XML specification.
      • -
      • Added checking for invalid comment termination ("--->" is not - allowed)
      • -
      -

      Changes in Mini-XML 2.1

      -
        -
      • Added support for custom data nodes (STR #6)
      • -
      • Now treat UTF-8 sequences which are longer than necessary as an - error (STR #4)
      • -
      • Fixed entity number support (STR #8)
      • -
      • Fixed mxmlLoadString() bug with UTF-8 (STR #7)
      • -
      • Fixed entity lookup bug (STR #5)
      • -
      • Added mxmlLoadFd() and mxmlSaveFd() functions.
      • -
      • Fixed multi-word UTF-16 handling.
      • -
      -

      Changes in Mini-XML 2.0

      -
        -
      • New programmers manual.
      • -
      • Added Visual C++ project files for Microsoft Windows users.
      • -
      • Added optimizations to mxmldoc, mxmlSaveFile(), and mxmlIndexNew() - (STR #2)
      • -
      • mxmlEntityAddCallback() now returns an integer status (STR #2)
      • -
      • Added UTF-16 support (input only; all output is UTF-8)
      • -
      • Added index functions to build a searchable index of XML nodes.
      • -
      • Added character entity callback interface to support additional - character entities beyond those defined in the XHTML specification.
      • -
      • Added support for XHTML character entities.
      • -
      • The mxmldoc utility now produces XML output which conforms to an - updated XML schema, described in the file "doc/mxmldoc.xsd".
      • -
      • Changed the whitespace callback interface to return strings instead - of a single character, allowing for greater control over the formatting - of XML files written using Mini-XML. THIS CHANGE WILL REQUIRE CHANGES - TO YOUR 1.x CODE IF YOU USE WHITESPACE CALLBACKS.
      • -
      • The mxmldoc utility now produces XML output which conforms to an - updated XML schema, described in the file "doc/mxmldoc.xsd".
      • -
      • Changed the whitespace callback interface to return strings instead - of a single character, allowing for greater control over the formatting - of XML files written using Mini-XML. THIS CHANGE WILL REQUIRE CHANGES - TO YOUR 1.x CODE IF YOU USE WHITESPACE CALLBACKS.
      • -
      • The mxmldoc utility is now capable of documenting C++ classes, - functions, and structures, and correctly handles C++ comments.
      • -
      • Added new modular tests for mxmldoc.
      • -
      • Updated the mxmldoc output to be more compatible with embedding in - manuals produced with HTMLDOC.
      • -
      • The makefile incorrectly included a "/" separator between the - destination path and install path. This caused problems when building - and installing with MingW.
      • -
      -

      Changes in Mini-XML 1.3

      -
        -
      • Fixes for mxmldoc.
      • -
      • Added support for reading standard HTML entity names.
      • -
      • mxmlLoadString/File() did not decode character entities in element - names, attribute names, or attribute values.
      • -
      • mxmlLoadString/File() would crash when loading non- conformant XML - data under an existing parent (top) node.
      • -
      • Fixed several bugs in the mxmldoc utility.
      • -
      • Added new error callback function to catch a variety of errors and - log them to someplace other than stderr.
      • -
      • The mxmlElementSetAttr() function now allows for NULL attribute - values.
      • -
      • The load and save functions now properly handle quoted element and - attribute name strings properly, e.g. for !DOCTYPE declarations.
      • -
      -

      Changes in Mini-XML 1.2

      -
        -
      • Added new "set" methods to set the value of a node.
      • -
      • Added new formatted text methods mxmlNewTextf() and mxmlSetTextf() - to create/set a text node value using printf-style formats.
      • -
      • Added new standard callbacks for use with the mxmlLoad functions.
      • -
      • Updated the HTML documentation to include examples of the walk and - load function output.
      • -
      • Added --with/without-ansi configure option to control the strdup() - function check.
      • -
      • Added --with/without-snprintf configure option to control the - snprintf() and vsnprintf() function checks.
      • -
      -

      Changes in Mini-XML 1.1.2

      -
        -
      • The mxml(3) man page wasn't updated for the string functions.
      • -
      • mxmlSaveString() returned the wrong number of characters.
      • -
      • mxml_add_char() updated the buffer pointer in the wrong place.
      • -
      -

      Changes in Mini-XML 1.1.1

      -
        -
      • The private mxml_add_ch() function did not update the - start-of-buffer pointer which could cause a crash when using - mxmlSaveString().
      • -
      • The private mxml_write_ws() function called putc() instead of using - the proper callback which could cause a crash when using - mxmlSaveString().
      • -
      • Added a mxmlSaveAllocString() convenience function for saving an XML - node tree to an allocated string.
      • -
      -

      Changes in Mini-XML 1.1

      -
        -
      • The mxmlLoadFile() function now uses dynamically allocated string - buffers for element names, attribute names, and attribute values. - Previously they were capped at 16383, 255, and 255 bytes, respectively.
      • -
      • Added a new mxmlLoadString() function for loading an XML node tree - from a string.
      • -
      • Added a new mxmlSaveString() function for saving an XML node tree to - a string.
      • -
      • Add emulation of strdup() if the local platform does not provide the - function.
      • -
      -

      Changes in Mini-XML 1.0

      -
        -
      • The mxmldoc program now handles function arguments, structures, - unions, enumerations, classes, and typedefs properly.
      • -
      • Documentation provided via mxmldoc and more in-line comments in the - code.
      • -
      • Added man pages and packaging files.
      • -
      -

      Changes in Mini-XML 0.93

      -
        -
      • New mxmldoc example program that is also used to create and update - code documentation using XML and produce HTML reference pages.
      • -
      • Added mxmlAdd() and mxmlRemove() functions to add and remove nodes - from a tree. This provides more flexibility over where the nodes are - inserted and allows nodes to be moved within the tree as needed.
      • -
      • mxmlLoadFile() now correctly handles comments.
      • -
      • mxmlLoadFile() now supports the required "gt", "quot", and "nbsp" - character entities.
      • -
      • mxmlSaveFile() now uses newlines as whitespace when valid to do so.
      • -
      • mxmlFindElement() now also takes attribute name and attribute value - string arguments to limit the search to specific elements with - attributes and/or values.
      • - NULL pointers can be used as "wildcards". -
      • Added uninstall target to makefile, and auto-reconfig if Makefile.in - or configure.in are changed.
      • -
      • mxmlFindElement(), mxmlWalkNext(), and mxmlWalkPrev() now all - provide "descend" arguments to control whether they descend into child - nodes in the tree.
      • -
      • Fixed some whitespace issues in mxmlLoadFile().
      • -
      • Fixed Unicode output and whitespace issues in mxmlSaveFile().
      • -
      • mxmlSaveFile() now supports a whitespace callback to provide more - human-readable XML output under program control.
      • -
      -

      Changes in Mini-XML 0.92

      -
        -
      • mxmlSaveFile() didn't return a value on success.
      • -
      -

      Changes in Mini-XML 0.91

      -
        -
      • mxmlWalkNext() would go into an infinite loop.
      • -
      -

      Changes in Mini-XML 0.9

      -
        -
      • Initial public release.
      • -
      -
      -Contents -Previous -Next - - diff --git a/www/docfiles/schema.html b/www/docfiles/schema.html deleted file mode 100644 index 907438e..0000000 --- a/www/docfiles/schema.html +++ /dev/null @@ -1,223 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - - - - -Contents -Previous -
      -

      DXML Schema

      -

      This appendix provides the XML schema that is used for the XML files - produced by mxmldoc. This schema is available on-line at:

      -
      -    http://www.minixml.org/mxmldoc.xsd
      -
      -

      mxmldoc.xsd

      -
      
      -<?xml version="1.0"?>
      -<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      -  <xsd:annotation>
      -    <xsd:documentation xml:lang="en">
      -      Mini-XML 2.7 documentation schema for mxmldoc output.
      -      Copyright 2003-2011 by Michael Sweet.
      -    </xsd:documentation>
      -  </xsd:annotation>
      -
      -  <!-- basic element definitions -->
      -  <xsd:element name="argument" type="argumentType"/>
      -  <xsd:element name="class" type="classType"/>
      -  <xsd:element name="constant" type="constantType"/>
      -  <xsd:element name="description" type="xsd:string"/>
      -  <xsd:element name="enumeration" type="enumerationType"/>
      -  <xsd:element name="function" type="functionType"/>
      -  <xsd:element name="mxmldoc" type="mxmldocType"/>
      -  <xsd:element name="namespace" type="namespaceType"/>
      -  <xsd:element name="returnvalue" type="returnvalueType"/>
      -  <xsd:element name="seealso" type="identifierList"/>
      -  <xsd:element name="struct" type="structType"/>
      -  <xsd:element name="typedef" type="typedefType"/>
      -  <xsd:element name="type" type="xsd:string"/>
      -  <xsd:element name="union" type="unionType"/>
      -  <xsd:element name="variable" type="variableType"/>
      -
      -  <!-- descriptions of complex elements -->
      -  <xsd:complexType name="argumentType">
      -    <xsd:sequence>
      -      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
      -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -    </xsd:sequence>
      -    <xsd:attribute name="default" type="xsd:string" use="optional"/>
      -    <xsd:attribute name="name" type="identifier" use="required"/>
      -    <xsd:attribute name="direction" type="direction" use="optional"
      -     default="I"/>
      -  </xsd:complexType>
      -
      -  <xsd:complexType name="classType">
      -    <xsd:sequence>
      -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -      <xsd:choice minOccurs="0" maxOccurs="unbounded">
      -	<xsd:element ref="class"/>
      -	<xsd:element ref="enumeration"/>
      -	<xsd:element ref="function"/>
      -	<xsd:element ref="struct"/>
      -	<xsd:element ref="typedef"/>
      -	<xsd:element ref="union"/>
      -	<xsd:element ref="variable"/>
      -      </xsd:choice>
      -    </xsd:sequence>
      -    <xsd:attribute name="name" type="identifier" use="required"/>
      -    <xsd:attribute name="parent" type="xsd:string" use="optional"/>
      -  </xsd:complexType>
      -
      -  <xsd:complexType name="constantType">
      -    <xsd:sequence>
      -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -    </xsd:sequence>
      -    <xsd:attribute name="name" type="identifier" use="required"/>
      -  </xsd:complexType>
      -
      -  <xsd:complexType name="enumerationType">
      -    <xsd:sequence>
      -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -      <xsd:element ref="constant" minOccurs="1" maxOccurs="unbounded"/>
      -    </xsd:sequence>
      -    <xsd:attribute name="name" type="identifier" use="required"/>
      -  </xsd:complexType>
      -
      -  <xsd:complexType name="functionType">
      -    <xsd:sequence>
      -      <xsd:element ref="returnvalue" minOccurs="0" maxOccurs="1"/>
      -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -      <xsd:element ref="argument" minOccurs="1" maxOccurs="unbounded"/>
      -      <xsd:element ref="seealso" minOccurs="0" maxOccurs="1"/>
      -    </xsd:sequence>
      -    <xsd:attribute name="name" type="identifier" use="required"/>
      -    <xsd:attribute name="scope" type="scope" use="optional"/>
      -  </xsd:complexType>
      -
      -  <xsd:complexType name="mxmldocType">
      -    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      -      <xsd:element ref="class"/>
      -      <xsd:element ref="enumeration"/>
      -      <xsd:element ref="function"/>
      -      <xsd:element ref="namespace"/>
      -      <xsd:element ref="struct"/>
      -      <xsd:element ref="typedef"/>
      -      <xsd:element ref="union"/>
      -      <xsd:element ref="variable"/>
      -    </xsd:choice>
      -  </xsd:complexType>
      -
      -  <xsd:complexType name="namespaceType">
      -    <xsd:sequence>
      -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -      <xsd:choice minOccurs="0" maxOccurs="unbounded">
      -	<xsd:element ref="class"/>
      -	<xsd:element ref="enumeration"/>
      -	<xsd:element ref="function"/>
      -	<xsd:element ref="struct"/>
      -	<xsd:element ref="typedef"/>
      -	<xsd:element ref="union"/>
      -	<xsd:element ref="variable"/>
      -      </xsd:choice>
      -    </xsd:sequence>
      -    <xsd:attribute name="name" type="identifier" use="required"/>
      -  </xsd:complexType>
      -
      -  <xsd:complexType name="returnvalueType">
      -    <xsd:sequence>
      -      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
      -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -    </xsd:sequence>
      -  </xsd:complexType>
      -
      -  <xsd:complexType name="structType">
      -    <xsd:sequence>
      -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -      <xsd:choice minOccurs="0" maxOccurs="unbounded">
      -	<xsd:element ref="variable"/>
      -	<xsd:element ref="function"/>
      -      </xsd:choice>
      -    </xsd:sequence>
      -    <xsd:attribute name="name" type="identifier" use="required"/>
      -  </xsd:complexType>
      -
      -  <xsd:complexType name="typedefType">
      -    <xsd:sequence>
      -      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
      -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -    </xsd:sequence>
      -    <xsd:attribute name="name" type="identifier" use="required"/>
      -  </xsd:complexType>
      -
      -  <xsd:complexType name="unionType">
      -    <xsd:sequence>
      -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -      <xsd:element ref="variable" minOccurs="0" maxOccurs="unbounded"/>
      -    </xsd:sequence>
      -    <xsd:attribute name="name" type="identifier" use="required"/>
      -  </xsd:complexType>
      -
      -  <xsd:complexType name="variableType">
      -    <xsd:sequence>
      -      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
      -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
      -    </xsd:sequence>
      -    <xsd:attribute name="name" type="identifier" use="required"/>
      -  </xsd:complexType>
      -
      -  <!-- data types -->
      -  <xsd:simpleType name="direction">
      -    <xsd:restriction base="xsd:string">
      -      <xsd:enumeration value="I"/>
      -      <xsd:enumeration value="O"/>
      -      <xsd:enumeration value="IO"/>
      -    </xsd:restriction>
      -  </xsd:simpleType>
      -
      -  <xsd:simpleType name="identifier">
      -    <xsd:restriction base="xsd:string">
      -      <xsd:pattern value="[a-zA-Z_(.]([a-zA-Z_(.,)* 0-9])*"/>
      -    </xsd:restriction>
      -  </xsd:simpleType>
      -
      -  <xsd:simpleType name="identifierList">
      -    <xsd:list itemType="identifier"/>
      -  </xsd:simpleType>
      -
      -  <xsd:simpleType name="scope">
      -    <xsd:restriction base="xsd:string">
      -      <xsd:enumeration value=""/>
      -      <xsd:enumeration value="private"/>
      -      <xsd:enumeration value="protected"/>
      -      <xsd:enumeration value="public"/>
      -    </xsd:restriction>
      -  </xsd:simpleType>
      -</xsd:schema>
      -
      -
      -Contents -Previous - - diff --git a/www/docfiles/search.index b/www/docfiles/search.index deleted file mode 100644 index 052dd7b1103b0186c28359172b1f56e6888005b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13261 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 LN6ayIVAB8q^HU0u diff --git a/www/documentation.php b/www/documentation.php deleted file mode 100644 index a255036..0000000 --- a/www/documentation.php +++ /dev/null @@ -1,267 +0,0 @@ -The path '$path' is bad.

      \n"); - - html_footer(); - } - } - else - { - $fp = fopen("docfiles$path", "rb"); - if (!$fp) - { - if ($type == "html") - { - html_header("Documentation Error"); - - print("

      Unable to open path '$path'.

      \n"); - - html_footer(); - } - } - else if ($type == "html") - { - html_header("Documentation"); - - $saw_body = 0; - $last_nav = 0; - - while ($line = fgets($fp, 1024)) - { - if (strstr($line, "") || strstr($line, "")) - { - break; - } - else if ($saw_body) - { - if (strstr($line, "ContentsPrevious") || - strstr($line, ">Next")) - { - if ($last_nav) - print("·\n"); - else - print("\n"); - - print("

      User Comments

      \n" - ."

      " - ."Add Comment

      \n"); - - $num_comments = show_comments("documentation.php$path"); - - if ($num_comments == 0) - print("

      No comments for this page.

      \n"); - - html_footer(); - } - else - { - header("Content-Type: image/$type"); - - print(fread($fp, filesize("docfiles$path"))); - - fclose($fp); - } - } -} -else -{ - html_header("Documentation"); - - if (array_key_exists("CLEAR", $_GET)) - $q = ""; - else if (array_key_exists("Q", $_GET)) - $q = $_GET["Q"]; - else - $q = ""; - - $html = htmlspecialchars($q, ENT_QUOTES); - - if (stripos($_SERVER["HTTP_USER_AGENT"], "webkit") !== FALSE) - { - // Use Safari search box... - $search = ""; - } - else - { - // Use standard HTML text field... - $search = " " - ." " - .""; - } - - print("
      \n" - ."

      $search

      \n" - ."
      \n"); - - if ($q != "") - { - // Run htmlsearch to search the documentation... - $matches = array(); - $scores = array(); - $maxscore = 0; - $fp = popen("/usr/local/bin/websearch docfiles " . escapeshellarg($q), - "r"); - - fgets($fp, 1024); - - while ($line = fgets($fp, 1024)) - { - $data = explode("|", $line); - $matches[$data[1]] = $data[2]; - $scores[$data[1]] = $data[0]; - - if ($maxscore == 0) - $maxscore = $data[0]; - } - - pclose($fp); - - // Show the results... - if (sizeof($matches) == 1) - $total = "1 match"; - else - $total = sizeof($matches) . " matches"; - - print("

      $total found:

      \n" - ."\n"); - - reset($matches); - foreach ($matches as $file => $text) - { - $link = "$PHP_SELF/$file"; - $score = str_repeat("★", - (int)(4 * $scores[$file] / $maxscore) + 1); - - print("" - ."\n"); - } - - print("
      $score   $text
      \n"); - } - else - { -?> - -

      You can view the Mini-XML documentation in a single HTML file or in -multiple files with comments on-line:

      - - - -

      You can also get a printed version of the Mini-XML documentation on -Lulu.com.

      - - diff --git a/www/forums.php b/www/forums.php deleted file mode 100644 index a89b675..0000000 --- a/www/forums.php +++ /dev/null @@ -1,1199 +0,0 @@ -"; - -if ($from == "" || $from == "Anonymous") - $from = "Anonymous "; - - -// -// 'sanitize_email()' - Convert an email address to something a SPAMbot -// can't read... -// - -function // O - Sanitized email -sanitize_email($email, // I - Email address - $html = 1) // I - HTML format? -{ - $nemail = ""; - $len = strlen($email); - - for ($i = 0; $i < $len; $i ++) - { - switch ($email[$i]) - { - case '@' : - if ($i > 0) - $i = $len; - else if ($html) - $nemail .= " at "; - else - $nemail .= " at "; - break; - - case '<' : - if ($i > 0) - $i = $len; - break; - - case '>' : - break; - - case '&' ; - $nemail .= "&"; - break; - - default : - $nemail .= $email[$i]; - break; - } - } - - return (trim($nemail)); -} - - -// -// 'format_date()' - Format a RFC 2822 date string. -// - -function // O - Date/time in human format -format_date($rfc2822) // I - Date/time in RFC 2822 format -{ - if (($time = strtotime($rfc2822)) < 0) - $date = htmlspecialchars($rfc2822, ENT_QUOTES); - else - { - $diff = abs(time() - $time); - - if ($diff < 604800) - $date = date("H:i D", $time); - else if ($diff < 31536000) - $date = date("H:i M d", $time); - else - $date = date("M d, Y", $time); - } - - return ($date); -} - - -// -// 'nntp_header()' - Show the standard header and nav links. -// - -function -nntp_header($title, // I - Title - $links) // I - Links -{ - html_header($title); - html_start_links(TRUE); - html_links($links); - html_end_links(); -} - - -// -// 'nntp_close()' - Close a news server thing... -// - -function -nntp_close($stream) // I - Socket stream -{ - nntp_command($stream, "QUIT", 205); - - fclose($stream); -} - - -// -// 'nntp_command()' - Send a command and get the response... -// - -function // O - NNTP response -nntp_command($stream, // I - Socket stream - $command = "QUIT", // I - NNTP command - $expect = 200) // I - Expected status - -{ -// print("

      nntp_command(stream=$stream, command='$command', expect=$expect)

      \n"); - - fwrite($stream, "$command\r\n"); - - $status = fgets($stream, 1024); - -// print("

      status='$status'

      \n"); - -// if ((int)$status != $expect) -// { -// print("

      Error: $status

      \n"); -// return (NULL); -// } -// else - return ($status); -} - - -// -// 'nntp_connect()' - Connect to the news server. -// - -function // O - Socket stream -nntp_connect() -{ - global $NNTPSERVER, $NNTPPORT; - - - $errno = 0; - $errstr = ""; - $stream = fsockopen($NNTPSERVER, $NNTPPORT, $errno, $errstr); - - if ($stream) - { - if ($line = fgets($stream, 1024)) - { - if ((int)$line != 200) - { - print("

      Error: $line

      \n"); - fclose($stream); - return (FALSE); - } - } - else - { - print("

      Error: No response from NNTP server!

      \n"); - fclose($stream); - return (FALSE); - } - } - else - print("

      Error: $errstr ($errno)

      \n"); - - return ($stream); -} - - -// -// 'nntp_error()' - Show an error message. -// - -function -nntp_error($text, // I - Human-readable message - $status, // I - NNTP status message - $group = "") // I - Current group, if any -{ - $links = array(); - - $links["All Forums"] = "forums.php"; - if ($group != "") - $links["Back to $group"] = "forums.php?g$group"; - - nntp_header("Error", $links); - - print("

      $text

      \n" - ."
      $status
      \n"); - - html_footer(); -} - - -// -// 'nntp_search()' - Do a header search... -// - -function // O - Matching message headers... -nntp_search($stream, // I - Socket stream - $group, // I - NNTP group - $search, // I - Search text - $threaded = TRUE) // I - Thread messages? -{ -// print("

      nntp_search(stream=$stream, group='$group', search='$search'

      \n"); - - // Get the start and end messages in the group... - $status = nntp_command($stream, "GROUP $group", 211); - if ((int)$status != 211) - { - nntp_error("We were unable to open the forum '$group' for the following " - ."reason:", $status, $group); - return (NULL); - } - - // Read the messages in the group... - $fields = explode(" ", $status); - $status = nntp_command($stream, "XOVER $fields[2]-$fields[3]", 224); - if ((int)$status != 224) - { - nntp_error("We were unable to search the forum '$group' for the following " - ."reason:", $status, $group); - return (NULL); - } - - $words = html_search_words($search); - $num_matches = 0; - $matches = NULL; - - while ($line = fgets($stream, 1024)) - { - $line = rtrim($line); - - if ($line == ".") - break; - -// print("
      " . htmlspecialchars($line) . "
      \n"); - - if ($search == "") - { - // Return all matches... - $matches[$num_matches] = $line; - $num_matches ++; - } - else - { - // Search for words... - reset($words); - - $fields = explode("\t", $line); - - foreach ($words as $word) - { - if (stristr($fields[1], $word) || stristr($fields[2], $word)) - { - $matches[$num_matches] = $line; - $num_matches ++; - break; - } - } - } - } - - if ($threaded) - { - // Thread the articles... - $threads = array(); - $parents = array(); - - for ($i = 0; $i < sizeof($matches); $i ++) - { - $fields = explode("\t", $matches[$i]); - $subject = eregi_replace("(re:|\\[[a-z]+\\.[a-z]+\\]) ", "", $fields[1]); - - if (array_key_exists($subject, $parents)) - $threads[$i] = sprintf("%06d%06d", $parents[$subject], $i); - else - { - $parents["$subject"] = $i; - $threads[$i] = sprintf("%06d%06d", $i, $i); - } - } - - array_multisort($threads, SORT_NUMERIC, $matches); - } - - // Return the matches... - return ($matches); -} - - -// -// 'show_prevnext_page()' - Show the prev/next links for the messages list... -// - -function -show_prevnext_page($group, // I - Group - $group_filter, // I - Group filter - $start, // I - Start message - $end, // I - End message - $count, // I - Number of messages - $threaded) // I - Thread messages? -{ - global $PHP_SELF, $PAGE_MAX, $options; - - - print("

      \n" - ."\n" - ."
      "); - - if ($start > 1) - { - $i = $start - $PAGE_MAX; - if ($i < 1) - $i = 1; - - $j = $i + $PAGE_MAX - 1; - if ($j > $count) - $j = $count; - - html_start_links(); - html_link("Show Messages $i - $j", "$PHP_SELF?s$i+g$group$options"); - html_end_links(); - } - - print(""); - html_start_links(); - if (!ereg(".*\.announce", $group) && !ereg(".*\.commit", $group)) - html_link("New Message", "$PHP_SELF?s$start+g$group+n$options"); - if ($threaded) - html_link("Sort by Date", - "$PHP_SELF?s$start+g$group+T0" . substr($options, 3)); - else - html_link("Sort by Thread", - "$PHP_SELF?s$start+g$group+T1" . substr($options, 3)); - html_end_links(); - print(""); - - if ($end < $count) - { - $i = $start + $PAGE_MAX; - $j = $i + $PAGE_MAX - 1; - if ($j > $count) - $j = $count; - - html_start_links(); - html_link("Show Messages $i - $j", "$PHP_SELF?s$i+g$group$options"); - html_end_links(); - } - - print("

      \n"); -} - - -// -// 'show_messages()' - Show messages in the named group... -// - -function -show_messages($group, // I - Group - $group_filter, // I - Group filter - $start, // I - Start message - $search, // I - Search string - $threaded) // I - Threaded view? -{ - global $PHP_SELF, $PAGE_MAX, $_COOKIE, $options; - - - // Figure out which messages to show... - $error = ""; - - $stream = nntp_connect(); - $matches = nntp_search($stream, $group, $search, $threaded); - - nntp_close($stream); - - if (!$matches) - { - $count = 0; - - if ($search == "") - $error = "No messages in group."; - else - $error = "No matches found for '" . - htmlspecialchars($search, ENT_QUOTES) . "'..."; - } - else - $count = count($matches); - - if ($start == 0) - { - if ($search == "") - { - $cookie = str_replace(".", "_", $group); - - if (array_key_exists($cookie, $_COOKIE)) - { - $msgnum = (int)$_COOKIE[$cookie]; - - for ($i = 0; $i < $count; $i ++) - { - $fields = explode("\t", $matches[$i]); - if ((int)$fields[0] == $msgnum) - break; - } - - $start = $i + 1; - } - else - $start = $count - $PAGE_MAX + 1; - } - else - $start = 1; - } - - if ($start > ($count - $PAGE_MAX + 1)) - $start = $count - $PAGE_MAX + 1; - if ($start < 1) - $start = 1; - - $end = $start + $PAGE_MAX - 1; - if ($end > $count) - $end = $count; - - // Show the standard header... - nntp_header("$group ($start - $end of $count)", - array("All Forums" => "forums.php?g$options")); - - $temp = htmlspecialchars($search, ENT_QUOTES); - print("
      \n" - ."

      Search Words:

      \n" - ."
      \n"); - - if ($error != "") - print("

      $error

      \n"); - else - { - show_prevnext_page($group, $group_filter, $start, $end, $count, $threaded); - - html_start_table(array("Subject", "Author", "Date/Time")); - - for ($i = $start; $i <= $end; $i ++) - { - $fields = explode("\t", $matches[$i - 1]); - $subject = htmlspecialchars(eregi_replace("\\[[a-z]+\\.[a-z]+\\] ", "", - $fields[1]), ENT_QUOTES); - $author = sanitize_email($fields[2]); - $date = format_date($fields[3]); - - if ($subject == "") - $subject = "(No Subject)"; - - html_start_row(); - print("" - ."$subject" - ."  $author  " - ."$date"); - html_end_row(); - } - - html_end_table(); - - show_prevnext_page($group, $group_filter, $start, $end, $count, $threaded); - } - - html_footer(); -} - - -// -// 'show_groups()' - Show groups... -// - -function -show_groups($group_filter, // I - Group filter - $search) // I - Search string -{ - global $PHP_SELF, $_COOKIE, $options; - - - nntp_header("Forums", - array("All Forums" => "forums.php?g$options")); - - // Figure out which messages to show... - $stream = nntp_connect(); - - // Search stuff... - print("
      \n" - ."

      Search Words:

      \n" - ."
      \n"); - - // Show the standard header... - html_start_table(array("Forum", "Messages", "")); - - $status = nntp_command($stream, "LIST", 215); - $num_groups = 0; - $groups = array(); - - if ((int)$status == 215) - { - while ($line = fgets($stream, 1024)) - { - $line = rtrim($line); - if ($line == ".") - break; - - $fields = explode(" ", $line); - $groups[$num_groups] = $fields[0]; - $num_groups ++; - } - } - - sort($groups); - - while (list($key, $group) = each($groups)) - { - if (ereg("(linuxprinting|private)\\..*", $group)) - continue; - - if ($group_filter && !ereg("${group_filter}\\.*", $group)) - continue; - - $status = nntp_command($stream, "GROUP $group", 211); - if ((int)$status != 211) - continue; - - $fields = explode(" ", $status); - $total = (int)$fields[1]; - - if ($search != "") - { - $matches = nntp_search($stream, $group, $search); - $mcount = count($matches); - $count = "$total total, $mcount match"; - } - else - { - $cookie = str_replace(".", "_", $group); - - if (array_key_exists($cookie, $_COOKIE)) - { - $newcount = (int)$fields[3] - (int)$_COOKIE[$cookie]; - - $count = "$total total, $newcount unread"; - } - else - $count = "$total total"; - } - - html_start_row(); - print("$group" - ."$count"); - - if ($search != "") - print("/$total"); - - print(""); - html_start_links(); - html_link("View", "$PHP_SELF?g$group$options"); - if (!ereg(".*\.announce", $group) && !ereg(".*\.commit", $group)) - html_link("New Message", "$PHP_SELF?g$group+n$options"); - html_end_links(); - print(""); - html_end_row(); - } - - html_start_row("header"); - print("Forums and Mailing Lists"); - html_end_row(); - html_start_row(); - print("" - ."

      Point your news reader at " - ."news.easysw.com to view these forums directly.

      \n" - ."

      Go to " - ."http://lists.easysw.com/mailman/listinfo " - ."to subscribe to or unsubcribe from the mailing lists that mirror " - ."these forums.

      " - .""); - html_end_row(); - html_end_table(); - - nntp_close($stream); - - html_footer(); -} - - -// -// 'show_prevnext_msg()' - Show the prev/next links for the messages list... -// - -function -show_prevnext_msg($group, // I - Group - $group_filter, // I - Group filter - $start, // I - Start message - $count, // I - Number of messages - $msg, // I - Current message - $threaded) // I - Thread messages? -{ - global $PHP_SELF, $options; - - - print("

      \n" - ."\n" - ."
      "); - - if ($msg > 1) - { - $i = $msg - 1; - - html_start_links(); - html_link("Previous Message", "$PHP_SELF?s$start+g$group+v$i$options"); - html_end_links(); - } - - print(""); - if (!ereg(".*\.announce", $group) && !ereg(".*\.commit", $group)) - { - html_start_links(); - html_link("New Message", "$PHP_SELF?s$start+g$group+n$options"); - html_link("Reply", "$PHP_SELF?s$start+g$group+r$msg$options"); - html_end_links(); - } - - print(""); - - if ($msg < $count) - { - $i = $msg + 1; - html_start_links(); - html_link("Next Message", "$PHP_SELF?s$start+g$group+v$i$options"); - html_end_links(); - } - - print("

      \n"); -} - - -// -// 'show_message()' - Show a single message... -// - -function -show_message($group, // I - Group - $group_filter, // I - Group filter - $start, // I - Start message - $msg, // I - Current message - $search, // I - Search string - $threaded) // I - Thread messages? -{ - global $PHP_SELF, $_COOKIE, $options; - - -// print("\n"); - - // Figure out which messages to show... - $stream = nntp_connect(); - $matches = nntp_search($stream, $group, $search, $threaded); - $count = count($matches); - - if ($msg[0] == ':') - { - // Lookup a specific message ID... - $msg = (int)substr($msg, 1); - - for ($i = 0; $i < $count; $i ++) - { - $fields = explode("\t", $matches[$i]); - - if ($msg == $fields[0]) - break; - } - - if ($i >= $count) - { - nntp_error("We were unable to show the requested message for the following " - ."reason:", "The message number ($msg) is out of range.", $group); - nntp_close($stream); - return; - } - - $msg = $i; - } - else - { - // Lookup index into search... - if ($msg < 1 || $msg > $count) - { - nntp_error("We were unable to show the requested message for the following " - ."reason:", "The message number is out of range.", $group); - nntp_close($stream); - return; - } - - $fields = explode("\t", $matches[$msg - 1]); - } - -// print("\n"); - - $msgnum = (int)$fields[0]; - $subject = htmlspecialchars(eregi_replace("\\[[a-z]+\\.[a-z]+\\] ", "", - $fields[1]), ENT_QUOTES); - $author = sanitize_email($fields[2]); - $date = format_date($fields[3]); - - if ($subject == "") - $subject = "(No Subject)"; - - // Save last message read... - $cookie = str_replace(".", "_", $group); - if ($search == "" && - (!array_key_exists($group, $_COOKIE) || (int)$_COOKIE[$cookie] < $msgnum)) - setcookie($cookie, $msgnum, time() + 90 * 86400, "/"); - - $status = nntp_command($stream, "BODY $msgnum", 222); - if ((int)$status != 222) - { - nntp_close($stream); - nntp_error("We were unable to show the requested message for the following " - ."reason:", $status, $group); - return (NULL); - } - - $body = ""; - while ($line = fgets($stream, 1024)) - { - $line = rtrim($line); - - if ($line == ".") - break; - - $body = $body . $line . "\n"; - } - - nntp_close($stream); - - $body = quote_text($body); - - nntp_header("$subject", - array("All Forums" => "forums.php?g$options", - "Back to $group" => "forums.php?g$group+s$start$options")); - - show_prevnext_msg($group, $group_filter, $start, $count, $msg, $threaded); - - html_start_table(array($subject, $author, $date), "", "", TRUE); - html_start_row(); - print("$body
      \n" - ."[ Direct Link" - ." to Message ]"); - html_end_row(); - html_end_table(); - - show_prevnext_msg($group, $group_filter, $start, $count, $msg, $threaded); - - html_footer(); -} - - -// -// 'post_message()' - Post a message... -// - -function -post_message($group, // I - Group - $group_filter, // I - Group filter - $start, // I - Start message - $msg, // I - Current message - $search, // I - Search string - $threaded) // I - Thread messages? -{ - global $LOGIN_USER, $PHP_SELF, $PROJECT_URL, $_POST, $options; - - - // Get form data... - if (array_key_exists("FROM", $_POST)) - $from = $_POST["FROM"]; - else - $from = ""; - - if (array_key_exists("SUBJECT", $_POST)) - $subject = $_POST["SUBJECT"]; - else - $subject = ""; - - if (array_key_exists("BODY", $_POST)) - $body = $_POST["BODY"]; - else - $body = ""; - - // Validate form data... - if (!validate_email($from) || $subject == "" || $body == "") - { - new_message($group, $group_filter, $start, $from, $subject, $body); - return; - } - - // Connect to the news server and get the reply-to message ID... - $stream = nntp_connect(); - if (!$stream) - { - return; - } - - $id = ""; - - if ($msg > 0) - { - $matches = nntp_search($stream, $group, $search, $threaded); - $count = count($matches); - - if ($msg <= $count) - { - $fields = explode("\t", $matches[$msg - 1]); - $id = $fields[4]; - } - } - - // Create the message body... - $message = "From: $from\r\n" - ."Subject: $subject\r\n" - ."Newsgroups: $group\r\n"; - - if ($id != "") - $message .= "In-Reply-To: $id\r\n"; - - $message .= "X-Login-Name: $LOGIN_USER\r\n" - ."X-Site-URL: $PROJECT_URL\r\n" - ."\r\n"; - - $lines = explode("\n", $body); - $count = count($lines); - - for ($i = 0; $i < $count; $i ++) - { - $line = rtrim($lines[$i]); - - if ($line == ".") - $message .= ". \r\n"; - else - $message .= "$line\r\n"; - } - - // Run the message by spamc to see if it thinks the message is - // spam... - $p = popen("spamc -c >/dev/null", "w"); - if ($p) - { - fwrite($p, $message); - if (pclose($p)) - { - // Message is spam... - nntp_header("$group Error", - array("All Forums" => "forums.php?g$options", - "Back to $group" => "forums.php?g$group+s$start$options")); - - print("

      Your message could not be posted for the following reason:

      \n" - ."
      The anti-spam filters determined that your message " - ."is most likely an unsolicited commercial message that is not " - ."allowed on this group. If this is not the case, please press your " - ."browser's Back button and check that the message does " - ."not contain common spam phrases like 'an offer for you' and so " - ."forth.
      \n"); - - html_footer(); - return; - } - } - - // Post the message... - $status = nntp_command($stream, "POST", 340); - - if ((int)$status != 340) - { - nntp_close($stream); - nntp_error("We were unable to post the requested message for the following " - ."reason:", $status, $group); - return; - } - - fwrite($stream, $message); - - // Get the posting status... - $status = nntp_command($stream, ".", 240); - - if ((int)$status == 240) - { - if ($msg == 0) - header("Location: $PHP_SELF?s$start+g$group$options"); - else - header("Location: $PHP_SELF?s$start+g$group+v$msg$options"); - } - else - nntp_error("We were unable to post the requested message for the following " - ."reason:", $status, $group); - - nntp_close($stream); -} - - -// -// 'reply_message()' - Reply to a message... -// - -function -reply_message($group, // I - Group to reply to - $group_filter, // I - Group filter - $start, // I - First message in the display - $msg, // I - Message to reply to - $search, // I - Search string - $threaded, // I - Thread messages? - $sender) // I - Sender address -{ - // Figure out which messages to show... - $stream = nntp_connect(); - $matches = nntp_search($stream, $group, $search, $threaded); - $count = count($matches); - - if ($msg < 1 || $msg > $count) - { - nntp_close($stream); - return; - } - - $fields = explode("\t", $matches[$msg - 1]); - $msgnum = (int)$fields[0]; - $subject = eregi_replace("\\[[a-z]+\\.[a-z]+\\] ", "", $fields[1]); - $author = sanitize_email($fields[2]); - $date = htmlspecialchars($fields[3], ENT_QUOTES); - - if (strncasecmp($subject, "re:", 3)) - $subject = "Re: " . $subject; - - $status = nntp_command($stream, "BODY $msgnum", 222); - if ((int)$status != 222) - { - nntp_close($stream); - nntp_error("We were unable to reply to the requested message for the following " - ."reason:", $status, $group); - return; - } - - $body = ""; - while ($line = fgets($stream, 1024)) - { - $line = rtrim($line); - - if ($line == ".") - break; - - $body = $body . "> " . $line . "\n"; - } - - nntp_close($stream); - - new_message($group, $group_filter, $start, $subject, $sender, $body); -} - - -// -// 'new_message()' - Post a new message... -// - -function -new_message($group, // I - Group to post to - $group_filter, // I - Group filter - $start, // I - First message - $subject, // I - Subject of message - $sender, // I - Sender address - $body) // I - Message body -{ - global $PHP_SELF, $NNTPSPEC, $options; - - - $subject = htmlspecialchars($subject, ENT_QUOTES); - $sender = htmlspecialchars($sender, ENT_QUOTES); - $body = htmlspecialchars($body, ENT_QUOTES); - - nntp_header("Post Message to $group", - array("All Forums" => "forums.php?g$options", - "Back to $group" => "forums.php?g$group+s$start$options")); - - print("

      Post Message to $group

      "); - - print("
      \n"); - - print("
      \n"); - print("" - ."\n"); - - print("" - ."\n"); - - print("" - ."\n"); - - print("" - ."\n"); - print("
      Subject:
      From:
      Body:
      \n"); - - print("
      \n"); - - html_footer(); -} - - -// Parse command-line options... -$start = 0; -$group = ""; -$op = 'l'; -$msg = ""; -$groups = "minixml"; - -if (array_key_exists("THREADED", $_COOKIE)) - $threaded = $_COOKIE["THREADED"] != 0; -else - $threaded = FALSE; - -if (array_key_exists("SEARCH", $_POST)) - $search = $_POST["SEARCH"]; -else - $search = ""; - -for ($i = 0; $i < $argc; $i ++) -{ - switch ($argv[$i][0]) - { - case 'g' : - $group = substr($argv[$i], 1); - break; - - case 'G' : - $groups = substr($argv[$i], 1); - break; - - case 'n' : - case 'p' : - case 'r' : - $op = $argv[$i][0]; - $msg = (int)substr($argv[$i], 1); - break; - - case 'v' : - $op = $argv[$i][0]; - $msg = substr($argv[$i], 1); - break; - - case 's' : - $start = (int)substr($argv[$i], 1); - break; - - case 'T' : // Set threading - $threaded = (int)substr($argv[$i], 1); - break; - - case 'Q' : // Set search text - $search = urldecode(substr($argv[$i], 1)); - $i ++; - while ($i < $argc) - { - $search .= urldecode(" $argv[$i]"); - $i ++; - } - break; - } -} - -setcookie("THREADED", $threaded, time() + 90 * 86400, "/"); - -if ($search != "") - $options = "+T$threaded+Q" . urlencode($search); -else - $options = "+T$threaded"; - -// Now handle the request... -switch ($op) -{ - case 'l' : // List - if ($group) - show_messages($group, $groups, $start, $search, $threaded); - else - show_groups($groups, $search); - break; - - case 'n' : // New message - if ($LOGIN_USER == "") - { - $options = str_replace("+", "%2B", "+g" . urlencode($group) . $options); - header("Location: login.php?PAGE=$PHP_SELF?n$options"); - return; - } - - new_message($group, $groups, $start, "", $from, ""); - break; - - case 'p' : // Post message - if ($LOGIN_USER == "") - { - $options = str_replace("+", "%2B", "+g" . urlencode($group) . $options); - header("Location: login.php?PAGE=$PHP_SELF?l$options"); - return; - } - - if (ereg(".*\.announce", $group) || ereg(".*\.commit", $group)) - { - nntp_header("Forum Posting Error", - array("All Forums" => "forums.php?g$options", - "Back to $group" => "forums.php?g$group+s$start$options")); - - print("

      We are sorry, but we could not post your message for the " - ."following reason:\n" - ."

      Forum $group is read-only.
      \n"); - - html_footer(); - - } - else - post_message($group, $groups, $start, $msg, $search, $threaded); - break; - - case 'r' : // Reply message - if ($LOGIN_USER == "") - { - $options = str_replace("+", "%2B", "+g" . urlencode($group) . $options); - header("Location: login.php?PAGE=$PHP_SELF?r$msg$options"); - return; - } - - reply_message($group, $groups, $start, $msg, $search, $threaded, - $from); - break; - - case 'v' : // View message - show_message($group, $groups, $start, $msg, $search, $threaded); - break; -} - - -// -// End of "$Id$". -// -?> diff --git a/www/images/.htaccess b/www/images/.htaccess deleted file mode 100644 index 6537b6a..0000000 --- a/www/images/.htaccess +++ /dev/null @@ -1,2 +0,0 @@ -DirectoryIndex off - diff --git a/www/images/black.gif b/www/images/black.gif deleted file mode 100644 index 26735dd150c446b7a35b39f2b611b61df7aa273f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35 jcmZ?wbh9u|WMp7uXkY+=|NsB%fM}2i0~3=ABZD;nd{G71 diff --git a/www/images/favicon.xcf.gz b/www/images/favicon.xcf.gz deleted file mode 100644 index c35df9c0e892a8728de326a24de387be9a321a3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42450 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 diff --git a/www/images/graph.gif b/www/images/graph.gif deleted file mode 100644 index de9568b05ec1f9f68e3ba5005c678005b968028c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44 scmZ?wbh9u|WMtrB_{hMppMjyCf#E+G=`a8RNZgT$wTEQ}dmw`~0Lb_V9RL6T diff --git a/www/images/logo-large.gif b/www/images/logo-large.gif deleted file mode 100644 index b73f1d7fc6c997074e1ce31def8f6481faca045a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2281 zcmcJK`9IT*1HeB!7|Yc@+QSm2OeBx%(cFuvNbaO`Ozx5U&M`M5M}~&neFr||l2ML-cS0sKZxObi6Ug9i^PDJiL` zsp;zK8WTMJCnslRWzlG~l9H0Ty1K^3#*U5- z27}Sx-_K&P*lhO9%*?{V!s6oM`uh5>U%&oW_&*A}0~bXCih%m>#_uOUc#n`5bVePM zYfcGa`5RQcZV0m~RBD@QL0?>oc{aNma#rKo;ODTL0j0GyYlT?C$x- zdQehQuOzvoQM2qbPG#riTjf~ZF3O@6mryfG%Tr@3swv?$_3=0EHAQ-g zbopmK>T&CS(tFk7M{X=27!y`7V(U(Bv5Cl9R%{c%<(j+H19C$Es7$UF0VV zW%+!>Twy=t(2~L-L5j?#!b;G8*EYECbZXnKnkFdH#+pyG+x0~tCPnOBTFU|RMX_Z| zd_d9(zv-^HA6Y-QV>j+KWgF2Fs;o5}HXM?Pu zicut;=g?aF%b39v)aNE}K*XtGDgXw<39APgPbNa&;`RwS2r)?&aAl;ncA2K)NNS9{ z61Ay)ML9ig33v3Ol+AV*Dsze6BjI;1>)rcSz?-BPXOxTev3zg(U8opupILRCj?-DV`YWcN`=PN=#9KpC zuVDHI4fbB@WMUEmV|2|YkJ7gklSwB?n&`t)gpe2)O$N|CF(?PZnE@jw3f#b{37%!Vf(Q=| zQSjmqz<0xZxasVUhmwdoEjGy*O~{aq|H}k&*xXnRdoo{Mn?^D`Kn%v_nZ3cy=?nF4 z&k0*X+dYi+aH$Ige7SFM=q^0-dI*tI;0d0NnD|t@lp@NE!J46kN}O7wD^%5cS;R8h z80+IL8y<^W?(3|2xN=vd2VTVs+JWDd!`wLvj>nPe!Pu@EUbw%Rpg!LfgRHM7t6sv@ z#NGbRKbly5DYwpsM9#Sz6(T^lR2wwS;~tWuo14Nrth6bhJ|RCE?cu7ovyrY# zh%a7Qeqc{L^Xr{oG04@&&>6quy{Upy^=Be_i|XKfJV68Cl~6SX3j>}scgiL_X<&5N zxT@XHzuj_w@E;|?amH-9ep|~XHMXr|hsRyME7tr&ZM5%=VeKpM*-=cc?Q0iXiXf9C z1Hw29^Ppo_Xd-yV0$h@rFDBg`^570Lf&bOosYB&0Xv`Wc(?BG$|9F{_?77z-#^zD%SQvy+SVAs z`O4lNf#B({@0X~o-aUh*)@K^lK0TYQGanqJ+7nlvnm#7N2f&1CY1EOG-C^+~wpE(z zOXH9Pvy~Uuo?l_VCr)j~z8lDeo{u^U(TXP-eHfe=hJRa!YOOPYz zFg*y!iBfB5F~#()<|^8G`ZO&&LP9J`GTx)F+}EJSOhWr(YS)V*{g1)`#J@73|M{Fg z3J`+LdZk+VR2frz_Nm4zCjJ135Q;@JZ(POd9A&nZ|WdKk8vf$eatV1fXu{GTzetmx3YV^ z@NAXQiw-x$D7UQ$ji^f_W_G^nywz%l;TKMBv379)Uce@0+WOzJfWRMrMRA&} zJYPHBv>+aHM`F%~i*3lQs2+3L<~mv~4megnF^s}BVB(U=ALFbYdL zMYb!L7dw=6OVM4ny8p_+h6jq~D|8&sp+}|Bnh#_^{D)m3cFw4a%?Jznstu$Ft?<3f zniyhOC652r{rZ*$0_h_PrA)|Khe3U2qA%m%t1!D6|804zyPF;N#vwl{;4l$1K8%gKZU zF(}AC-G=d79ViK=yNG+%@EM!6>UYA)^^zjjy ze?@QCQEqMFSwv2c=IA}39UkMUIU2~+J<%;UzvpWj**adwlxq+Mf8x&}Ab{b&P-^_C diff --git a/www/images/logo.gif b/www/images/logo.gif deleted file mode 100644 index c44c9e22f536d6ca6e0ac100f31851d68ed1e6a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 846 zcmV-U1F`%^Nk%v~VITk?0LFR%2L}fT2nY!Y2?`1d3kwSj3=9no4GsecBqSszCMGB-C@U)~EiElCFE2ScIXXHz zJUl!-Jv}}?K0rV~LqkJFMMXwNMn^|SNl8gcN=i#hOH52mO-)TsPEJrzP*PG-S65eB zT3TFOTwPsVVPRooV`FG&XlZF_YHDh1Y;0|9ZEkLEZ*OmMa&mWfcYAw#e}8{~fPjI4 zfrW*Ih=_=ZiHVAeii?Yjjg5_ukB^a&k(88_m6es3mzSHHo1C1So}Qkjrlzm2ud%VQ zv$M0bw6wOiwz#;sy1Kf%ySu!+yu-u8#KgqK#l^&dd%gf8n&CSlv&e74)($dn^ z)z#P6*Vx$D+1c6K+uPjS+}_^a-{0Ti;o;`y=I7_<>FMd}>gwz3>+bIE@9*#M@bLBZ z_4fAm_xJbs`1twx`TP6({r&y^{{H{}|NsC0|NsC0|NsC0|NsC0EC2ui03ZM$06+)+ zfO>*@U^f^B0Evo=i~t50H(-N$j5vBsKzd&^Z%zPZO#pFhHc)yOGkOz^tgWuBh>AgZ zBL!k>4MuniTY4l(cL+gxXJ%$kiw0lw;j zFM4uT0RXyKI|y}G!NU)&dN$7ciZ+6DBltNRK}Qb;emPjM((psUqJxVpJ$Rr82LLTq zK81>71b_)W9a60lNb(gDUjn+cd0<3Oodf`m=&7gY-aZp~>_};+YlRyfRDcPq+3H5g zeK-EuV0KiI02>7d(OKHmDbzvwsn_0fwxivxzK4pqS%gMo^-V06+m!?0E3DG`xvO<5;ZcUM#h6hi5_^Fg}FZYXuPifgKhBc<{l&M2`b2d?-l4gTM$M_nzPKh^2v=Y@w&%XWxU&AwpxUN!5RQ3HXULB diff --git a/www/index.php b/www/index.php deleted file mode 100644 index 7880785..0000000 --- a/www/index.php +++ /dev/null @@ -1,93 +0,0 @@ - - - - -

      Mini-XML: Lightweight XML Library

      - -

      Mini-XML is a small XML library that you can use to read and write XML and -XML-like data files in your application without requiring large non-standard -libraries. Mini-XML only requires an ANSI C compatible compiler (GCC works, as -do most vendors' ANSI C compilers) and a 'make' program.

      - -

      Mini-XML supports reading of UTF-8 and UTF-16 and writing of UTF-8 encoded -XML files and strings. Data is stored in a linked-list tree structure, -preserving the XML data hierarchy, and arbitrary element names, attributes, -and attribute values are supported with no preset limits, just available -memory.

      - - - -
      - -

      Documentation

      - -

      Introduction

      - -

      Getting Started with Mini-XML

      - -

      More Mini-XML Programming -Techniques

      - -

      Mini-XML License

      - -

      Library Reference

      - -
            - -

      Recent News

      - -$title - $abstract
      \n" - ."$date, $count

      \n"); -} - -db_free($result); - -?> - -
      - - diff --git a/www/login.php b/www/login.php deleted file mode 100644 index 2ca8cd1..0000000 --- a/www/login.php +++ /dev/null @@ -1,264 +0,0 @@ -\n"); - html_footer(); - exit(); - } - - db_free($result); - - $usererror = "Username already exists!"; - } - else if ($argc == 1 && $argv[0] == "E" && $username != "" && - $password != "" && $register != "") - { - // Check that we have an existing user account... - $name = db_escape($username); - $result = db_query("SELECT * FROM users WHERE name='$name'"); - if (db_count($result) == 1) - { - // Yes, now check the registration code... - $row = db_next($result); - $hash = md5("$row[id]:$row[hash]"); - - if ($hash == $register) - { - // Good code, enable the account and login... - db_query("UPDATE users SET is_published = 1 WHERE name='$name'"); - - if (auth_login($username, $password) == "") - { - db_query("UPDATE users SET is_published = 0 WHERE name='$name'"); - $usererror = "Login failed!"; - } - } - else - $usererror = "Bad registration code!"; - } - else - $usererror = "Username not found!"; - - db_free($result); - } - else if ($argc == 0 && $username != "" && $password != "") - if (auth_login($username, $password) == "") - $usererror = "Login failed!"; -} -else -{ - $username = ""; - $password = ""; - $password2 = ""; - $email = ""; - $register = ""; -} - -if ($LOGIN_USER != "") - header("Location: $page"); -else if ($argc == 0 || $argv[0] != "E") -{ - // Header + start of table... - html_header("Login"); - - print("\n" - ."" - ."" - ."\n" - ."
      \n"); - - // Existing users... - print("

      Current Users

      \n"); - - if ($argc == 0 && $usererror != "") - print("

      $usererror

      \n"); - - $page = htmlspecialchars($page, ENT_QUOTES); - - print("

      If you are a registered $PROJECT_NAME developer, please enter " - ."your username and password to login:

      \n" - ."
      " - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."\n" - ."
      Username:
      Password:" - ."
      \n"); - - // Separator... - print("
          " - ."" - ."    \n"); - - // New users... - print("

      New Users

      \n"); - - if ($argc == 1 && $usererror != "") - print("

      $usererror

      \n"); - - $username = htmlspecialchars($username, ENT_QUOTES); - $email = htmlspecialchars($email, ENT_QUOTES); - - print("

      If you are a not registered $PROJECT_NAME developer, please fill " - ."in the form below to register. An email will be sent to the " - ."address you supply to confirm the registration:

      \n" - ."
      " - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."\n" - ."
      Username:
      EMail:
      Password:" - ."
      Password Again:" - ."
      \n"); - - // End table - print("
      \n"); - - html_footer(); -} -else -{ - html_header("Enable Account"); - - if ($usererror != NULL) - print("

      $usererror

      \n"); - - $username = htmlspecialchars($username, ENT_QUOTES); - $register = htmlspecialchars($register, ENT_QUOTES); - - print("

      Please enter the registration code that was emailed to you " - ."with your username and password to enable your account and login:

      \n" - ."
      " - ."
      \n" - ."" - ."\n" - ."" - ."\n" - ."" - ."\n" - ."\n" - ."
      Registration Code:" - ."
      Username:
      Password:" - ."
      \n"); - - html_footer(); -} - - -// -// End of "$Id$". -// -?> diff --git a/www/mxml.html b/www/mxml.html deleted file mode 100644 index c20a101..0000000 --- a/www/mxml.html +++ /dev/null @@ -1,4222 +0,0 @@ - - - -Mini-XML Programmers Manual, Version 2.7 - - - - - - -

      Table of Contents

      -
      -
      Introduction - -Building, Installing, and Packaging Mini-XML - -Getting Started with Mini-XML - -More Mini-XML Programming Techniques - -Using the mxmldoc Utility - -Mini-XML License -
      -
      Release Notes -
        -Library Reference - -XML Schema -
          -
          -

          0Introduction

          -

          This programmers manual describes Mini-XML version 2.7, a small XML - parsing library that you can use to read and write XML data files in - your C and C++ applications.

          -

          Mini-XML was initially developed for the -Gutenprint project to replace the rather large and unwieldy -libxml2 library with something substantially smaller and - easier-to-use. It all began one morning in June of 2003 when Robert - posted the following sentence to the developer's list:

          -
          It's bad enough that we require libxml2, but rolling our - own XML parser is a bit more than we can handle.
          -

          I then replied with:

          -
          Given the limited scope of what you use in XML, it - should be trivial to code a mini-XML API in a few hundred lines of - code.
          -

          I took my own challenge and coded furiously for two days to produced - the initial public release of Mini-XML, total lines of code: 696. - Robert promptly integrated Mini-XML into Gutenprint and removed - libxml2.

          -

          Thanks to lots of feedback and support from various developers, - Mini-XML has evolved since then to provide a more complete XML - implementation and now stands at a whopping 3,965 lines of code, - compared to 103,893 lines of code for libxml2 version 2.6.9.

          -

          Aside from Gutenprint, Mini-XML is used for the following - projects/software applications:

          - -

          Please email me (mxml @ easysw . com) if you would like your project - added or removed from this list, or if you have any comments/quotes you - would like me to publish about your experiences with Mini-XML.

          - - -

          Organization of This Document

          -

          This manual is organized into the following chapters and appendices:

          - - - -

          Notation Conventions

          -

          Various font and syntax conventions are used in this guide. Examples - and their meanings and uses are explained below:

          -
          -
          mxmldoc -
          mxmldoc(1)
          -
          The names of commands; the first mention of a command or function in - a chapter is followed by a manual page section number. -
          -
          -
          /var -
          /etc/hosts
          -
          File and directory names. -
          -
          -
          Request ID is Printer-123
          -
          Screen output. -
          -
          -
          lp -d printer filename ENTER
          -
          Literal user input; special keys like ENTER are in ALL - CAPS. -
          -
          -
          12.3
          -
          Numbers in the text are written using the period (.) to indicate the - decimal point. -
          -
          -
          - - -

          Abbreviations

          -

          The following abbreviations are used throughout this manual:

          -
          -
          Gb
          -
          Gigabytes, or 1073741824 bytes -
          -
          -
          kb
          -
          Kilobytes, or 1024 bytes -
          -
          -
          Mb
          -
          Megabytes, or 1048576 bytes -
          -
          -
          UTF-8, UTF-16
          -
          Unicode Transformation Format, 8-bit or 16-bit -
          -
          -
          W3C
          -
          World Wide Web Consortium -
          -
          -
          XML
          -
          Extensible Markup Language -
          -
          -
          - - -

          Other References

          -
          -
          The Unicode Standard, Version 4.0, Addison-Wesley, ISBN - 0-321-18578-1
          -
          The definition of the Unicode character set which is used for XML. -
          -
          -
          Extensible - Markup Language (XML) 1.0 (Third Edition)
          -
          The XML specification from the World Wide Web Consortium (W3C) -
          -
          -
          - - -

          Legal Stuff

          -

          The Mini-XML library is copyright 2003-2011 by Michael Sweet. License - terms are described in Appendix A - Mini-XML License -.

          -
          -

          1Building, Installing, and - Packaging Mini-XML

          -

          This chapter describes how to build, install, and package Mini-XML on - your system from the source archive. You will need an ANSI/ISO-C - compatible compiler to build Mini-XML - GCC works, as do most vendors' - C compilers. If you are building Mini-XML on Windows, we recommend - using the Visual C++ environment with the supplied solution file. For - other operating systems, you'll need a POSIX-compatible shell and -make program in addition to the C compiler.

          -

          Compiling Mini-XML

          -

          Mini-XML comes with both an autoconf-based configure script and a - Visual C++ solution that can be used to compile the library and - associated tools.

          -

          Compiling with Visual C++

          -

          Open the mxml.sln solution in the vcnet folder. - Choose the desired build configuration, "Debug" (the default) or - "Release", and then choose Build Solution from the - Build menu.

          -

          Compiling with Command-Line Tools

          -

          Type the following command to configure the Mini-XML source code for - your system:

          -
          -    ./configure ENTER
          -
          -

          The default install prefix is /usr/local, which can be - overridden using the --prefix option:

          -
          -    ./configure --prefix=/foo ENTER
          -
          -

          Other configure options can be found using the --help - option:

          -
          -    ./configure --help ENTER
          -
          -

          Once you have configured the software, use the make(1) - program to do the build and run the test program to verify that things - are working, as follows:

          -
          -    make ENTER
          -
          -

          Installing Mini-XML

          -

          If you are using Visual C++, copy the mxml.lib and and - mxml.h files to the Visual C++ lib and include - directories, respectively.

          -

          Otherwise, use the make command with the install - target to install Mini-XML in the configured directories:

          -
          -    make install ENTER
          -
          -

          Creating Mini-XML Packages

          -

          Mini-XML includes two files that can be used to create binary - packages. The first file is mxml.spec which is used by the -rpmbuild(8) software to create Red Hat Package Manager ("RPM") - packages which are commonly used on Linux. Since rpmbuild - wants to compile the software on its own, you can provide it with the - Mini-XML tar file to build the package:

          -
          -    rpmbuild -ta mxml-version.tar.gz ENTER
          -
          -

          The second file is mxml.list which is used by the -epm(1) program to create software packages in a variety of formats. - The epm program is available from the following URL:

          -
          -    http://www.epmhome.org/
          -
          -

          Use the make command with the epm target to - create portable and native packages for your system:

          -
          -    make epm ENTER
          -
          -

          The packages are stored in a subdirectory named dist for - your convenience. The portable packages utilize scripts and tar files - to install the software on the target system. After extracting the - package archive, use the mxml.install script to install the - software.

          -

          The native packages will be in the local OS's native format: RPM for - Red Hat Linux, DPKG for Debian Linux, PKG for Solaris, and so forth. - Use the corresponding commands to install the native packages.

          -
          -

          2Getting Started with Mini-XML

          -

          This chapter describes how to write programs that use Mini-XML to - access data in an XML file. Mini-XML provides the following - functionality:

          -
            -
          • Functions for creating and managing XML documents in memory.
          • -
          • Reading of UTF-8 and UTF-16 encoded XML files and strings.
          • -
          • Writing of UTF-8 encoded XML files and strings.
          • -
          • Support for arbitrary element names, attributes, and attribute - values with no preset limits, just available memory.
          • -
          • Support for integer, real, opaque ("CDATA"), and text data types in - "leaf" nodes.
          • -
          • "Find", "index", and "walk" functions for easily accessing data in - an XML document.
          • -
          -

          Mini-XML doesn't do validation or other types of processing on the - data based upon schema files or other sources of definition - information, nor does it support character entities other than those - required by the XML specification.

          -

          The Basics

          -

          Mini-XML provides a single header file which you include:

          -
          -    #include <mxml.h>
          -
          -

          The Mini-XML library is included with your program using the --lmxml option:

          -
          -    gcc -o myprogram myprogram.c -lmxml ENTER
          -
          -

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

          -
          -    pkg-config --cflags mxml ENTER
          -    pkg-config --libs mxml ENTER
          -
          -

          Nodes

          -

          Every piece of information in an XML file is stored in memory in - "nodes". Nodes are defined by the -mxml_node_t structure. Each node has a typed value, optional - user data, a parent node, sibling nodes (previous and next), and - potentially child nodes.

          -

          For example, if you have an XML file like the following:

          -
          -    <?xml version="1.0" encoding="utf-8"?>
          -    <data>
          -        <node>val1</node>
          -        <node>val2</node>
          -        <node>val3</node>
          -        <group>
          -            <node>val4</node>
          -            <node>val5</node>
          -            <node>val6</node>
          -        </group>
          -        <node>val7</node>
          -        <node>val8</node>
          -    </data>
          -
          -

          the node tree for the file would look like the following in memory:

          -
          -    ?xml version="1.0" encoding="utf-8"?
          -      |
          -    data
          -      |
          -    node - node - node - group - node - node
          -      |      |      |      |       |      |
          -    val1   val2   val3     |     val7   val8
          -                           |
          -                         node - node - node
          -                           |      |      |
          -                         val4   val5   val6
          -
          -

          where "-" is a pointer to the sibling node and "|" is a pointer to - the first child or parent node.

          -

          The mxmlGetType function gets the - type of a node, one of MXML_CUSTOM, MXML_ELEMENT, -MXML_INTEGER, MXML_OPAQUE, MXML_REAL, or -MXML_TEXT. The parent and sibling nodes are accessed using the -mxmlGetParent, mxmlGetNext -, and mxmlGetPrevious functions. - The mxmlGetUserData function - gets any user data associated with the node.

          -

          CDATA Nodes

          -

          CDATA (MXML_ELEMENT) nodes are created using the -mxmlNewCDATA function. The -mxmlGetCDATA function retrieves the CDATA string pointer for a - node.

          -
          Note: -

          CDATA nodes are currently stored in memory as special elements. This - will be changed in a future major release of Mini-XML.

          -
          -

          Custom Nodes

          -

          Custom (MXML_CUSTOM) nodes are created using the -mxmlNewCustom function or using a custom load callback - specified using the -mxmlSetCustomHandlers function. The -mxmlGetCustom function retrieves the custom value pointer for a - node.

          -

          Comment Nodes

          -

          Comment (MXML_ELEMENT) nodes are created using the -mxmlNewElement function. The -mxmlGetElement function retrieves the comment string pointer - for a node, including the surrounding "!--" and "--" characters.

          -
          Note: -

          Comment nodes are currently stored in memory as special elements. - This will be changed in a future major release of Mini-XML.

          -
          -

          Element Nodes

          -

          Element (MXML_ELEMENT) nodes are created using the -mxmlNewElement function. The -mxmlGetElement function retrieves the element name, the -mxmlElementGetAttr function retrieves the value string for - a named attribute associated with the element, and the -mxmlGetFirstChild and -mxmlGetLastChild functions retrieve the first and last child - nodes for the element, respectively.

          -

          Integer Nodes

          -

          Integer (MXML_INTEGER) nodes are created using the -mxmlNewInteger function. The -mxmlGetInteger function retrieves the integer value for a node.

          -

          Opaque Nodes

          -

          Opaque (MXML_OPAQUE) nodes are created using the -mxmlNewOpaque function. The -mxmlGetOpaque function retrieves the opaque string pointer for - a node. Opaque nodes are like string nodes but preserve all whitespace - between nodes.

          -

          Text Nodes

          -

          Text (MXML_TEXT) nodes are created using the -mxmlNewText and mxmlNewTextf - functions. Each text node consists of a text string and (leading) - whitespace value - the mxmlGetText - function retrieves the text string pointer and whitespace value for a - node.

          - - -

          Processing Instruction Nodes

          -

          Processing instruction (MXML_ELEMENT) nodes are created - using the mxmlNewElement - function. The mxmlGetElement - function retrieves the processing instruction string for a node, - including the surrounding "?" characters.

          -
          Note: -

          Processing instruction nodes are currently stored in memory as - special elements. This will be changed in a future major release of - Mini-XML.

          -
          -

          Real Number Nodes

          -

          Real number (MXML_REAL) nodes are created using the -mxmlNewReal function. The -mxmlGetReal function retrieves the CDATA string pointer for a - node.

          - - -

          XML Declaration Nodes

          -

          XML declaration (MXML_ELEMENT) nodes are created using the mxmlNewXML function. The -mxmlGetElement function retrieves the XML declaration - string for a node, including the surrounding "?" characters.

          -
          Note: -

          XML declaration nodes are currently stored in memory as special - elements. This will be changed in a future major release of Mini-XML.

          -
          - -

          Creating XML Documents

          -

          You can create and update XML documents in memory using the various -mxmlNew functions. The following code will create the XML document - described in the previous section:

          -
          -    mxml_node_t *xml;    /* <?xml ... ?> */
          -    mxml_node_t *data;   /* <data> */
          -    mxml_node_t *node;   /* <node> */
          -    mxml_node_t *group;  /* <group> */
          -
          -    xml = mxmlNewXML("1.0");
          -
          -    data = mxmlNewElement(xml, "data");
          -
          -        node = mxmlNewElement(data, "node");
          -        mxmlNewText(node, 0, "val1");
          -        node = mxmlNewElement(data, "node");
          -        mxmlNewText(node, 0, "val2");
          -        node = mxmlNewElement(data, "node");
          -        mxmlNewText(node, 0, "val3");
          -
          -        group = mxmlNewElement(data, "group");
          -
          -            node = mxmlNewElement(group, "node");
          -            mxmlNewText(node, 0, "val4");
          -            node = mxmlNewElement(group, "node");
          -            mxmlNewText(node, 0, "val5");
          -            node = mxmlNewElement(group, "node");
          -            mxmlNewText(node, 0, "val6");
          -
          -        node = mxmlNewElement(data, "node");
          -        mxmlNewText(node, 0, "val7");
          -        node = mxmlNewElement(data, "node");
          -        mxmlNewText(node, 0, "val8");
          -
          - - -

          We start by creating the declaration node common to all XML files - using the mxmlNewXML function:

          -
          -    xml = mxmlNewXML("1.0");
          -
          -

          We then create the <data> node used for this document using - the mxmlNewElement function. The - first argument specifies the parent node (xml) while the - second specifies the element name (data):

          -
          -    data = mxmlNewElement(xml, "data");
          -
          -

          Each <node>...</node> in the file is created using the -mxmlNewElement and mxmlNewText - functions. The first argument of mxmlNewText specifies the - parent node (node). The second argument specifies whether - whitespace appears before the text - 0 or false in this case. The last - argument specifies the actual text to add:

          -
          -    node = mxmlNewElement(data, "node");
          -    mxmlNewText(node, 0, "val1");
          -
          -

          The resulting in-memory XML document can then be saved or processed - just like one loaded from disk or a string.

          - - -

          Loading XML

          -

          You load an XML file using the -mxmlLoadFile function:

          -
          -    FILE *fp;
          -    mxml_node_t *tree;
          -
          -    fp = fopen("filename.xml", "r");
          -    tree = mxmlLoadFile(NULL, fp,
          -                        MXML_TEXT_CALLBACK);
          -    fclose(fp);
          -
          -

          The first argument specifies an existing XML parent node, if any. - Normally you will pass NULL for this argument unless you are - combining multiple XML sources. The XML file must contain a complete - XML document including the ?xml element if the parent node is -NULL.

          -

          The second argument specifies the stdio file to read from, as opened - by fopen() or popen(). You can also use stdin - if you are implementing an XML filter program.

          -

          The third argument specifies a callback function which returns the - value type of the immediate children for a new element node: -MXML_CUSTOM, MXML_IGNORE, MXML_INTEGER, -MXML_OPAQUE, MXML_REAL, or MXML_TEXT. Load - callbacks are described in detail in Chapter - 3. The example code uses the MXML_TEXT_CALLBACK constant - which specifies that all data nodes in the document contain - whitespace-separated text values. Other standard callbacks include -MXML_IGNORE_CALLBACK, MXML_INTEGER_CALLBACK, -MXML_OPAQUE_CALLBACK, and MXML_REAL_CALLBACK.

          -

          The mxmlLoadString function - loads XML node trees from a string:

          - - -
          -    char buffer[8192];
          -    mxml_node_t *tree;
          -
          -    ...
          -    tree = mxmlLoadString(NULL, buffer,
          -                          MXML_TEXT_CALLBACK);
          -
          -

          The first and third arguments are the same as used for -mxmlLoadFile(). The second argument specifies the string or - character buffer to load and must be a complete XML document including - the ?xml element if the parent node is NULL.

          - - -

          Saving XML

          -

          You save an XML file using the -mxmlSaveFile function:

          -
          -    FILE *fp;
          -    mxml_node_t *tree;
          -
          -    fp = fopen("filename.xml", "w");
          -    mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
          -    fclose(fp);
          -
          -

          The first argument is the XML node tree to save. It should normally - be a pointer to the top-level ?xml node in your XML document.

          -

          The second argument is the stdio file to write to, as opened by -fopen() or popen(). You can also use stdout if - you are implementing an XML filter program.

          -

          The third argument is the whitespace callback to use when saving the - file. Whitespace callbacks are covered in detail in -Chapter 3. The previous example code uses the MXML_NO_CALLBACK - constant to specify that no special whitespace handling is required.

          -

          The mxmlSaveAllocString, - and mxmlSaveString functions - save XML node trees to strings:

          -
          -    char buffer[8192];
          -    char *ptr;
          -    mxml_node_t *tree;
          -
          -    ...
          -    mxmlSaveString(tree, buffer, sizeof(buffer),
          -                   MXML_NO_CALLBACK);
          -
          -    ...
          -    ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
          -
          -

          The first and last arguments are the same as used for -mxmlSaveFile(). The mxmlSaveString function takes pointer - and size arguments for saving the XML document to a fixed-size buffer, - while mxmlSaveAllocString() returns a string buffer that was - allocated using malloc().

          - - -

          Controlling Line Wrapping

          -

          When saving XML documents, Mini-XML normally wraps output lines at - column 75 so that the text is readable in terminal windows. The -mxmlSetWrapMargin function overrides the default wrap - margin:

          -
          -    /* Set the margin to 132 columns */
          -    mxmlSetWrapMargin(132);
          -
          -    /* Disable wrapping */
          -    mxmlSetWrapMargin(0);
          -
          -

          Memory Management

          -

          Once you are done with the XML data, use the -mxmlDelete function to recursively free the memory that is used - for a particular node or the entire tree:

          -
          -    mxmlDelete(tree);
          -
          -

          You can also use reference counting to manage memory usage. The -mxmlRetain and mxmlRelease - functions increment and decrement a node's use count, respectively. - When the use count goes to 0, mxmlRelease will automatically - call mxmlDelete to actually free the memory used by the node - tree. New nodes automatically start with a use count of 1.

          - - -

          Finding and Iterating Nodes

          -

          The mxmlWalkPrev and -mxmlWalkNextfunctions can be used to iterate through the - XML node tree:

          -
          -    mxml_node_t *node;
          -    
          -    node = mxmlWalkPrev(current, tree,
          -                        MXML_DESCEND);
          -
          -    node = mxmlWalkNext(current, tree,
          -                        MXML_DESCEND);
          -
          -

          In addition, you can find a named element/node using the -mxmlFindElement function:

          -
          -    mxml_node_t *node;
          -    
          -    node = mxmlFindElement(tree, tree, "name",
          -                           "attr", "value",
          -                           MXML_DESCEND);
          -
          -

          The name, attr, and value arguments can be - passed as NULL to act as wildcards, e.g.:

          - - -
          -    /* Find the first "a" element */
          -    node = mxmlFindElement(tree, tree, "a",
          -                           NULL, NULL,
          -                           MXML_DESCEND);
          -
          - - -
          -    /* Find the first "a" element with "href"
          -       attribute */
          -    node = mxmlFindElement(tree, tree, "a",
          -                           "href", NULL,
          -                           MXML_DESCEND);
          -
          - - -
          -    /* Find the first "a" element with "href"
          -       to a URL */
          -    node = mxmlFindElement(tree, tree, "a",
          -                           "href",
          -                           "http://www.easysw.com/",
          -                           MXML_DESCEND);
          -
          - - -
          -    /* Find the first element with a "src"
          -       attribute */
          -    node = mxmlFindElement(tree, tree, NULL,
          -                           "src", NULL,
          -                           MXML_DESCEND);
          -
          - - -
          -    /* Find the first element with a "src"
          -       = "foo.jpg" */
          -    node = mxmlFindElement(tree, tree, NULL,
          -                           "src", "foo.jpg",
          -                           MXML_DESCEND);
          -
          -

          You can also iterate with the same function:

          -
          -    mxml_node_t *node;
          -
          -    for (node = mxmlFindElement(tree, tree,
          -                                "name",
          -                                NULL, NULL,
          -                                MXML_DESCEND);
          -         node != NULL;
          -         node = mxmlFindElement(node, tree,
          -                                "name",
          -                                NULL, NULL,
          -                                MXML_DESCEND))
          -    {
          -      ... do something ...
          -    }
          -
          - - -

          The MXML_DESCEND argument can actually be one of three - constants:

          -
            -
          • MXML_NO_DESCEND means to not to look at any child nodes in - the element hierarchy, just look at siblings at the same level or - parent nodes until the top node or top-of-tree is reached. -

            The previous node from "group" would be the "node" element to the - left, while the next node from "group" would be the "node" element to - the right. -
            -

            -
          • -
          • MXML_DESCEND_FIRST means that it is OK to descend to the - first child of a node, but not to descend further when searching. - You'll normally use this when iterating through direct children of a - parent node, e.g. all of the "node" and "group" elements under the - "?xml" parent node in the example above. -

            This mode is only applicable to the search function; the walk - functions treat this as MXML_DESCEND since every call is a - first time. -
            -

            -
          • -
          • MXML_DESCEND means to keep descending until you hit the - bottom of the tree. The previous node from "group" would be the "val3" - node and the next node would be the first node element under "group". -

            If you were to walk from the root node "?xml" to the end of the tree - with mxmlWalkNext(), the order would be:

            -

            ?xml data node val1 node val2 node val3 group node val4 node val5 - node val6 node val7 node val8

            -

            If you started at "val8" and walked using mxmlWalkPrev(), - the order would be reversed, ending at "?xml".

            -
          • -
          -

          Finding Specific Nodes

          -

          You can find specific nodes in the tree using the -mxmlFindPath, for example:

          -
          -    mxml_node_t *value;
          -
          -    value = mxmlFindPath(tree, "path/to/*/foo/bar");
          -
          -

          The second argument is a "path" to the parent node. Each component of - the path is separated by a slash (/) and represents a named element in - the document tree or a wildcard (*) path representing 0 or more - intervening nodes.

          -
          -

          3More Mini-XML Programming - Techniques

          -

          This chapter shows additional ways to use the Mini-XML library in - your programs.

          -

          Load Callbacks

          -

          Chapter 2 introduced the -mxmlLoadFile() and -mxmlLoadString() functions. The last argument to these - functions is a callback function which is used to determine the value - type of each data node in an XML document.

          -

          Mini-XML defines several standard callbacks for simple XML data - files:

          -
            -
          • MXML_INTEGER_CALLBACK - All data nodes contain - whitespace-separated integers.
          • -
          • MXML_OPAQUE_CALLBACK - All data nodes contain opaque - strings ("CDATA").
          • -
          • MXML_REAL_CALLBACK - All data nodes contain - whitespace-separated floating-point numbers.
          • -
          • MXML_TEXT_CALLBACK - All data nodes contain - whitespace-separated strings.
          • -
          -

          You can provide your own callback functions for more complex XML - documents. Your callback function will receive a pointer to the current - element node and must return the value type of the immediate children - for that element node: MXML_INTEGER, MXML_OPAQUE, -MXML_REAL, or MXML_TEXT. The function is called after - the element and its attributes have been read, so you can look at the - element name, attributes, and attribute values to determine the proper - value type to return.

          - - -

          The following callback function looks for an attribute named "type" - or the element name to determine the value type for its child nodes:

          -
          -    mxml_type_t
          -    type_cb(mxml_node_t *node)
          -    {
          -      const char *type;
          -
          -     /*
          -      * You can lookup attributes and/or use the
          -      * element name, hierarchy, etc...
          -      */
          -
          -      type = mxmlElementGetAttr(node, "type");
          -      if (type == NULL)
          -	type = mxmlGetElement(node);
          -
          -      if (!strcmp(type, "integer"))
          -	return (MXML_INTEGER);
          -      else if (!strcmp(type, "opaque"))
          -	return (MXML_OPAQUE);
          -      else if (!strcmp(type, "real"))
          -	return (MXML_REAL);
          -      else
          -	return (MXML_TEXT);
          -    }
          -
          -

          To use this callback function, simply use the name when you call any - of the load functions:

          -
          -    FILE *fp;
          -    mxml_node_t *tree;
          -
          -    fp = fopen("filename.xml", "r");
          -    tree = mxmlLoadFile(NULL, fp, type_cb);
          -    fclose(fp);
          -
          -

          Save Callbacks

          -

          Chapter 2 also introduced the -mxmlSaveFile(), -mxmlSaveString(), and -mxmlSaveAllocString() functions. The last argument to these - functions is a callback function which is used to automatically insert - whitespace in an XML document.

          -

          Your callback function will be called up to four times for each - element node with a pointer to the node and a "where" value of -MXML_WS_BEFORE_OPEN, MXML_WS_AFTER_OPEN, -MXML_WS_BEFORE_CLOSE, or MXML_WS_AFTER_CLOSE. The callback - function should return NULL if no whitespace should be added - and the string to insert (spaces, tabs, carriage returns, and newlines) - otherwise.

          -

          The following whitespace callback can be used to add whitespace to - XHTML output to make it more readable in a standard text editor:

          -
          -    const char *
          -    whitespace_cb(mxml_node_t *node,
          -                  int where)
          -    {
          -      const char *name;
          -
          -     /*
          -      * We can conditionally break to a new line
          -      * before or after any element. These are
          -      * just common HTML elements...
          -      */
          -
          -      name = mxmlGetElement(node);
          -
          -      if (!strcmp(name, "html") ||
          -          !strcmp(name, "head") ||
          -          !strcmp(name, "body") ||
          -	  !strcmp(name, "pre") ||
          -          !strcmp(name, "p") ||
          -	  !strcmp(name, "h1") ||
          -          !strcmp(name, "h2") ||
          -          !strcmp(name, "h3") ||
          -	  !strcmp(name, "h4") ||
          -          !strcmp(name, "h5") ||
          -          !strcmp(name, "h6"))
          -      {
          -       /*
          -	* Newlines before open and after
          -        * close...
          -	*/
          -
          -	if (where == MXML_WS_BEFORE_OPEN ||
          -            where == MXML_WS_AFTER_CLOSE)
          -	  return ("\n");
          -      }
          -      else if (!strcmp(name, "dl") ||
          -               !strcmp(name, "ol") ||
          -               !strcmp(name, "ul"))
          -      {
          -       /*
          -	* Put a newline before and after list
          -        * elements...
          -	*/
          -
          -	return ("\n");
          -      }
          -      else if (!strcmp(name, "dd") ||
          -               !strcmp(name, "dt") ||
          -               !strcmp(name, "li"))
          -      {
          -       /*
          -	* Put a tab before <li>'s, * <dd>'s,
          -        * and <dt>'s, and a newline after them...
          -	*/
          -
          -	if (where == MXML_WS_BEFORE_OPEN)
          -	  return ("\t");
          -	else if (where == MXML_WS_AFTER_CLOSE)
          -	  return ("\n");
          -      }
          -
          -     /*
          -      * Return NULL for no added whitespace...
          -      */
          -
          -      return (NULL);
          -    }
          -
          -

          To use this callback function, simply use the name when you call any - of the save functions:

          -
          -    FILE *fp;
          -    mxml_node_t *tree;
          -
          -    fp = fopen("filename.xml", "w");
          -    mxmlSaveFile(tree, fp, whitespace_cb);
          -    fclose(fp);
          -
          - - -

          Custom Data Types

          -

          Mini-XML supports custom data types via global load and save - callbacks. Only a single set of callbacks can be active at any time, - however your callbacks can store additional information in order to - support multiple custom data types as needed. The MXML_CUSTOM - node type identifies custom data nodes.

          -

          The load callback receives a pointer to the current data node and a - string of opaque character data from the XML source with character - entities converted to the corresponding UTF-8 characters. For example, - if we wanted to support a custom date/time type whose value is encoded - as "yyyy-mm-ddThh:mm:ssZ" (ISO format), the load callback would look - like the following:

          -
          -    typedef struct
          -    {
          -      unsigned      year,    /* Year */
          -                    month,   /* Month */
          -                    day,     /* Day */
          -                    hour,    /* Hour */
          -                    minute,  /* Minute */
          -                    second;  /* Second */
          -      time_t        unix;    /* UNIX time */
          -    } iso_date_time_t;
          -
          -    int
          -    load_custom(mxml_node_t *node,
          -                const char *data)
          -    {
          -      iso_date_time_t *dt;
          -      struct tm tmdata;
          -
          -     /*
          -      * Allocate data structure...
          -      */
          -
          -      dt = calloc(1, sizeof(iso_date_time_t));
          -
          -     /*
          -      * Try reading 6 unsigned integers from the
          -      * data string...
          -      */
          -
          -      if (sscanf(data, "%u-%u-%uT%u:%u:%uZ",
          -                 &(dt->year), &(dt->month),
          -                 &(dt->day), &(dt->hour),
          -                 &(dt->minute),
          -                 &(dt->second)) != 6)
          -      {
          -       /*
          -        * Unable to read numbers, free the data
          -        * structure and return an error...
          -        */
          -
          -        free(dt);
          -
          -        return (-1);
          -      }
          -
          -     /*
          -      * Range check values...
          -      */
          -
          -      if (dt->month <1 || dt->month > 12 ||
          -          dt->day  <1 || dt->day > 31 ||
          -          dt->hour  <0 || dt->hour > 23 ||
          -          dt->minute  <0 || dt->minute > 59 ||
          -          dt->second  <0 || dt->second > 59)
          -      {
          -       /*
          -        * Date information is out of range...
          -        */
          -
          -        free(dt);
          -
          -        return (-1);
          -      }
          -
          -     /*
          -      * Convert ISO time to UNIX time in
          -      * seconds...
          -      */
          -
          -      tmdata.tm_year = dt->year - 1900;
          -      tmdata.tm_mon  = dt->month - 1;
          -      tmdata.tm_day  = dt->day;
          -      tmdata.tm_hour = dt->hour;
          -      tmdata.tm_min  = dt->minute;
          -      tmdata.tm_sec  = dt->second;
          -
          -      dt->unix = gmtime(&tmdata);
          -
          -     /*
          -      * Assign custom node data and destroy
          -      * function pointers...
          -      */
          -
          -      mxmlSetCustom(node, data, destroy);
          -
          -     /*
          -      * Return with no errors...
          -      */
          -
          -      return (0);
          -    }
          -
          -

          The function itself can return 0 on success or -1 if it is unable to - decode the custom data or the data contains an error. Custom data nodes - contain a void pointer to the allocated custom data for the - node and a pointer to a destructor function which will free the custom - data when the node is deleted.

          - - -

          The save callback receives the node pointer and returns an allocated - string containing the custom data value. The following save callback - could be used for our ISO date/time type:

          -
          -    char *
          -    save_custom(mxml_node_t *node)
          -    {
          -      char data[255];
          -      iso_date_time_t *dt;
          -
          -
          -      dt = (iso_date_time_t *)mxmlGetCustom(node);
          -
          -      snprintf(data, sizeof(data),
          -               "%04u-%02u-%02uT%02u:%02u:%02uZ",
          -               dt->year, dt->month, dt->day,
          -               dt->hour, dt->minute, dt->second);
          -
          -      return (strdup(data));
          -    }
          -
          -

          You register the callback functions using the -mxmlSetCustomHandlers() function:

          -
          -    mxmlSetCustomHandlers(load_custom,
          -                          save_custom);
          -
          - - -

          Changing Node Values

          -

          All of the examples so far have concentrated on creating and loading - new XML data nodes. Many applications, however, need to manipulate or - change the nodes during their operation, so Mini-XML provides functions - to change node values safely and without leaking memory.

          -

          Existing nodes can be changed using the -mxmlSetElement(), -mxmlSetInteger(), mxmlSetOpaque() -, mxmlSetReal(), -mxmlSetText(), and -mxmlSetTextf() functions. For example, use the following - function call to change a text node to contain the text "new" with - leading whitespace:

          -
          -    mxml_node_t *node;
          -
          -    mxmlSetText(node, 1, "new");
          -
          -

          Formatted Text

          -

          The mxmlNewTextf() and -mxmlSetTextf() functions create and change text nodes, - respectively, using printf-style format strings and arguments. - For example, use the following function call to create a new text node - containing a constructed filename:

          -
          -    mxml_node_t *node;
          -
          -    node = mxmlNewTextf(node, 1, "%s/%s",
          -                        path, filename);
          -
          -

          Indexing

          -

          Mini-XML provides functions for managing indices of nodes. The - current implementation provides the same functionality as -mxmlFindElement(). The advantage of using an index is that - searching and enumeration of elements is significantly faster. The only - disadvantage is that each index is a static snapshot of the XML - document, so indices are not well suited to XML data that is updated - more often than it is searched. The overhead of creating an index is - approximately equal to walking the XML document tree. Nodes in the - index are sorted by element name and attribute value.

          -

          Indices are stored in mxml_index_t - structures. The mxmlIndexNew() - function creates a new index:

          -
          -    mxml_node_t *tree;
          -    mxml_index_t *ind;
          -
          -    ind = mxmlIndexNew(tree, "element",
          -                       "attribute");
          -
          -

          The first argument is the XML node tree to index. Normally this will - be a pointer to the ?xml element.

          -

          The second argument contains the element to index; passing NULL - indexes all element nodes alphabetically.

          -

          The third argument contains the attribute to index; passing NULL - causes only the element name to be indexed.

          -

          Once the index is created, the -mxmlIndexEnum(), mxmlIndexFind() -, and mxmlIndexReset() - functions are used to access the nodes in the index. The -mxmlIndexReset() function resets the "current" node pointer - in the index, allowing you to do new searches and enumerations on the - same index. Typically you will call this function prior to your calls - to mxmlIndexEnum() and -mxmlIndexFind().

          -

          The mxmlIndexEnum() function - enumerates each of the nodes in the index and can be used in a loop as - follows:

          -
          -    mxml_node_t *node;
          -
          -    mxmlIndexReset(ind);
          -
          -    while ((node = mxmlIndexEnum(ind)) != NULL)
          -    {
          -      // do something with node
          -    }
          -
          -

          The mxmlIndexFind() function - locates the next occurrence of the named element and attribute value in - the index. It can be used to find all matching elements in an index, as - follows:

          -
          -    mxml_node_t *node;
          -
          -    mxmlIndexReset(ind);
          -
          -    while ((node = mxmlIndexFind(ind, "element",
          -                                 "attr-value"))
          -                != NULL)
          -    {
          -      // do something with node
          -    }
          -
          -

          The second and third arguments represent the element name and - attribute value, respectively. A NULL pointer is used to - return all elements or attributes in the index. Passing NULL - for both the element name and attribute value is equivalent to calling -mxmlIndexEnum.

          -

          When you are done using the index, delete it using the -mxmlIndexDelete() function:

          -
          -    mxmlIndexDelete(ind);
          -
          -

          SAX (Stream) Loading of Documents

          -

          Mini-XML supports an implementation of the Simple API for XML (SAX) - which allows you to load and process an XML document as a stream of - nodes. Aside from allowing you to process XML documents of any size, - the Mini-XML implementation also allows you to retain portions of the - document in memory for later processing.

          -

          The mxmlSAXLoadFd, -mxmlSAXLoadFile, and -mxmlSAXLoadString functions provide the SAX loading APIs. 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
          -    sax_cb(mxml_node_t *node,
          -           mxml_sax_event_t event,
          -           void *data)
          -    {
          -      ... do something ...
          -    }
          -
          -

          The event will be one of the following:

          -
            -
          • MXML_SAX_CDATA - CDATA was just read
          • -
          • MXML_SAX_COMMENT - A comment was just read
          • -
          • MXML_SAX_DATA - Data (custom, integer, opaque, real, or - text) was just read
          • -
          • MXML_SAX_DIRECTIVE - A processing directive was just read
          • -
          • MXML_SAX_ELEMENT_CLOSE - A close element was just read ( -</element>)
          • -
          • MXML_SAX_ELEMENT_OPEN - An open element was just read ( -<element>)
          • -
          -

          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
          -    sax_cb(mxml_node_t *node,
          -           mxml_sax_event_t event,
          -           void *data)
          -    {
          -      if (event != MXML_SAX_ELEMENT_CLOSE)
          -        mxmlRetain(node);
          -    }
          -
          -

          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 <!DOCTYPE ... >:

          - - -
          -    void
          -    sax_cb(mxml_node_t *node,
          -           mxml_sax_event_t event,
          -           void *data)
          -    {
          -      if (event == MXML_SAX_ELEMENT_OPEN)
          -      {
          -       /*
          -        * Retain headings and titles...
          -        */
          -
          -        char *name = mxmlGetElement(node);
          -
          -        if (!strcmp(name, "html") ||
          -            !strcmp(name, "head") ||
          -            !strcmp(name, "title") ||
          -            !strcmp(name, "body") ||
          -            !strcmp(name, "h1") ||
          -            !strcmp(name, "h2") ||
          -            !strcmp(name, "h3") ||
          -            !strcmp(name, "h4") ||
          -            !strcmp(name, "h5") ||
          -            !strcmp(name, "h6"))
          -          mxmlRetain(node);
          -      }
          -      else if (event == MXML_SAX_DIRECTIVE)
          -        mxmlRetain(node);
          -      else if (event == MXML_SAX_DATA)
          -      {
          -        if (mxmlGetRefCount(mxmlGetParent(node)) > 1)
          -        {
          -         /*
          -          * If the parent was retained, then retain
          -          * this data node as well.
          -          */
          -
          -          mxmlRetain(node);
          -        }
          -      }
          -    }
          -
          -

          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:

          -
          -    mxml_node_t *doc, *title, *body, *heading;
          -
          -    doc = mxmlSAXLoadFd(NULL, 0,
          -                        MXML_TEXT_CALLBACK,
          -                        sax_cb, NULL);
          -
          -    title = mxmlFindElement(doc, doc, "title",
          -                            NULL, NULL,
          -                            MXML_DESCEND);
          -
          -    if (title)
          -      print_children(title);
          -
          -    body = mxmlFindElement(doc, doc, "body",
          -                           NULL, NULL,
          -                           MXML_DESCEND);
          -
          -    if (body)
          -    {
          -      for (heading = mxmlGetFirstChild(body);
          -           heading;
          -           heading = mxmlGetNextSibling(heading))
          -        print_children(heading);
          -    }
          -
          -
          -

          4Using the mxmldoc Utility

          -

          This chapter describes how to use mxmldoc(1) program to - automatically generate documentation from C and C++ source files.

          -

          The Basics

          -

          Originally developed to generate the Mini-XML and CUPS API - documentation, mxmldoc is now a general-purpose utility which - scans C and C++ source files to produce HTML and man page documentation - along with an XML file representing the functions, types, and - definitions in those source files. Unlike popular documentation - generators like Doxygen or Javadoc, mxmldoc uses in-line - comments rather than comment headers, allowing for more "natural" code - documentation.

          -

          By default, mxmldoc produces HTML documentation. For - example, the following command will scan all of the C source and header - files in the current directory and produce a HTML documentation file - called filename.html:

          -
          -    mxmldoc *.h *.c >filename.html ENTER
          -
          -

          You can also specify an XML file to create which contains all of the - information from the source files. For example, the following command - creates an XML file called filename.xml in addition to the - HTML file:

          -
          -    mxmldoc filename.xml *.h *.c >filename.html ENTER
          -
          -

          The --no-output option disables the normal HTML output:

          -
          -    mxmldoc --no-output filename.xml *.h *.c ENTER
          -
          -

          You can then run mxmldoc again with the XML file alone to - generate the HTML documentation:

          -
          -    mxmldoc filename.xml >filename.html ENTER
          -
          -

          Creating Man Pages

          -

          The --man filename option tells mxmldoc to create a - man page instead of HTML documentation, for example:

          -
          -    mxmldoc --man filename filename.xml \
          -        >filename.man ENTER
          -
          -    mxmldoc --man filename *.h *.c \
          -        >filename.man ENTER
          -
          -

          Creating Xcode Documentation Sets

          -

          The --docset directory.docset option tells mxmldoc - to create an Xcode documentation set containing the HTML documentation, - for example:

          -
          -    mxmldoc --docset foo.docset *.h *.c foo.xml ENTER
          -
          -

          Xcode documentation sets can only be built on Mac OS X with Xcode 3.0 - or higher installed.

          -

          Commenting Your Code

          -

          As noted previously, mxmldoc looks for in-line comments to - describe the functions, types, and constants in your code. Mxmldoc - will document all public names it finds in your source files - any - names starting with the underscore character (_) or names that are - documented with the @private@ directive are - treated as private and are not documented.

          -

          Comments appearing directly before a function or type definition are - used to document that function or type. Comments appearing after - argument, definition, return type, or variable declarations are used to - document that argument, definition, return type, or variable. For - example, the following code excerpt defines a key/value structure and a - function that creates a new instance of that structure:

          -
          -    /* A key/value pair. This is used with the
          -       dictionary structure. */
          -
          -    struct keyval
          -    {
          -      char *key; /* Key string */
          -      char *val; /* Value string */
          -    };
          -
          -    /* Create a new key/value pair. */
          -
          -    struct keyval * /* New key/value pair */
          -    new_keyval(
          -        const char *key, /* Key string */
          -	const char *val) /* Value string */
          -    {
          -      ...
          -    }
          -
          -

          Mxmldoc also knows to remove extra asterisks (*) from the - comment string, so the comment string:

          -
          -    /*
          -     * Compute the value of PI.
          -     *
          -     * The function connects to an Internet server
          -     * that streams audio of mathematical monks
          -     * chanting the first 100 digits of PI.
          -     */
          -
          -

          will be shown as:

          -
          -    Compute the value of PI.
          -
          -    The function connects to an Internet server
          -    that streams audio of mathematical monks
          -    chanting the first 100 digits of PI.
          -
          -

          Comments can also include the following - special @name ...@ directive strings:

          -
            -
          • @deprecated@ - flags the item as deprecated to discourage - its use
          • -
          • @private@ - flags the item as private so it will not be - included in the documentation
          • -
          • @since ...@ - flags the item as new since a particular - release. The text following the @since up to the closing @ - is highlighted in the generated documentation, e.g. @since Mini-XML - 2.7@.
          • -
          - - -

          Titles, Sections, and Introductions

          -

          Mxmldoc also provides options to set the title, section, and - introduction text for the generated documentation. The --title text - option specifies the title for the documentation. The title string is - usually put in quotes:

          -
          -    mxmldoc filename.xml \
          -        --title "My Famous Documentation" \
          -        >filename.html ENTER
          -
          -

          The --section name option specifies the section for the - documentation. For HTML documentation, the name is placed in a HTML - comment such as:

          -
          -    <!-- SECTION: name -->
          -
          -

          For man pages, the section name is usually just a number ("3"), or a - number followed by a vendor name ("3acme"). The section name is used in - the .TH directive in the man page:

          -
          -    .TH mylibrary 3acme "My Title" ...
          -
          -

          The default section name for man page output is "3". There is no - default section name for HTML output.

          -

          Finally, the --intro filename option specifies a file to - embed after the title and section but before the generated - documentation. For HTML documentation, the file must consist of valid - HTML without the usual DOCTYPE, html, and body - elements. For man page documentation, the file must consist of valid -nroff(1) text.

          -
          -

          AMini-XML License

          -

          The Mini-XML library and included programs are provided under the - terms of the GNU Library General Public License version 2 (LGPL2) with - the following exceptions:

          -

          1. Static linking of applications to the Mini-XML library does - not constitute a derivative work and does not require the author to - provide source code for the application, use the shared Mini-XML - libraries, or link their applications against a user-supplied version - of Mini-XML.

          -

          If you link the application to a modified version of Mini-XML, - then the changes to Mini-XML must be provided under the terms of the - LGPL2 in sections 1, 2, and 4.

          -

          2. You do not have to provide a copy of the Mini-XML license - with programs that are linked to the Mini-XML library, nor do you have - to identify the Mini-XML license in your program or documentation as - required by section 6 of the LGPL2.

          -

           

          -

          GNU LIBRARY GENERAL PUBLIC LICENSE

          -

          Version 2, June 1991 -
          Copyright (C) 1991 Free Software Foundation, Inc. -
          59 Temple Place - Suite 330, Boston, MA 02111-1307, USA -
          Everyone is permitted to copy and distribute verbatim copies of - this license document, but changing it is not allowed. -
          [This is the first released version of the library GPL. It is - numbered 2 because it goes with version 2 of the ordinary GPL.]

          -

          Preamble

          -

          The licenses for most software are designed to take away your freedom - to share and change it. By contrast, the GNU General Public Licenses - are intended to guarantee your freedom to share and change free - software--to make sure the software is free for all its users.

          -

          This license, the Library General Public License, applies to some - specially designated Free Software Foundation software, and to any - other libraries whose authors decide to use it. You can use it for your - libraries, too.

          -

          When we speak of free software, we are referring to freedom, not - price. Our General Public Licenses are designed to make sure that you - have the freedom to distribute copies of free software (and charge for - this service if you wish), that you receive source code or can get it - if you want it, that you can change the software or use pieces of it in - new free programs; and that you know you can do these things.

          -

          To protect your rights, we need to make restrictions that forbid - anyone to deny you these rights or to ask you to surrender the rights. - These restrictions translate to certain responsibilities for you if you - distribute copies of the library, or if you modify it.

          -

          For example, if you distribute copies of the library, whether gratis - or for a fee, you must give the recipients all the rights that we gave - you. You must make sure that they, too, receive or can get the source - code. If you link a program with the library, you must provide complete - object files to the recipients so that they can relink them with the - library, after making changes to the library and recompiling it. And - you must show them these terms so they know their rights.

          -

          Our method of protecting your rights has two steps: (1) copyright the - library, and (2) offer you this license which gives you legal - permission to copy, distribute and/or modify the library.

          -

          Also, for each distributor's protection, we want to make certain that - everyone understands that there is no warranty for this free library. - If the library is modified by someone else and passed on, we want its - recipients to know that what they have is not the original version, so - that any problems introduced by others will not reflect on the original - authors' reputations.

          -

          Finally, any free program is threatened constantly by software - patents. We wish to avoid the danger that companies distributing free - software will individually obtain patent licenses, thus in effect - transforming the program into proprietary software. To prevent this, we - have made it clear that any patent must be licensed for everyone's free - use or not licensed at all.

          -

          Most GNU software, including some libraries, is covered by the - ordinary GNU General Public License, which was designed for utility - programs. This license, the GNU Library General Public License, applies - to certain designated libraries. This license is quite different from - the ordinary one; be sure to read it in full, and don't assume that - anything in it is the same as in the ordinary license.

          -

          The reason we have a separate public license for some libraries is - that they blur the distinction we usually make between modifying or - adding to a program and simply using it. Linking a program with a - library, without changing the library, is in some sense simply using - the library, and is analogous to running a utility program or - application program. However, in a textual and legal sense, the linked - executable is a combined work, a derivative of the original library, - and the ordinary General Public License treats it as such.

          -

          Because of this blurred distinction, using the ordinary General - Public License for libraries did not effectively promote software - sharing, because most developers did not use the libraries. We - concluded that weaker conditions might promote sharing better.

          -

          However, unrestricted linking of non-free programs would deprive the - users of those programs of all benefit from the free status of the - libraries themselves. This Library General Public License is intended - to permit developers of non-free programs to use free libraries, while - preserving your freedom as a user of such programs to change the free - libraries that are incorporated in them. (We have not seen how to - achieve this as regards changes in header files, but we have achieved - it as regards changes in the actual functions of the Library.) The hope - is that this will lead to faster development of free libraries.

          -

          The precise terms and conditions for copying, distribution and - modification follow. Pay close attention to the difference between a - "work based on the libary" and a "work that uses the library". The - former contains code derived from the library, while the latter only - works together with the library.

          -

          Note that it is possible for a library to be covered by the ordinary - General Public License rather than by this special one.

          -

          TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND - MODIFICATION

          -

          0. This License Agreement applies to any software - library which contains a notice placed by the copyright holder or other - authorized party saying it may be distributed under the terms of this - Library General Public License (also called "this License"). Each - licensee is addressed as "you".

          -

          A "library" means a collection of software functions and/or data - prepared so as to be conveniently linked with application programs - (which use some of those functions and data) to form executables.

          -

          The "Library", below, refers to any such software library or work - which has been distributed under these terms. A "work based on the - Library" means either the Library or any derivative work under - copyright law: that is to say, a work containing the Library or a - portion of it, either verbatim or with modifications and/or translated - straightforwardly into another language. (Hereinafter, translation is - included without limitation in the term "modification".)

          -

          "Source code" for a work means the preferred form of the work for - making modifications to it. For a library, complete source code means - all the source code for all modules it contains, plus any associated - interface definition files, plus the scripts used to control - compilation and installation of the library.

          -

          Activities other than copying, distribution and modification are not - covered by this License; they are outside its scope. The act of running - a program using the Library is not restricted, and output from such a - program is covered only if its contents constitute a work based on the - Library (independent of the use of the Library in a tool for writing - it). Whether that is true depends on what the Library does and what the - program that uses the Library does.

          -

          1. You may copy and distribute verbatim copies of - the Library's complete source code as you receive it, in any medium, - provided that you conspicuously and appropriately publish on each copy - an appropriate copyright notice and disclaimer of warranty; keep intact - all the notices that refer to this License and to the absence of any - warranty; and distribute a copy of this License along with the Library.

          -

          You may charge a fee for the physical act of transferring a copy, and - you may at your option offer warranty protection in exchange for a fee.

          -

          2. You may modify your copy or copies of the Library - or any portion of it, thus forming a work based on the Library, and - copy and distribute such modifications or work under the terms of - Section 1 above, provided that you also meet all of these conditions:

          -
            -

            a) The modified work must itself be a software - library.

            -

            b) You must cause the files modified to carry - prominent notices stating that you changed the files and the date of - any change.

            -

            c) You must cause the whole of the work to be - licensed at no charge to all third parties under the terms of this - License.

            -

            d) If a facility in the modified Library refers to a - function or a table of data to be supplied by an application program - that uses the facility, other than as an argument passed when the - facility is invoked, then you must make a good faith effort to ensure - that, in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of its - purpose remains meaningful.

            -

            (For example, a function in a library to compute square roots has a - purpose that is entirely well-defined independent of the application. - Therefore, Subsection 2d requires that any application-supplied - function or table used by this function must be optional: if the - application does not supply it, the square root function must still - compute square roots.)

            -
          -

          These requirements apply to the modified work as a whole. If - identifiable sections of that work are not derived from the Library, - and can be reasonably considered independent and separate works in - themselves, then this License, and its terms, do not apply to those - sections when you distribute them as separate works. But when you - distribute the same sections as part of a whole which is a work based - on the Library, the distribution of the whole must be on the terms of - this License, whose permissions for other licensees extend to the - entire whole, and thus to each and every part regardless of who wrote - it.

          -

          Thus, it is not the intent of this section to claim rights or contest - your rights to work written entirely by you; rather, the intent is to - exercise the right to control the distribution of derivative or - collective works based on the Library.

          -

          In addition, mere aggregation of another work not based on the - Library with the Library (or with a work based on the Library) on a - volume of a storage or distribution medium does not bring the other - work under the scope of this License.

          -

          3. You may opt to apply the terms of the ordinary - GNU General Public License instead of this License to a given copy of - the Library. To do this, you must alter all the notices that refer to - this License, so that they refer to the ordinary GNU General Public - License, version 2, instead of to this License. (If a newer version - than version 2 of the ordinary GNU General Public License has appeared, - then you can specify that version instead if you wish.) Do not make any - other change in these notices.

          -

          Once this change is made in a given copy, it is irreversible for that - copy, so the ordinary GNU General Public License applies to all - subsequent copies and derivative works made from that copy.

          -

          This option is useful when you wish to copy part of the code of the - Library into a program that is not a library.

          -

          4. You may copy and distribute the Library (or a - portion or derivative of it, under Section 2) in object code or - executable form under the terms of Sections 1 and 2 above provided that - you accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections 1 - and 2 above on a medium customarily used for software interchange.

          -

          If distribution of object code is made by offering access to copy - from a designated place, then offering equivalent access to copy the - source code from the same place satisfies the requirement to distribute - the source code, even though third parties are not compelled to copy - the source along with the object code.

          -

          5. A program that contains no derivative of any - portion of the Library, but is designed to work with the Library by - being compiled or linked with it, is called a "work that uses the - Library". Such a work, in isolation, is not a derivative work of the - Library, and therefore falls outside the scope of this License.

          -

          However, linking a "work that uses the Library" with the Library - creates an executable that is a derivative of the Library (because it - contains portions of the Library), rather than a "work that uses the - library". The executable is therefore covered by this License. Section - 6 states terms for distribution of such executables.

          -

          When a "work that uses the Library" uses material from a header file - that is part of the Library, the object code for the work may be a - derivative work of the Library even though the source code is not. - Whether this is true is especially significant if the work can be - linked without the Library, or if the work is itself a library. The - threshold for this to be true is not precisely defined by law.

          -

          If such an object file uses only numerical parameters, data structure - layouts and accessors, and small macros and small inline functions (ten - lines or less in length), then the use of the object file is - unrestricted, regardless of whether it is legally a derivative work. - (Executables containing this object code plus portions of the Library - will still fall under Section 6.)

          -

          Otherwise, if the work is a derivative of the Library, you may - distribute the object code for the work under the terms of Section 6. - Any executables containing that work also fall under Section 6, whether - or not they are linked directly with the Library itself.

          -

          6. As an exception to the Sections above, you may - also compile or link a "work that uses the Library" with the Library to - produce a work containing portions of the Library, and distribute that - work under terms of your choice, provided that the terms permit - modification of the work for the customer's own use and reverse - engineering for debugging such modifications.

          -

          You must give prominent notice with each copy of the work that the - Library is used in it and that the Library and its use are covered by - this License. You must supply a copy of this License. If the work - during execution displays copyright notices, you must include the - copyright notice for the Library among them, as well as a reference - directing the user to the copy of this License. Also, you must do one - of these things:

          -
            a) Accompany the work with the complete - corresponding machine-readable source code for the Library including - whatever changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked with - the Library, with the complete machine-readable "work that uses the - Library", as object code and/or source code, so that the user can - modify the Library and then relink to produce a modified executable - containing the modified Library. (It is understood that the user who - changes the contents of definitions files in the Library will not - necessarily be able to recompile the application to use the modified - definitions.) -

            b) Accompany the work with a written offer, valid - for at least three years, to give the same user the materials specified - in Subsection 6a, above, for a charge no more than the cost of - performing this distribution.

            -

            c) If distribution of the work is made by offering - access to copy from a designated place, offer equivalent access to copy - the above specified materials from the same place.

            -

            d) Verify that the user has already received a copy - of these materials or that you have already sent this user a copy.

            -
          -

          For an executable, the required form of the "work that uses the - Library" must include any data and utility programs needed for - reproducing the executable from it. However, as a special exception, - the source code distributed need not include anything that is normally - distributed (in either source or binary form) with the major components - (compiler, kernel, and so on) of the operating system on which the - executable runs, unless that component itself accompanies the - executable.

          -

          It may happen that this requirement contradicts the license - restrictions of other proprietary libraries that do not normally - accompany the operating system. Such a contradiction means you cannot - use both them and the Library together in an executable that you - distribute.

          -

          7. You may place library facilities that are a work - based on the Library side-by-side in a single library together with - other library facilities not covered by this License, and distribute - such a combined library, provided that the separate distribution of the - work based on the Library and of the other library facilities is - otherwise permitted, and provided that you do these two things:

          -
            a) Accompany the combined library with a copy of - the same work based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the Sections - above. -

            b) Give prominent notice with the combined library - of the fact that part of it is a work based on the Library, and - explaining where to find the accompanying uncombined form of the same - work.

            -
          -

          8. You may not copy, modify, sublicense, link with, - or distribute the Library except as expressly provided under this - License. Any attempt otherwise to copy, modify, sublicense, link with, - or distribute the Library is void, and will automatically terminate - your rights under this License. However, parties who have received - copies, or rights, from you under this License will not have their - licenses terminated so long as such parties remain in full compliance.

          -

          9. You are not required to accept this License, - since you have not signed it. However, nothing else grants you - permission to modify or distribute the Library or its derivative works. - These actions are prohibited by law if you do not accept this License. - Therefore, by modifying or distributing the Library (or any work based - on the Library), you indicate your acceptance of this License to do so, - and all its terms and conditions for copying, distributing or modifying - the Library or works based on it.

          -

          10. Each time you redistribute the Library (or any - work based on the Library), the recipient automatically receives a - license from the original licensor to copy, distribute, link with or - modify the Library subject to these terms and conditions. You may not - impose any further restrictions on the recipients' exercise of the - rights granted herein. You are not responsible for enforcing compliance - by third parties to this License.

          -

          11. If, as a consequence of a court judgment or - allegation of patent infringement or for any other reason (not limited - to patent issues), conditions are imposed on you (whether by court - order, agreement or otherwise) that contradict the conditions of this - License, they do not excuse you from the conditions of this License. If - you cannot distribute so as to satisfy simultaneously your obligations - under this License and any other pertinent obligations, then as a - consequence you may not distribute the Library at all. For example, if - a patent license would not permit royalty-free redistribution of the - Library by all those who receive copies directly or indirectly through - you, then the only way you could satisfy both it and this License would - be to refrain entirely from distribution of the Library.

          -

          If any portion of this section is held invalid or unenforceable under - any particular circumstance, the balance of the section is intended to - apply, and the section as a whole is intended to apply in other - circumstances.

          -

          It is not the purpose of this section to induce you to infringe any - patents or other property right claims or to contest validity of any - such claims; this section has the sole purpose of protecting the - integrity of the free software distribution system which is implemented - by public license practices. Many people have made generous - contributions to the wide range of software distributed through that - system in reliance on consistent application of that system; it is up - to the author/donor to decide if he or she is willing to distribute - software through any other system and a licensee cannot impose that - choice.

          -

          This section is intended to make thoroughly clear what is believed to - be a consequence of the rest of this License.

          -

          12. If the distribution and/or use of the Library is - restricted in certain countries either by patents or by copyrighted - interfaces, the original copyright holder who places the Library under - this License may add an explicit geographical distribution limitation - excluding those countries, so that distribution is permitted only in or - among countries not thus excluded. In such case, this License - incorporates the limitation as if written in the body of this License.

          -

          13. The Free Software Foundation may publish revised - and/or new versions of the Library General Public License from time to - time. Such new versions will be similar in spirit to the present - version, but may differ in detail to address new problems or concerns.

          -

          Each version is given a distinguishing version number. If the Library - specifies a version number of this License which applies to it and "any - later version", you have the option of following the terms and - conditions either of that version or of any later version published by - the Free Software Foundation. If the Library does not specify a license - version number, you may choose any version ever published by the Free - Software Foundation.

          -

          14. If you wish to incorporate parts of the Library - into other free programs whose distribution conditions are incompatible - with these, write to the author to ask for permission. For software - which is copyrighted by the Free Software Foundation, write to the Free - Software Foundation; we sometimes make exceptions for this. Our - decision will be guided by the two goals of preserving the free status - of all derivatives of our free software and of promoting the sharing - and reuse of software generally.

          -

          NO WARRANTY

          -

          15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, - THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY - APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT - HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT - WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE - OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU - ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

          -

          16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR - AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO - MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE - LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL - OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE - LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING - RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A - FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF - SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - DAMAGES.

          -

          END OF TERMS AND CONDITIONS

          -

          How to Apply These Terms to Your New Libraries

          -

          If you develop a new library, and you want it to be of the greatest - possible use to the public, we recommend making it free software that - everyone can redistribute and change. You can do so by permitting - redistribution under these terms (or, alternatively, under the terms of - the ordinary General Public License).

          -

          To apply these terms, attach the following notices to the library. It - is safest to attach them to the start of each source file to most - effectively convey the exclusion of warranty; and each file should have - at least the "copyright" line and a pointer to where the full notice is - found.

          -
            -

            one line to give the library's name and an idea of what it does. -
            Copyright (C) year name of author

            -

            This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version.

            -

            This library is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser - General Public License for more details.

            -

            You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

            -
          -

          Also add information on how to contact you by electronic and paper - mail.

          -

          You should also get your employer (if you work as a programmer) or - your school, if any, to sign a "copyright disclaimer" for the library, - if necessary. Here is a sample; alter the names:

          -
            -

            Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random - Hacker.

            -

            signature of Ty Coon, 1 April 1990 Ty Coon, President of - Vice

            -
          -

          That's all there is to it!

          -
          -

          BRelease Notes

          -

          Changes in Mini-XML 2.7

          -
            -
          • Fixed conformance of mxmldoc's HTML and CSS output.
          • -
          • Added data accessor ("get") functions and made the mxml_node_t and - mxml_index_t structures private but still available in the Mini-XML - header to preserve source compatibility (STR #118)
          • -
          • Updated the source headers to reference the Mini-XML license and its - exceptions to the LGPL2 (STR #108)
          • -
          • Added a new mxmlFindPath() function to find the value node of a - named element (STR #110)
          • -
          • Building a static version of the library did not work on Windows - (STR #112)
          • -
          • The shared library did not include a destructor for the thread- - specific data key on UNIX-based operating systems (STR #103)
          • -
          • mxmlLoad* did not error out on XML with multiple root nodes (STR - #101)
          • -
          • Fixed an issue with the _mxml_vstrdupf function (STR #107)
          • -
          • mxmlSave* no longer write all siblings of the passed node, just that - node and its children (STR #109)
          • -
          -

          Changes in Mini-XML 2.6

          -
            -
          • Documentation fixes (STR #91, STR #92)
          • -
          • The mxmldoc program did not handle typedef comments properly (STR - #72)
          • -
          • Added support for "long long" printf formats.
          • -
          • The XML parser now ignores BOMs in UTF-8 XML files (STR #89)
          • -
          • The mxmldoc program now supports generating Xcode documentation - sets.
          • -
          • mxmlSave*() did not output UTF-8 correctly on some platforms.
          • -
          • mxmlNewXML() now adds encoding="utf-8" in the ?xml directive to - avoid problems with non-conformant XML parsers that assume something - other than UTF-8 as the default encoding.
          • -
          • Wrapping was not disabled when mxmlSetWrapMargin(0) was called, and - "<?xml ... ?>" was always followed by a newline (STR #76)
          • -
          • The mxml.pc.in file was broken (STR #79)
          • -
          • The mxmldoc program now handles "typedef enum name {} name" - correctly (STR #72)
          • -
          -

          Changes in Mini-XML 2.5

          -
            -
          • The mxmldoc program now makes greater use of CSS and supports a - --css option to embed an alternate stylesheet.
          • -
          • The mxmldoc program now supports --header and --footer options to - insert documentation content before and after the generated content.
          • -
          • The mxmldoc program now supports a --framed option to generate - framed HTML output.
          • -
          • The mxmldoc program now creates a table of contents including any - headings in the --intro file when generating HTML output.
          • -
          • The man pages and man page output from mxmldoc did not use "\-" for - dashes (STR #68)
          • -
          • The debug version of the Mini-XML DLL could not be built (STR #65)
          • -
          • Processing instructions and directives did not work when not at the - top level of a document (STR #67)
          • -
          • Spaces around the "=" in attributes were not supported (STR #67)
          • -
          -

          Changes in Mini-XML 2.4

          -
            -
          • Fixed shared library build problems on HP-UX and Mac OS X.
          • -
          • The mxmldoc program did not output argument descriptions for - functions properly.
          • -
          • All global settings (custom, error, and entity callbacks and the - wrap margin) are now managed separately for each thread.
          • -
          • Added mxmlElementDeleteAttr() function (STR #59)
          • -
          • mxmlElementSetAttrf() did not work (STR #57)
          • -
          • mxmlLoad*() incorrectly treated declarations as parent elements (STR - #56)
          • -
          • mxmlLoad*() incorrectly allowed attributes without values (STR #47)
          • -
          • Fixed Visual C++ build problems (STR #49)
          • -
          • mxmlLoad*() did not return NULL when an element contained an error - (STR #46)
          • -
          • Added support for the apos character entity (STR #54)
          • -
          • Fixed whitespace detection with Unicode characters (STR #48)
          • -
          • mxmlWalkNext() and mxmlWalkPrev() did not work correctly when called - with a node with no children as the top node (STR #53)
          • -
          -

          Changes in Mini-XML 2.3

          -
            -
          • Added two exceptions to the LGPL to support static linking of - applications against Mini-XML
          • -
          • The mxmldoc utility can now generate man pages, too.
          • -
          • Added a mxmlNewXML() function
          • -
          • Added a mxmlElementSetAttrf() function (STR #43)
          • -
          • Added a snprintf() emulation function for the test program (STR #32)
          • -
          • Added the _CRT_SECURE_NO_DEPRECATE definition when building on VC++ - 2005 (STR #36)
          • -
          • mxmlLoad*() did not detect missing > characters in elements (STR - #41)
          • -
          • mxmlLoad*() did not detect missing close tags at the end of an XML - document (STR #45)
          • -
          • Added user_data and ref_count members to mxml_node_t structure
          • -
          • Added mxmlReleaseNode() and mxmlRetainNode() APIs for - reference-counted nodes
          • -
          • Added mxmlSetWrapMargin() to control the wrapping of XML output
          • -
          • Added conditional check for EINTR error code for certain Windows - compilers that do not define it (STR #33)
          • -
          • The mxmldoc program now generates correct HTML 4.0 output - - previously it generated invalid XHTML
          • -
          • The mxmldoc program now supports "@deprecated@, "@private@", and - "@since version@" comments
          • -
          • Fixed function and enumeration type bugs in mxmldoc
          • -
          • Fixed the XML schema for mxmldoc
          • -
          • The mxmldoc program now supports --intro, --section, and --title - options
          • -
          • The mxmlLoad*() functions could leak a node on an error (STR #27)
          • -
          • The mxml_vsnprintf() function could get in an infinite loop on a - buffer overflow (STR #25)
          • -
          • Added new mxmlNewCDATA() and mxmlSetCDATA() functions to create and - set CDATA nodes, which are really just special element nodes
          • -
          • Added new MXML_IGNORE type and MXML_IGNORE_CB callback to ignore - non-element nodes, e.g. whitespace
          • -
          • mxmlLoad*() did not treat custom data as opaque, so whitespace - characters would be lost
          • -
          -

          Changes in Mini-XML 2.2.2

          -
            -
          • mxmlLoad*() did not treat custom data as opaque, so whitespace - characters would be lost.
          • -
          -

          Changes in Mini-XML 2.2.1

          -
            -
          • mxmlLoadFd(), mxmlLoadFile(), and mxmlLoadString() now correctly - return NULL on error (STR #21)
          • -
          • mxmlNewInteger(), mxmlNewOpaque(), mxmlNewReal(), mxmlNewText(), and - mxmlNewTextf() incorrectly required a parent node (STR #22)
          • -
          • Fixed an XML output bug in mxmldoc.
          • -
          • The "make install" target now uses the install command to set the - proper permissions on UNIX/Linux/OSX.
          • -
          • Fixed a MingW/Cygwin compilation problem (STR #18)
          • -
          -

          Changes in Mini-XML 2.2

          -
            -
          • Added shared library support (STR #17)
          • -
          • mxmlLoad*() now returns an error when an XML stream contains illegal - control characters (STR #10)
          • -
          • mxmlLoad*() now returns an error when an element contains two - attributes with the same name in conformance with the XML spec (STR - #16)
          • -
          • Added support for CDATA (STR #14, STR #15)
          • -
          • Updated comment and processing instruction handling - no entity - support per XML specification.
          • -
          • Added checking for invalid comment termination ("--->" is not - allowed)
          • -
          -

          Changes in Mini-XML 2.1

          -
            -
          • Added support for custom data nodes (STR #6)
          • -
          • Now treat UTF-8 sequences which are longer than necessary as an - error (STR #4)
          • -
          • Fixed entity number support (STR #8)
          • -
          • Fixed mxmlLoadString() bug with UTF-8 (STR #7)
          • -
          • Fixed entity lookup bug (STR #5)
          • -
          • Added mxmlLoadFd() and mxmlSaveFd() functions.
          • -
          • Fixed multi-word UTF-16 handling.
          • -
          -

          Changes in Mini-XML 2.0

          -
            -
          • New programmers manual.
          • -
          • Added Visual C++ project files for Microsoft Windows users.
          • -
          • Added optimizations to mxmldoc, mxmlSaveFile(), and mxmlIndexNew() - (STR #2)
          • -
          • mxmlEntityAddCallback() now returns an integer status (STR #2)
          • -
          • Added UTF-16 support (input only; all output is UTF-8)
          • -
          • Added index functions to build a searchable index of XML nodes.
          • -
          • Added character entity callback interface to support additional - character entities beyond those defined in the XHTML specification.
          • -
          • Added support for XHTML character entities.
          • -
          • The mxmldoc utility now produces XML output which conforms to an - updated XML schema, described in the file "doc/mxmldoc.xsd".
          • -
          • Changed the whitespace callback interface to return strings instead - of a single character, allowing for greater control over the formatting - of XML files written using Mini-XML. THIS CHANGE WILL REQUIRE CHANGES - TO YOUR 1.x CODE IF YOU USE WHITESPACE CALLBACKS.
          • -
          • The mxmldoc utility now produces XML output which conforms to an - updated XML schema, described in the file "doc/mxmldoc.xsd".
          • -
          • Changed the whitespace callback interface to return strings instead - of a single character, allowing for greater control over the formatting - of XML files written using Mini-XML. THIS CHANGE WILL REQUIRE CHANGES - TO YOUR 1.x CODE IF YOU USE WHITESPACE CALLBACKS.
          • -
          • The mxmldoc utility is now capable of documenting C++ classes, - functions, and structures, and correctly handles C++ comments.
          • -
          • Added new modular tests for mxmldoc.
          • -
          • Updated the mxmldoc output to be more compatible with embedding in - manuals produced with HTMLDOC.
          • -
          • The makefile incorrectly included a "/" separator between the - destination path and install path. This caused problems when building - and installing with MingW.
          • -
          -

          Changes in Mini-XML 1.3

          -
            -
          • Fixes for mxmldoc.
          • -
          • Added support for reading standard HTML entity names.
          • -
          • mxmlLoadString/File() did not decode character entities in element - names, attribute names, or attribute values.
          • -
          • mxmlLoadString/File() would crash when loading non- conformant XML - data under an existing parent (top) node.
          • -
          • Fixed several bugs in the mxmldoc utility.
          • -
          • Added new error callback function to catch a variety of errors and - log them to someplace other than stderr.
          • -
          • The mxmlElementSetAttr() function now allows for NULL attribute - values.
          • -
          • The load and save functions now properly handle quoted element and - attribute name strings properly, e.g. for !DOCTYPE declarations.
          • -
          -

          Changes in Mini-XML 1.2

          -
            -
          • Added new "set" methods to set the value of a node.
          • -
          • Added new formatted text methods mxmlNewTextf() and mxmlSetTextf() - to create/set a text node value using printf-style formats.
          • -
          • Added new standard callbacks for use with the mxmlLoad functions.
          • -
          • Updated the HTML documentation to include examples of the walk and - load function output.
          • -
          • Added --with/without-ansi configure option to control the strdup() - function check.
          • -
          • Added --with/without-snprintf configure option to control the - snprintf() and vsnprintf() function checks.
          • -
          -

          Changes in Mini-XML 1.1.2

          -
            -
          • The mxml(3) man page wasn't updated for the string functions.
          • -
          • mxmlSaveString() returned the wrong number of characters.
          • -
          • mxml_add_char() updated the buffer pointer in the wrong place.
          • -
          -

          Changes in Mini-XML 1.1.1

          -
            -
          • The private mxml_add_ch() function did not update the - start-of-buffer pointer which could cause a crash when using - mxmlSaveString().
          • -
          • The private mxml_write_ws() function called putc() instead of using - the proper callback which could cause a crash when using - mxmlSaveString().
          • -
          • Added a mxmlSaveAllocString() convenience function for saving an XML - node tree to an allocated string.
          • -
          -

          Changes in Mini-XML 1.1

          -
            -
          • The mxmlLoadFile() function now uses dynamically allocated string - buffers for element names, attribute names, and attribute values. - Previously they were capped at 16383, 255, and 255 bytes, respectively.
          • -
          • Added a new mxmlLoadString() function for loading an XML node tree - from a string.
          • -
          • Added a new mxmlSaveString() function for saving an XML node tree to - a string.
          • -
          • Add emulation of strdup() if the local platform does not provide the - function.
          • -
          -

          Changes in Mini-XML 1.0

          -
            -
          • The mxmldoc program now handles function arguments, structures, - unions, enumerations, classes, and typedefs properly.
          • -
          • Documentation provided via mxmldoc and more in-line comments in the - code.
          • -
          • Added man pages and packaging files.
          • -
          -

          Changes in Mini-XML 0.93

          -
            -
          • New mxmldoc example program that is also used to create and update - code documentation using XML and produce HTML reference pages.
          • -
          • Added mxmlAdd() and mxmlRemove() functions to add and remove nodes - from a tree. This provides more flexibility over where the nodes are - inserted and allows nodes to be moved within the tree as needed.
          • -
          • mxmlLoadFile() now correctly handles comments.
          • -
          • mxmlLoadFile() now supports the required "gt", "quot", and "nbsp" - character entities.
          • -
          • mxmlSaveFile() now uses newlines as whitespace when valid to do so.
          • -
          • mxmlFindElement() now also takes attribute name and attribute value - string arguments to limit the search to specific elements with - attributes and/or values.
          • - NULL pointers can be used as "wildcards". -
          • Added uninstall target to makefile, and auto-reconfig if Makefile.in - or configure.in are changed.
          • -
          • mxmlFindElement(), mxmlWalkNext(), and mxmlWalkPrev() now all - provide "descend" arguments to control whether they descend into child - nodes in the tree.
          • -
          • Fixed some whitespace issues in mxmlLoadFile().
          • -
          • Fixed Unicode output and whitespace issues in mxmlSaveFile().
          • -
          • mxmlSaveFile() now supports a whitespace callback to provide more - human-readable XML output under program control.
          • -
          -

          Changes in Mini-XML 0.92

          -
            -
          • mxmlSaveFile() didn't return a value on success.
          • -
          -

          Changes in Mini-XML 0.91

          -
            -
          • mxmlWalkNext() would go into an infinite loop.
          • -
          -

          Changes in Mini-XML 0.9

          -
            -
          • Initial public release.
          • -
          -
          -
          -

          CLibrary Reference

          -

          Contents

          - -

          Functions

          -

          mxmlAdd

          -

          Add a node to a tree.

          -

          void mxmlAdd ( -
              mxml_node_t *parent, -
              int where, -
              mxml_node_t *child, -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node
          -
          where
          -
          Where to add, MXML_ADD_BEFORE or MXML_ADD_AFTER
          -
          child
          -
          Child node for where or MXML_ADD_TO_PARENT
          -
          node
          -
          Node to add
          -
          -

          Discussion

          -

          Adds the specified node to the parent. If the - child argument is not NULL, puts the new node before or after the - specified child depending on the value of the where argument. If the - child argument is NULL, puts the new node at the beginning of the child - list (MXML_ADD_BEFORE) or at the end of the child list - (MXML_ADD_AFTER). The constant MXML_ADD_TO_PARENT can be used to - specify a NULL child pointer.

          -

          mxmlDelete

          -

          Delete a node and all of its children.

          -

          void mxmlDelete ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to delete
          -
          -

          Discussion

          -

          If the specified node has a parent, this function - first removes the node from its parent using the mxmlRemove() function.

          -

          - - Mini-XML 2.4 mxmlElementDeleteAttr -

          -

          Delete an attribute.

          -

          void mxmlElementDeleteAttr ( -
              mxml_node_t *node, -
              const char *name -
          );

          -

          Parameters

          -
          -
          node
          -
          Element
          -
          name
          -
          Attribute name
          -
          -

          mxmlElementGetAttr

          -

          Get an attribute.

          -

          const char *mxmlElementGetAttr ( -
              mxml_node_t *node, -
              const char *name -
          );

          -

          Parameters

          -
          -
          node
          -
          Element node
          -
          name
          -
          Name of attribute
          -
          -

          Return Value

          -

          Attribute value or NULL

          -

          Discussion

          -

          This function returns NULL if the node is not an - element or the named attribute does not exist.

          -

          mxmlElementSetAttr

          -

          Set an attribute.

          -

          void mxmlElementSetAttr ( -
              mxml_node_t *node, -
              const char *name, -
              const char *value -
          );

          -

          Parameters

          -
          -
          node
          -
          Element node
          -
          name
          -
          Name of attribute
          -
          value
          -
          Attribute value
          -
          -

          Discussion

          -

          If the named attribute already exists, the value - of the attribute is replaced by the new string value. The string value - is copied into the element node. This function does nothing if the node - is not an element.

          -

          - - Mini-XML 2.3 mxmlElementSetAttrf

          -

          Set an attribute with a formatted value.

          -

          void mxmlElementSetAttrf ( -
              mxml_node_t *node, -
              const char *name, -
              const char *format, -
              ... -
          );

          -

          Parameters

          -
          -
          node
          -
          Element node
          -
          name
          -
          Name of attribute
          -
          format
          -
          Printf-style attribute value
          -
          ...
          -
          Additional arguments as needed
          -
          -

          Discussion

          -

          If the named attribute already exists, the value - of the attribute is replaced by the new formatted string. The formatted - string value is copied into the element node. This function does - nothing if the node is not an element.

          -

          -mxmlEntityAddCallback

          -

          Add a callback to convert entities to Unicode.

          -

          int mxmlEntityAddCallback ( -
              mxml_entity_cb_t cb -
          );

          -

          Parameters

          -
          -
          cb
          -
          Callback function to add
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          mxmlEntityGetName

          -

          Get the name that corresponds to the character - value.

          -

          const char *mxmlEntityGetName ( -
              int val -
          );

          -

          Parameters

          -
          -
          val
          -
          Character value
          -
          -

          Return Value

          -

          Entity name or NULL

          -

          Discussion

          -

          If val does not need to be represented by a named - entity, NULL is returned.

          -

          mxmlEntityGetValue

          -

          Get the character corresponding to a named - entity.

          -

          int mxmlEntityGetValue ( -
              const char *name -
          );

          -

          Parameters

          -
          -
          name
          -
          Entity name
          -
          -

          Return Value

          -

          Character value or -1 on error

          -

          Discussion

          -

          The entity name can also be a numeric constant. -1 - is returned if the name is not known.

          -

          -mxmlEntityRemoveCallback

          -

          Remove a callback.

          -

          void mxmlEntityRemoveCallback ( -
              mxml_entity_cb_t cb -
          );

          -

          Parameters

          -
          -
          cb
          -
          Callback function to remove
          -
          -

          mxmlFindElement

          -

          Find the named element.

          -

          mxml_node_t *mxmlFindElement - ( -
              mxml_node_t *node, -
              mxml_node_t *top, -
              const char *name, -
              const char *attr, -
              const char *value, -
              int descend -
          );

          -

          Parameters

          -
          -
          node
          -
          Current node
          -
          top
          -
          Top node
          -
          name
          -
          Element name or NULL for any
          -
          attr
          -
          Attribute name, or NULL for none
          -
          value
          -
          Attribute value, or NULL for any
          -
          descend
          -
          Descend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
          -
          -

          Return Value

          -

          Element node or NULL

          -

          Discussion

          -

          The search is constrained by the name, attribute - name, and value; any NULL names or values are treated as wildcards, so - different kinds of searches can be implemented by looking for all - elements of a given name or all elements with a specific attribute. The - descend argument determines whether the search descends into child - nodes; normally you will use MXML_DESCEND_FIRST for the initial search - and MXML_NO_DESCEND to find additional direct descendents of the node. - The top node argument constrains the search to a particular node's - children.

          -

          - - Mini-XML 2.7 mxmlFindPath

          -

          Find a node with the given path.

          -

          mxml_node_t *mxmlFindPath ( -
              mxml_node_t *top, -
              const char *path -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          path
          -
          Path to element
          -
          -

          Return Value

          -

          Found node or NULL

          -

          Discussion

          -

          The "path" is a slash-separated list of element - names. The name "*" is considered a wildcard for one or more levels of - elements. For example, "foo/one/two", "bar/two/one", "*/one", and so - forth. -
          -
          The first child node of the found node is returned if the given - node has children and the first child is a value node.

          -

          - - Mini-XML 2.7 mxmlGetCDATA

          -

          Get the value for a CDATA node.

          -

          const char *mxmlGetCDATA ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          CDATA value or NULL

          -

          Discussion

          -

          NULL is returned if the node is not a - CDATA element.

          -

          - - Mini-XML 2.7 mxmlGetCustom

          -

          Get the value for a custom node.

          -

          const void *mxmlGetCustom ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Custom value or NULL

          -

          Discussion

          -

          NULL is returned if the node (or its - first child) is not a custom value node.

          -

          - - Mini-XML 2.7 mxmlGetElement

          -

          Get the name for an element node.

          -

          const char *mxmlGetElement ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Element name or NULL

          -

          Discussion

          -

          NULL is returned if the node is not - an element node.

          -

          - - Mini-XML 2.7 mxmlGetFirstChild

          -

          Get the first child of an element node.

          -

          mxml_node_t - *mxmlGetFirstChild ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          First child or NULL

          -

          Discussion

          -

          NULL is returned if the node is not - an element node or if the node has no children.

          -

          - - Mini-XML 2.7 mxmlGetInteger

          -

          Get the integer value from the specified node or - its first child.

          -

          int mxmlGetInteger ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Integer value or 0

          -

          Discussion

          -

          0 is returned if the node (or its first child) is - not an integer value node.

          -

          - - Mini-XML 2.7 mxmlGetLastChild

          -

          Get the last child of an element node.

          -

          mxml_node_t - *mxmlGetLastChild ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Last child or NULL

          -

          Discussion

          -

          NULL is returned if the node is not - an element node or if the node has no children.

          -

          mxmlGetNextSibling

          -

          Return the node type...

          -

          mxml_node_t - *mxmlGetNextSibling ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Get the next node for the current parent.

          -

          NULL is returned if this is the last - child for the current parent.

          -

          - - Mini-XML 2.7 mxmlGetOpaque

          -

          Get an opaque string value for a node or its - first child.

          -

          const char *mxmlGetOpaque ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Opaque string or NULL

          -

          Discussion

          -

          NULL is returned if the node (or its - first child) is not an opaque value node.

          -

          - - Mini-XML 2.7 mxmlGetParent

          -

          Get the parent node.

          -

          mxml_node_t *mxmlGetParent ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Parent node or NULL

          -

          Discussion

          -

          NULL is returned for a root node.

          -

          - - Mini-XML 2.7 mxmlGetPrevSibling

          -

          Get the previous node for the current parent.

          -

          mxml_node_t - *mxmlGetPrevSibling ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Previous node or NULL

          -

          Discussion

          -

          NULL is returned if this is the first - child for the current parent.

          -

          - - Mini-XML 2.7 mxmlGetReal

          -

          Get the real value for a node or its first child.

          -

          double mxmlGetReal ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Real value or 0.0

          -

          Discussion

          -

          0.0 is returned if the node (or its first child) - is not a real value node.

          -

          - - Mini-XML 2.7 mxmlGetRefCount

          -

          Get the current reference (use) count for a node.

          -

          int mxmlGetRefCount ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node
          -
          -

          Return Value

          -

          Reference count

          -

          Discussion

          -

          The initial reference count of new nodes is 1. Use - the mxmlRetain and -mxmlRelease functions to increment and decrement a - node's reference count. .

          -

          - - Mini-XML 2.7 mxmlGetText

          -

          Get the text value for a node or its first child.

          -

          const char *mxmlGetText ( -
              mxml_node_t *node, -
              int *whitespace -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          whitespace
          -
          1 if string is preceded by whitespace, 0 - otherwise
          -
          -

          Return Value

          -

          Text string or NULL

          -

          Discussion

          -

          NULL is returned if the node (or its - first child) is not a text node. The "whitespace" argument can be NULL.

          -

          - - Mini-XML 2.7 mxmlGetType

          -

          Get the node type.

          -

          mxml_type_t mxmlGetType ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          Type of node

          -

          Discussion

          -

          MXML_IGNORE is returned if "node" is -NULL.

          -

          - - Mini-XML 2.7 mxmlGetUserData

          -

          Get the user data pointer for a node.

          -

          void *mxmlGetUserData ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to get
          -
          -

          Return Value

          -

          User data pointer

          -

          mxmlIndexDelete

          -

          Delete an index.

          -

          void mxmlIndexDelete ( -
              mxml_index_t *ind -
          );

          -

          Parameters

          -
          -
          ind
          -
          Index to delete
          -
          -

          mxmlIndexEnum

          -

          Return the next node in the index.

          -

          mxml_node_t *mxmlIndexEnum ( -
              mxml_index_t *ind -
          );

          -

          Parameters

          -
          -
          ind
          -
          Index to enumerate
          -
          -

          Return Value

          -

          Next node or NULL if there is none

          -

          Discussion

          -

          Nodes are returned in the sorted order of the - index.

          -

          mxmlIndexFind

          -

          Find the next matching node.

          -

          mxml_node_t *mxmlIndexFind ( -
              mxml_index_t *ind, -
              const char *element, -
              const char *value -
          );

          -

          Parameters

          -
          -
          ind
          -
          Index to search
          -
          element
          -
          Element name to find, if any
          -
          value
          -
          Attribute value, if any
          -
          -

          Return Value

          -

          Node or NULL if none found

          -

          Discussion

          -

          You should call mxmlIndexReset() prior to using - this function for the first time with a particular set of "element" and - "value" strings. Passing NULL for both "element" and "value" is - equivalent to calling mxmlIndexEnum().

          -

          - - Mini-XML 2.7 mxmlIndexGetCount

          -

          Get the number of nodes in an index.

          -

          int mxmlIndexGetCount ( -
              mxml_index_t *ind -
          );

          -

          Parameters

          -
          -
          ind
          -
          Index of nodes
          -
          -

          Return Value

          -

          Number of nodes in index

          -

          mxmlIndexNew

          -

          Create a new index.

          -

          mxml_index_t *mxmlIndexNew - ( -
              mxml_node_t *node, -
              const char *element, -
              const char *attr -
          );

          -

          Parameters

          -
          -
          node
          -
          XML node tree
          -
          element
          -
          Element to index or NULL for all
          -
          attr
          -
          Attribute to index or NULL for none
          -
          -

          Return Value

          -

          New index

          -

          Discussion

          -

          The index will contain all nodes that contain the - named element and/or attribute. If both "element" and "attr" are NULL, - then the index will contain a sorted list of the elements in the node - tree. Nodes are sorted by element name and optionally by attribute - value if the "attr" argument is not NULL.

          -

          mxmlIndexReset

          -

          Reset the enumeration/find pointer in the index - and return the first node in the index.

          -

          mxml_node_t *mxmlIndexReset - ( -
              mxml_index_t *ind -
          );

          -

          Parameters

          -
          -
          ind
          -
          Index to reset
          -
          -

          Return Value

          -

          First node or NULL if there is none

          -

          Discussion

          -

          This function should be called prior to using - mxmlIndexEnum() or mxmlIndexFind() for the first time.

          -

          mxmlLoadFd

          -

          Load a file descriptor into an XML node tree.

          -

          mxml_node_t *mxmlLoadFd ( -
              mxml_node_t *top, -
              int fd, -
              mxml_load_cb_t cb -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          fd
          -
          File descriptor to read from
          -
          cb
          -
          Callback function or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          First node or NULL if the file could not be read.

          -

          Discussion

          -

          The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
          -
          The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type.

          -

          mxmlLoadFile

          -

          Load a file into an XML node tree.

          -

          mxml_node_t *mxmlLoadFile ( -
              mxml_node_t *top, -
              FILE *fp, -
              mxml_load_cb_t cb -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          fp
          -
          File to read from
          -
          cb
          -
          Callback function or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          First node or NULL if the file could not be read.

          -

          Discussion

          -

          The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
          -
          The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type.

          -

          mxmlLoadString

          -

          Load a string into an XML node tree.

          -

          mxml_node_t *mxmlLoadString - ( -
              mxml_node_t *top, -
              const char *s, -
              mxml_load_cb_t cb -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          s
          -
          String to load
          -
          cb
          -
          Callback function or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          First node or NULL if the string has errors.

          -

          Discussion

          -

          The nodes in the specified string are added to the - specified top node. If no top node is provided, the XML string MUST be - well-formed with a single parent node like <?xml> for the entire - string. The callback function returns the value type that should be - used for child nodes. If MXML_NO_CALLBACK is specified then all child - nodes will be either MXML_ELEMENT or MXML_TEXT nodes. -
          -
          The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type.

          -

          - - Mini-XML 2.3 mxmlNewCDATA

          -

          Create a new CDATA node.

          -

          mxml_node_t *mxmlNewCDATA ( -
              mxml_node_t *parent, -
              const char *data -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          data
          -
          Data string
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new CDATA node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new CDATA node has no parent. The data string must - be nul-terminated and is copied into the new node. CDATA nodes use the - MXML_ELEMENT type.

          -

          - - Mini-XML 2.1 mxmlNewCustom

          -

          Create a new custom data node.

          -

          mxml_node_t *mxmlNewCustom ( -
              mxml_node_t *parent, -
              void *data, -
              mxml_custom_destroy_cb_t - destroy -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          data
          -
          Pointer to data
          -
          destroy
          -
          Function to destroy data
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new custom node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new element node has no parent. NULL can be passed - when the data in the node is not dynamically allocated or is separately - managed.

          -

          mxmlNewElement

          -

          Create a new element node.

          -

          mxml_node_t *mxmlNewElement - ( -
              mxml_node_t *parent, -
              const char *name -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          name
          -
          Name of element
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new element node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new element node has no parent.

          -

          mxmlNewInteger

          -

          Create a new integer node.

          -

          mxml_node_t *mxmlNewInteger - ( -
              mxml_node_t *parent, -
              int integer -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          integer
          -
          Integer value
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new integer node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new integer node has no parent.

          -

          mxmlNewOpaque

          -

          Create a new opaque string.

          -

          mxml_node_t *mxmlNewOpaque ( -
              mxml_node_t *parent, -
              const char *opaque -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          opaque
          -
          Opaque string
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new opaque node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new opaque node has no parent. The opaque string - must be nul-terminated and is copied into the new node.

          -

          mxmlNewReal

          -

          Create a new real number node.

          -

          mxml_node_t *mxmlNewReal ( -
              mxml_node_t *parent, -
              double real -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          real
          -
          Real number value
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new real number node is added to the end of - the specified parent's child list. The constant MXML_NO_PARENT can be - used to specify that the new real number node has no parent.

          -

          mxmlNewText

          -

          Create a new text fragment node.

          -

          mxml_node_t *mxmlNewText ( -
              mxml_node_t *parent, -
              int whitespace, -
              const char *string -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          whitespace
          -
          1 = leading whitespace, 0 = no whitespace
          -
          string
          -
          String
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new text node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new text node has no parent. The whitespace - parameter is used to specify whether leading whitespace is present - before the node. The text string must be nul-terminated and is copied - into the new node.

          -

          mxmlNewTextf

          -

          Create a new formatted text fragment node.

          -

          mxml_node_t *mxmlNewTextf ( -
              mxml_node_t *parent, -
              int whitespace, -
              const char *format, -
              ... -
          );

          -

          Parameters

          -
          -
          parent
          -
          Parent node or MXML_NO_PARENT
          -
          whitespace
          -
          1 = leading whitespace, 0 = no whitespace
          -
          format
          -
          Printf-style frmat string
          -
          ...
          -
          Additional args as needed
          -
          -

          Return Value

          -

          New node

          -

          Discussion

          -

          The new text node is added to the end of the - specified parent's child list. The constant MXML_NO_PARENT can be used - to specify that the new text node has no parent. The whitespace - parameter is used to specify whether leading whitespace is present - before the node. The format string must be nul-terminated and is - formatted into the new node.

          -

          - - Mini-XML 2.3 mxmlNewXML

          -

          Create a new XML document tree.

          -

          mxml_node_t *mxmlNewXML ( -
              const char *version -
          );

          -

          Parameters

          -
          -
          version
          -
          Version number to use
          -
          -

          Return Value

          -

          New ?xml node

          -

          Discussion

          -

          The "version" argument specifies the version - number to put in the ?xml element node. If NULL, version 1.0 is - assumed.

          -

          - - Mini-XML 2.3 mxmlRelease

          -

          Release a node.

          -

          int mxmlRelease ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node
          -
          -

          Return Value

          -

          New reference count

          -

          Discussion

          -

          When the reference count reaches zero, the node - (and any children) is deleted via mxmlDelete().

          -

          mxmlRemove

          -

          Remove a node from its parent.

          -

          void mxmlRemove ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to remove
          -
          -

          Discussion

          -

          Does not free memory used by the node - use - mxmlDelete() for that. This function does nothing if the node has no - parent.

          -

          - - Mini-XML 2.3 mxmlRetain

          -

          Retain a node.

          -

          int mxmlRetain ( -
              mxml_node_t *node -
          );

          -

          Parameters

          -
          -
          node
          -
          Node
          -
          -

          Return Value

          -

          New reference count

          -

          - - Mini-XML 2.3 mxmlSAXLoadFd

          -

          Load a file descriptor into an XML node tree - using a SAX callback.

          -

          mxml_node_t *mxmlSAXLoadFd ( -
              mxml_node_t *top, -
              int fd, -
              mxml_load_cb_t cb, -
              mxml_sax_cb_t sax_cb, -
              void *sax_data -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          fd
          -
          File descriptor to read from
          -
          cb
          -
          Callback function or MXML_NO_CALLBACK
          -
          sax_cb
          -
          SAX callback or MXML_NO_CALLBACK
          -
          sax_data
          -
          SAX user data
          -
          -

          Return Value

          -

          First node or NULL if the file could not be read.

          -

          Discussion

          -

          The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
          -
          The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type. -
          -
          The SAX callback must call mxmlRetain() for any nodes that need to - be kept for later use. Otherwise, nodes are deleted when the parent - node is closed or after each data, comment, CDATA, or directive node.

          -

          - - Mini-XML 2.3 mxmlSAXLoadFile

          -

          Load a file into an XML node tree using a SAX - callback.

          -

          mxml_node_t *mxmlSAXLoadFile - ( -
              mxml_node_t *top, -
              FILE *fp, -
              mxml_load_cb_t cb, -
              mxml_sax_cb_t sax_cb, -
              void *sax_data -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          fp
          -
          File to read from
          -
          cb
          -
          Callback function or MXML_NO_CALLBACK
          -
          sax_cb
          -
          SAX callback or MXML_NO_CALLBACK
          -
          sax_data
          -
          SAX user data
          -
          -

          Return Value

          -

          First node or NULL if the file could not be read.

          -

          Discussion

          -

          The nodes in the specified file are added to the - specified top node. If no top node is provided, the XML file MUST be - well-formed with a single parent node like <?xml> for the entire file. - The callback function returns the value type that should be used for - child nodes. If MXML_NO_CALLBACK is specified then all child nodes will - be either MXML_ELEMENT or MXML_TEXT nodes. -
          -
          The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type. -
          -
          The SAX callback must call mxmlRetain() for any nodes that need to - be kept for later use. Otherwise, nodes are deleted when the parent - node is closed or after each data, comment, CDATA, or directive node.

          -

          - - Mini-XML 2.3 mxmlSAXLoadString

          -

          Load a string into an XML node tree using a SAX - callback.

          -

          mxml_node_t - *mxmlSAXLoadString ( -
              mxml_node_t *top, -
              const char *s, -
              mxml_load_cb_t cb, -
              mxml_sax_cb_t sax_cb, -
              void *sax_data -
          );

          -

          Parameters

          -
          -
          top
          -
          Top node
          -
          s
          -
          String to load
          -
          cb
          -
          Callback function or MXML_NO_CALLBACK
          -
          sax_cb
          -
          SAX callback or MXML_NO_CALLBACK
          -
          sax_data
          -
          SAX user data
          -
          -

          Return Value

          -

          First node or NULL if the string has errors.

          -

          Discussion

          -

          The nodes in the specified string are added to the - specified top node. If no top node is provided, the XML string MUST be - well-formed with a single parent node like <?xml> for the entire - string. The callback function returns the value type that should be - used for child nodes. If MXML_NO_CALLBACK is specified then all child - nodes will be either MXML_ELEMENT or MXML_TEXT nodes. -
          -
          The constants MXML_INTEGER_CALLBACK, MXML_OPAQUE_CALLBACK, - MXML_REAL_CALLBACK, and MXML_TEXT_CALLBACK are defined for loading - child nodes of the specified type. -
          -
          The SAX callback must call mxmlRetain() for any nodes that need to - be kept for later use. Otherwise, nodes are deleted when the parent - node is closed or after each data, comment, CDATA, or directive node.

          -

          mxmlSaveAllocString -

          -

          Save an XML tree to an allocated string.

          -

          char *mxmlSaveAllocString ( -
              mxml_node_t *node, -
              mxml_save_cb_t cb -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to write
          -
          cb
          -
          Whitespace callback or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          Allocated string or NULL

          -

          Discussion

          -

          This function returns a pointer to a string - containing the textual representation of the XML node tree. The string - should be freed using the free() function when you are done with it. - NULL is returned if the node would produce an empty string or if the - string cannot be allocated. -
          -
          The callback argument specifies a function that returns a - whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

          -

          mxmlSaveFd

          -

          Save an XML tree to a file descriptor.

          -

          int mxmlSaveFd ( -
              mxml_node_t *node, -
              int fd, -
              mxml_save_cb_t cb -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to write
          -
          fd
          -
          File descriptor to write to
          -
          cb
          -
          Whitespace callback or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          0 on success, -1 on error.

          -

          Discussion

          -

          The callback argument specifies a function that - returns a whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

          -

          mxmlSaveFile

          -

          Save an XML tree to a file.

          -

          int mxmlSaveFile ( -
              mxml_node_t *node, -
              FILE *fp, -
              mxml_save_cb_t cb -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to write
          -
          fp
          -
          File to write to
          -
          cb
          -
          Whitespace callback or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          0 on success, -1 on error.

          -

          Discussion

          -

          The callback argument specifies a function that - returns a whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

          -

          mxmlSaveString

          -

          Save an XML node tree to a string.

          -

          int mxmlSaveString ( -
              mxml_node_t *node, -
              char *buffer, -
              int bufsize, -
              mxml_save_cb_t cb -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to write
          -
          buffer
          -
          String buffer
          -
          bufsize
          -
          Size of string buffer
          -
          cb
          -
          Whitespace callback or MXML_NO_CALLBACK
          -
          -

          Return Value

          -

          Size of string

          -

          Discussion

          -

          This function returns the total number of bytes - that would be required for the string but only copies (bufsize - 1) - characters into the specified buffer. -
          -
          The callback argument specifies a function that returns a - whitespace string or NULL before and after each element. If - MXML_NO_CALLBACK is specified, whitespace will only be added before - MXML_TEXT nodes with leading whitespace and before attribute names - inside opening element tags.

          -

          - - Mini-XML 2.3 mxmlSetCDATA

          -

          Set the element name of a CDATA node.

          -

          int mxmlSetCDATA ( -
              mxml_node_t *node, -
              const char *data -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          data
          -
          New data string
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not a CDATA element node.

          -

          - - Mini-XML 2.1 mxmlSetCustom

          -

          Set the data and destructor of a custom data - node.

          -

          int mxmlSetCustom ( -
              mxml_node_t *node, -
              void *data, -
              mxml_custom_destroy_cb_t - destroy -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          data
          -
          New data pointer
          -
          destroy
          -
          New destructor function
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not a custom node.

          -

          -mxmlSetCustomHandlers

          -

          Set the handling functions for custom data.

          -

          void mxmlSetCustomHandlers ( -
              mxml_custom_load_cb_t - load, -
              mxml_custom_save_cb_t save -
          );

          -

          Parameters

          -
          -
          load
          -
          Load function
          -
          save
          -
          Save function
          -
          -

          Discussion

          -

          The load function accepts a node pointer and a - data string and must return 0 on success and non-zero on error. -
          -
          The save function accepts a node pointer and must return a malloc'd - string on success and NULL on error.

          -

          mxmlSetElement

          -

          Set the name of an element node.

          -

          int mxmlSetElement ( -
              mxml_node_t *node, -
              const char *name -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          name
          -
          New name string
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it is not an element - node.

          -

          mxmlSetErrorCallback -

          -

          Set the error message callback.

          -

          void mxmlSetErrorCallback ( -
              mxml_error_cb_t cb -
          );

          -

          Parameters

          -
          -
          cb
          -
          Error callback function
          -
          -

          mxmlSetInteger

          -

          Set the value of an integer node.

          -

          int mxmlSetInteger ( -
              mxml_node_t *node, -
              int integer -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          integer
          -
          Integer value
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not an integer node.

          -

          mxmlSetOpaque

          -

          Set the value of an opaque node.

          -

          int mxmlSetOpaque ( -
              mxml_node_t *node, -
              const char *opaque -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          opaque
          -
          Opaque string
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not an opaque node.

          -

          mxmlSetReal

          -

          Set the value of a real number node.

          -

          int mxmlSetReal ( -
              mxml_node_t *node, -
              double real -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          real
          -
          Real number value
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not a real number node.

          -

          mxmlSetText

          -

          Set the value of a text node.

          -

          int mxmlSetText ( -
              mxml_node_t *node, -
              int whitespace, -
              const char *string -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          whitespace
          -
          1 = leading whitespace, 0 = no whitespace
          -
          string
          -
          String
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not a text node.

          -

          mxmlSetTextf

          -

          Set the value of a text node to a formatted - string.

          -

          int mxmlSetTextf ( -
              mxml_node_t *node, -
              int whitespace, -
              const char *format, -
              ... -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          whitespace
          -
          1 = leading whitespace, 0 = no whitespace
          -
          format
          -
          Printf-style format string
          -
          ...
          -
          Additional arguments as needed
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          Discussion

          -

          The node is not changed if it (or its first child) - is not a text node.

          -

          - - Mini-XML 2.7 mxmlSetUserData

          -

          Set the user data pointer for a node.

          -

          int mxmlSetUserData ( -
              mxml_node_t *node, -
              void *data -
          );

          -

          Parameters

          -
          -
          node
          -
          Node to set
          -
          data
          -
          User data pointer
          -
          -

          Return Value

          -

          0 on success, -1 on failure

          -

          - - Mini-XML 2.3 mxmlSetWrapMargin

          -

          Set the wrap margin when saving XML data.

          -

          void mxmlSetWrapMargin ( -
              int column -
          );

          -

          Parameters

          -
          -
          column
          -
          Column for wrapping, 0 to disable wrapping
          -
          -

          Discussion

          -

          Wrapping is disabled when "column" is 0.

          -

          mxmlWalkNext

          -

          Walk to the next logical node in the tree.

          -

          mxml_node_t *mxmlWalkNext ( -
              mxml_node_t *node, -
              mxml_node_t *top, -
              int descend -
          );

          -

          Parameters

          -
          -
          node
          -
          Current node
          -
          top
          -
          Top node
          -
          descend
          -
          Descend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
          -
          -

          Return Value

          -

          Next node or NULL

          -

          Discussion

          -

          The descend argument controls whether the first - child is considered to be the next node. The top node argument - constrains the walk to the node's children.

          -

          mxmlWalkPrev

          -

          Walk to the previous logical node in the tree.

          -

          mxml_node_t *mxmlWalkPrev ( -
              mxml_node_t *node, -
              mxml_node_t *top, -
              int descend -
          );

          -

          Parameters

          -
          -
          node
          -
          Current node
          -
          top
          -
          Top node
          -
          descend
          -
          Descend into tree - MXML_DESCEND, - MXML_NO_DESCEND, or MXML_DESCEND_FIRST
          -
          -

          Return Value

          -

          Previous node or NULL

          -

          Discussion

          -

          The descend argument controls whether the previous - node's last child is considered to be the previous node. The top node - argument constrains the walk to the node's children.

          -

          Data Types

          -

          -mxml_custom_destroy_cb_t

          -

          Custom data destructor

          -

          typedef void (*mxml_custom_destroy_cb_t)(void *);

          -

          -mxml_custom_load_cb_t

          -

          Custom data load callback function

          -

          typedef int (*mxml_custom_load_cb_t)( -mxml_node_t *, const char *);

          -

          -mxml_custom_save_cb_t

          -

          Custom data save callback function

          -

          typedef char *(*mxml_custom_save_cb_t)( -mxml_node_t *);

          -

          mxml_entity_cb_t

          -

          Entity callback function

          -

          typedef int (*mxml_entity_cb_t)(const char *);

          -

          mxml_error_cb_t

          -

          Error callback function

          -

          typedef void (*mxml_error_cb_t)(const char *);

          -

          mxml_index_t

          -

          An XML node index.

          -

          typedef struct mxml_index_s - mxml_index_t;

          -

          mxml_load_cb_t

          -

          Load callback function

          -

          typedef mxml_type_t - (*mxml_load_cb_t)(mxml_node_t *);

          -

          mxml_node_t

          -

          An XML node.

          -

          typedef struct mxml_node_s - mxml_node_t;

          -

          mxml_save_cb_t

          -

          Save callback function

          -

          typedef const char *(*mxml_save_cb_t)( -mxml_node_t *, int);

          -

          mxml_sax_cb_t

          -

          SAX callback function

          -

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

          -

          mxml_sax_event_t

          -

          SAX event type.

          -

          typedef enum -mxml_sax_event_e mxml_sax_event_t;

          -

          mxml_type_t

          -

          The XML node type.

          -

          typedef enum mxml_type_e - mxml_type_t;

          -

          Constants

          -

          mxml_sax_event_e

          -

          SAX event type.

          -

          Constants

          -
          -
          MXML_SAX_CDATA
          -
          CDATA node
          -
          MXML_SAX_COMMENT
          -
          Comment node
          -
          MXML_SAX_DATA
          -
          Data node
          -
          MXML_SAX_DIRECTIVE
          -
          Processing directive node
          -
          MXML_SAX_ELEMENT_CLOSE
          -
          Element closed
          -
          MXML_SAX_ELEMENT_OPEN
          -
          Element opened
          -
          -

          mxml_type_e

          -

          The XML node type.

          -

          Constants

          -
          -
          MXML_CUSTOM - -  Mini-XML 2.1 
          -
          Custom data
          -
          MXML_ELEMENT
          -
          XML element with attributes
          -
          MXML_IGNORE - -  Mini-XML 2.3 
          -
          Ignore/throw away node
          -
          MXML_INTEGER
          -
          Integer value
          -
          MXML_OPAQUE
          -
          Opaque string
          -
          MXML_REAL
          -
          Real value
          -
          MXML_TEXT
          -
          Text fragment
          -
          -

          -

          DXML Schema

          -

          This appendix provides the XML schema that is used for the XML files - produced by mxmldoc. This schema is available on-line at:

          -
          -    http://www.minixml.org/mxmldoc.xsd
          -
          -

          mxmldoc.xsd

          -
          
          -<?xml version="1.0"?>
          -<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          -  <xsd:annotation>
          -    <xsd:documentation xml:lang="en">
          -      Mini-XML 2.7 documentation schema for mxmldoc output.
          -      Copyright 2003-2011 by Michael Sweet.
          -    </xsd:documentation>
          -  </xsd:annotation>
          -
          -  <!-- basic element definitions -->
          -  <xsd:element name="argument" type="argumentType"/>
          -  <xsd:element name="class" type="classType"/>
          -  <xsd:element name="constant" type="constantType"/>
          -  <xsd:element name="description" type="xsd:string"/>
          -  <xsd:element name="enumeration" type="enumerationType"/>
          -  <xsd:element name="function" type="functionType"/>
          -  <xsd:element name="mxmldoc" type="mxmldocType"/>
          -  <xsd:element name="namespace" type="namespaceType"/>
          -  <xsd:element name="returnvalue" type="returnvalueType"/>
          -  <xsd:element name="seealso" type="identifierList"/>
          -  <xsd:element name="struct" type="structType"/>
          -  <xsd:element name="typedef" type="typedefType"/>
          -  <xsd:element name="type" type="xsd:string"/>
          -  <xsd:element name="union" type="unionType"/>
          -  <xsd:element name="variable" type="variableType"/>
          -
          -  <!-- descriptions of complex elements -->
          -  <xsd:complexType name="argumentType">
          -    <xsd:sequence>
          -      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
          -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          -    </xsd:sequence>
          -    <xsd:attribute name="default" type="xsd:string" use="optional"/>
          -    <xsd:attribute name="name" type="identifier" use="required"/>
          -    <xsd:attribute name="direction" type="direction" use="optional"
          -     default="I"/>
          -  </xsd:complexType>
          -
          -  <xsd:complexType name="classType">
          -    <xsd:sequence>
          -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          -      <xsd:choice minOccurs="0" maxOccurs="unbounded">
          -	<xsd:element ref="class"/>
          -	<xsd:element ref="enumeration"/>
          -	<xsd:element ref="function"/>
          -	<xsd:element ref="struct"/>
          -	<xsd:element ref="typedef"/>
          -	<xsd:element ref="union"/>
          -	<xsd:element ref="variable"/>
          -      </xsd:choice>
          -    </xsd:sequence>
          -    <xsd:attribute name="name" type="identifier" use="required"/>
          -    <xsd:attribute name="parent" type="xsd:string" use="optional"/>
          -  </xsd:complexType>
          -
          -  <xsd:complexType name="constantType">
          -    <xsd:sequence>
          -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          -    </xsd:sequence>
          -    <xsd:attribute name="name" type="identifier" use="required"/>
          -  </xsd:complexType>
          -
          -  <xsd:complexType name="enumerationType">
          -    <xsd:sequence>
          -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          -      <xsd:element ref="constant" minOccurs="1" maxOccurs="unbounded"/>
          -    </xsd:sequence>
          -    <xsd:attribute name="name" type="identifier" use="required"/>
          -  </xsd:complexType>
          -
          -  <xsd:complexType name="functionType">
          -    <xsd:sequence>
          -      <xsd:element ref="returnvalue" minOccurs="0" maxOccurs="1"/>
          -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          -      <xsd:element ref="argument" minOccurs="1" maxOccurs="unbounded"/>
          -      <xsd:element ref="seealso" minOccurs="0" maxOccurs="1"/>
          -    </xsd:sequence>
          -    <xsd:attribute name="name" type="identifier" use="required"/>
          -    <xsd:attribute name="scope" type="scope" use="optional"/>
          -  </xsd:complexType>
          -
          -  <xsd:complexType name="mxmldocType">
          -    <xsd:choice minOccurs="0" maxOccurs="unbounded">
          -      <xsd:element ref="class"/>
          -      <xsd:element ref="enumeration"/>
          -      <xsd:element ref="function"/>
          -      <xsd:element ref="namespace"/>
          -      <xsd:element ref="struct"/>
          -      <xsd:element ref="typedef"/>
          -      <xsd:element ref="union"/>
          -      <xsd:element ref="variable"/>
          -    </xsd:choice>
          -  </xsd:complexType>
          -
          -  <xsd:complexType name="namespaceType">
          -    <xsd:sequence>
          -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          -      <xsd:choice minOccurs="0" maxOccurs="unbounded">
          -	<xsd:element ref="class"/>
          -	<xsd:element ref="enumeration"/>
          -	<xsd:element ref="function"/>
          -	<xsd:element ref="struct"/>
          -	<xsd:element ref="typedef"/>
          -	<xsd:element ref="union"/>
          -	<xsd:element ref="variable"/>
          -      </xsd:choice>
          -    </xsd:sequence>
          -    <xsd:attribute name="name" type="identifier" use="required"/>
          -  </xsd:complexType>
          -
          -  <xsd:complexType name="returnvalueType">
          -    <xsd:sequence>
          -      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
          -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          -    </xsd:sequence>
          -  </xsd:complexType>
          -
          -  <xsd:complexType name="structType">
          -    <xsd:sequence>
          -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          -      <xsd:choice minOccurs="0" maxOccurs="unbounded">
          -	<xsd:element ref="variable"/>
          -	<xsd:element ref="function"/>
          -      </xsd:choice>
          -    </xsd:sequence>
          -    <xsd:attribute name="name" type="identifier" use="required"/>
          -  </xsd:complexType>
          -
          -  <xsd:complexType name="typedefType">
          -    <xsd:sequence>
          -      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
          -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          -    </xsd:sequence>
          -    <xsd:attribute name="name" type="identifier" use="required"/>
          -  </xsd:complexType>
          -
          -  <xsd:complexType name="unionType">
          -    <xsd:sequence>
          -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          -      <xsd:element ref="variable" minOccurs="0" maxOccurs="unbounded"/>
          -    </xsd:sequence>
          -    <xsd:attribute name="name" type="identifier" use="required"/>
          -  </xsd:complexType>
          -
          -  <xsd:complexType name="variableType">
          -    <xsd:sequence>
          -      <xsd:element ref="type" minOccurs="1" maxOccurs="1"/>
          -      <xsd:element ref="description" minOccurs="0" maxOccurs="1"/>
          -    </xsd:sequence>
          -    <xsd:attribute name="name" type="identifier" use="required"/>
          -  </xsd:complexType>
          -
          -  <!-- data types -->
          -  <xsd:simpleType name="direction">
          -    <xsd:restriction base="xsd:string">
          -      <xsd:enumeration value="I"/>
          -      <xsd:enumeration value="O"/>
          -      <xsd:enumeration value="IO"/>
          -    </xsd:restriction>
          -  </xsd:simpleType>
          -
          -  <xsd:simpleType name="identifier">
          -    <xsd:restriction base="xsd:string">
          -      <xsd:pattern value="[a-zA-Z_(.]([a-zA-Z_(.,)* 0-9])*"/>
          -    </xsd:restriction>
          -  </xsd:simpleType>
          -
          -  <xsd:simpleType name="identifierList">
          -    <xsd:list itemType="identifier"/>
          -  </xsd:simpleType>
          -
          -  <xsd:simpleType name="scope">
          -    <xsd:restriction base="xsd:string">
          -      <xsd:enumeration value=""/>
          -      <xsd:enumeration value="private"/>
          -      <xsd:enumeration value="protected"/>
          -      <xsd:enumeration value="public"/>
          -    </xsd:restriction>
          -  </xsd:simpleType>
          -</xsd:schema>
          -
          - - diff --git a/www/mxmldoc.xsd b/www/mxmldoc.xsd deleted file mode 100644 index 26c6508..0000000 --- a/www/mxmldoc.xsd +++ /dev/null @@ -1,189 +0,0 @@ - - - - - Mini-XML 2.7 documentation schema for mxmldoc output. - Copyright 2003-2011 by Michael Sweet. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/www/org.minixml.atom b/www/org.minixml.atom deleted file mode 100644 index fe7854e..0000000 --- a/www/org.minixml.atom +++ /dev/null @@ -1,16 +0,0 @@ - - - http://www.minixml.org/org.minixml.atom/20111220234804 - minixml.org - - 2011-12-20T23:48:04-08:00 - - tag:www.minixml.org,2011-12-20:org.minixml.docset/2.7.0 - Mini-XML API Reference - 2011-12-20T23:48:04-08:00 - Mini-XML API Reference (v2.7.0) - - org.minixml.docset - 2.7.0 - - \ No newline at end of file diff --git a/www/org.minixml.xar b/www/org.minixml.xar deleted file mode 100644 index 5185c524cac2bb286e2a6da02205f0a36118f7de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48828 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 H177#&N_?@j diff --git a/www/phplib/.htaccess b/www/phplib/.htaccess deleted file mode 100644 index 0a35203..0000000 --- a/www/phplib/.htaccess +++ /dev/null @@ -1,3 +0,0 @@ -Order deny,allow -Allow from none - diff --git a/www/phplib/auth.php b/www/phplib/auth.php deleted file mode 100644 index 1623667..0000000 --- a/www/phplib/auth.php +++ /dev/null @@ -1,183 +0,0 @@ - diff --git a/www/phplib/common.php b/www/phplib/common.php deleted file mode 100644 index 362d4c9..0000000 --- a/www/phplib/common.php +++ /dev/null @@ -1,681 +0,0 @@ - for the "is published" field... -// show_comments() - Show comments for the given path... -// validate_email() - Validate an email address... -// - - -// -// 'abbreviate()' - Abbreviate long strings... -// - -function // O - Abbreviated string -abbreviate($text, // I - String - $maxlen = 32) // I - Maximum length of string -{ - $newtext = ""; - $textlen = strlen($text); - $inelement = 0; - - for ($i = 0, $len = 0; $i < $textlen && $len < $maxlen; $i ++) - switch ($text[$i]) - { - case '<' : - $inelement = 1; - break; - - case '>' : - if ($inelement) - $inelement = 0; - else - { - $newtext .= ">"; - $len ++; - } - break; - - case '&' : - $len ++; - - while ($i < $textlen) - { - $newtext .= $text[$i]; - - if ($text[$i] == ';') - break; - - $i ++; - } - break; - - default : - if (!$inelement) - { - $newtext .= $text[$i]; - $len ++; - } - break; - } - - if ($i < $textlen) - return ($newtext . "..."); - else - return ($newtext); -} - - -// -// 'count_comments()' - Count visible comments for the given path... -// - -function // O - Number of comments -count_comments($url, // I - URL for comment - $parent_id = 0) // I - Parent comment -{ - $result = db_query("SELECT * FROM comment WHERE " - ."url = '" . db_escape($url) ."' " - ."AND parent_id = $parent_id " - ."ORDER BY id"); - - $num_comments = 0; - - while ($row = db_next($result)) - { - if ($row["status"] > 0) - $num_comments ++; - - $num_comments += count_comments($url, $row['id']); - } - - db_free($result); - - return ($num_comments); -} - - -// -// 'format_text()' - Convert plain text to HTML... -// - -function // O - Quoted string -format_text($text) // I - Original string -{ - $len = strlen($text); - $col = 0; - $list = 0; - $bold = 0; - $pre = 0; - $ftext = "
          " || - strtolower(substr($text, $i, 13)) == "
          " || - strtolower(substr($text, $i, 6)) == "" || - strtolower(substr($text, $i, 7)) == "" || - strtolower(substr($text, $i, 4)) == "" || - strtolower(substr($text, $i, 5)) == "" || - strtolower(substr($text, $i, 4)) == "

          " || - strtolower(substr($text, $i, 5)) == "

          " || - strtolower(substr($text, $i, 4)) == "

          " || - strtolower(substr($text, $i, 5)) == "

          " || - strtolower(substr($text, $i, 4)) == "

          " || - strtolower(substr($text, $i, 5)) == "

          " || - strtolower(substr($text, $i, 4)) == "

          " || - strtolower(substr($text, $i, 5)) == "

          " || - strtolower(substr($text, $i, 4)) == "
          " || - strtolower(substr($text, $i, 5)) == "
          " || - strtolower(substr($text, $i, 4)) == "
          " || - strtolower(substr($text, $i, 5)) == "
          " || - strtolower(substr($text, $i, 3)) == "" || - strtolower(substr($text, $i, 4)) == "" || - strtolower(substr($text, $i, 5)) == "" || - strtolower(substr($text, $i, 5)) == "" || - strtolower(substr($text, $i, 4)) == "
            " || - strtolower(substr($text, $i, 5)) == "
          " || - strtolower(substr($text, $i, 3)) == "

          " || - strtolower(substr($text, $i, 4)) == "

          " || - strtolower(substr($text, $i, 5)) == "
          " ||
          -	      strtolower(substr($text, $i, 6)) == "
          " || - strtolower(substr($text, $i, 4)) == "" || - strtolower(substr($text, $i, 5)) == "" || - strtolower(substr($text, $i, 3)) == "" || - strtolower(substr($text, $i, 4)) == "" || - strtolower(substr($text, $i, 4)) == "
            " || - strtolower(substr($text, $i, 5)) == "
          ") - { - while ($i < $len && $text[$i] != '>') - { - $ftext .= $text[$i]; - $i ++; - } - - $ftext .= ">"; - } - else - $ftext .= "<"; - break; - - case '>' : - $col ++; - $ftext .= ">"; - break; - - case '&' : - $col ++; - $ftext .= "&"; - break; - - case "\n" : - if (($i + 1) < $len && - ($text[$i + 1] == "\n" || $text[$i + 1] == "\r")) - { - while (($i + 1) < $len && - ($text[$i + 1] == "\n" || $text[$i + 1] == "\r")) - $i ++; - - if ($pre) - { - $ftext .= ""; - $pre = 0; - } - - if (($i + 1) < $len && $text[$i + 1] != '-' && $list) - { - $ftext .= "\n\n

          "; - $list = 0; - } - else - $ftext .= "\n

          "; - } - else if (($i + 1) < $len && - ($text[$i + 1] == " " || $text[$i + 1] == "\t")) - { - if ($pre) - { - $ftext .= ""; - $pre = 0; - } - else - $ftext .= "
          \n"; - } - else - $ftext .= "\n"; - - $col = 0; - break; - - case "\r" : - break; - - case "\t" : - if ($col == 0) - $ftext .= "        "; - else - $ftext .= " "; - break; - - case " " : - if ($col == 0 && !$pre) - { - for ($j = $i + 1; $j < $len; $j ++) - if ($text[$j] != " " && $text[$j] != "\t") - break; - - if ($j < $len && $text[$j] == '%') - { - $ftext .= "\n

          "; - - for ($i = 0; $i < $len; $i ++) - { - switch ($text[$i]) - { - case '<' : - $col ++; - if (strtolower(substr($text, $i, 8)) == "" || - strtolower(substr($text, $i, 3)) == "" || - strtolower(substr($text, $i, 4)) == "" || - strtolower(substr($text, $i, 12)) == "

          ";
          -	      $pre   = 1;
          -	    }
          -
          -	    $ftext .= " ";
          -	  }
          -	  else if ($text[$i + 1] == " ")
          -	    $ftext .= " ";
          -	  else
          -            $ftext .= " ";
          -
          -          if ($col > 0)
          -	    $col ++;
          -	  break;
          -
          -      case '*' :
          -          if ($bold)
          -	    $ftext .= "";
          -	  else
          -	    $ftext .= "";
          -
          -	  $bold = 1 - $bold;
          -	  break;
          -
          -      case '-' :
          -          // Possible list...
          -	  if ($col == 0)
          -	  {
          -	    if (!$list)
          -	    {
          -	      $ftext .= "\n";
          -
          -  if ($pre)
          -    $ftext .= "
          "; - - return ($ftext); -} - - -// -// 'quote_text()' - Quote a string... -// - -function // O - Quoted string -quote_text($text, // I - Original string - $quote = 0) // I - Add ">" to front of message -{ - $len = strlen($text); - $col = 0; - - if ($quote) - $qtext = "> "; - else - $qtext = ""; - - for ($i = 0; $i < $len; $i ++) - { - switch ($text[$i]) - { - case '<' : - $col ++; - $qtext .= "<"; - break; - - case '>' : - $col ++; - $qtext .= ">"; - break; - - case '&' : - $col ++; - $qtext .= "&"; - break; - - case "\n" : - if ($quote) - $qtext .= "\n> "; - else - $qtext .= "
          "; - - $col = 0; - break; - - case "\r" : - break; - - case "\t" : - if ($col == 0) - $qtext .= "        "; - else - $qtext .= " "; - break; - - case " " : - if ($col == 0 || $text[$i + 1] == " ") - $qtext .= " "; - else if ($col > 65 && $quote) - { - $qtext .= "\n> "; - $col = 0; - } - else - $qtext .= " "; - - if ($col > 0) - $col ++; - break; - - case 'f' : - case 'h' : - if (substr($text, $i, 7) == "http://" || - substr($text, $i, 8) == "https://" || - substr($text, $i, 6) == "ftp://") - { - // Extract the URL and make this a link... - for ($j = $i; $j < $len; $j ++) - if ($text[$j] == " " || $text[$j] == "\n" || $text[$j] == "\r" || - $text[$j] == "\t" || $text[$j] == "\'" || $text[$j] == "'") - break; - - $count = $j - $i; - $url = substr($text, $i, $count); - $qtext .= "$url"; - $col += $count; - $i = $j - 1; - break; - } - - default : - $col ++; - $qtext .= $text[$i]; - break; - } - } - - return ($qtext); -} - - -// -// 'sanitize_email()' - Convert an email address to something a SPAMbot -// can't read... -// - -function // O - Sanitized email -sanitize_email($email, // I - Email address - $html = 1) // I - HTML format? -{ - $nemail = ""; - $len = strlen($email); - - for ($i = 0; $i < $len; $i ++) - { - switch ($email[$i]) - { - case '@' : - if ($i > 0) - $i = $len; - else if ($html) - $nemail .= " at "; - else - $nemail .= " at "; - break; - - case '<' : - if ($i > 0) - $i = $len; - break; - - case '>' : - break; - - case '&' ; - $nemail .= "&"; - break; - - default : - $nemail .= $email[$i]; - break; - } - } - - return (trim($nemail)); -} - - -// -// 'sanitize_text()' - Sanitize text. -// - -function // O - Sanitized text -sanitize_text($text) // I - Original text -{ - $len = strlen($text); - $word = ""; - $qtext = ""; - - for ($i = 0; $i < $len; $i ++) - { - switch ($text[$i]) - { - case "\n" : - if (!strncmp($word, "http://", 7) || - !strncmp($word, "https://", 8) || - !strncmp($word, "ftp://", 6)) - $qtext .= "$word"; - else if (strchr($word, '@')) - $qtext .= sanitize_email($word); - else - $qtext .= quote_text($word); - - $qtext .= "
          "; - $word = ""; - break; - - case "\r" : - break; - - case "\t" : - case " " : - if (!strncmp($word, "http://", 7) || - !strncmp($word, "https://", 8) || - !strncmp($word, "ftp://", 6)) - $qtext .= "$word"; - else if (strchr($word, '@')) - $qtext .= sanitize_email($word); - else - $qtext .= quote_text($word); - - if ($word) - $qtext .= " "; - else - $qtext .= " "; - - $word = ""; - break; - - default : - $word .= $text[$i]; - break; - } - } - - if (!strncmp($word, "http://", 7) || - !strncmp($word, "https://", 8) || - !strncmp($word, "ftp://", 6)) - $qtext .= "$word"; - else if (strchr($word, '@')) - $qtext .= sanitize_email($word); - else - $qtext .= quote_text($word); - - return ($qtext); -} - - -// -// 'select_is_published()' - Do a "); - if ($is_published) - { - print(""); - print(""); - } - else - { - print(""); - print(""); - } - print(""); -} - - -// -// 'show_comments()' - Show comments for the given path... -// - -function // O - Number of comments -show_comments($url, // I - URL for comment - $path = "", // I - Path component - $parent_id = 0, // I - Parent comment - $heading = 3) // I - Heading level -{ - global $_COOKIE, $LOGIN_LEVEL; - - - $result = db_query("SELECT * FROM comment WHERE " - ."url = '" . db_escape($url) ."' " - ."AND parent_id = $parent_id " - ."ORDER BY id"); - - if (array_key_exists("MODPOINTS", $_COOKIE)) - $modpoints = $_COOKIE["MODPOINTS"]; - else - $modpoints = 5; - - if ($parent_id == 0 && $modpoints > 0) - print("

          You have $modpoints moderation points available.

          \n"); - - if ($heading > 6) - $heading = 6; - - $safeurl = urlencode($url); - $num_comments = 0; - $div = 0; - - while ($row = db_next($result)) - { - if ($row["status"] > 0) - { - if ($heading > 3 && !$div) - { - print("
          \n"); - $div = 1; - } - - $num_comments ++; - - $create_date = date("H:i M d, Y", $row['create_date']); - $create_user = sanitize_email($row['create_user']); - $contents = format_text($row['contents']); - - print("From " - ."$create_user, $create_date (score=$row[status])\n" - ."$contents\n"); - - html_start_links(); - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - { - html_link("Edit", "${path}comment.php?e$row[id]+p$safeurl"); - html_link("Delete", "${path}comment.php?d$row[id]+p$safeurl"); - } - - html_link("Reply", "${path}comment.php?r$row[id]+p$safeurl"); - - if ($modpoints > 0) - { - if ($row['status'] > 0) - html_link("Moderate Down", "${path}comment.php?md$row[id]+p$safeurl"); - - if ($row['status'] < 5) - html_link("Moderate Up", "${path}comment.php?mu$row[id]+p$safeurl"); - } - - html_end_links(); - } - - $num_comments += show_comments($url, $path, $row['id'], $heading + 1); - } - - db_free($result); - - if ($div) - print("
          \n"); - - return ($num_comments); -} - - -// -// 'validate_email()' - Validate an email address... -// - -function // O - TRUE if OK, FALSE otherwise -validate_email($email) // I - Email address -{ - // Check for both "name@domain.com" and "Full Name " - return (eregi("^[a-zA-Z0-9_\.+-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}$", - $email) || - eregi("^[^<]*<[a-zA-Z0-9_\.+-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}>$", - $email)); -} - - -// -// End of "$Id: common.php,v 1.12 2004/05/20 21:37:57 mike Exp $". -// -?> diff --git a/www/phplib/db.php b/www/phplib/db.php deleted file mode 100644 index 793d459..0000000 --- a/www/phplib/db.php +++ /dev/null @@ -1,159 +0,0 @@ -Database error $sqlerrno: $sqlerr

          \n"); - print("

          Please report the problem to " - ."webmaster@easysw.com.

          \n"); -} - - -// -// 'db_count()' - Return the number of rows in a query result. -// - -function // O - Number of rows in result -db_count($result) // I - Result of query -{ - if ($result) - return (mysql_num_rows($result)); - else - return (0); -} - - -// -// 'db_escape()' - Escape special chars in string for query. -// - -function // O - Quoted string -db_escape($str) // I - String -{ - return (mysql_escape_string($str)); -} - - -// -// 'db_free()' - Free a database query result... -// - -function -db_free($result) // I - Result of query -{ - if ($result) - mysql_free_result($result); -} - - -// -// 'db_insert_id()' - Return the ID of the last inserted record. -// - -function // O - ID number -db_insert_id() -{ - global $DB_CONN; - - return (mysql_insert_id($DB_CONN)); -} - - -// -// 'db_next()' - Fetch the next row of a result set and return it as an object. -// - -function // O - Row object or NULL at end -db_next($result) // I - Result of query -{ - if ($result) - return (mysql_fetch_array($result)); - else - return (NULL); -} - - -// -// 'db_query()' - Run a SQL query and return the result or 0 on error. -// - -function // O - Result of query or NULL -db_query($SQL_QUERY) // I - SQL query string -{ - global $DB_NAME, $DB_CONN; - - return (mysql_query($SQL_QUERY, $DB_CONN)); - -// print("

          SQL_QUERY: $SQL_QUERY

          \n"); -// -// $result = mysql_query($SQL_QUERY, $DB_CONN); -// $count = db_count($result); -// print("

          Result = $count rows...

          \n"); -// -// return ($result); -} - - -// -// 'db_seek()' - Seek to a specific row within a result. -// - -function // O - TRUE on success, FALSE otherwise -db_seek($result, // I - Result of query - $index = 0) // I - Row number (0 = first row) -{ - if ($result) - return (mysql_data_seek($result, $index)); - else - return (FALSE); -} - - -// -// End of "$Id: db.php,v 1.5 2004/05/21 03:59:17 mike Exp $". -// -?> diff --git a/www/phplib/globals.php b/www/phplib/globals.php deleted file mode 100644 index 4f21fb1..0000000 --- a/www/phplib/globals.php +++ /dev/null @@ -1,49 +0,0 @@ - diff --git a/www/phplib/html.php b/www/phplib/html.php deleted file mode 100644 index 07a9a30..0000000 --- a/www/phplib/html.php +++ /dev/null @@ -1,465 +0,0 @@ - for the "is published" field... -// - - -// -// Include necessary headers... -// - -include_once "globals.php"; -include_once "auth.php"; - - -// Check for a logout on the command-line... -if ($argc == 1 && $argv[0] == "logout") -{ - auth_logout(); - $argc = 0; -} - - -// Search keywords... -$html_keywords = array( - "documentation", - "functions", - "library", - "linux", - "macos x", - "mini-xml", - "mxml", - "mxmldoc", - "software", - "unix", - "windows", - "xml" -); - -// Figure out the base path... -$html_path = dirname($PHP_SELF); - -if (array_key_exists("PATH_INFO", $_SERVER)) -{ - $i = -1; - while (($i = strpos($_SERVER["PATH_INFO"], "/", $i + 1)) !== FALSE) - $html_path = dirname($html_path); -} - -if ($html_path == "/") - $html_path = ""; - - -// -// 'html_header()' - Show the standard page header and navbar... -// - -function // O - User information -html_header($title = "", // I - Additional document title - $refresh = "") // I - Refresh URL -{ - global $html_keywords, $html_path, $_GET, $LOGIN_USER, $PHP_SELF, $_SERVER; - - - // Common stuff... -// header("Cache-Control: no-cache"); - - print("\n"); - print("\n"); - print("\n"); - - // Title... - if ($title != "") - $html_title = "$title -"; - else - $html_title = ""; - - print(" $html_title Mini-XML\n" - ." \n" - ." \n" - ." \n" - ." \n"); - - // If refresh URL is specified, add the META tag... - if ($refresh != "") - print(" \n"); - - // Search engine keywords... - reset($html_keywords); - - list($key, $val) = each($html_keywords); - print("\n"); - - print("\n" - ."\n"); - - // Standard navigation stuff... - if (array_key_exists("Q", $_GET)) - $q = htmlspecialchars($_GET["Q"], ENT_QUOTES); - else - $q = ""; - - if (stripos($_SERVER["HTTP_USER_AGENT"], "webkit") !== FALSE) - { - // Use Safari search box... - $search = ""; - } - else - { - // Use standard HTML text field... - $search = ""; - } - - $classes = array("unsel", "unsel", "unsel", "unsel", "unsel", "unsel"); - if (strpos($PHP_SELF, "/account.php") !== FALSE || - strpos($PHP_SELF, "/login.php") !== FALSE) - $classes[0] = "sel"; - else if (strpos($PHP_SELF, "/str.php") !== FALSE) - $classes[2] = "sel"; - else if (strpos($PHP_SELF, "/documentation.php") !== FALSE || - strpos($PHP_SELF, "/account.php") !== FALSE) - $classes[3] = "sel"; - else if (strpos($PHP_SELF, "/software.php") !== FALSE) - $classes[4] = "sel"; - else if (strpos($PHP_SELF, "/forums.php") !== FALSE) - $classes[5] = "sel"; - else - $classes[1] = "sel"; - - print("\n" - ."" - ."" - ."" - ."" - ."" - ."" - ."" - ."" - ."" - ."\n" - ."\n" - ."\n" - ."
          "); - - if ($LOGIN_USER) - print("$LOGIN_USER"); - else - print("Login"); - - print("HomeBugs & FeaturesDocumentationDownloadForums" - ."
          " - ."$search
          "); -} - - -// -// 'html_footer()' - Show the standard footer for a page. -// - -function -html_footer() -{ - print("
          \n" - ."\n" - ."\n"); -} - - -// -// 'html_start_links()' - Start of series of hyperlinks. -// - -function -html_start_links($center = FALSE) // I - Center links? -{ - global $html_firstlink; - - $html_firstlink = 1; - - if ($center) - print("

          "); -} - - -// -// 'html_end_links()' - End of series of hyperlinks. -// - -function -html_end_links() -{ - print("

          \n"); -} - - -// -// 'html_link()' - Show a single hyperlink. -// - -function -html_link($text, // I - Text for hyperlink - $link) // I - URL for hyperlink -{ - global $html_firstlink; - - if ($html_firstlink) - $html_firstlink = 0; - else - print(" · "); - - $safetext = str_replace(" ", " ", $text); - - print("$safetext"); -} - - -// -// 'html_links()' - Show an array of links. -// - -function -html_links($links) // I - Associated array of hyperlinks -{ - reset($links); - while (list($key, $val) = each($links)) - html_link($key, $val); -} - - -// -// 'html_start_table()' - Start a rounded, shaded table. -// - -function -html_start_table($headings, // I - Array of heading strings - $width = "100%", // I - Width of table - $height = "") // I - Height of table -{ - global $html_row; - - - print("" - .""); - - $html_row = 0; - - reset($headings); - for ($i = 0; $i < count($headings); $i ++) - { - // - // Headings can be in the following forms: - // - // Mix and match as needed: - // - // "xxxxxxxx" -- Just a column heading. - // "xxxxxxxx:aa" -- Heading with align. - // "xxxxxxxx::cc" -- Heading with a colspan. - // "xxxxxxxx:::ww" -- Heading with a width. - // "xxxxxxxx::cc:ww" -- Heading with colspan and width. - // "xxxxxxxx:aa:cc:ww" -- Heading with align, colspan and width. - // - // etc, etc. - // - - $s_header = ""; - $s_colspan = ""; - $s_width = ""; - $s_align = ""; - - if (strstr($headings[$i], ":")) - { - $data = explode(":", $headings[$i]); - $s_header = $data[0]; - - if ($data[1] != "") - $s_align = "align=$data[1]"; - - if ($data[2] > 1) - $s_colspan = "colspan=$data[2]"; - - if ($data[3] > 0) - $s_width = "width=$data[3]%"; - } - else - $s_header = $headings[$i]; - - if (strlen($s_header)) - print(""); - else - print(""); - } - - print("\n"); -} - - -// -// 'html_end_table()' - End a rounded, shaded table. -// - -function -html_end_table() -{ - print("
          $s_header 
          \n"); -} - - -// -// 'html_start_row()' - Start a table row. -// - -function -html_start_row($classname = "") // I - HTML class to use -{ - global $html_row; - - if ($classname == "") - $classname = "data$html_row"; - else - $html_row = 1 - $html_row; - - print(""); -} - - -// -// 'html_end_row()' - End a table row. -// - -function -html_end_row() -{ - global $html_row; - - $html_row = 1 - $html_row; - - print("\n"); -} - - -// -// 'html_search_words()' - Generate an array of search words. -// - -function // O - Array of words -html_search_words($search = "") // I - Search string -{ - $words = array(); - $temp = ""; - $len = strlen($search); - - for ($i = 0; $i < $len; $i ++) - { - switch ($search[$i]) - { - case "\"" : - if ($temp != "") - { - $words[sizeof($words)] = strtolower($temp); - $temp = ""; - } - - $i ++; - - while ($i < $len && $search[$i] != "\"") - { - $temp .= $search[$i]; - $i ++; - } - - $words[sizeof($words)] = strtolower($temp); - $temp = ""; - break; - - case " " : - case "\t" : - case "\n" : - if ($temp != "") - { - $words[sizeof($words)] = strtolower($temp); - $temp = ""; - } - break; - - default : - $temp .= $search[$i]; - break; - } - } - - if ($temp != "") - $words[sizeof($words)] = strtolower($temp); - - return ($words); -} - - -// -// 'html_select_is_published()' - Do a "); - if ($is_published) - { - print(""); - print(""); - } - else - { - print(""); - print(""); - } - print(""); -} - - -?> diff --git a/www/phplib/mirrors.php b/www/phplib/mirrors.php deleted file mode 100644 index 6b25321..0000000 --- a/www/phplib/mirrors.php +++ /dev/null @@ -1,71 +0,0 @@ - array("California, USA", 37.7898, -122.3942), - "http://ftp2.easysw.com/pub" => array("New Jersey, USA", 40.4619, -74.3561), - "http://ftp.funet.fi/pub/mirrors/ftp.easysw.com/pub" => array("Espoo, Finland", 60.2167, 24.6667), - "http://ftp.rz.tu-bs.de/pub/mirror/ftp.easysw.com/ftp/pub" => array("Braunschweig, Germany", 52.2667, 10.5333), -); - - -// -// 'mirror_closest()' - Return the closest mirror to the current IP. -// - -function // O - Closest mirror -mirror_closest() -{ - global $_SERVER, $MIRRORS; - - - // Get the current longitude for the client... - if (!extension_loaded("geoip.so") || - $_SERVER["REMOTE_ADDR"] == "::1" || - $_SERVER["REMOTE_ADDR"] == "127.0.0.1") - $lon = -120; - else - { - $current = geoip_record_by_name($_SERVER["REMOTE_ADDR"]); - $lon = $current["longitude"]; - } - - // Loop through the mirrors to find the closest one, currently just using - // the longitude... - $closest_mirror = ""; - $closest_distance = 999; - - reset($MIRRORS); - foreach ($MIRRORS as $mirror => $data) - { - $distance = abs($lon - $data[2]); - if ($distance > 180) - $distance = 360 - $distance; - - if ($distance < $closest_distance) - { - $closest_mirror = $mirror; - $closest_distance = $distance; - } - } - - return ($closest_mirror); -} - - -// -// End of "$Id$". -// -?> diff --git a/www/phplib/poll.php b/www/phplib/poll.php deleted file mode 100644 index e2cedb7..0000000 --- a/www/phplib/poll.php +++ /dev/null @@ -1,114 +0,0 @@ -
          " - ."$question\n"); - - if ($row['poll_type'] == $POLL_TYPE_PICKONE) - print("(please pick one)\n"); - else - print("(pick all that apply)\n"); - - for ($i = 0; $i < 10; $i ++) - { - $answer = htmlspecialchars($row["answer$i"]); - - if ($answer != "") - { - if ($row['poll_type'] == $POLL_TYPE_PICKONE) - print("
          $answer\n"); - } - } - - $votes = $row['votes']; - if ($votes == 1) - $votes .= " vote"; - else - $votes .= " votes"; - - $ccount = count_comments("poll.php_r$id"); - if ($ccount == 1) - $ccount .= " comment"; - else - $ccount .= " comments"; - - print("
          \n" - ."[ Results ]\n"); - print("
          ($votes, $ccount)

          \n"); - } - - db_free($result); -} - - -// -// End of "$Id: poll.php,v 1.1 2004/05/20 03:38:42 mike Exp $". -// -?> diff --git a/www/phplib/str.php b/www/phplib/str.php deleted file mode 100644 index f771cef..0000000 --- a/www/phplib/str.php +++ /dev/null @@ -1,82 +0,0 @@ - "Resolved", - 2 => "Unresolved", - 3 => "Active", - 4 => "Pending", - 5 => "New" -); - -$status_long = array( - 1 => "1 - Closed w/Resolution", - 2 => "2 - Closed w/o Resolution", - 3 => "3 - Active", - 4 => "4 - Pending", - 5 => "5 - New" -); - -$priority_text = array( - 1 => "RFE", - 2 => "LOW", - 3 => "MODERATE", - 4 => "HIGH", - 5 => "CRITICAL" -); - -$priority_long = array( - 1 => "1 - Request for Enhancement, e.g. asking for a feature", - 2 => "2 - Low, e.g. a documentation error or undocumented side-effect", - 3 => "3 - Moderate, e.g. unable to compile the software", - 4 => "4 - High, e.g. key functionality not working", - 5 => "5 - Critical, e.g. nothing working at all" -); - -$scope_text = array( - 1 => "MACH", - 2 => "OS", - 3 => "ALL" -); - -$scope_long = array( - 1 => "1 - Specific to a machine", - 2 => "2 - Specific to an operating system", - 3 => "3 - Applies to all machines and operating systems" -); - - -// -// End of "$Id: str.php,v 1.2 2004/05/19 00:57:33 mike Exp $". -// -?> diff --git a/www/poll.php b/www/poll.php deleted file mode 100644 index ed84aa6..0000000 --- a/www/poll.php +++ /dev/null @@ -1,395 +0,0 @@ - 0) -{ - $op = $argv[0][0]; - $argv[0][0] = ' '; - $poll = (int)$argv[0]; -} -else if ($LOGIN_LEVEL >= AUTH_DEVEL) - $op = 'l'; -else - $op = 'c'; - -if ($poll == 0 && $op != 'u' && $op != 'n') - $poll = get_recent_poll(); - -// Do it! -switch ($op) -{ - case 'c' : // Show a poll - html_header("Poll #$poll"); - print("

          Poll #$poll

          \n"); - show_poll($poll); - html_footer(); - break; - - case 'l' : // List all polls - html_header("Polls"); - - if ($LOGIN_LEVEL > AUTH_USER) - { - // Show all polls and allow poll creation... - $result = db_query("SELECT * FROM poll ORDER BY id DESC"); - - html_start_links(1); - html_link("Add New Poll", "$PHP_SELF?n"); - html_end_links(1); - } - else - { - // Only show published polls... - $result = db_query("SELECT * FROM poll WHERE is_published = 1 " - ."ORDER BY id DESC"); - } - - print("

          Polls

          \n"); - - if (db_count($result) == 0) - { - print("

          No polls found.

          \n"); - } - else - { - html_start_table(array("ID", "Question::2")); - - while ($row = db_next($result)) - { - $id = $row['id']; - $votes = $row['votes']; - $question = htmlspecialchars($row['question']); - $ccount = count_comments("poll.php_r$id"); - - if ($ccount == 1) - $ccount .= " comment"; - else - $ccount .= " comments"; - - html_start_row(); - print("#$row[id]" - ."$question"); - if (!$row['is_published']) - print(" private"); - print("Vote | " - ."Results"); - - if ($LOGIN_LEVEL > AUTH_USER) - print(" | Edit"); - - print(" ($votes total votes, $ccount)"); - html_end_row(); - } - - html_end_table(); - } - - db_free($result); - - html_footer(); - break; - - case 'r' : // Show results - html_header("Poll #$poll"); - - html_start_links(1); - html_link("Show All Polls", "$PHP_SELF?l"); - html_link("Show Comments", "#_USER_COMMENTS"); - html_link("Submit Comment", "comment.php?r0+ppoll.php_r$poll"); - html_end_links(1); - - print("

          Poll #$poll

          \n"); - - $result = db_query("SELECT * FROM poll WHERE id = $poll"); - $row = db_next($result); - - $votes = $row['votes']; - - for ($max_count = 0, $i = 0; $i < 10; $i ++) - { - if ($row["count$i"] > $max_count) - $max_count = $row["count$i"]; - } - - if ($votes == 0) - print("

          No votes for this poll yet...

          \n"); - else - { - $question = htmlspecialchars($row['question']); - - print("
          \n"); - print("\n"); - - for ($i = 0; $i < 10; $i ++) - { - if ($row["answer$i"] != "") - { - $percent = (int)(100 * $row["count$i"] / $votes); - $size = (int)(300 * $row["count$i"] / $max_count); - $answer = htmlspecialchars($row["answer$i"]); - $count = $row["count$i"]; - - print("\n"); - } - } - - print("\n"); - print("
          $question
          $answer" - ." $count / $percent%
          $votes total votes.
          \n"); - } - - print("
          \n" - ."

          User Comments

          \n"); - html_start_links(); - html_link("Submit Comment", "comment.php?r0+ppoll.php_r$poll"); - html_end_links(); - - show_comments("poll.php_r$poll"); - - db_free($result); - - html_footer(); - break; - - case 'v' : // Vote on a poll - $answers = ""; - - if ($REQUEST_METHOD == "POST") - { - if (array_key_exists("ANSWER", $_POST)) - { - $answer = (int)$_POST["ANSWER"]; - $answers = ",count$answer=count$answer+1"; - } - else - { - for ($i = 0; $i < 10; $i ++) - { - if (array_key_exists("ANSWER$i", $_POST)) - $answers .= ",count$i=count$i+1"; - } - } - } - - if ($answers != "") - { - if (!db_query("INSERT INTO vote VALUES('poll_${poll}_${REMOTE_ADDR}')") - && $LOGIN_LEVEL < AUTH_ADMIN) - { - html_header("Poll Error"); - print("

          Poll Error

          \n"); - print("

          Sorry, it appears that you or someone else using your IP " - ."address has already voted for " - ."poll #$poll.\n"); - html_footer(); - } - else - { - db_query("UPDATE poll SET votes=votes+1$answers WHERE id = $poll"); - - header("Location: $PHP_SELF?r$poll"); - } - } - else - { - header("Location: $PHP_SELF?c$poll"); - } - break; - - case 'n' : // New poll - case 'e' : // Edit poll - if (!$LOGIN_USER) - { - header("Location:$PHP_SELF?r$poll"); - break; - } - - if ($poll) - { - html_header("Poll #$poll"); - - print("

          Poll #$poll

          \n"); - - $result = db_query("SELECT * FROM poll WHERE id = $poll"); - $row = db_next($result); - - $question = htmlspecialchars($row['question']); - $poll_type = $row['poll_type']; - - for ($i = 0; $i < 10; $i ++) - { - if ($row["answer$i"]) - $answer[$i] = htmlspecialchars($row["answer$i"], ENT_QUOTES); - else - $answer[$i] = ""; - } - - $is_published = $row['is_published']; - - db_free($result); - } - else - { - html_header("New Poll"); - - print("

          New Poll

          \n"); - - $question = ""; - $poll_type = $POLL_TYPE_PICKONE; - $answer[0] = ""; - $answer[1] = ""; - $answer[2] = ""; - $answer[3] = ""; - $answer[4] = ""; - $answer[5] = ""; - $answer[6] = ""; - $answer[7] = ""; - $answer[8] = ""; - $answer[9] = ""; - $is_published = 0; - } - - print("
          \n"); - print("
          \n" - ."\n"); - - print("\n"); - - print("\n"); - - for ($i = 0; $i < 10; $i ++) - { - $number = $i + 1; - - print("\n"); - } - - if ($poll) - print("\n"); - else - print("\n"); - - print("
          Question:" - ."
          Type:" - ."
          Published:"); - select_is_published($is_published); - print("
          Answer #$number" - ."
          \n"); - print("
          \n"); - - html_footer(); - break; - - case 'u' : // Update poll - header("Location:$PHP_SELF?l"); - - if ($LOGIN_LEVEL < AUTH_DEVEL) - break; - - $is_published = (int)$_POST["IS_PUBLISHED"]; - $question = db_escape($_POST["QUESTION"]); - $poll_type = (int)$_POST["POLLTYPE"]; - $answer0 = db_escape($_POST["ANSWER0"]); - $answer1 = db_escape($_POST["ANSWER1"]); - $answer2 = db_escape($_POST["ANSWER2"]); - $answer3 = db_escape($_POST["ANSWER3"]); - $answer4 = db_escape($_POST["ANSWER4"]); - $answer5 = db_escape($_POST["ANSWER5"]); - $answer6 = db_escape($_POST["ANSWER6"]); - $answer7 = db_escape($_POST["ANSWER7"]); - $answer8 = db_escape($_POST["ANSWER8"]); - $answer9 = db_escape($_POST["ANSWER9"]); - $date = time(); - - if ($poll) - { - // Update an existing poll... - db_query("UPDATE poll SET " - ."question='$question'," - ."is_published=$is_published," - ."poll_type=$poll_type," - ."answer0='$answer0'," - ."answer1='$answer1'," - ."answer2='$answer2'," - ."answer3='$answer3'," - ."answer4='$answer4'," - ."answer5='$answer5'," - ."answer6='$answer6'," - ."answer7='$answer7'," - ."answer8='$answer8'," - ."answer9='$answer9'," - ."modify_date=$date," - ."modify_user='$LOGIN_USER' " - ."WHERE id = $poll"); - } - else - { - // Create a new poll... - db_query("INSERT INTO poll VALUES(NULL," - ."$is_published," - ."$poll_type," - ."'$question'," - ."'$answer0',0," - ."'$answer1',0," - ."'$answer2',0," - ."'$answer3',0," - ."'$answer4',0," - ."'$answer5',0," - ."'$answer6',0," - ."'$answer7',0," - ."'$answer8',0," - ."'$answer9',0," - ."0," - ."$date,'$LOGIN_USER'," - ."$date,'$LOGIN_USER')"); - } - break; -} - -db_close(); - -// -// End of "$Id: poll.php,v 1.3 2004/05/20 15:45:55 mike Exp $". -// -?> diff --git a/www/software.php b/www/software.php deleted file mode 100644 index cc3ce64..0000000 --- a/www/software.php +++ /dev/null @@ -1,182 +0,0 @@ -Download\n"); - - print("

          Your download should begin shortly. If not, please " - ."click here to download the file " - ."from the current mirror.

          \n" - ."
          \n" - ."\n" - ."\n"); - - reset($MIRRORS); - while (list($key, $val) = each($MIRRORS)) - { - print("$val[0]
          \n"); - } - - print("

          \n" - ."

          \n"); -} -else -{ - // Show files... - print("

          Releases

          \n"); - - html_start_table(array("Version", "Filename", "Size", "MD5 Sum")); - - $curversion = ""; - - for ($i = 0; $i < sizeof($files); $i ++) - { - // Grab the data for the current file... - $data = explode(" ", $files[$i]); - $md5 = $data[0]; - $fversion = $data[1]; - $filename = $data[2]; - $basename = basename($filename); - - if ($fversion == $version) - { - $cs = ""; - $ce = ""; - } - else - { - $cs = ""; - $ce = ""; - } - - if ($fversion != $curversion) - { - if ($curversion != "") - { - html_start_row("header"); - print(""); - html_end_row(); - } - - $curversion = $fversion; - html_start_row(); - print("$cs$fversion$ce"); - } - else - { - html_start_row(); - print("$cs$ce"); - } - - if (file_exists("/home/ftp.easysw.com/pub/$filename")) - $kbytes = (int)((filesize("/home/ftp.easysw.com/pub/$filename") + 1023) / 1024); - else - $kbytes = "???"; - - print("$cs" - ."$basename$ce" - ."$cs${kbytes}k$ce" - ."$cs$md5$ce"); - - html_end_row(); - } - - html_end_table(); - - print("

          Subversion Access

          \n" - ."

          The $PROJECT_NAME software is available via Subversion " - ."using the following URL:

          \n" - ."
          \n"
          -       ."    "
          -       ."http://svn.easysw.com/public/$PROJECT_MODULE/\n"
          -       ."
          \n" - ."

          The following command can be used to checkout the current " - ."$PROJECT_NAME source from Subversion:

          \n" - ."
          \n"
          -       ."    svn co http://svn.easysw.com/public/$PROJECT_MODULE/trunk/ $PROJECT_MODULE\n"
          -       ."
          \n"); -} - -// Show the standard footer... -html_footer(); - -// -// End of "$Id$". -// -?> diff --git a/www/str.php b/www/str.php deleted file mode 100644 index d443789..0000000 --- a/www/str.php +++ /dev/null @@ -1,1934 +0,0 @@ - - "Fixed in Subversion repository.", - "Old STR" => - "This STR has not been updated by the submitter for two or more weeks " - ."and has been closed as required by the Mini-XML Configuration Management " - ."Plan. If the issue still requires resolution, please re-submit a new " - ."STR.", - "Unresolvable" => - "We are unable to resolve this problem with the information provided. " - ."If you discover new information, please file a new STR referencing " - ."this one." -); - -$subsystems = array( - "Build Files", - "Config Files", - "Core API", - "Documentation", - "Multiple", - "mxmldoc", - "Sample Programs", - "Web Site" -); - -$versions = array( - "+Will Not Fix", - "+None", - "+Future", - "Trunk", - "+3.0", - "2.7", - "2.6", - "2.5", - "2.4", - "2.3", - "2.2.2", - "2.2.1", - "2.2", - "2.1", - "2.0", - "2.0rc1", - "1.3", - "1.2", - "1.1.2", - "1.1.1", - "1.1", - "1.0", - "Web Site" -); - - -// -// Get the list of valid developers from the users table... -// - -$managers = array(); - -$result = db_query("SELECT * FROM users WHERE is_published = 1 AND " - ."level >= " . AUTH_DEVEL); -while ($row = db_next($result)) - $managers[$row["name"]] = $row["email"]; - -db_free($result); - - -// -// 'notify_users()' - Notify users of STR changes... -// - -function -notify_users($id, // I - STR # - $what = "updated", // I - Reason for notification - $contents = "") // I - Notification message -{ - global $priority_long; - global $scope_long; - global $status_long; - global $PHP_URL, $PROJECT_EMAIL, $PROJECT_NAME; - - - $result = db_query("SELECT * FROM str WHERE id = $id"); - if ($result) - { - $contents = wordwrap($contents); - $row = db_next($result); - $prtext = $priority_long[$row['priority']]; - $sttext = $status_long[$row['status']]; - $sctext = $scope_long[$row['scope']]; - - if ($row['subsystem'] != "") - $subsystem = $row['subsystem']; - else - $subsystem = "Unassigned"; - - if ($row['fix_version'] != "") - $fix_version = $row['fix_version']; - else - $fix_version = "Unassigned"; - - if (eregi("[a-z0-9_.]+", $row['create_user'])) - $email = auth_user_email($row['create_user']); - else - $email = $row['create_user']; - - if ($row['create_user'] != $row['modify_user'] && - $row['create_user'] != $manager && - $email != "") - mail($email, "$PROJECT_NAME STR #$id $what", - "Your software trouble report #$id has been $what. You can check\n" - ."the status of the report and add additional comments and/or files\n" - ."at the following URL:\n" - ."\n" - ." $PHP_URL?L$id\n" - ."\n" - ." Summary: $row[summary]\n" - ." Version: $row[str_version]\n" - ." Status: $sttext\n" - ." Priority: $prtext\n" - ." Scope: $sctext\n" - ." Subsystem: $subsystem\n" - ."Fix Version: $fix_version\n" - ."\n$contents" - ."________________________________________________________________\n" - ."Thank you for using the $PROJECT_NAME Software Trouble Report page!", - "From: $PROJECT_EMAIL\r\n"); - - $ccresult = db_query("SELECT email FROM carboncopy WHERE url = 'str.php_L$id'"); - if ($ccresult) - { - while ($ccrow = db_next($ccresult)) - { - mail($ccrow['email'], "$PROJECT_NAME STR #$id $what", - "Software trouble report #$id has been $what. You can check\n" - ."the status of the report and add additional comments and/or files\n" - ."at the following URL:\n" - ."\n" - ." $PHP_URL?L$id\n" - ."\n" - ." Summary: $row[summary]\n" - ." Version: $row[str_version]\n" - ." Status: $sttext\n" - ." Priority: $prtext\n" - ." Scope: $sctext\n" - ." Subsystem: $subsystem\n" - ."Fix Version: $fix_version\n" - ."\n$contents" - ."________________________________________________________________\n" - ."Thank you for using the $PROJECT_NAME Software Trouble Report page!", - "From: $PROJECT_EMAIL\r\n"); - } - - db_free($ccresult); - } - - if ($row['manager_email'] != "") - $manager = $row['manager_email']; - else - $manager = $PROJECT_EMAIL; - - if ($row['modify_user'] != $manager) - mail($manager, "$PROJECT_NAME STR #$id $what", - "The software trouble report #$id assigned to you has been $what.\n" - ."You can manage the report and add additional comments and/or files\n" - ."at the following URL:\n" - ."\n" - ." $PHP_URL?L$id\n" - ."\n" - ." Summary: $row[summary]\n" - ." Version: $row[str_version]\n" - ." Status: $sttext\n" - ." Priority: $prtext\n" - ." Scope: $sctext\n" - ." Subsystem: $subsystem\n" - ."Fix Version: $fix_version\n" - ."\n$contents", - "From: $PROJECT_EMAIL\r\n"); - - db_free($result); - } -} - - -// Get command-line options... -// -// Usage: str.php [operation] [options] -// -// Operations: -// -// B = Batch update selected STRs -// L = List all STRs -// L# = List STR # -// M# = Modify STR # -// T# = Post text for STR # -// F# = Post file for STR # -// N = Post new STR -// U# = Update notification for STR # -// -// Options: -// -// I# = Set first STR -// P# = Set priority filter -// S# = Set status filter -// C# = Set scope filter -// E# = Set email filter -// Qtext = Set search text - -$priority = 0; -$status = -2; -$scope = 0; -$search = ""; -$index = 0; -$femail = 0; - -if ($argc) -{ - $op = $argv[0][0]; - $id = (int)substr($argv[0], 1); - - if ($op != 'L' && $op != 'M' && $op != 'T' && $op != 'F' && - $op != 'N' && $op != 'U' && $op != 'B') - { - html_header("Bugs & Features Error"); - print("

          Bad command '$op'!

          \n"); - html_footer(); - exit(); - } - - if (($op == 'M' || $op == 'B') && $LOGIN_LEVEL < AUTH_DEVEL) - { - html_header("Bugs & Features Error"); - print("

          The '$op' command is not available to you!

          \n"); - html_footer(); - exit(); - } - - if (($op == 'M' || $op == 'T' || $op == 'F') && !$id) - { - html_header("Bugs & Features Error"); - print("

          Command '$op' requires an STR number!

          \n"); - html_footer(); - exit(); - } - - if ($op == 'N' && $id) - { - html_header("Bugs & Features Error"); - print("

          Command '$op' cannot have an STR number!

          \n"); - html_footer(); - exit(); - } - - for ($i = 1; $i < $argc; $i ++) - { - $option = substr($argv[$i], 1); - - switch ($argv[$i][0]) - { - case 'P' : // Set priority filter - $priority = (int)$option; - break; - case 'S' : // Set status filter - $status = (int)$option; - break; - case 'C' : // Set scope filter - $scope = (int)$option; - break; - case 'Q' : // Set search text - $search = urldecode($option); - $i ++; - while ($i < $argc) - { - $search .= urldecode(" $argv[$i]"); - $i ++; - } - break; - case 'I' : // Set first STR - $index = (int)$option; - if ($index < 0) - $index = 0; - break; - case 'E' : // Show only problem reports matching the current email - $femail = (int)$option; - break; - default : - html_header("Bugs & Features Error"); - print("

          Bad option '$argv[$i]'!

          \n"); - html_footer(); - exit(); - break; - } - } -} -else -{ - $op = 'L'; - $id = 0; -} - -if ($REQUEST_METHOD == "POST") -{ - if (array_key_exists("FPRIORITY", $_POST)) - $priority = (int)$_POST["FPRIORITY"]; - if (array_key_exists("FSTATUS", $_POST)) - $status = (int)$_POST["FSTATUS"]; - if (array_key_exists("FSCOPE", $_POST)) - $scope = (int)$_POST["FSCOPE"]; - if (array_key_exists("FEMAIL", $_POST)) - $femail = (int)$_POST["FEMAIL"]; - if (array_key_exists("SEARCH", $_POST)) - $search = $_POST["SEARCH"]; -} - -$options = "+P$priority+S$status+C$scope+I$index+E$femail+Q" . urlencode($search); - -// B = Batch update selected STRs -// L = List all STRs -// L# = List STR # -// M# = Modify STR # -// T# = Post text for STR # -// F# = Post file for STR # -// N = Post new STR -// U# = Update notification for STR # - -switch ($op) -{ - case 'B' : // Batch update selected STRs - if ($REQUEST_METHOD != "POST") - { - header("Location: $PHP_SELF?L$options"); - break; - } - - if (array_key_exists("STATUS", $_POST) && - ($_POST["STATUS"] != "" || - $_POST["PRIORITY"] != "" || - $_POST["MANAGER_EMAIL"] != "" || - $_POST["MESSAGE"] != "")) - { - $time = time(); - $manager_email = db_escape($_POST["MANAGER_EMAIL"]); - $modify_user = db_escape($_COOKIE["FROM"]); - $message = $_POST["MESSAGE"]; - - if ($message != "") - { - $contents = db_escape($messages[$message]); - $mailmsg = $messages[$message] . "\n\n"; - } - else - { - $contents = ""; - $mailmsg = ""; - } - - $query = "modify_date = $time, modify_user = '$modify_user'"; - - if ($_POST["STATUS"] != "") - $query .= ", status = $_POST[STATUS]"; - if ($_POST["PRIORITY"] != "") - $query .= ", priority = $_POST[PRIORITY]"; - if ($manager_email != "") - $query .= ", manager_email = '$manager_email'"; - - db_query("BEGIN TRANSACTION"); - - reset($_POST); - while (list($key, $val) = each($_POST)) - if (substr($key, 0, 3) == "ID_") - { - $id = (int)substr($key, 3); - - db_query("UPDATE str SET $query WHERE id = $id"); - - if ($contents != "") - { - db_query("INSERT INTO strtext VALUES(NULL,$id,1,'$contents'," - ."$time,'$modify_user')"); - - notify_users($id, "updated", $mailmsg); - } - } - - db_query("COMMIT TRANSACTION"); - } - - header("Location: $PHP_SELF?L$options"); - break; - - case 'L' : // List (all) STR(s) - if ($id) - { - html_header("STR #$id"); - - $result = db_query("SELECT * FROM str WHERE id = $id"); - if (db_count($result) != 1) - { - print("

          Error: STR #$id was not found!

          \n"); - html_footer(); - exit(); - } - - $row = db_next($result); - - html_start_links(1); - html_link("Return to Bugs & Features", "$PHP_SELF?L$options"); - - if ($row['status'] >= $STR_STATUS_ACTIVE) - { - html_link("Post Text", "$PHP_SELF?T$id$options"); - html_link("Post File", "$PHP_SELF?F$id$options"); - } - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - html_link("Modify STR", "$PHP_SELF?M$id$options"); - - html_end_links(); - - $create_user = sanitize_email($row['create_user']); - $manager_email = sanitize_email($row['manager_email']); - $subsystem = $row['subsystem']; - $summary = htmlspecialchars($row['summary'], ENT_QUOTES); - $prtext = $priority_long[$row['priority']]; - $sttext = $status_long[$row['status']]; - $sctext = $scope_long[$row['scope']]; - $str_version = $row['str_version']; - $fix_version = $row['fix_version']; - - if ($manager_email == "") - $manager_email = "Unassigned"; - - if ($subsystem == "") - $subsystem = "Unassigned"; - - if ($fix_version == "") - $fix_version = "Unassigned"; - - print("\n"); - - print("\n"); - - if ($row['master_id'] > 0) - print("" - ."\n"); - - if (!$row['is_published']) - print("\n"); - - print("\n"); - - print("\n"); - print("\n"); - print("\n"); - print("\n"); - print("\n"); - print("\n"); - print("\n"); - print("\n"); - - if (array_key_exists("FROM", $_COOKIE)) - $email = htmlspecialchars($_COOKIE["FROM"]); - else - $email = ""; - - print("\n"); - print("
          ID:$id
          Duplicate Of:STR " - ."#$row[master_id]
          This STR is " - ."currently hidden from public view.
          Status:$sttext
          Priority:$prtext
          Scope:$sctext
          Subsystem:$subsystem
          Summary:$summary
          Version:$str_version
          Created By:$create_user
          Assigned To:$manager_email
          Fix Version:$fix_version
          Update Notification:" - ."
          " - ."" - ."" - ."
          Receive EMails " - ."Don't Receive EMails" - ."
          " - ."
          \n"); - - db_free($result); - - print("

          Trouble Report Files:

          \n"); - if ($row['status'] >= $STR_STATUS_ACTIVE) - { - html_start_links(); - html_link("Post File", "$PHP_SELF?F$id$options"); - html_end_links(); - } - - $result = db_query("SELECT * FROM strfile WHERE " - ."str_id = $id AND is_published = 1"); - - if (db_count($result) == 0) - print("

          No files

          \n"); - else - { - html_start_table(array("Name/Time/Date", "Filename")); - - while ($row = db_next($result)) - { - $date = date("M d, Y", $row['create_date']); - $time = date("H:i", $row['create_date']); - $email = sanitize_email($row['create_user']); - $filename = htmlspecialchars($row['filename']); - - html_start_row(); - print("$email
          $time $date" - ."" - ."$filename"); - html_end_row(); - } - - html_end_table(); - } - - db_free($result); - - print("

          Trouble Report Dialog:

          \n"); - if ($row['status'] >= $STR_STATUS_ACTIVE) - { - html_start_links(); - html_link("Post Text", "$PHP_SELF?T$id$options"); - html_end_links(); - } - - $result = db_query("SELECT * FROM strtext WHERE " - ."str_id = $id AND is_published = 1"); - - if (db_count($result) == 0) - print("

          No text

          \n"); - else - { - html_start_table(array("Name/Time/Date", "Text")); - - while ($row = db_next($result)) - { - $date = date("M d, Y", $row['create_date']); - $time = date("H:i", $row['create_date']); - $email = sanitize_email($row['create_user']); - $contents = quote_text($row['contents']); - - html_start_row(); - print("$email
          $time $date" - ."$contents"); - html_end_row(); - } - - html_end_table(); - } - - db_free($result); - } - else - { - html_header("Bugs & Features"); - - html_start_links(1); - html_link("Submit Bug or Feature Request", "$PHP_SELF?N$options'"); - html_end_links(); - - $htmlsearch = htmlspecialchars($search, ENT_QUOTES); - - print("

          " - ."Search Words:  " - ."

          \n"); - - print("

          Priority: \n"); - - print("Status: \n"); - - print("Scope: \n"); - - if (array_key_exists("FROM", $_COOKIE)) - { - print("Show: \n"); - } - - print("

          \n"); - - $query = ""; - $prefix = "WHERE "; - - if ($priority > 0) - { - $query .= "${prefix}priority = $priority"; - $prefix = " AND "; - } - - if ($status > 0) - { - $query .= "${prefix}status = $status"; - $prefix = " AND "; - } - else if ($status == -1) // Show closed - { - $query .= "${prefix}status <= $STR_STATUS_UNRESOLVED"; - $prefix = " AND "; - } - else if ($status == -2) // Show open - { - $query .= "${prefix}status >= $STR_STATUS_ACTIVE"; - $prefix = " AND "; - } - - if ($scope > 0) - { - $query .= "${prefix}scope = $scope"; - $prefix = " AND "; - } - - if ($LOGIN_LEVEL < AUTH_DEVEL) - { - $query .= "${prefix}(is_published = 1 OR create_user = '" - . db_escape($LOGIN_USER) . "')"; - $prefix = " AND "; - } - - if ($femail) - { - if (array_key_exists("FROM", $_COOKIE)) - $email = db_escape($_COOKIE["FROM"]); - else - $email = ""; - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - { - $query .= "${prefix}(manager_email = '' OR manager_email = '$email')"; - $prefix = " AND "; - } - else if ($email != "") - { - $query .= "${prefix}create_user = '$email'"; - $prefix = " AND "; - } - } - - if ($search) - { - // Convert the search string to an array of words... - $words = html_search_words($search); - - // Loop through the array of words, adding them to the query... - $query .= "${prefix}("; - $prefix = ""; - $next = " OR"; - $logic = ""; - - reset($words); - foreach ($words as $word) - { - if ($word == "or") - { - $next = ' OR'; - if ($prefix != '') - $prefix = ' OR'; - } - else if ($word == "and") - { - $next = ' AND'; - if ($prefix != '') - $prefix = ' AND'; - } - else if ($word == "not") - $logic = ' NOT'; - else - { - $query .= "$prefix$logic ("; - $subpre = ""; - $word = db_escape($word); - - if (ereg("[0-9]+", $word)) - { - $query .= "${subpre}id = $word"; - $subpre = " OR "; - } - - $query .= "${subpre}summary LIKE \"%$word%\""; - $subpre = " OR "; - $query .= "${subpre}subsystem LIKE \"%$word%\""; - $query .= "${subpre}str_version LIKE \"%$word%\""; - $query .= "${subpre}fix_version LIKE \"%$word%\""; - $query .= "${subpre}manager_email LIKE \"%$word%\""; - $query .= "${subpre}create_user LIKE \"%$word%\""; - - $query .= ")"; - $prefix = $next; - $logic = ''; - } - } - - $query .= ")"; - } - - $result = db_query("SELECT * FROM str $query " - ."ORDER BY status DESC, priority DESC, scope DESC, " - ."modify_date"); - $count = db_count($result); - - if ($count == 0) - { - print("

          No STRs found.

          \n"); - - if (($priority || $status || $scope) && $search != "") - print("

          Search for \"$htmlsearch\" in all STRs

          \n"); - - html_footer(); - exit(); - } - - if ($index >= $count) - $index = $count - ($count % $PAGE_MAX); - if ($index < 0) - $index = 0; - - $start = $index + 1; - $end = $index + $PAGE_MAX; - if ($end > $count) - $end = $count; - - $prev = $index - $PAGE_MAX; - if ($prev < 0) - $prev = 0; - $next = $index + $PAGE_MAX; - - print("

          $count STR(s) found, showing $start to $end:\n"); - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - print("

          \n"); - - if ($count > $PAGE_MAX) - { - print("\n"); - - print("\n"); - print("
          "); - if ($index > 0) - print("Previous $PAGE_MAX"); - print(""); - if ($end < $count) - { - $next_count = min($PAGE_MAX, $count - $end); - print("Next $next_count"); - } - print("
          \n"); - } - - html_start_table(array("Id", "Priority", "Status", "Scope", - "Summary", "Version", "Last Updated", - "Assigned To")); - - db_seek($result, $index); - for ($i = 0; $i < $PAGE_MAX && $row = db_next($result); $i ++) - { - $date = date("M d, Y", $row['modify_date']); - $summary = htmlspecialchars($row['summary'], ENT_QUOTES); - $summabbr = htmlspecialchars(abbreviate($row['summary'], 80), ENT_QUOTES); - $prtext = $priority_text[$row['priority']]; - $sttext = $status_text[$row['status']]; - $sctext = $scope_text[$row['scope']]; - $link = ""; - - html_start_row(); - - if ($row['is_published'] == 0) - $summabbr .= " Private"; - - print(""); - if ($LOGIN_LEVEL >= AUTH_DEVEL) - print(""); - print("$link$row[id]" - ."$link$prtext" - ."$link$sttext" - ."$link$sctext" - ."$link$summabbr" - ."$link$row[str_version]" - ."$link$date"); - - if ($row['manager_email'] != "") - $email = sanitize_email($row['manager_email']); - else - $email = "Unassigned"; - - print("$link$email"); - - html_end_row(); - - if ($row['status'] >= $STR_STATUS_PENDING) - { - $textresult = db_query("SELECT * FROM strtext " - ."WHERE str_id = $row[id] " - ."ORDER BY id DESC LIMIT 1"); - if ($textresult && db_count($textresult) > 0) - { - $textrow = db_next($textresult); - - html_start_row(); - - $email = sanitize_email($textrow['create_user']); - $contents = abbreviate(quote_text($textrow['contents']), 128); - - print("$email" - ."" - ."$contents"); - - html_end_row(); - - db_free($textresult); - } - } - } - - db_free($result); - html_end_table(); - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - { - print("

          \n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print(""); - print("

          \n"); - } - - if ($count > $PAGE_MAX) - { - print("\n"); - - print("\n"); - print("
          "); - if ($index > 0) - print("Previous $PAGE_MAX"); - print(""); - if ($end < $count) - { - $next_count = min($PAGE_MAX, $count - $end); - print("Next $next_count"); - } - print("
          \n"); - } - - if ($LOGIN_LEVEL >= AUTH_DEVEL) - print("
          "); - - print("

          " - ."MACH = Machine, " - ."OS = Operating System, " - ."STR = Software Trouble Report, " - ."private = hidden from public view

          \n"); - } - - html_footer(); - break; - - case 'M' : // Modify STR - if ($LOGIN_USER == "") - { - header("Location: login.php?PAGE=$PHP_SELF?M$id$options"); - return; - } - - if ($REQUEST_METHOD == "POST") - { - if (array_key_exists("STATUS", $_POST)) - { - $time = time(); - $master_id = (int)$_POST["MASTER_ID"]; - $summary = db_escape($_POST["SUMMARY"]); - $subsystem = db_escape($_POST["SUBSYSTEM"]); - $manager_email = db_escape($_POST["MANAGER_EMAIL"]); - $modify_user = db_escape($_COOKIE["FROM"]); - $contents = db_escape(trim($_POST["CONTENTS"])); - $message = $_POST["MESSAGE"]; - - db_query("UPDATE str SET " - ."master_id = $master_id, " - ."is_published = $_POST[IS_PUBLISHED], " - ."status = $_POST[STATUS], " - ."priority = $_POST[PRIORITY], " - ."scope = $_POST[SCOPE], " - ."summary = '$summary', " - ."subsystem = '$subsystem', " - ."str_version = '$_POST[STR_VERSION]', " - ."fix_version = '$_POST[FIX_VERSION]', " - ."manager_email = '$manager_email', " - ."modify_date = $time, " - ."modify_user = '$modify_user' " - ."WHERE id = $id"); - - if ($contents != "") - { - db_query("INSERT INTO strtext VALUES(NULL,$id,1,'$contents'," - ."$time,'$modify_user')"); - $contents = trim($_POST["CONTENTS"]) . "\n\n"; - } - - if ($message != "") - { - $contents = db_escape($messages[$message]); - - db_query("INSERT INTO strtext VALUES(NULL,$id,1,'$contents'," - ."$time,'$modify_user')"); - - $contents = $messages[$message] . "\n\n"; - } - - header("Location: $PHP_SELF?L$id$options"); - - notify_users($id, "updated", $contents); - } - else if (array_key_exists("FILE_ID", $_POST)) - { - db_query("UPDATE strfile SET " - ."is_published = $_POST[IS_PUBLISHED] " - ."WHERE id = $_POST[FILE_ID]"); - - header("Location: $PHP_SELF?M$id$options"); - } - else if (array_key_exists("TEXT_ID", $_POST)) - { - db_query("UPDATE strtext SET " - ."is_published = $_POST[IS_PUBLISHED] " - ."WHERE id = $_POST[TEXT_ID]"); - - header("Location: $PHP_SELF?M$id$options"); - } - else - header("Location: $PHP_SELF?M$id$options"); - } - else - { - html_header("Modify STR #$id"); - - html_start_links(1); - html_link("Return to Bugs & Features", "$PHP_SELF?L$options"); - html_link("Return to STR #$id", "$PHP_SELF?L$id$options"); - html_link("Post Text", "$PHP_SELF?T$id$options"); - html_link("Post File", "$PHP_SELF?F$id$options"); - html_end_links(); - - $result = db_query("SELECT * FROM str WHERE id = $id"); - if (db_count($result) != 1) - { - print("

          Error: STR #$id was not found!

          \n"); - html_footer(); - exit(); - } - - $row = db_next($result); - - $create_user = htmlspecialchars($row['create_user']); - $manager_email = htmlspecialchars($row['manager_email']); - $summary = htmlspecialchars($row['summary'], ENT_QUOTES); - - print("
          " - ."\n"); - - print("\n"); - - print("" - ."\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("" - ."\n"); - - print("" - ."\n"); - - print("" - ."\n"); - - print("" - ."\n"); - - print("" - ."\n"); - - print("" - ."\n"); - - print("\n"); - - print("\n"); - print("
          ID:$id
          Duplicate Of:
          Published:"); - print("
          Status:"); - print("\n"); - print("
          Priority:"); - print("
          Scope:"); - print("
          Subsystem:
          Summary:
          Version:
          Created By:$create_user
          Assigned To:
          Fix Version:
          Text:"); - - print("
          \n"); - - print("
          " - ."
          \n"); - - print("

          Trouble Report Files: " - ."Post File" - ."

          \n"); - - $result = db_query("SELECT * FROM strfile WHERE str_id = $id"); - - if (db_count($result) == 0) - print("

          No files

          \n"); - else - { - print("\n" - ."" - ."\n"); - - $line = 0; - while ($row = db_next($result)) - { - $date = date("M d, Y", $row['create_date']); - $time = date("H:i", $row['create_date']); - $email = sanitize_email($row['create_user']); - $filename = htmlspecialchars($row['filename']); - - print("" - ."" - ."" - ."\n"); - - $line = 1 - $line; - } - print("
          Name/Time/DateFilename
          $email
          $time $date
          " - ."
          " - .""); - - if ($row['is_published']) - print("" - .""); - else - print("" - .""); - - print("
          " - ."$filename
          \n"); - } - - db_free($result); - - print("

          Trouble Report Dialog: " - ."Post Text" - ."

          \n"); - - $result = db_query("SELECT * FROM strtext WHERE " - ."str_id = $id"); - - if (db_count($result) == 0) - print("

          No text

          \n"); - else - { - print("\n" - ."" - ."\n"); - - $line = 0; - - while ($row = db_next($result)) - { - $date = date("M d, Y", $row['create_date']); - $time = date("H:i", $row['create_date']); - $email = sanitize_email($row['create_user']); - $contents = quote_text($row['contents']); - - print("" - ."" - ."" - ."\n"); - - $line = 1 - $line; - } - print("
          Name/Time/DateText
          $email
          $time $date
          " - ."
          " - .""); - - if ($row['is_published']) - print("" - .""); - else - print("" - .""); - - print("
          $contents
          \n"); - } - - db_free($result); - - html_footer(); - } - break; - - case 'T' : // Post text for STR # - if ($LOGIN_USER == "") - { - header("Location: login.php?PAGE=$PHP_SELF?T$id$options"); - return; - } - - if ($REQUEST_METHOD == "POST") - { - $contents = $_POST["CONTENTS"]; - - if ($LOGIN_USER != "" && $LOGIN_LEVEL < AUTH_DEVEL) - $email = $LOGIN_USER; - else if (array_key_exists("EMAIL", $_POST) && - validate_email($_POST["EMAIL"])) - { - $email = $_POST["EMAIL"]; - setcookie("FROM", "$email", time() + 90 * 86400, "/"); - } - else if (array_key_exists("FROM", $_COOKIE)) - $email = $_COOKIE["FROM"]; - else - $email = ""; - - if (ereg("Anonymous.*", $email)) - $email = ""; - - if ($email != "" && $contents != "") - $havedata = 1; - } - else - { - if ($LOGIN_USER != "") - $email = $LOGIN_USER; - else if (array_key_exists("FROM", $_COOKIE)) - $email = $_COOKIE["FROM"]; - else - $email = ""; - - $contents = ""; - - if (ereg("Anonymous.*", $email)) - $email = ""; - } - - if ($REQUEST_METHOD == "POST" && $havedata) - { - $time = time(); - $temail = db_escape($email); - $tcontents = db_escape($contents); - - db_query("INSERT INTO strtext VALUES(NULL,$id,1,'$tcontents'," - ."$time,'$temail')"); - - db_query("UPDATE str SET modify_date=$time, modify_user='$temail' " - ."WHERE id = $id"); - db_query("UPDATE str SET status=$STR_STATUS_PENDING WHERE " - ."id = $id AND status >= $STR_STATUS_ACTIVE AND " - ."status < $STR_STATUS_NEW"); - - header("Location: $PHP_SELF?L$id$options"); - - notify_users($id, "updated", "$contents\n\n"); - } - else - { - html_header("Post Text For STR #$id"); - - html_start_links(1); - html_link("Return to STR #$id", "$PHP_SELF?L$id$options"); - html_end_links(); - - if ($REQUEST_METHOD == "POST") - { - print("

          Error: Please fill in the fields marked in " - ."bold red below and resubmit " - ."your trouble report.

          \n"); - - $hstart = ""; - $hend = ""; - } - else - { - $hstart = ""; - $hend = ""; - } - - print("
          " - ."\n"); - - print("\n"); - - print("\n"); - - print("\n"); - print("
          "); - if ($email != "") - print("EMail:"); - else - print("${hstart}EMail:$hend"); - - $temp = htmlspecialchars($email); - print("
          "); - if ($contents != "") - print("Text:"); - else - print("${hstart}Text:$hend"); - - $temp = htmlspecialchars($contents); - print("
          " - ."
          \n"); - html_footer(); - } - break; - - case 'F' : // Post file for STR # - if ($LOGIN_USER == "") - { - header("Location: login.php?PAGE=$PHP_SELF?F$id$options"); - return; - } - - if ($REQUEST_METHOD == "POST") - { - if ($LOGIN_USER != "" && $LOGIN_LEVEL < AUTH_DEVEL) - $email = $LOGIN_USER; - else if (array_key_exists("EMAIL", $_POST) && - validate_email($_POST["EMAIL"])) - { - $email = $_POST["EMAIL"]; - setcookie("FROM", "$email", time() + 90 * 86400, "/"); - } - else if (array_key_exists("FROM", $_COOKIE)) - $email = $_COOKIE["FROM"]; - else - $email = ""; - - if (ereg("Anonymous.*", $email)) - $email = ""; - - if (array_key_exists("STRFILE", $_FILES)) - { - $filename = $_FILES['STRFILE']['name']; - if ($filename[0] == '.' || $filename[0] == '/') - $filename = ""; - } - else - $filename = ""; - - if ($email != "" && $filename != "") - $havedata = 1; - } - else - { - if ($LOGIN_USER != "") - $email = $LOGIN_USER; - else if (array_key_exists("FROM", $_COOKIE)) - $email = $_COOKIE["FROM"]; - else - $email = ""; - - $filename = ""; - - if (ereg("Anonymous.*", $email)) - $email = ""; - } - - if ($REQUEST_METHOD == "POST" && $havedata) - { - $time = time(); - $temail = db_escape($email); - $tmp_name = $_FILES['STRFILE']['tmp_name']; - $name = $_FILES['STRFILE']['name']; - $tname = db_escape($name); - - $infile = fopen($tmp_name, "rb"); - - if (!$infile) - { - html_header("Error"); - print("

          Error! Unable to open file attachment!

          \n"); - html_footer(); - exit(); - } - - mkdir("strfiles/$id"); - $outfile = fopen("strfiles/$id/$name", "wb"); - - if (!$outfile) - { - html_header("Error"); - print("

          Error! Unable to save file attachment!

          \n"); - html_footer(); - exit(); - } - - while ($data = fread($infile, 8192)) - fwrite($outfile, $data); - - fclose($infile); - fclose($outfile); - - db_query("INSERT INTO strfile VALUES(NULL,$id,1,'$tname'," - ."$time,'$temail')"); - - db_query("UPDATE str SET modify_date=$time, modify_user='$temail' " - ."WHERE id = $id"); - db_query("UPDATE str SET status=$STR_STATUS_PENDING WHERE " - ."id = $id AND status >= $STR_STATUS_ACTIVE AND " - ."status < $STR_STATUS_NEW"); - - header("Location: $PHP_SELF?L$id$options"); - - notify_users($id, "updated", "Added file $name\n\n"); - } - else - { - html_header("Post File For STR #$id"); - - html_start_links(1); - html_link("Return to STR #$id", "$PHP_SELF?L$id$options"); - html_end_links(); - - if ($REQUEST_METHOD == "POST") - { - print("

          Error: Please fill in the fields marked in " - ."bold red below and resubmit " - ."your trouble report.

          \n"); - - $hstart = ""; - $hend = ""; - } - else - { - $hstart = ""; - $hend = ""; - } - - print("
          " - .""); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - print("
          "); - if ($email != "") - print("EMail:"); - else - print("${hstart}EMail:$hend"); - - $temp = htmlspecialchars($email); - print("
          "); - if (array_key_exists("STRFILE", $_FILES)) - print("File:"); - else - print("${hstart}File:$hend"); - - print("
          " - ."
          \n"); - html_footer(); - } - break; - - case 'N' : // Post new STR - if ($LOGIN_USER == "") - { - header("Location: login.php?PAGE=$PHP_SELF?N$options"); - return; - } - - $havedata = 0; - - if ($REQUEST_METHOD == "POST") - { - $npriority = $_POST["PRIORITY"]; - $nscope = $_POST["SCOPE"]; - $summary = $_POST["SUMMARY"]; - $version = $_POST["VERSION"]; - $contents = $_POST["CONTENTS"]; - $email = $LOGIN_USER; - - if (array_key_exists("STRFILE", $_FILES)) - { - $filename = $_FILES['STRFILE']['name']; - if ($filename[0] == '.' || $filename[0] == '/') - $filename = ""; - } - else - $filename = ""; - - if ($npriority && $nscope && $summary != "" && $email != "" && - $version != "" && $contents != "") - $havedata = 1; - } - else - { - $email = $LOGIN_USER; - $npriority = 0; - $nscope = 0; - $summary = ""; - $version = ""; - $contents = ""; - $filename = ""; - } - - if ($REQUEST_METHOD == "POST" && $havedata) - { - $time = time(); - $temail = db_escape($email); - $tsummary = db_escape($summary); - $tcontents = db_escape($contents); - - db_query("INSERT INTO str VALUES(NULL,0," - ."$_POST[IS_PUBLISHED],$STR_STATUS_NEW," - ."$npriority,$nscope,'$tsummary','','$version','',''," - ."$time,'$temail',$time,'$temail')"); - - $id = db_insert_id(); - - db_query("INSERT INTO strtext VALUES(NULL,$id,1,'$tcontents'," - ."$time,'$temail')"); - - if ($filename != "") - { - $tmp_name = $_FILES['STRFILE']['tmp_name']; - $name = $_FILES['STRFILE']['name']; - $tname = db_escape($name); - - $infile = fopen($tmp_name, "rb"); - - if (!$infile) - { - html_header("Error"); - print("

          Error! Unable to open file attachment!

          \n"); - html_footer(); - exit(); - } - - mkdir("strfiles/$id"); - $outfile = fopen("strfiles/$id/$name", "wb"); - - if (!$outfile) - { - html_header("Error"); - print("

          Error! Unable to save file attachment!

          \n"); - html_footer(); - exit(); - } - - while ($data = fread($infile, 8192)) - fwrite($outfile, $data); - - fclose($infile); - fclose($outfile); - - db_query("INSERT INTO strfile VALUES(NULL,$id,1,'$tname'," - ."$time,'$temail')"); - } - - header("Location: $PHP_SELF?L$id$options"); - notify_users($id, "created", "$contents\n\n"); - } - else - { - html_header("Submit Bug or Feature Request"); - - html_start_links(1); - html_link("Return to Bugs & Features", "$PHP_SELF?L$options"); - html_end_links(); - - if ($REQUEST_METHOD == "POST") - { - print("

          Error: Please fill in the fields marked " - ."like this below and resubmit " - ."your trouble report.

          \n"); - - $hstart = ""; - $hend = ""; - } - else - { - print("

          Please use this form to report all bugs and request " - ."features in the $PROJECT_NAME software. Be sure to include " - ."the operating system, compiler, sample programs and/or " - ."files, and any other information you can about your " - ."problem. Thank you for helping us to improve " - ."$PROJECT_NAME!

          \n"); - - $hstart = ""; - $hend = ""; - - $recent = time() - 90 * 86400; - $result = db_query("SELECT master_id, " - ."count(master_id) AS count FROM str " - ."WHERE master_id > 0 AND modify_date > $recent " - ."GROUP BY master_id " - ."ORDER BY count DESC, modify_date DESC"); - if (db_count($result) > 0) - { - print("
          \n" - ."

          Commonly reported bugs:

          \n" - ."
            \n"); - $count = 0; - while ($row = db_next($result)) - { - $count ++; - if ($count > 10) - break; - - $common = db_query("SELECT summary, status, fix_version " - ."FROM str WHERE id=$row[master_id]"); - $crow = db_next($common); - $csummary = htmlspecialchars($crow["summary"], ENT_QUOTES); - $cstatus = $status_text[$crow["status"]]; - - if ($crow["fix_version"] != "") - $cstatus .= ", $crow[fix_version]"; - - print("
          • " - ."STR #$row[master_id]: $csummary ($cstatus)
          • \n"); - } - print("
          \n"); - } - } - - print("
          \n" - ."
          " - .""); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - $temp = htmlspecialchars($email); - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - - print("\n"); - print("
          Security Advisory:" - ."
          Status:5 - New
          "); - if ($npriority > 0) - print("Priority:"); - else - print("${hstart}Priority:$hend"); - for ($i = 1; $i <= 5; $i ++) - { - print("$priority_long[$i]
          "); - } - print("
          "); - if ($nscope > 0) - print("Scope:"); - else - print("${hstart}Scope:$hend"); - for ($i = 1; $i <= 3; $i ++) - { - print("$scope_long[$i]
          "); - } - print("
          Subsystem:Unassigned
          "); - if ($summary != "") - print("Summary:"); - else - print("${hstart}Summary:$hend"); - - $temp = htmlspecialchars($summary, ENT_QUOTES); - print("
          "); - if ($version != "") - print("Version:"); - else - print("${hstart}Version:$hend"); - - print("
          Created By:$temp
          Assigned To:Unassigned
          Fix Version:Unassigned
          "); - if ($contents != "") - print("Detailed Description of Problem:"); - else - print("${hstart}Detailed Description of Problem:$hend"); - - $temp = htmlspecialchars($contents); - print("
          File:"); - - print("
          " - ."
          \n"); - html_footer(); - } - break; - - case 'U' : // Update notification status - // EMAIL and NOTIFICATION variables hold status; add/delete from strcc... - $havedata = 0; - - if ($REQUEST_METHOD != "POST") - { - html_header("Bugs & Features Error"); - print("

          The '$op' command requires a POST request!\n"); - html_footer(); - exit(); - } - - $notification = $_POST["NOTIFICATION"]; - $email = $_POST["EMAIL"]; - - if (($notification != "ON" && $notification != "OFF") || $email == "" || - !validate_email($email)) - { - html_header("Bugs & Features Error"); - print("

          Please press your browsers back button and enter a valid " - ."EMail address and choose whether to receive notification " - ."messages.

          \n"); - html_footer(); - exit(); - } - - setcookie("FROM", "$email", time() + 90 * 86400, "/"); - - $result = db_query("SELECT * FROM carboncopy WHERE " - ."url = 'str.php_L$id' AND email = '$email'"); - - html_header("STR #$id Notifications"); - - html_start_links(); - html_link("Return to STR #$id", "$PHP_SELF?L$id$options"); - html_end_links(); - - if ($notification == "ON") - { - if ($result && db_count($result) > 0) - print("

          Your email address has already been added to the " - ."notification list for STR #$id!

          \n"); - else - { - db_query("INSERT INTO carboncopy VALUES(NULL,'str.php?L$id','$email')"); - - print("

          Your email address has been added to the notification list " - ."for STR #$id.

          \n"); - } - } - else if ($result && db_count($result) > 0) - { - db_query("DELETE FROM carboncopy WHERE " - ."url = 'str.php?L$id' AND email = '$email'"); - - print("

          Your email address has been removed from the notification list " - ."for STR #$id.

          \n"); - } - else - { - print("

          Your email address is not on the notification list for " - ."STR #$id!

          \n"); - } - - if ($result) - db_free($result); - - html_footer(); - break; -} - -// -// End of "$Id$". -// -?> diff --git a/www/strfiles/.htaccess b/www/strfiles/.htaccess deleted file mode 100644 index 6537b6a..0000000 --- a/www/strfiles/.htaccess +++ /dev/null @@ -1,2 +0,0 @@ -DirectoryIndex off - diff --git a/www/style.css b/www/style.css deleted file mode 100644 index 92d4f70..0000000 --- a/www/style.css +++ /dev/null @@ -1,241 +0,0 @@ -BODY { - background: #ffffff; - color: #000000; - font-family: sans-serif; - margin: 15px; -} - -P, TD, TH { - color: #000000; - font-family: sans-serif; -} - -H1, H2, H3, H4, H5, H6 { - color: #000000; - font-family: sans-serif; -} - -H2, H3, H4, H5, H6 { - font-style: italic; -} - -KBD { - color: #006600; - font-family: monospace; - font-weight: bold; -} - -PRE { - color: #7f0000; - font-family: monospace; -} - -SUB, SUP { - font-size: smaller; -} - -FORM { - display: inline; -} - -INPUT[TYPE="TEXT"], INPUT[TYPE="PASSWORD"], INPUT[TYPE="SEARCH"], TEXTAREA { - font-family: monospace; -} - -A:link { - font-family: sans-serif; - text-decoration: none; - color: #00007f; -} - -A:visited { - font-family: sans-serif; - text-decoration: none; - color: #0000bf; -} - -A:hover { - font-family: sans-serif; - text-decoration: none; - color: #7f0000; -} - -A:active { - font-family: sans-serif; - text-decoration: underline; - color: #bf0000; -} - -TD.unsel, TD.sel { - border-bottom: solid 1px black; - padding: 1px 10px; - vertical-align: bottom; -} - -TD.unsel A, TD.sel A { - font-weight: bold; - padding: 1px 10px; -} - -TD.sel A { - border-bottom: solid 3px black; -} - -TD.unsel A:hover, TD.sel A:hover { - background: #f4f4f4; - border-bottom: solid 3px #999999; -} - -TD.page { - height: 100%; - padding: 10px 0px; - vertical-align: top; -} - -TD.footer { - border-top: solid thin #666666; - color: #666666; - font-size: 80%; - padding: 5px; -} - -P.links { - border-bottom: solid 1px #999999; - margin-left: auto; - margin-right: auto; - padding: 0px 10px; - text-align: center; - vertical-align: bottom; - width: 80%; -} - -P.links A { - padding: 0px 5px; -} - -P.links A:hover { - background: #f8f8f8; - border-bottom: solid 3px #cccccc; -} - -TABLE.standard { - border-bottom: solid thin black; - border-collapse: collapse; -} - -TR.header TH { - border-bottom: solid thin black; - padding: 0px 5px; - vertical-align: bottom; -} - -TR.data0 TD, TR.data0 TH { - background-color: #f8f8f8; - padding: 2px; -} - -TR.data1 TD, TR.data1 TH { - background-color: #f4f4f4; - padding: 2px; -} - -.dateinfo { - font-size: 80%; - font-style: italic; -} - -.invalid { - background: red; - color: white; - font-weight: bold; - padding: 2px; -} -/* Styles for documentation */ -.class { - border-bottom: solid 2px gray; -} -.constants { -} -.description { - margin-top: 0.5em; -} -.discussion { -} -.enumeration { - border-bottom: solid 2px gray; -} -.function { - border-bottom: solid 2px gray; - margin-bottom: 0; -} -.members { -} -.method { -} -.parameters { -} -.returnvalue { -} -.struct { - border-bottom: solid 2px gray; -} -.typedef { - border-bottom: solid 2px gray; -} -.union { - border-bottom: solid 2px gray; -} -.variable { -} -code, p.code, pre, ul.code li { - font-family: monaco, courier, monospace; - font-size: 90%; -} -a:link, a:visited { - text-decoration: none; -} -span.info { - background: black; - border: solid thin black; - color: white; - font-size: 80%; - font-style: italic; - font-weight: bold; - white-space: nowrap; -} -h3 span.info, h4 span.info { - float: right; - font-size: 100%; -} -ul.code, ul.contents, ul.subcontents { - list-style-type: none; - margin: 0; - padding-left: 0; -} -ul.code li { - margin: 0; -} -ul.contents > li { - margin-top: 1em; -} -ul.contents li ul.code, ul.contents li ul.subcontents { - padding-left: 2em; -} -div.body dl { - margin-top: 0; -} -div.body dt { - font-style: italic; - margin-top: 0; -} -div.body dd { - margin-bottom: 0.5em; -} -h1.title { -} -h2.title { - border-bottom: solid 2px black; -} -h3.title { - border-bottom: solid 2px black; -} diff --git a/www/swfiles/.htaccess b/www/swfiles/.htaccess deleted file mode 100644 index 6537b6a..0000000 --- a/www/swfiles/.htaccess +++ /dev/null @@ -1,2 +0,0 @@ -DirectoryIndex off -