From 440e93a533a19d54f83ecf6eb300abb48e10491f Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 16 Jun 2017 15:44:11 -0400 Subject: [PATCH 001/104] turn fancy "gt log" to "gt clog" --- bin/gt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/gt b/bin/gt index 1d5c7bf5..d23aab6c 100755 --- a/bin/gt +++ b/bin/gt @@ -101,12 +101,16 @@ case "$op" in git remote show origin ;; - log) + clog) colors='--format=format:%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(dim white) - %an%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n %C(white)%s%C(reset)' git log --graph --abbrev-commit --decorate --all "${colors}" "$@" echo '' ;; + log) + git log "$@" + ;; + make-gh-pages) url=`git config --get remote.origin.url` base=`basename "$url" .git` From ab226b713ba98008d3517f140faaa834f770f5d8 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sat, 29 Jul 2017 14:58:44 -0400 Subject: [PATCH 002/104] fixes from rfcdoc --- doc/oxtradoc/oxtradoc.in | 42 ++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/doc/oxtradoc/oxtradoc.in b/doc/oxtradoc/oxtradoc.in index c610f853..a6654458 100644 --- a/doc/oxtradoc/oxtradoc.in +++ b/doc/oxtradoc/oxtradoc.in @@ -359,6 +359,9 @@ sub second_pass { # No one can claim the end of a digress last if /^}}/; + # No one can claim a passthru + last if $tag eq "passthru"; + foreach $s (@sticky) { ($tag, $mode) = &update($s, $mode, $tag, $_); } @@ -426,6 +429,11 @@ sub generate_output { next if $tag ne "enddigress"; } + if ($tag eq "passthru") { + passthru(); + next; + } + if ($last_tag ne $tag) { &emit($last_tag, "end") if $last_tag; &emit($tag, "start") if $tag; @@ -560,7 +568,7 @@ sub section { sub start_picture { suspend_digress(); - print "\t
\n\t \n \n\t
\n"; + print " ]]>\n \n"; resume_digress(); } @@ -646,27 +654,27 @@ sub start_code { print "\n", $indent_digress, untabify($line), "\n"; } else { - print "\t
\n\t \n \n\t
\n" if $art; + print " ]]>\n \n" if $art; resume_digress(); $art = 0; } sub start_xml { suspend_digress(); - print "\t
\n\t \n \n\t
\n"; + print " ]]>\n \n"; resume_digress(); $art = 0; } @@ -753,7 +761,7 @@ sub nlist { } if ($type eq "hanging") { - print "\t\n"; + print " \n"; } else { print " " x $ndepth, "\n", esc($content), "\n"; } @@ -773,11 +781,11 @@ sub end_nlist { sub start_abstract { print " \n" unless &prev_tag() eq "abstract"; - print "\t\n", esc($line), "\n"; + print " \n", esc($line), "\n"; } sub end_abstract { - print "\t\n"; + print " \n"; print "\n" unless &next_tag() eq "abstract"; } @@ -855,7 +863,7 @@ sub include_figure { print "<CODE BEGINS> file \"${extract_to}\"\n"; } - print "\t
\n\t \n ) { $lnum += 1; @@ -871,7 +879,7 @@ sub include_figure { } } close FD; - print "\t ]]>\n\t
\n"; + print " ]]>\n \n"; if ($extract_to) { print "<CODE ENDS>\n"; } @@ -994,11 +1002,11 @@ sub question { return if /^$/; if (/^\? /) { - print "\t \n\t\n" if $in_question; + print " \n \n" if $in_question; - print "\t\n\t\n", + print " \n \n", "Open Question\n"; - print "\t \n"; + print " \n"; s/^\?\s+//; } @@ -1007,7 +1015,7 @@ sub question { } sub end_question { - print "\t \n\t\n\t\n"; + print " \n \n \n"; $in_question = 0; } @@ -1045,9 +1053,9 @@ print "\n" if $doc{private}; EOF print_authors($doc); - print "\t\n"; + print " \n"; foreach $k (@{$doc{keyword}}) { - print "\t", $k, "\n"; + print " ", $k, "\n"; } } From fe0ba1663ec95052952fc95aa2aabf9a0cb31449 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 3 Aug 2017 16:20:19 -0400 Subject: [PATCH 003/104] Add os:remove docs --- doc/slax.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/doc/slax.txt b/doc/slax.txt index 4bc22f1c..cb796b6b 100644 --- a/doc/slax.txt +++ b/doc/slax.txt @@ -5096,6 +5096,21 @@ holds the tag for the errno value, if known. If successful, nothing is returned. On failure, a set of error nodes is returned. See ^error-nodes^ for details. +**** os:remove + +The os:remove function removes files and directories. The input +arguments are nodesets containing either strings or XML content. The +XML nodes can be either , , or elements +containing the name of a file, directory, or glob-style wildcard +expression to remove. Directories must be empty. If an nodeset +member is a string, it defaults to . + + var $file = { expr "/tmp/some-file"; } + var $dir = { expr "/tmp/some-dir"; } + var $wild = { expr "/tmp/some-*-wild"; } + var $res = os:remove("/tmp/another-file", $file, $dir, $wild); + { copy-of $res; } + **** os:stat The os:stat function returns information about files and directories, From 930c5e630d18594a4358caad8a2cc55788286baf Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 24 Aug 2017 21:54:33 -0400 Subject: [PATCH 004/104] Update to 1.2 --- doc/slax-quick-reference.docx | Bin 46490 -> 60075 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/slax-quick-reference.docx b/doc/slax-quick-reference.docx index 0ccf569e02910c3ec070c4debab8831aa643f8dc..68eda550974ba804fde2fc4c424d22927d30124d 100644 GIT binary patch delta 53661 zcmV)DK*7J7>jJCQ0~kwBLaWRPTN2f-6QoM ztl3ufgf383#bH6|vLH28*-pmS$%uJr?hTN?@3kE)9+4d|Y%JO1^O)ng$Mf?CXR|v< zXo4@rX)zNScpWO^*QNNo{FQ$f8ItmqvcW?sc7Wo1@#SQ`+(p2Q(H={&A&NhwM7;s0 zum}-6uhbzqMSPpqGAe(4tJWaD&1Pp(2T$NBr-nl;=0BlUTT9vH13&JZFkEC8-FuBx zDO8NsXhm#PHmmX=E`h}X;GM5txXbs>3P!f%xG@pG?iH>$nq(@-u2rJn%CQf5A5tZ& zptp|qPz)PApcm@eXz1|`TTDR%B4_Sw(XTjV{E!d5MGEf5S!sU=+;s{OPbb^yNgF;$ zWMDiCzjZ4}?0&NPt1x=%p&;51g0!=MAMc>!JyQOkq0MDogXU8|elQ&7jrF3Fc!C{Q z10v4*7?J0*n2()4+%u0_xQErBPjm5veAGzIC9za13r8gW#xQ#7Q4_?)2eQ3RpTU-9 zNRlg}9d|C$^o}NNKQ>;2&bfPznDbtdTX=HL(A0bd)myc@ZkjCL(Hsz$?LTetACrNR z6tnOHG6M;sjfUAv0RRBZvnvNI0e_S+Ps1<}g?A+WgXNvLEzly=vv-7j*BUBRUrC6FeGIDV-Q_ zdizSN&@>`RM579WU^{6>ebTsy8`YUhycsKa-kBjT!Knf#gyK>h4f7ZPld~w6U@9h8jU;g>!cI7Yk8+RK? z@DBB%a|Jj%WxA7n8 zCxYBU8AQe(nI$a8TX~SXQR1dDg*p#n;Ocn+A0m)ocDHaz_M22+gxKm6MiJ^t*h?*^(ifY)x4FM~hR?>^5Dyxd0i z#~;Q&pp9E3GALc zJs(Z>e!Ik`mLLLc2VxH?V8&=XRHqh_8xXsr0ydUaZEmDu^x-|Y0uUrap6TFxSW=gL zymqNeWlk}X%)Q(e%ORTqsy3NTCZn+c1Li|(wqR=5+|TQ4o2E=u&1h7z>?>*OZ?D0_{Ep_$ zd8Mfu55FadWLsNZo~cuLI0CILayL_!dXt9sLk8rK?+BP+ORa2z!@mLlG2&75*f14) zA5i~lnpNh+rL=qkoW6`8BO$$b(UT-Ve!8OAU7fV1oSGI2Ba)BA zqzI7Oh`e$*{l?wwqA!Wi0&~}EDR4LbvnxfAt@)M|6t=CgWKB_LmMUOtNaIo3tRVak zPzJX4-i2fh;HqI_e_MLY_ZknLiuo=C;MG88H82%+1kK@;Y?sko4Lg)Gy@f#-l710{ zq>jcTV>}l@NR-uzmqoqUBP22@g|=aiY6dPKq!x)BX~e{%~7ckX(fO*7TV{u6xV zec(EuuGiky4JkCtUO{*E!hVC~2k~CSrC6q->e_f--Y9$pE`=1eMh*4^$=9o!dE*E0 z543R-Qko?cTA=)k;)c`{eVe)>^uGTfxoa2Itivk_%GuJ+4J0J2=pB@(7m0y1V=^%p z1}gp(`2#BYf6o91G84l|tz4Erpe<5P;pxOUDMl?gjCYn0odpl!KgZ^4_bvvIGajq~}6-i-srsQQ=KjB1IZYB5ygZQN@xg`U5nSbd0gFu9-6S8&hwY>R=a}hiLaO-;e>f@amTc<7sPG6 zA|4CUNo3~WsZfqK3ii1KO4oQNc@H$>nC^y;`&(daY@^>$mV-$*&rP;KH3{;mvdCy; zEoL(?Cvknb2AQozwWKE}lw^&Y03dXpc{~C!e(9#}AdC~z#ePAst2}Su}x3KP(G5)f6Y7~M!eKDS)EsHX3k+YA-2)*y<%fk zwI6@*)-D2#*M4v<#I|hw)1?0IgS8NSuiM%rb&%5DMd8=e*Qn`Z&0L7|8j)$5!mN&v zS8O+{Q%!D4hDP=W*IA+FFI+f5RS{GNaip~m@uh^cQiA%*pFjNYR+9d-L&qQB<+Mr$ ze=#V;p>e@Q`eq${mo&kB^B8@1gL za&v!SeP?9GqIqOt`}aS)%c#gmA`JIxBikmrZa7p!uKYr=kBc%^LE*^$_{0aaYiAj;cebK?A`KP((OSE0hkg zOpyA~L<9{c;ZrIs84)Mn;fVNUr$f?Jw`Rn81h7g1kdxro2?*f93&QByf1nIie~}k% zU2@*UqVro3H>gZ?W1*=Ff$S(V=|(!cY?L5mBf8`U8|}YKs{6=z)ADt|Pbh_z@V61) zXd`)-oZvB@Mgv8?Nb*7mR3izWcoNFCtHTA1dl2d8q>>F8_d-fq?_LhGEx@$oXI)go z$fu;>+wzGV@FrxRv#HJ+E%XWQf927Q(A=X9By@yU(49cvegi%b&OnMd7+IeWVW@~m z#)(w>!t5hyKR8z6m+D~Hs`4Ih8x9%vFb+n793r%J@AkQ45`+(0D2Af7diFY3RUtLF zNzct@EUSTtjT8BH=%iKT?2u583>*Sjp|*X>{v38cHuNVERxDz7qTG<>0me>qfc9`2Y6ynk1HW_ zoSEHL)}FVOwm`TNJ9WwevFX1|RH?(jqmeoj$zqa9-=oTOZX!LEO9(J<0i=ixhh7}r zFf@@+pts>LIkT-W`=sf2e{B)X0b@cokdMjRwBezs zy%(Wr$2bSFbHWe}qNXaS$47p$`wDc^Fg0Zc)80=w)t;E0ggqSjf4!_gg>HJzq0!^A zagrgf7RmId+Cl!}QM~l#9TG&H>sa@~Yh0@;vP5`AU2>ao&6Z5duq}+GP1VJ0ga%s| zbuRU>&ygANB{P$3fGKoJ`=q2~wajkuDeaSps)cvxlr}1WA1cmJY!)swE8`)wG70rD zk!UcR5c~@LZ0Fo)e_v=$?!aKpj6Mn0`9qN?j- zbpj45JG7@s1H)z_mxbq{IR~zU>SO=(^Cfb21J_hOcyLn$dEpK_{h%4c*?6Ri%+n}| zV93WYg2}*4e+GgX$xUCA(wP*?V)tu5*2B@JrWi#oWU+}j8q z9Nuly%nzj3|EA6ksvT?ZZ&2>QP5x^)f}3H8{bOspVvgpTEHt#8RNtg}o%oGZZ!+-; z`FOAGHrkCKzTYnDwH;miS^mCHkTb!%uTX2(&n2ttf6Xa-HG};3AIHD{2W`Mwv_Whj z2Zrf=;KDfKl?3#nBydt*&Ym?Q(H`42>9et=TMGnLi*hL?3n2{KlsSmiBN5n-Ok-r7 z5>`#{|B3KqoU%Q?%jcxvrW(aRE3}?AXIx4aZ|p3R`1r}&0funbE2Ox1@C=@&iVg|F zjdR;af0sPW#MWHZ7%IAMp4JK27jMdV$Z9?zO}|Sk(LmsgOA6v$r)NgN+Y4R z2lt=k%S(DjHopCX6D^-$`r9%2ro!SH@*O2ff48v-x#H2-JV9(;cAJT8nqNorWNuV~ zd4S#FwT;J4?BU+pB=XuIk>$~svBzl|r+M+PDO{O3v54qvU7y&ZAnn%sP;$0M4}&JY zu07szXg?+o9p(4V31Ir>lN&;&bJZn5VO4Szv19)#AK$&cii zajfZ~b-A_A*{R>*{Z7aJ9lr;y{_V+ye?q14@2BIBb4n1qWfRz1bs60KBq^Rez-{SMV_Epf5NL72w?HN<1DsCj=38P!;>B&-PEWZs)Mu zQ6SDNjGmMn&eg+&HVB_e2-mK=qf8ZhIi21o`wbl3_qQv!8++re*Ix23kwmUKf12vr z6mH6^y`)W=8je9}^>{#Tr)h)HVzl@XNhS`Z9O=<}hMObNU2f>wbGYl5bPC5U3%ed_ z4)u{a(NA+3eLb|VhYnP20E2x%%F<3Uw$r!{-Q3K_oc>*q&YGXs!EM34&kjKIjf9%4a+TDFOL2X=<^*(z712aECX)kS9+eSY67w8hy zcigqRL3cl0N&B4yZ=fOz-cjr;;AI%6jb2O2;H1}J`vt>PM&rd|Tz;Rkp#(9$mE-v@ zYnaG!WN;FEtrlPOhn#B}S9VJ5@FiSEWp5QE5oHT<^9Ehlh;#H%Arc7?e>8OncLGco zZ_`c*~eQ*2JS~eY7=#X&%?P>m{43II@~A#MVh;Mac|1 z#5bYzx?-xDVUAHcw&>Icf9cY)gMY|(IL_{}F>#aW_3~}vO;U%F9micl^T>~5A}BJ& zQ!=sHJ!u^|10tTdr^v2&>3Ky00E2BGuOt8Z^XBsKe?6Q#C20LEO+xEIkw_e5>XU^f zFGl6PK&&bJIEZX*>@;B8h`8Bx6N_O_^ za`lilSo@EZ&tT(}e38DbEkGC6d4AwUU(&;8LYJeO3w1n{Rgv^NspW-b7V>e9QE1i4 z3k^ClR<84?*(ov zv||c+fxh0-cD;r20F8!x5a^+JPfQ3pcMQ57&Q*dUHcHfVF&$zH`D4o(S;|=G0x8N8 z$H0SnF;gQa-@*Pkc?o$m#=w{6k2yEuTG?2YJ>))z5OV!Oe~plw+*XAK7#6npQnsKG z`q(VRq4N{WTy%mZ{6WDKb~lJMo|&dBi{v~=c~0P{uE}r(8)Qu4!JcKsKZs|Om6*zv z!FA>!xo>V7!tdi5U1X~oS~B_p_R{5fqUC1JfW|f| zp|qN47X9kWf9*X=!^D@mEdBLTHj4S5ZN@fn>$cZAUk+D*kiH96^@ zm>yhNgcPUq{pxO@DRW2`D>5v$sNP5}GqJjc45kZpcIQkF`FL$ysbX~*P3yEb&*|Us zgg~pq6D2S4&>T58+4)%UE2;_rv6%5!Zm%t zek+B`f56+J_EX4-Ji9?8-Mi6?3r7`x`uM|-_&oT>AI3kSLk!Ss29Hs83ps`$opv>u zDMPr!u9@9K%UM3T%TH4HWg9v4V5*B(tcPPE|LX4|$ODJ}D*g4CbxS0PDT~!Mr6l=w zY^!-R63WpGL7nFqzK9m6j4z+*66Xk7*vMMf=QB$mB1>0E#Kqb*So&&s;QE>{TMUeIJiI%Jsntk^7)ONWd;o_Uj>uS> zl;=jYl#N*UQCMq|@t^faKKo;8|s|VJ%*h{IM7{Nw$Nu8!-~A)di5&Jd5lP`z^}l;CxIR3P^9z z(cqQ);Oy6t1Q&9-B3-ah)KJG0p>ZLkR*?oU-K0$Ffqc9+B`k0GxvF@Q2Py;dfB4}h zR}ot?-od)bt zK1P#cG`SB4nmd8O?1E|MCy91F289xe1OHmva{z;6Iv$y099|POGDDdtqmdz!0w*0y z;)i-L2wCRvZ@gxKBOa&+gPyYt_!np5DnXg z5i+Q9N7w|m`l*HiclK(P(~F7a>tSF;B_y^e6OXlKw!cOgSRQ`l&`A#i?*?O-mysCE z%5a<~@8^Me)yO1a3nRbTWvF^d$wKm+C&xj}#*6uUj^-Kn$wJfsTYN4ie-luMpc%Hr zpc|l%DeJgT7N(ey>_+Y+KE!=oNtaiQ4^aY<*k88#8Hzbolv$4tLBv7lYcdV;ieu}c=CL67$2J7IDO>ZIZV1G*q-Gb^Jjlmue=`J`ttqtI8559N zs^&A}oc-au;^s;0igUws@Qo-T&S`5-V&cW4p)vvlwAjf&-lV}Lake7qB5kCa`cx6Q z-hkQH$8VP=AIGYdymXR}&2Z+#c4_G7Q7lUnu`1+R605>*mnI)S$I=T8KG&)=+Ah8D z)~=Ks6uBidgKg+le{E>a#MQPR~umS0LshYZk>c>jCr9&LvHSzZAGynRbmwfJ@IxF6X( zRML6-n(pbZb0;g2RFZEsC~T$ewV9g0_F%F#v|ubsWjw`if6qF<2fOf4r7ypw-3A%6 zTDYfRR=W~e*}sSD9z#59G6`gm;z>Cl#MV4h8BR=fDsoDORHYs}0*H&7`9z#B$7o9z zh#m1kXUa=Am%sbvxy*X|^)gmYL~g$l@K^%~s!{N+zvp`08VEf*T7z?yW5ZBHF1TU( zj2^A^&Gaame`~Udy@O~C`%$S3SW`4>KGaQ-E=8u|@!ROh$NNOzW_^opym0RZyTA?I z;MpD6(j|g5<}{ift%V-ZXkMes?9tkt=pFCp1VMG8HUFH1)+l=H2;Z{CBXg?txwW&^ zk$JH_zYhSRpT4!7GibY;xwY7lmV#^AXgrcFt8z0ef4@tB?48AMEqSRUT>`2;k`1^4 zPoN}CuBEU`fPDNMOD{}|AUm5>pU6UPqg?`MY&N=4C>|&&(kEcRwRZENdO6e8$~$rH z)-+#Z=Xr$-%=oU{`+eb!Y8^gh!B1kI=MYFNx0R3`M{1~ad+Rl5`+XSr*_(5R2-+}n@m{R^R08gP71r|808HBiL3ry}(Qf6@dbQ5(OoM?PMg#mI1{uw^G>D^ioz zyjADy4?k1XJc(VYly&mN$os&5_F$MfoX(W6sghRya=$@mG#xY&YquvS5VG~m7%i;D z*boWCsT@#|XC@!VdX~I&QevpQ`^jiq@0oL>I|MxQ<&8mgyF36Z<0%UBd(HIBm!yc} ze>uRjlLtB27DpNB(;43j!kRVnc7 z*}!*>gWk1w57*F=VF6pt)uApz^|3uL6|!qHAa612$-dZ!W@Ad|6C ztfuc}1O(Z{kFFCepCmAi?lSU&FX&QTNKatr6W(~6ogYLZgDw zlETW4o$P6Ua{&*t z=Ewv_HGMB5Al$@(`x&NChaQ|Zh$}IkE0Q}fM`O#Fjzk7glZQHzS`67Uf0WI_k&okA zO!5+9QVMWNr=K&tDh%AX%5+k^TZRJIEuJz_UiT7k740T+ex!3*hMfaXf7Mp$oE3xuI6AVzNu&8ceC$(6(&qIEPeMf67ZD8*&@^XlP95BJD~f7AS02A|F2obog2ecpW~S(_zw@ zPsiHtoiKzBWsFbU$PJRKdZQ;d$%qmbgROv;uBq~5G8$Aoxz{*$FK<21gW${4aRkR- z;Q1Ypx(F^}B1DYQki!PPUq2S9Q#>I3wj=n=R%LCz7(&~NTve6%e}{T{Uy55gxM4W| zR8NN;R) zHZO4;&N1bX?M7t9g28Qu$Pp?s0O)gXcLSJpbc1S;m3n{sc;Vu&aQ;i+MQCOZ@~G0v zi5w~NB?nK9BpfVT^(=EXHIY+1c!1Fr&!CWp$=ni_u(U1S84o!dQxY9B&N_zK|E=L8b)~ z4#I(Iuib~}ZlIZR9GV2}^hG8FpWMYNlF?!Z!T&_3hjQ(BCpIBAxkNi$JD*_zO9G29 zFy9Fsh)u4Cy=Bt%W9dyhq+pOwHK(ekOtDU!SME`=f6t9A1GOUudg`sWi0Fa+7D)+3 z4_oRFJ*q8|%aH+Z`}Xr@jgIl5KZ(_Fu(vWEn~EuNKOJdCd#g*_ij={WBGSg*zTWCG zj553ZrFjFv-ZI+c#)B))3LB95yuOapW;cY2Gq^{)>4xZwHaj88UQKC>VCUw+=U-dZ zxMzf%e`uso%xh@ZunUC1QqXs3vS}&uM5OwW;O#Vc&P*>Ly-E+xZM5|X{^E2?^=^V; z=z2Gize+Ga;O~G~8#imLdvTgEYl4nDwM~t4rf_Ib&WE=~sz>>yqWGvqr_OR?R5MAF z0WU`gueUUSWV7^R1ij)(PO7!t-+U<@BXfezf9YbV&nF_|1xa{N7<7_2qmyW&MV&YU zaA;&T=Sko-LOM_Hm(n-u=)1&7N#8ue--T>z)(|wZ02_5?)TH;ubRk>HLZoM7XldgK z%1YfrwSJZ8y|$1w9fce5ire2a%U`JQZnV>=Oug+j#b_bmN4_q4XWn&b2XWy ze<-z2zdrP~k82lweTwCg9Yje1wmp;=hBA@IA~%3CZ^GsCg?#+Xe97d%Fh}Ucb5MI$ zq|>d9(>uw!PL^|m8k9cyfB#ofWkr$x$A0VW+(7!H8@>3!r|?Spe!F~Iq=@WL1K~zy zr_q^KagVTk^kwIQIQ#4UW}C_zW>?Bce?-*;PBcwNgSy$ccEad`3-jXwclF+RbSHu9 ze8L@lJ8v1`!;sE)`Q!)Rub`x6>BISSib`(Jx8aksa}nv12XFn`XBqzcw@A^TBE9te zU=@0QgH@@DDa%**{|AzP8}6Voho5m)Kf~YTp$zA=c24wkH`u(huH^N*;g!63e`mxW zS-&&mzqt4(QLTIr6r-PiklcUY-VMV2M*5X3$x{4PK>6V<0AVZio+>GbtB2RoM=(L~ zsdxFe(3ic#!p8oDMtqs~Aiaa&vjrgtHZzNx&$D|RzvGG>YJ41Sh zTP+VifnOcM8~JA~=^f5rlh2yce>;nK7BS+TiI$7M;|3njFc@u$6u~4M^cVlr-5^36 zxb(MMn6R6O>^_YAP3GmbzYOmN??zYhckdMW3hxR0O^G)V{-(ySWj^8{D+?b|EqHz? zUybCegq7)UOFrx~{P+WOMj)9(|G@kC1Pv4LS+uoJ(#{XP2-+y_2EUT8fA0MV2>akY zKEdZc2k;y4DHG0%Tq*j3v+>qn zZom2Wy&ruy^><)PcWWndrQiF}led&6{(2R^`5k^9DfX?Z1Le=x=nJnuxxw}pu`KX5 z=}yHe4KD)m;7IQV=tf87t@_QcK99fqpL=il3IFYb`v8__yNvy8f5Obz!-DyVT`$k! zLesW3n@>eLU}mO11>>38(+uWl)VJQlCZJYnpaUZq6>m%4!y>1UK};DCl;jjom?%vC zCi0{2pS-p7@yUUmz<72C|9{Q=w-3Z}Y!ke=3k7-Oyb!>_>0FFkg4s)Lejx)m9&lkdb_pII;@0b`JgGskFIXVY&%gfJfsb&wE6zeP3%p${wh?;tk_ z77b->xOfdQj?45A=#M>8X0lo7nrOzXpQBe-28KnUy?zU7xdt@M!Bq z-m^=Gr3V9pSSZh-4IfRO$=aL@tIFG)R|`k-2#Gfsdw&HUfv_koGYwxBfG%FTlF-nQ zzi3l%TL3PcU?u(Zhab@ChHd!TsJR9_u?MXDwmWR)2m@Sz;7V8|Fx!*Ml|wX{h~j^_ zjAgSTlWCHrf2bzpSk?8h8e6A&Mb@DYMzfjqS_V&532E24sABK9grxWwlN#MQHjP)w zRGv^;!lk13uH-r)08oe;x6l?Hxhr@rdU4%cR=t_sMiu}P3CJdF9O}-HjGb!Ua?&Xc zf*so2oXY45f+mbOdtZ;A=9^ArbtGf#P^)&bY55U0fAN?aG|Da;EbuX6≧_tof-s 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
Y6{-kCLW#tQZK4# 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 L@HBUpFHipm70zY% delta 40051 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%0DhSik(*UBhHt90huN9YX0qqZ$4bZ$oB!x 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 From e2f0f4667e01c03f20dd0d26f0a1043ad2d972f6 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 24 Aug 2017 21:55:32 -0400 Subject: [PATCH 005/104] update to 1.2 --- doc/slax-quick-reference.pdf | Bin 183619 -> 186160 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/slax-quick-reference.pdf b/doc/slax-quick-reference.pdf index 11e92ab4ddbc1deb94b0458128bb01174dcb79cf..9302c1407c6b303b42944e32793b651919e3d9a2 100644 GIT binary patch delta 179379 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 delta 176870 zcmV)BK*PVVt_#DO3y@NO|F$Hzap(DeJw+X@XZN;EUf%j$<(csgB}=pNk;bx{yVg0D zcTcO?6x-8e)9j`!&766leH%a0e!dZi05U5RmACuaJK|B-jRGnF1R}l>2q2OFwEmm* zKdm?0`-jWra<)Gn9v-&q)A4kFI=~>g6}^CMWr2!8nXr48Zzv-M$p_xjoTw7z@$?YqH9 zMlEhOjO_Gq9Ez+bsk`;F^<4k!1RM@bNST1$&g5P`hH~$5+wbl#KAro+{pMJw^WkXH z*!g^x595m><$S(F47>H+_s`Z$C&JjT@4jVjnd09)TQzfkJCX>hb2*+a>w`5~=C;$+ zsyBq=8I3&e(8!h>8u@TKX+j5lS3}XDlJDMFw_p6>&wF!tKHpzXr{keEvU0V5IHMV( zM%Ked?tc5?-K*n%eo8l+%l+YDi>|kmFzEM~<)yqUO51dB);7;)w|1owyM04zAJ_GJnSA$;Wu{2`@^=u z^S$Bu_F@25KFol2_YVoXe~C__DUQ9&A%A~q|N8gfB{1~DzVW|*Y=7fusQH|KS9d?P zzmN7W#>n?x(>b6J9sb^y*MIknUP*yl;Nx%S&{yK)?*4c=?bnA8f>307=yV64d3WEj zMPT%QxZg5C#;vi%&0Z$a;|uVu|5j$VzGM8d$nX5)4MO~MyON~!Z7DSCft2;|(Y2oK z!}0!nK~DzV>UE}XJ(qhlal}pLvs*GqGaq`4`S33jm{xyfK2<}v=lf%$pme=2%@xvo z`SlCDAd2zgC8|MNubg~Gn^6CZ;3x#|AiTnV*KKdE;;ao)+@DTNu6onVEiQh#Hx-P& zeai&R#Serz_nX5J9c&m+%uZ$3!M4rz;eLOXLO0AbIkPfLw#dvT2MuI$a$2qhvD@75 z&O5+()Wk9+|IM9Cz9_QL6fa=PzPfw=N7v_dcqQh{rV05;&oO3wtTlV|^YxoI>r!KX z$nNd4mFoT8tB1|J|9U`|rUkib1H+yl^mezsKkSHf+d)rE5)fH%0%e+;@fzc8_V>po zWMAfiJ~qa)MsGW#g)v^sO^Wuf65~Z9|0*$FI|&osG?z;~RNQ2Y*K(VY$2fL;_3hFa zZ_NDPEXIoon2$I-GAIGe^h$4Y25eY=^sWz!*>$X_x(AS%IJ7QES$d2S*#pqDPO$E$ zKnhmh319$_3}E;hNTUAxXDj{&bokeuhw}lMD0Sb`e($cu10*l4JXd!={`~n*M*$Fg z!7F(6`Jx(oT_%ZR%_F;!-Ac}Tw#YcWLO71UY2wIPSI{`6n zQt8X?zU?lWi25#PeC~R{dcyWA!;a5A9$AW>ao_`Pvi(I1ig$8PrdbML(UF|3tBB~# zWS#fqjJ%~rcxL;+Prr6+av3|hZr4gN<}7Q6)mm%ILS)x zf%xP~Ruikn5l%9KH?OgZPs#ItNM;NHn=H~=DW^6}SZ(&K;y1_BwY2)Mx$@N5Z)Aar zG8AL;fyI^RJSXV7$x{gv2E&^W)*{8)oDKvX+ugOWK0vV)=48jOG;4Et@c3q+S>28Y zG*3uAp?QDa-4il*q1k8Ipt(r?$3-y>1|2R@(S+9upcRw_$3svSB(|V`thkd(j>KMd zjK_hwUZ*Z+EfO-ERVN&s9oL;h>q8v1z0^C}dV|;IJ-klaxn)CA>;5ZECTl`(zHOlA zZbDk40Z1vP6ApD6QN)3Rom=v>8G^T8nZUh|uYA4tN-;N*eD$q&^xY>-owwh<^2*

?V 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 a>SpTV<_Wwx!N6+@iiCnWI25icg8vU}1Md?6 From 2d4a15f37c1ef43473a32b705dcbd5fb22f936f0 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 15 Sep 2017 11:35:54 -0400 Subject: [PATCH 006/104] checkpoint libxi work --- libxi/xicommon.h | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/libxi/xicommon.h b/libxi/xicommon.h index 9493df01..54d6971e 100644 --- a/libxi/xicommon.h +++ b/libxi/xicommon.h @@ -7,34 +7,26 @@ * LICENSE. * * Phil Shafer (phil@) June 2016 + * + * Definitions common to the parser, storage, and processing of nodes. */ #ifndef LIBSLAX_XI_COMMON_H #define LIBSLAX_XI_COMMON_H -typedef uint8_t xi_node_type_t; /* Type of node (XI_TYPE_*) */ -typedef uint8_t xi_depth_t; /* Depth in the hierarchy */ -typedef off_t xi_offset_t; /* Offset in file or buffer */ typedef uint32_t xi_source_flags_t; /* Flags for parser */ -typedef uint16_t xi_node_flags_t; /* Flags for a node (XNF_*) */ +typedef uint8_t xi_depth_t; /* Depth in the hierarchy */ -/* - * Since we're using these as bitfields, we're unable to use - * atom wrappers. This will require extra care. - */ -typedef pa_atom_t xi_name_id_t; /* Element name identifier */ -typedef pa_atom_t xi_ns_id_t; /* Namespace identifier */ +#define XI_DEPTH_MIN 1 /* Depth of top of tree (origin 1) */ +#define XI_DEPTH_MAX 254 /* Max depth of tree */ -/* Wrapper for our "name" atom */ -PA_ATOM_TYPE(xi_name_atom_t, xi_name_atom_s, xna_atom, - xi_name_is_null, xi_name_atom, xi_name_atom_of, - xi_name_null_atom); +typedef uint16_t xi_node_flags_t; /* Flags for a node (XNF_*) */ -/* Wrapper for our "namespace" atom */ -PA_ATOM_TYPE(xi_ns_atom_t, xi_ns_atom_s, xns_atom, - xi_ns_is_null, xi_ns_atom, xi_ns_atom_of, - xi_ns_null_atom); +/* Flags for xi_node_flags_t */ +#define XNF_ATTRIBS_PRESENT (1<<0) /* Attributes available */ +#define XNF_ATTRIBS_EXTRACTED (1<<1) /* Attributes aleady extracted */ +typedef uint8_t xi_node_type_t; /* Type of node (XI_TYPE_*) */ /* Type of XML nodes (for xi_node_type_t) */ #define XI_TYPE_NONE 0 /* Unknown type */ #define XI_TYPE_EOF 1 /* End of file */ @@ -62,6 +54,7 @@ PA_ATOM_TYPE(xi_ns_atom_t, xi_ns_atom_s, xns_atom, #define XI_XMLNS_LEADER "xmlns" /* String that starts namespace attributes */ typedef uint8_t xi_boolean_t; /* Base boolean type */ +typedef off_t xi_offset_t; /* Offset in file or buffer */ /* Define opaque types for function prototypes */ struct xi_source_s; typedef struct xi_source_s xi_source_t; From d23c796fcca581855f15cae7b9ad136ea85ea32a Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 15 Sep 2017 11:35:55 -0400 Subject: [PATCH 007/104] checkpoint libxi work --- libxi/xirules.h | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/libxi/xirules.h b/libxi/xirules.h index a727da85..50c74af1 100644 --- a/libxi/xirules.h +++ b/libxi/xirules.h @@ -35,8 +35,13 @@ typedef uint8_t xi_action_type_t; #define XIA_EMIT 5 /* Emit as output */ #define XIA_RETURN 6 /* Force return from xi_parse() */ -typedef pa_atom_t xi_rule_id_t; /* Number to represent each rule */ -typedef pa_atom_t xi_state_id_t; /* Number to represent each state */ +/* Number to represent each rule */ +PA_FIXED_ATOM_TYPE(xi_rule_id_t, xi_rule_id_s, xr_atom, xi_rule_id, + xi_rule_id_atom_of, xi_rule_id_is_null, xi_rule_id_null_atom); + +/* Number to represent each state */ +PA_FIXED_ATOM_TYPE(xi_rstate_id_t, xi_rstate_id_s, xrs_atom, xi_rstate_id, + xi_rstate_id_atom_of, xi_rstate_id_is_null, xi_rstate_id_null_atom); /* * A rule defines a behavior for an incoming token. A token can be @@ -48,7 +53,7 @@ typedef struct xi_rule_s { pa_bitmap_id_t xr_bitmap; /* Elements affected by this rule */ xi_action_type_t xr_action; /* What to do when the rule matches */ pa_atom_t xr_use_tag; /* Different tag to emit */ - xi_state_id_t xr_new_state; /* New state (in the rulebook) to enter */ + xi_rstate_id_t xr_new_state; /* New state (in the rulebook) to enter */ } xi_rule_t; /* Flags for xr_flags */ @@ -67,8 +72,8 @@ typedef struct xi_rstate_s { #define XRBSF_INUSE (1<<0) /* State is used/defined */ typedef struct xi_rulebook_info_s { - xi_state_id_t xrsi_initial_state; /* First state in the rule book */ - xi_state_id_t xrsi_max_state; /* Maximum allocated (seen) state */ + xi_rstate_id_t xrsi_initial_state; /* First state in the rule book */ + xi_rstate_id_t xrsi_max_state; /* Maximum allocated (seen) state */ } xi_rulebook_info_t; /* @@ -83,18 +88,6 @@ typedef struct xi_rulebook_s { pa_bitmap_t *xrb_bitmaps; /* Pool of bitmaps */ } xi_rulebook_t; -static inline xi_rstate_t * -xi_rulebook_state (xi_rulebook_t *xrbp, xi_state_id_t sid) -{ - return pa_fixed_element(xrbp->xrb_states, sid); -} - -static inline xi_rule_t * -xi_rulebook_rule (xi_rulebook_t *xrbp, xi_rule_id_t rid) -{ - return pa_fixed_atom_addr(xrbp->xrb_rules, rid); -} - xi_rulebook_t * xi_rulebook_open (const char *name); @@ -116,6 +109,11 @@ void xi_rulebook_dump (xi_rulebook_t *xrbp); PA_FIXED_FUNCTIONS(xi_rule_id_t, xi_rule_t, xi_rulebook_t, xrb_rules, - xi_rule_alloc, xi_rule_free, xi_rule_addr); + xi_rule_alloc, xi_rule_free, xi_rule_addr, + xi_rule_id, xi_rule_id_atom_of, xi_rule_id_is_null); + +PA_FIXED_FUNCTIONS(xi_rstate_id_t, xi_rstate_t, xi_rulebook_t, xrb_states, + xi_rstate_alloc, xi_rstate_free, xi_rstate_addr, + xi_rstate_id, xi_rstate_id_atom_of, xi_rstate_id_is_null); #endif /* LIBSLAX_XI_RULES_H */ From 2ff3b974b9c6e005f522332ad9e3d2d56748f693 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 15 Sep 2017 11:35:56 -0400 Subject: [PATCH 008/104] checkpoint libxi work --- libxi/xitree.h | 29 +---------------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/libxi/xitree.h b/libxi/xitree.h index 2015f8ec..42b62f8e 100644 --- a/libxi/xitree.h +++ b/libxi/xitree.h @@ -16,35 +16,8 @@ #define XI_MAX_ATOMS (1<<26) /* Max number of nodes in a document */ #define XI_SHIFT 12 /* Bit shift for packed array paging */ -#define XI_ISTR_SHIFT 2 /* Bit shift for immutable string storage */ -/* - * A node in an XML hierarchy, made as small as possible. We use the - * trick where the last sibling points to the parent, allowing us to - * work back up the hierarchy, guided by xn_depth. - * - * If xn_name == PA_NULL_ATOM, the node is the top node in the - * hierarchy. We call this the "top" node, as opposed to the "root" - * node, which appears as a child of the root node. This scheme - * allows the hierarchies with multipe root nodes, which is needed for - * RTFs. - */ -typedef struct xi_node_s { - xi_node_type_t xn_type; /* Type of this node */ - xi_depth_t xn_depth; /* Depth of this node (origin XI_DEPTH_MIN) */ - xi_node_flags_t xn_flags; /* Flags (XNF_*) */ - xi_ns_id_t xn_ns_map:12; /* Namespace map for this node (in ns_map) */ - xi_name_id_t xn_name:20; /* Name of this node (in name db) */ - xi_node_id_t xn_next; /* Next node (or parent if last) */ - xi_node_id_t xn_contents; /* Child node or data (in this tree or data) */ -} xi_node_t; - -#define XI_DEPTH_MIN 1 /* Depth of top of tree (origin 1) */ -#define XI_DEPTH_MAX 254 /* Max depth of tree */ - -/* Flags for xn_flags */ -#define XNF_ATTRIBS_PRESENT (1<<0) /* Attributes available */ -#define XNF_ATTRIBS_EXTRACTED (1<<1) /* Attributes aleady extracted */ +#define XI_ISTR_SHIFT 2 /* Bit shift for immutable string storage */ /* * Each tree (document or RTF) is represented as a tree. The From 03a42cfa9dad7f9ad1bc2c19d5f259198eef4dc5 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 15 Sep 2017 11:35:56 -0400 Subject: [PATCH 009/104] checkpoint libxi work --- libxi/xiworkspace.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/libxi/xiworkspace.h b/libxi/xiworkspace.h index 8919f95e..58f81f5a 100644 --- a/libxi/xiworkspace.h +++ b/libxi/xiworkspace.h @@ -89,12 +89,11 @@ xi_get_attrib_string (xi_workspace_t *xwp, xi_node_t *nodep, return (atom == PA_NULL_ATOM) ? NULL : xi_textpool_string(xwp, atom); } -PA_ATOM_TYPE(xi_ns_map_id_t, xi_ns_map_id_s, xnm_atom, xi_ns_map_id_is_null, - xi_ns_map_id, xi_ns_map_null_atom); - -PA_FIXED_FUNCTIONS(xi_ns_map_id_t, xi_ns_map_t, xi_workspace_t, xw_ns_map, - xi_ns_map_alloc, xi_ns_map_free, xi_ns_map_addr, - xi_ns_map_id_is_null, xi_ns_map_id); +PA_FIXED_ATOM_BASED(xi_ns_map_id_t, xi_ns_map_id_s, xnm_atom, + xi_ns_map_t, xi_workspace_t, xw_ns_map, + xi_ns_map_alloc, xi_ns_map_free, xi_ns_map_addr, + xi_ns_map_id, xi_ns_map_id_atom_of, + xi_ns_map_id_is_null, xi_ns_map_id_null_atom); #endif /* LIBSLAX_XI_WORKSPACE_H */ From 80ac64340a808a39ff2b02e0dd86ed1bc346c5a2 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 15 Sep 2017 11:35:57 -0400 Subject: [PATCH 010/104] checkpoint libxi work --- parrotdb/pafixed.h | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/parrotdb/pafixed.h b/parrotdb/pafixed.h index 7e1a60c6..e9a148d1 100644 --- a/parrotdb/pafixed.h +++ b/parrotdb/pafixed.h @@ -287,12 +287,41 @@ pa_fixed_test_flags (pa_fixed_t *pfp, pa_fixed_flags_t flags) return (pfp->pf_flags & flags) ? 1 : 0; } +/** + * Macro to wrap a fixed atom with a different name + */ +#define PA_FIXED_ATOM_TYPE(_atom_type, _atom_struct, _field, \ + _build_fn, _atom_of_fn, _is_null_fn, _null_atom_fn) \ +typedef struct _atom_struct { \ + pa_fixed_atom_t _field; /* Fixed atom */ \ +} _atom_type; \ +static inline psu_boolean_t \ +_is_null_fn (_atom_type atom) \ +{ \ + return pa_fixed_is_null(atom._field); \ +} \ +static inline _atom_type \ +_build_fn (pa_atom_t atom) \ +{ \ + return (_atom_type){ pa_fixed_atom(atom) }; \ +} \ +static inline pa_fixed_atom_t \ +_atom_of_fn (_atom_type atom) \ +{ \ + return atom._field; \ +} \ +static inline _atom_type \ +_null_atom_fn (void) \ +{ \ + return (_atom_type){ pa_fixed_null_atom()}; \ +} + /* * Define a set of functions for a PA_ATOM_TYPE that call allocate * a free atoms, as well as turn the atom into a typed pointer. */ #define PA_FIXED_FUNCTIONS(_atom_type, _type, _base, _field, \ - _alloc_fn, _free_fn, _addr_fn, _build_fn, _is_null_fn) \ + _alloc_fn, _free_fn, _addr_fn, _build_fn, _atom_of_fn, _is_null_fn) \ static inline _type * \ _alloc_fn (_base *basep, _atom_type *atomp) \ { \ @@ -312,13 +341,22 @@ _free_fn (_base *basep, _atom_type atom) \ if (_is_null_fn(atom)) /* Should not occur */ \ return; \ \ - pa_fixed_free_atom(basep->_field, _build_fn##_of(atom)); \ + pa_fixed_free_atom(basep->_field, _atom_of_fn(atom)); \ } \ \ static inline _type * \ _addr_fn (_base *basep, _atom_type atom) \ { \ - return pa_fixed_atom_addr(basep->_field, _build_fn##_of(atom)); \ + return pa_fixed_atom_addr(basep->_field, _atom_of_fn(atom)); \ } +#define PA_FIXED_ATOM_BASED(_atom_type, _atom_struct, _struct_field, \ + _type, _base, _field, _alloc_fn, _free_fn, _addr_fn, \ + _build_fn, _atom_of_fn, _is_null_fn, _null_atom_fn) \ + PA_FIXED_ATOM_TYPE(_atom_type, _atom_struct, _struct_field, \ + _build_fn, _atom_of_fn, _is_null_fn, _null_atom_fn) \ + PA_FIXED_FUNCTIONS(_atom_type, _type, _base, _field, \ + _alloc_fn, _free_fn, _addr_fn, \ + _build_fn, _atom_of_fn, _is_null_fn) + #endif /* PARROTDB_PAFIXED_H */ From be30b232f9eb5b8deb3ee4ed98d16412ddb25732 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 15 Sep 2017 11:35:58 -0400 Subject: [PATCH 011/104] checkpoint libxi work --- libxi/NOTES.txt | 395 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 395 insertions(+) create mode 100644 libxi/NOTES.txt diff --git a/libxi/NOTES.txt b/libxi/NOTES.txt new file mode 100644 index 00000000..cb7283ea --- /dev/null +++ b/libxi/NOTES.txt @@ -0,0 +1,395 @@ +# +# Copyright (c) 2016-2017, Juniper Networks, Inc. +# All rights reserved. +# This SOFTWARE is licensed under the LICENSE provided in the +# ../Copyright file. By downloading, installing, copying, or otherwise +# using the SOFTWARE, you agree to be bound by the terms of that +# LICENSE. +# +# Phil Shafer , March 2017 + +* Introduction + +This is documentation only in that most vague sense of the word. It's +more like 1/2 diary, 1/2 stream of consciousness therapy. I'm not +even sure it's all true. But if you're trying to answer the question +"what the snot was he thinking?", this document might help you. + +* Ramblings + +** XML + +The XML parser grew out of a discussion (one of those loud ones where +neither side was really listening to the other) about the +cost/benefits of XML versus JSON. My contention is that XML has three +valuable tools: + +- hierarchical organization +- extensibility via namespaces +- meta-data via attributes + +JSON has only the hierarchical organization, but does have the benefit +of carrying data type encoding. XML purists will likely think of that +as meta-data that shouldn't be mixed with data, or repeated on every +data instance, but in truth, it's a huge advantage, since you don't +need to parse schema data to know that a data item is a string and not +a boolean. One can carry this information in XML attributes, but it's +far uglier. + +But the discussion was more about the "wordiness" of XML and how +annoying that was. I pointed out that with compression, this turns +out to be less than 5% overhead, and a close tag makes error detection +possible in a way that a dozen close braces does not. + +We moved on to parsing, where I pointed out that calling one +parsing function for JSON and one for XML meant it really wasn't any +more painful to the programmer, but the counter was that XML parsing +is much slower. My own JSON parser (in libslax) is actually a bit +faster than the libxml2 parser, and I could only argue that one's my +code and the other's not. Which didn't win the discussion. + +After thinking about it a bit, I realized that even the XML parser in +JUNOS isn't that efficient (the fbuf code). So I wanted to see how +fast I could make one. Turns out when parsing XML, you always "know" +the next character that you care about, and it's either a '<' or a +'>'. That means one should be calling memchr() extensively. So I +wrote a parser based on that, and got one an order of magnitude faster +than the JUNOS code and even more so against the libxml2 code. 2.5GB +of data per second on my aging laptop. + +Yes, I didn't have any real back end to use the XML. I could have +built libxml2-compatible structures, but they are fairly ugly. So I +went on a reading jaunt, looking at how things were stored in various +XML implementations, and end up on the papers that described the "tiny +tree" idea. It seemed suitably efficient but was based around a large +array. In java, that's fine, but in C, large arrays stink. + +** Other Projects + +A bit about the other projects circling in my head at this time: + +- I want a means of pre-parsing large XML datasets, building an +"index file" (of sorts) so that queries against the data were fast. +The index file can refer into the original file for content, but all +the XML parsing/hierarchy/etc needs to be pre-done, so one can open +the file(s) and immediately start searching. We have large YANG +models, and (if we put them on YIN format) can use this for satisfying +queries on the data model without have to rebuild it. + +- I want to build a new XSLT library, since my SLAX project hits on +a number of performance issues within libxslt and libxml2. + +- I want a command line utility to parse XML (XHTML really (sort +of)) so that libxo output could be filtered in ways like +grep and awk but with XML awareness. Imagine writing commands +like "df | xfind 'avail > 2g'". + +- I want to make a new database for the JUNOS management daemon, +which is currently ancient. I wrote it as a memory-mapped tree of +patricia trees, which is insanely fast, but it's not really very +memory efficient. It's build on a power-of-two allocator, but most of +it's data is fixed sizes and we don't take advantage of that. I +originally mapped it at a fixed address, placing pointers inside it, +but that was redone to use offsets, which allows the database to be +mapped at any address. Also we're using TLV files for shipping data, +but something more database-oriented would be faster (assumably). + +Which brings us to...... + +** ParrotDB + +ParrotDB's name (at least to "PA" part of it) comes from "paged +arrays". The idea is that I wanted an array with a software page +table, so the index into the array would consist of two halves, one +that indicated the "page" on which the data lived, and the second half +indicated the item number within that "page". Using power-of-two page +sizes means we can "or" these two halves together into a single 32-bit +word that gives us that ability to address up to 4G of items in an +array, with an upfront cost of only a page table. This means 4G of +each type of item, not 4G total number of items. + +Each page of data items is allocated at once, so the cost of +allocating a single item can be large, but that incremental cost is +near zero. And also blindingly fast. Like "grab the first idea off a +queue" fast. + +We call these item numbers "atoms", and an atom looks like: + + 32 0 + +---------+-------------+-------------------------+ + | unused | page number | number-inside-that-page | + +---------+-------------+-------------------------+ + page-part item-part + +Here's the comment from pafixed.h, which might say it better: + + * Paged arrays are fixed size arrays, allocated piecemeal + * to reduce their initial memory impact. + * + * Glossary: + * atom = smallest addressable unit. You are making an arrray of + * these atoms. Atom size is determined by the user by + * in the atom_size parameter. + * page = a set of atoms. The number of atom per page is given in + * the shift parameter: a page hold 1<ppi_root + #define pp_key_bytes pp_infop->ppi_key_bytes + +The handle will also hold the handle of the underlaying mmap handle, +as demonstrated here with the "pp_mmap" field. + +*** Configuration + +The configuration system is fairly trivial. The config file +holds a series of "name = value;" pairs. Values are currently all +integers (uint32_t) and "1<URL" mappings, +with the assumption that the number of unique mappings within a +document is relatively low. + +We mash the prefix mapping atom in the top bits of the same uint32_t +bit field as the node's name, which is an immutable string atom, and +should also be a relatively small number. + +Since the "mapping" and the "name" are really parrotdb atoms, we want +to expose these as parrotdb uint32_t structures, not raw atoms. We +do this to help about numbering bugs. So we provide accessors for +these fields. + +** Future Plans + +I'm looking at a libxml2/libxslt replacement, but these libraries +expose a large volume of internals, making a plug-compatible +replacement impossible. + +I'm working on the XPath implementation currently, looking at FSA to +make regex-like state-based pattern matching. It's still very early +and, well, it's pretty ugly. But very interesting...... From 3247f443196520d29ecb4c53092411a438ae6840 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 15 Sep 2017 11:36:07 -0400 Subject: [PATCH 012/104] checkpoint libxi work --- libxi/xinode.h | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 libxi/xinode.h diff --git a/libxi/xinode.h b/libxi/xinode.h new file mode 100644 index 00000000..32455724 --- /dev/null +++ b/libxi/xinode.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2016, Juniper Networks, Inc. + * All rights reserved. + * This SOFTWARE is licensed under the LICENSE provided in the + * ../Copyright file. By downloading, installing, copying, or otherwise + * using the SOFTWARE, you agree to be bound by the terms of that + * LICENSE. + * + * Phil Shafer (phil@) June 2017 + * + * xinode.h: all the definition needed for xi_node_t, which is the + * representation of a node in the tree. + */ + +#ifndef LIBXI_XINODE_H +#define LIBXI_XINODE_H + +/* + * Since we're using these as bitfields, we're unable to use + * atom wrappers. This will require extra care. + */ +typedef pa_atom_t xi_name_id_raw_t; /* Element name identifier */ +typedef pa_atom_t xi_ns_map_id_raw_t; /* Namespace identifier */ + +/* Wrapper for our "name" atom */ +PA_ATOM_TYPE(xi_name_atom_t, xi_name_atom_s, xna_atom, + xi_name_is_null, xi_name_atom, xi_name_atom_of, + xi_name_null_atom); + +/* + * Wrapper for our "namespace" mapping atom, which is really a "prefix + * mapping", since we use this as an index into prefix->namespace mappings. + */ +PA_ATOM_TYPE(xi_ns_map_atom_t, xi_ns_map_atom_s, xnsm_atom, + xi_ns_map_is_null, xi_ns_map_atom, xi_ns_map_atom_of, + xi_ns_map_null_atom); + +/* + * A node in an XML hierarchy, made as small as possible. We use the + * trick where the last sibling points to the parent, allowing us to + * work back up the hierarchy, guided by xn_depth. + * + * If xn_name == PA_NULL_ATOM, the node is the top node in the + * hierarchy. We call this the "top" node, as opposed to the "root" + * node, which appears as a child of the root node. This scheme + * allows the hierarchies with multipe root nodes, which is needed for + * RTFs. + */ +typedef struct xi_node_s { + xi_node_type_t xn_type; /* Type of this node */ + xi_depth_t xn_depth; /* Depth of this node (origin XI_DEPTH_MIN) */ + xi_node_flags_t xn_flags; /* Flags (XNF_*) */ + xi_ns_id_raw_t xn_ns_map_t; /* Namespace map for this node (in ns_map) */ + xi_name_id_raw_t xn_name_:20; /* Name of this node (in name db) */ + xi_node_id_t xn_parent; /* Parent node (NULL if root) */ + xi_node_id_t xn_next; /* Next node (or parent if last) */ + xi_node_id_t xn_contents; /* Child node or data (in this tree or data) */ +} xi_node_t; + +/* + * Each node has a prefix mapping that tells us which namespace it's + * in. We want to make this simple and reusable, but since prefixes + * can be remapped within any hierarchy, it's only reusable in the + * window where that mapping isn't changed. But this makes finding + * the prefix and url a simple lookup. This means that it two nodes + * have the same mapping (xi_ns_id_t) then they are in the same + * namespace, but if they are different, then those two mappings' + * xnm_uri fields must be compared to see if they have the same atom + * number. Since they are in a name-pool, "There can be only one!" + * applies, so comparing the url atom number is sufficient. + */ +typedef struct xi_ns_map_s { + pa_atom_t xnm_prefix; /* Atom of prefix string (in namepool) */ + pa_atom_t xnm_uri; /* Atom of URL string (in namepool) */ +} xi_ns_map_t; + +static inline xi_name_t +xi_node_get_name (xi_node_t *nodep) +{ + +} + +#endif /* LIBXI_XINODE_H */ From fce6c5854a6b7bf04209690fceba9b9701758d6c Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 15 Sep 2017 11:36:08 -0400 Subject: [PATCH 013/104] checkpoint libxi work --- parrotdb/parrotdb.h | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 parrotdb/parrotdb.h diff --git a/parrotdb/parrotdb.h b/parrotdb/parrotdb.h new file mode 100644 index 00000000..4b860e69 --- /dev/null +++ b/parrotdb/parrotdb.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016-2017, Juniper Networks, Inc. + * All rights reserved. + * This SOFTWARE is licensed under the LICENSE provided in the + * ../Copyright file. By downloading, installing, copying, or otherwise + * using the SOFTWARE, you agree to be bound by the terms of that + * LICENSE. + * + * Phil Shafer , March 2017 + */ + +#ifndef PARROTDB_PARROTDB_H +#define PARROTDB_PARROTDB_H + +/** + * A pa_dscr_t is meant to provide some abstraction between + * the operations on an atom and the atom itself, allowing + * a layered set of features on top of a simple datatype. + */ +typedef struct pa_dscr_s { + uint8_t pd_dbase; /* Number of the database */ + uint8_t pd_type; /* Type of the database */ + uint16_t pd_table; /* Table number (in pa_mmap_t) */ + pa_atom_t pd_atom; /* Atom number */ +} pa_dscr_t; + + +struct pa_ops_s; /* Forward declaration */ + +/* Typedefs for pa_ops_t functions */ +typedef int (*pa_op_lock_t)(pa_mmap_t *dbase, pa_dscr_t atom, + +/** + * The "pa_ops_t" defines the operations one may perform on + * any base parrotdb data type. + */ +typedef struct pa_ops_s { + const char *po_name; /* Printable name of the type */ + +} pa_ops_t; + +#endif /* PARROTDB_PARROTDB_H */ + From 1034f1910c23fc56c9069b8037afa343bc720803 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 15 Sep 2017 11:36:11 -0400 Subject: [PATCH 014/104] checkpoint libxi work --- tests/art/test-020.txt | 72 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 tests/art/test-020.txt diff --git a/tests/art/test-020.txt b/tests/art/test-020.txt new file mode 100644 index 00000000..5ae365ea --- /dev/null +++ b/tests/art/test-020.txt @@ -0,0 +1,72 @@ + +---------------+ + O | Creation of a | + -|- ->| YANG module | + / \ +---------------+ + | + V + /-------------\ + / Standardized \ yes + \ YANG module ? /-------------+ + \-------------/ | + | no | + V V + /-------------\ +---------------+ + / Constrained \ yes | SID range | + +-->\ application ? /---->| registration | + | \-------------/ +---------------+ + | | no | + | V V + | +---------------+ +---------------+ + +---| YANG module | | SID sub-range | + | update | | assignment | + +---------------+ +---------------+ + | + V + +---------------+ + | .sid file | + | generation | + +---------------+ + | + V + /-------------\ +---------------+ + / Publicly \ yes | YANG module | + \ available ? /---->| registration | + \-------------/ +---------------+ + | no | + +---------------------+ + | + [DONE] + + + +---------------+ + O | Update of the | + -|- ->| YANG module | + / \ | or include(s) | + | or import(s) | + +---------------+ + | + V + /-------------\ +----------------+ + / More SIDs \ yes | Extra sub-range| + \ required ? /---->| assignment | + \-------------/ +----------------+ + | no | + +---------------------+ + | + V + +---------------+ + | .sid file | + | update based | + | on previous | + | .sid file | + +---------------+ + | + V + /-------------\ +---------------+ + / Publicly \ yes | YANG module | + \ available ? /---->| registration | + \-------------/ +---------------+ + | no | + +---------------------+ + | + [DONE] From 271cbf6e354310fcfbef65675962053164ead512 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Wed, 13 Dec 2017 15:26:26 -0500 Subject: [PATCH 015/104] Fix use of AC_ARG_ENABLE, where I was assuming "yes" instead of using $$enableval --- configure.ac | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 31cd86ac..b53aed09 100644 --- a/configure.ac +++ b/configure.ac @@ -105,25 +105,34 @@ AM_CONDITIONAL([SLAX_WARNINGS_HIGH], [test "$SLAX_WARNINGS" != "no"]) AC_MSG_CHECKING([whether to build with debugging]) AC_ARG_ENABLE([debug], [ --enable-debug Turn on debugging], - [SLAX_DEBUG=yes; AC_DEFINE([SLAX_DEBUG], [1], [Enable debugging])], + [SLAX_DEBUG=$enableval], [SLAX_DEBUG=no]) AC_MSG_RESULT([$SLAX_DEBUG]) +if test "$SLAX_DEBUG" != "no"; then + AC_DEFINE([SLAX_DEBUG], [1], [Enable debugging]) +fi AM_CONDITIONAL([SLAX_DEBUG], [test "$SLAX_DEBUG" != "no"]) AC_MSG_CHECKING([whether to build with readline]) AC_ARG_ENABLE([readline], [ --enable-readline Enable support for GNU readline], - [HAVE_READLINE=yes; AC_DEFINE([HAVE_READLINE], [1], [Support readline])], + [HAVE_READLINE=$enableval], [HAVE_READLINE=no]) AC_MSG_RESULT([$HAVE_READLINE]) +if test "$HAVE_READLINE" != "no"; then + AC_DEFINE([HAVE_READLINE], [1], [Support readline]) +fi AM_CONDITIONAL([HAVE_READLINE], [test "$HAVE_READLINE" != "no"]) AC_MSG_CHECKING([whether to build with libedit]) AC_ARG_ENABLE([libedit], [ --enable-libedit Enable support for libedit (BSD readline)], - [HAVE_LIBEDIT=yes; AC_DEFINE([HAVE_LIBEDIT], [1], [Support libedit])], + [HAVE_LIBEDIT=$enableval], [HAVE_LIBEDIT=no]) AC_MSG_RESULT([$HAVE_LIBEDIT]) +if test "$HAVE_LIBEDIT" != "no"; then + AC_DEFINE([HAVE_LIBEDIT], [1], [Support libedit]) +fi AM_CONDITIONAL([HAVE_LIBEDIT], [test "$HAVE_LIBEDIT" != "no"]) AC_MSG_CHECKING([compiler for gcc]) From c8b3fe32a22759dea928d4a60ac0ea96fec71b7e Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Wed, 13 Dec 2017 16:08:21 -0500 Subject: [PATCH 016/104] Add "info insert", "info output", and "info locals" commands --- libslax/slaxdebugger.c | 279 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 256 insertions(+), 23 deletions(-) diff --git a/libslax/slaxdebugger.c b/libslax/slaxdebugger.c index 0c0c7e77..c8ed4b8c 100644 --- a/libslax/slaxdebugger.c +++ b/libslax/slaxdebugger.c @@ -183,6 +183,7 @@ typedef struct slaxDebugBreakpoint_s { char *dbp_where; /* Text name as given by user */ xmlNodePtr dbp_inst; /* Node we are breaking on */ uint dbp_num; /* Breakpoint number */ + char *dbp_condition; /* Conditional breakpoint expression */ } slaxDebugBreakpoint_t; TAILQ_HEAD(slaxDebugBpList_s, slaxDebugBreakpoint_s) slaxDebugBreakpoints; @@ -458,6 +459,7 @@ slaxDebugClearBreakpoints (void) if (dbp == NULL) break; xmlFreeAndEasy(dbp->dbp_where); + xmlFreeAndEasy(dbp->dbp_condition); TAILQ_REMOVE(&slaxDebugBreakpoints, dbp, dbp_link); } @@ -682,37 +684,73 @@ slaxDebugSplitArgs (char *buf, const char **args, int maxargs) * Check if the breakpoint is available for curnode being executed */ static int -slaxDebugCheckBreakpoint (slaxDebugState_t *statep, - xmlNodePtr node, int reached) +slaxDebugCheckBreakpoint (slaxDebugState_t *statep, xmlNodePtr node) { slaxDebugBreakpoint_t *dbp; if (statep->ds_stop_at && statep->ds_stop_at == node) { - if (reached) { - slaxOutput("Reached stop at %s:%ld", - node->doc->URL, xmlGetLineNo(node)); - xsltSetDebuggerStatus(XSLT_DEBUG_INIT); - } - statep->ds_stop_at = NULL; /* One time only */ return TRUE; } TAILQ_FOREACH(dbp, &slaxDebugBreakpoints, dbp_link) { - if (dbp->dbp_inst && dbp->dbp_inst == node) { - if (reached) { - slaxOutput("Reached breakpoint %d, at %s:%ld", - dbp->dbp_num, node->doc->URL, - xmlGetLineNo(node)); - xsltSetDebuggerStatus(XSLT_DEBUG_INIT); - } + if (dbp->dbp_inst && dbp->dbp_inst == node) return TRUE; - } } return FALSE; } +/* + * Find the breakpoint (and return it) + */ +static slaxDebugBreakpoint_t * +slaxDebugFindBreakpoint (slaxDebugState_t *statep, xmlNodePtr node) +{ + slaxDebugBreakpoint_t *dbp; + + if (statep->ds_stop_at && statep->ds_stop_at == node) + return NULL; + + TAILQ_FOREACH(dbp, &slaxDebugBreakpoints, dbp_link) { + if (dbp->dbp_inst && dbp->dbp_inst == node) + return dbp; + } + + return NULL; +} + +/* + * Announce the breakpoint found (and return it) + */ +static void +slaxDebugAnnounceBreakpoint (slaxDebugState_t *statep, xmlNodePtr node) +{ + slaxDebugBreakpoint_t *dbp; + + if (statep->ds_stop_at && statep->ds_stop_at == node) { + slaxOutput("Reached stop at %s:%ld", + node->doc->URL, xmlGetLineNo(node)); + + xsltSetDebuggerStatus(XSLT_DEBUG_INIT); + statep->ds_stop_at = NULL; /* One time only */ + return; + } + + TAILQ_FOREACH(dbp, &slaxDebugBreakpoints, dbp_link) { + if (dbp->dbp_inst && dbp->dbp_inst == node) { + slaxOutput("Reached breakpoint %d, at %s:%ld", + dbp->dbp_num, node->doc->URL, + xmlGetLineNo(node)); + if (dbp->dbp_condition) + slaxOutput(" Condition: '%s'", dbp->dbp_condition); + + xsltSetDebuggerStatus(XSLT_DEBUG_INIT); + return; + } + } +} + static char * slaxDebugTemplateInfo (xsltTemplatePtr template, char *buf, int bufsiz) { @@ -833,6 +871,38 @@ slaxDebugClearListInfo (slaxDebugState_t *statep) statep->ds_list_line = 0; } +/* + * Move along the commandline to find the expression. Allow + * the user to say "if" or "when". + */ +static char * +slaxDebugFindCondition (char *input) +{ + /* Move over command name */ + while (*input && !isspace((int) *input)) + input += 1; + while (*input && isspace((int) *input)) + input += 1; + + /* Move over breakpoint number */ + while (*input && !isspace((int) *input)) + input += 1; + while (*input && isspace((int) *input)) + input += 1; + + if (strncmp(input, "if ", 3) == 0) { + input += 3; + while (*input && isspace((int) *input)) + input += 1; + } else if (strncmp(input, "when ", 5) == 0) { + input += 5; + while (*input && isspace((int) *input)) + input += 1; + } + + return input; +} + /* * 'break' command */ @@ -841,6 +911,7 @@ slaxDebugCmdBreak (DC_ARGS) { xmlNodePtr node = NULL; slaxDebugBreakpoint_t *bp; + char *condition = NULL; node = slaxDebugGetNode(statep, argv[1]); if (node == NULL) { @@ -848,11 +919,36 @@ slaxDebugCmdBreak (DC_ARGS) return; } - if (slaxDebugCheckBreakpoint(statep, node, FALSE)) { + if (slaxDebugCheckBreakpoint(statep, node)) { slaxOutput("Duplicate breakpoint"); return; } + /* If we have a breakpoint, make sure the expression parses */ + if (argv[2]) { + condition = ALLOCADUP(commandline); + condition = slaxDebugFindCondition(condition); + if (*condition == '\0') { + slaxOutput("Missing expression"); + return; + } + + condition = slaxSlaxToXpath("sdb", 1, condition, NULL); + if (condition == NULL) { + slaxOutput("Invalid expression"); + return; + } + + xmlXPathCompExprPtr comp; + comp = xsltXPathCompile(statep->ds_script, (const xmlChar *) condition); + if (comp == NULL) { + xmlFreeAndEasy(condition); + return; + } + + xmlXPathFreeCompExpr(comp); + } + /* * Create a record of the breakpoint and add it to the list */ @@ -864,6 +960,8 @@ slaxDebugCmdBreak (DC_ARGS) bp->dbp_where = xmlStrdup2(argv[1]); bp->dbp_num = ++slaxDebugBreakpointNumber; bp->dbp_inst = node; + bp->dbp_condition = condition; + TAILQ_INSERT_TAIL(&slaxDebugBreakpoints, bp, dbp_link); slaxOutput("Breakpoint %d at file %s, line %ld", @@ -913,7 +1011,7 @@ slaxDebugCmdContinue (DC_ARGS) slaxDebugClearListInfo(statep); - if (argv[1]) { + if (argv && argv[1]) { node = slaxDebugGetNode(statep, argv[1]); if (node == NULL) { slaxOutput("Unknown location: %s", argv[1]); @@ -966,6 +1064,8 @@ slaxDebugCmdDelete (DC_ARGS) */ TAILQ_FOREACH(dbpp, &slaxDebugBreakpoints, dbp_link) { if (dbpp->dbp_num == num) { + xmlFreeAndEasy(dbpp->dbp_where); + xmlFreeAndEasy(dbpp->dbp_condition); TAILQ_REMOVE(&slaxDebugBreakpoints, dbpp, dbp_link); slaxOutput("Deleted breakpoint '%d'", num); return; @@ -1010,6 +1110,9 @@ slaxDebugHelpInfo (DH_ARGS) { slaxOutput("List of commands:"); slaxOutput(" info breakpoints Display current breakpoints"); + slaxOutput(" info insert Display current insertion point"); + slaxOutput(" info locals Display local variables"); + slaxOutput(" info output Display output document"); slaxOutput(" info profile [brief] Report profiling information"); } @@ -1029,13 +1132,16 @@ slaxDebugInfoBreakpoints (slaxDebugState_t *statep) tag = (dbp->dbp_inst == statep->ds_node) ? "*" : " "; template = slaxDebugGetTemplate(statep, dbp->dbp_inst); - if (dbp->dbp_inst) - slaxOutput(" %s#%d %s at %s:%ld", + if (dbp->dbp_inst) { + char *cond = dbp->dbp_condition; + slaxOutput(" %s#%d %s at %s:%ld%s%s%s", tag, dbp->dbp_num, slaxDebugTemplateInfo(template, buf, sizeof(buf)), dbp->dbp_inst->doc ? dbp->dbp_inst->doc->URL : slaxNull, - xmlGetLineNo(dbp->dbp_inst)); - else + xmlGetLineNo(dbp->dbp_inst), + cond ? " condition: '" : "", cond ?: "", + cond ? "'" : ""); + } else slaxOutput(" #%d %s (orphaned)", dbp->dbp_num, dbp->dbp_where); } @@ -1043,15 +1149,96 @@ slaxDebugInfoBreakpoints (slaxDebugState_t *statep) slaxOutput("No breakpoints."); } +/* + * Dump the variables in a context + */ +static void +slaxDebugContextVariables (xsltTransformContextPtr ctxt) +{ + int i; + const char *type, *name; + char buf[BUFSIZ]; + + if (ctxt->varsNr <= ctxt->varsBase) { + slaxOutput("no local variables"); + return; + } + + slaxOutput("Local variables:"); + for (i = ctxt->varsNr; i > ctxt->varsBase; i--) { + xsltStackElemPtr cur; + + for (cur = ctxt->varsTab[i - 1]; cur != NULL; cur = cur->next) { + type = "local"; + name = "unknown"; + + if (cur->name) { + const char mprefix[] = SLAX_MVAR_PREFIX; + + name = (const char *) cur->name; + if (strncmp(name, mprefix, sizeof(mprefix) - 1) == 0) + continue; + } + + if (cur->comp == NULL) { + type = "invalid"; + + } else if (cur->comp->type == XSLT_FUNC_PARAM) { + type = "param"; + + } else if (cur->comp->type == XSLT_FUNC_VARIABLE) { + type = "var"; + } + + snprintf(buf, sizeof(buf), "%s $%s%s", type, name, + cur->value ? " = " : " -- null value"); + if (cur->value) + slaxDebugOutputXpath(cur->value, buf, TRUE); + else + slaxOutput("%s", buf); + } + } +} + +/* + * Dump the variables in a context + */ +static void +slaxDebugCmdLocals (DC_ARGS) +{ + slaxDebugContextVariables(statep->ds_ctxt); +} + /* * 'info' command */ static void slaxDebugCmdInfo (DC_ARGS) { + xsltTransformContextPtr ctxt = statep->ds_ctxt; + if (argv[1] == NULL || slaxDebugIsAbbrev("breakpoints", argv[1])) { slaxDebugInfoBreakpoints(statep); + } else if (slaxDebugIsAbbrev("insert", argv[1])) { + if (ctxt->insert == NULL) { + slaxOutput("context insertion point is NULL"); + } else { + slaxOutput("[context insertion point]"); + slaxOutputNode(ctxt->insert); + } + + } else if (slaxDebugIsAbbrev("output", argv[1])) { + if (ctxt->output == NULL) { + slaxOutput("context output document is NULL"); + } else { + slaxOutput("[context output document]"); + slaxDumpToFd(1, ctxt->output, FALSE); + } + + } else if (slaxDebugIsAbbrev("locals", argv[1])) { + slaxDebugContextVariables(ctxt); + } else if (slaxDebugIsAbbrev("profile", argv[1])) { int brief = (argv[2] && slaxDebugIsAbbrev("brief", argv[2])); slaxProfReport(brief, statep->ds_script_buffer); @@ -1650,6 +1837,7 @@ static slaxDebugCommand_t slaxDebugCmdTable[] = { NULL, }, + { "delete", 1, slaxDebugCmdDelete, "delete [num] Delete all (or one) breakpoints", NULL, @@ -1677,6 +1865,11 @@ static slaxDebugCommand_t slaxDebugCmdTable[] = { NULL, }, + { "locals", 2, slaxDebugCmdLocals, + "locals List contents of local variables", + NULL, + }, + { "mode", 1, slaxDebugCmdMode, NULL, NULL }, /* Hidden */ { "next", 1, slaxDebugCmdNext, @@ -1823,6 +2016,37 @@ slaxDebugShell (slaxDebugState_t *statep) return 0; } +/* + * We've got a conditional breakpoint, which means we need to + * (a) compile the expression, (b) evaluate the expression, + * (c) turn it into a boolean, and (d) decide whether to skip. + * We return FALSE to skip, TRUE to stop. + */ +static int +slaxDebugEvalCondition (slaxDebugState_t *statep, + slaxDebugBreakpoint_t *dbp, int print) +{ + xmlXPathObjectPtr xpobj; + int res = FALSE; + + xpobj = slaxDebugEvalXpath(statep, dbp->dbp_condition); + if (xpobj == NULL) + return FALSE; /* Failure means don't stop */ + + if (print) + slaxDebugOutputXpath(xpobj, NULL, TRUE); /* Debug output */ + + if (xpobj->type != XPATH_BOOLEAN) + xpobj = xmlXPathConvertBoolean(xpobj); + + if (xpobj->type == XPATH_BOOLEAN) /* Otherwise, it can't be converted */ + res = xpobj->boolval ? TRUE : FALSE; + + xmlXPathFreeObject(xpobj); + + return res; +} + /** * Are we at the same spot as the last time we stopped? This is * tricky question because (a) a single SLAX statement can turn into @@ -1945,7 +2169,16 @@ slaxDebugHandler (xmlNodePtr inst, xmlNodePtr node, } } - slaxDebugCheckBreakpoint(statep, inst, TRUE); + slaxDebugBreakpoint_t *dbp = slaxDebugFindBreakpoint(statep, inst); + if (dbp && dbp->dbp_condition) { + if (slaxDebugEvalCondition(statep, dbp, FALSE) == FALSE) { + /* Fake a "continue" command */ + slaxDebugCmdContinue(statep, NULL, NULL); + return; + } + } + + slaxDebugAnnounceBreakpoint(statep, inst); #if 0 if (statep->ds_flags & DSF_OVER) { From d6871e2984bdf7dd1a428594f684ba990d1250f9 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Wed, 13 Dec 2017 16:08:32 -0500 Subject: [PATCH 017/104] add SLAX_MVAR_PREFIX --- libslax/slaxinternals.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libslax/slaxinternals.h b/libslax/slaxinternals.h index ad86fd9b..4998d994 100644 --- a/libslax/slaxinternals.h +++ b/libslax/slaxinternals.h @@ -64,6 +64,8 @@ slaxTransformError2 (xsltTransformContextPtr tctxt, const char *fmt, ...); /* --- slaxmvar.h --- */ +#define SLAX_MVAR_PREFIX "slax-" + void slaxMvarAddSvarName (slax_data_t *sdp, xmlNodePtr nodep); /** From a02d67e48f5d11e3d48b1b1fcb0fc22912ebd0cb Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Wed, 13 Dec 2017 16:08:35 -0500 Subject: [PATCH 018/104] use SLAX_MVAR_PREFIX --- libslax/slaxmvar.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libslax/slaxmvar.c b/libslax/slaxmvar.c index b8da3e9b..4f908a46 100644 --- a/libslax/slaxmvar.c +++ b/libslax/slaxmvar.c @@ -54,10 +54,10 @@ slaxMvarSvarName (const char *varname) cp = strchr(varname, ':'); if (cp) - snprintf(buf, sizeof(buf), "%*s:slax-%s", (int) (cp - varname), - varname, cp); + snprintf(buf, sizeof(buf), "%*s:" SLAX_MVAR_PREFIX "%s", + (int) (cp - varname), varname, cp); else - snprintf(buf, sizeof(buf), "slax-%s", varname); + snprintf(buf, sizeof(buf), SLAX_MVAR_PREFIX "%s", varname); return xmlStrdup((const xmlChar *) buf); } From 98bbb88e1db1722b7162ddf2f9ca1a086afd4bff Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Wed, 13 Dec 2017 21:20:31 -0500 Subject: [PATCH 019/104] Test for NULL ctxt when running new "info" commands (insert, output, locals) --- libslax/slaxdebugger.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/libslax/slaxdebugger.c b/libslax/slaxdebugger.c index c8ed4b8c..c800805e 100644 --- a/libslax/slaxdebugger.c +++ b/libslax/slaxdebugger.c @@ -1158,7 +1158,12 @@ slaxDebugContextVariables (xsltTransformContextPtr ctxt) int i; const char *type, *name; char buf[BUFSIZ]; - + + if (ctxt == NULL) { + slaxOutput("The script is not being run."); + return; + } + if (ctxt->varsNr <= ctxt->varsBase) { slaxOutput("no local variables"); return; @@ -1209,6 +1214,17 @@ slaxDebugCmdLocals (DC_ARGS) slaxDebugContextVariables(statep->ds_ctxt); } +static int +slaxDebugCheckContext (xsltTransformContextPtr ctxt) +{ + if (ctxt == NULL) { + slaxOutput("The script is not being run."); + return TRUE; + } + + return FALSE; +} + /* * 'info' command */ @@ -1221,6 +1237,9 @@ slaxDebugCmdInfo (DC_ARGS) slaxDebugInfoBreakpoints(statep); } else if (slaxDebugIsAbbrev("insert", argv[1])) { + if (slaxDebugCheckContext(ctxt)) + return; + if (ctxt->insert == NULL) { slaxOutput("context insertion point is NULL"); } else { @@ -1229,6 +1248,9 @@ slaxDebugCmdInfo (DC_ARGS) } } else if (slaxDebugIsAbbrev("output", argv[1])) { + if (slaxDebugCheckContext(ctxt)) + return; + if (ctxt->output == NULL) { slaxOutput("context output document is NULL"); } else { @@ -1237,6 +1259,9 @@ slaxDebugCmdInfo (DC_ARGS) } } else if (slaxDebugIsAbbrev("locals", argv[1])) { + if (slaxDebugCheckContext(ctxt)) + return; + slaxDebugContextVariables(ctxt); } else if (slaxDebugIsAbbrev("profile", argv[1])) { From 72f0c7d7bcf0db43d51b6617767def6b1f5958c5 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:03 -0500 Subject: [PATCH 020/104] Add targets for sphinx --- doc/Makefile.am | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/Makefile.am b/doc/Makefile.am index 3b0ab180..26b5c8a0 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -111,3 +111,13 @@ uninstall-hook: ${RM} -f ${OXTRADOC_INSTALL_DIR}/`basename $$file` ; \ done ${RM} -f ${DESTDIR}${bindir}/oxtradoc + +SPHINX = python3.4 -msphinx + +html sphinx sphinx-html: + ${SPHINX} -M html ${srcdir} sphinx + +clean-local: sphinx-clean + +sphinx-clean: + ${SPHINX} -M clean ${srcdir} sphinx From ca3c2f1a816f3e0e9759daeedaaba1c602d753a5 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:15 -0500 Subject: [PATCH 021/104] Move documentation to Sphinx/RST --- doc/_static/basic.css_t | 663 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 663 insertions(+) create mode 100644 doc/_static/basic.css_t diff --git a/doc/_static/basic.css_t b/doc/_static/basic.css_t new file mode 100644 index 00000000..bad030f2 --- /dev/null +++ b/doc/_static/basic.css_t @@ -0,0 +1,663 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: {{ theme_sidebarwidth|toint }}px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + width: 170px; +} + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +blockquote.epigraph p.attribution { + margin-left: 50%; +} + +blockquote.epigraph { + background-color: #eee; + padding: 0.5em; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { +/* clear: right; */ + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 1em 1em 1em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +dl.function table.docutils th.field-name { + width: 100px; +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 1px solid #aaa; + border-left: 1px solid #aaa; + border-right: 1px solid #aaa; + border-bottom: 1px solid #aaa; +} + +table.docutils th { + border-bottom: 2px solid #aaa; + background-color: #f2f2f2; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +dl.option dd:empty { + margin-top: 0px; + margin-bottom: 0px; + margin-left: 0px; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, .highlighted { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +div.code-block-caption { + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: relative; + left: 0px; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} From 12826fa52e1a09b94c46111d2e2821ea8d11a6f2 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:16 -0500 Subject: [PATCH 022/104] Move documentation to Sphinx/RST --- doc/_templates/localtoc.html | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 doc/_templates/localtoc.html diff --git a/doc/_templates/localtoc.html b/doc/_templates/localtoc.html new file mode 100644 index 00000000..14fdb12a --- /dev/null +++ b/doc/_templates/localtoc.html @@ -0,0 +1,14 @@ +{# + basic/localtoc.html + ~~~~~~~~~~~~~~~~~~~ + + Sphinx sidebar template: local table of contents. + + :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +#} +{%- if display_toc %} +

{{ _('On This Page') }}

+ {{ toc }} +

{{ _('Full Documentation') }}

+{%- endif %} From a6d7eb3b58b231ae4d71b79d8ae458eae5f5b193 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:17 -0500 Subject: [PATCH 023/104] Move documentation to Sphinx/RST --- doc/concepts.rst | 696 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 696 insertions(+) create mode 100644 doc/concepts.rst diff --git a/doc/concepts.rst b/doc/concepts.rst new file mode 100644 index 00000000..c9319ea4 --- /dev/null +++ b/doc/concepts.rst @@ -0,0 +1,696 @@ + +=============== +SLAX (Overview) +=============== + +SLAX is purely syntactic sugar. The underlaying constructs are +completely native to XSLT. All SLAX constructs can be represented in +XSLT. The SLAX parser parses an input document and builds an XML tree +identical to one produced when the XML parser reads an XSLT document. + +SLAX can be viewed as a pre-processor for XSLT, turning SLAX +constructs (like if/then/else) into the equivalent XSLT constructs +(like and ) before the real XSLT transformation +engine gets invoked. + +The current distribution for libslax is built on libxslt. SLAX uses +the xsltSetLoaderFunc() in libxslt to tell libxslt to use a different +function when loading script documents. When xsltParseStylesheetDoc() +loads a script, it then calls the SLAX loader code, which reads the +script, constructs an XML document (xmlDoc) which mimics the document +the normal XML parser would have created for a functionally equivalent +script. After this document is returned to the existing libxslt code, +normal XSLT processing continues, unaffected by the fact that the +script was written in SLAX. + +The "build-as-if" nature of SLAX makes is trivial to write a +SLAX-to-XSLT convertor, which reads in SLAX and emits XSLT using the +normal libxslt file writing mechanism. In addition, an XSLT-to-SLAX +convertor is also available, which emits an XSLT document in SLAX +format. These make a great learning aid, as well as allowing +conversion of SLAX scripts to XSLT for environments where libxslt is +not available. + +Composite Technologies +---------------------- + +SLAX builds on three existing technologies, XML, XPath, and XSLT. + +XML is a set of encoding rules that allow simplified parsing of +documents, which gives a simple way to represent hierarchical data +sets in text. XML parsers can be used to encode any type of content, +and their reuse has breed a set of high-quality implementations that +can be easily incorporated into any software project. Having a single +encoding helps removing parsing errors, increase code reuse, simplify +developer interaction, reduce development costs, and reduce errors. + +XPath is an expression language that allows the specification of sets +of nodes within an XML document. The language is simultaneously +powerfully expressive in terms of the nodes that can be selected, but +also simple and readable. It follows the path of making simple things +simple, while making hard things possible. + +XSLT is a transformation language that turns XML input document into +an XML output document. The basic model is that an XSLT engine (or +"processor") reads a script (or stylesheet) and an XML document. The +XSLT engine uses the instructions in the script to process the XML +document by traversing the document's hierarchy. The script indicates +what portion of the tree should be traversed, how it should be +inspected, and what XML should be generated at each point. + +We'll examine each of these technologies in more detail in the +following sections. + +XML Concepts +++++++++++++ + +XML is a set of encoding rules that allow simplified parsing of +documents, which gives a simple way to represent hierarchical data +sets in text. There are six basic constructs in XML: + +Open tags: + Starts a level of hierarchy. An open tag and it's matching close + tag constitute an XML element. An element can contain additional + elements, data, or both. + +Close tags: + Ends a level of hierarchy. There must be a close tag for + every open tag. + +Empty tags: + Equivalent to . Functions as a shorthand. + +Text: data + Any additional text is data. + +Attributes: + Attributes are used to encode name=value pairs inside the open or + empty tag. A specific attribute can appear only once per tag. + +Namespaces: + Defines the scope of a tag, as indicated by the prefix. This + allows the same tag used in different namespaces to be unique. The + URI is not dereferenced, but provides a unique name for the + namespace. The "xmlns:" attribute maps the prefix to the given + URI. + +In addition, comments can be added in XML using the delimiters "". For example:: + + + +From these simple concepts, hierarchical documents are constructed, +such as the following JUNOS configuration file:: + + + + my-router + example.net + America/New_York + + 10.4.1.40 + + + login + change-log + interactive-commands + + + + 10.1.1.1 + + + 10.2.2.2 + + + + + + + 64k + 5 + + + + lhs + + any + + + + + + + + + + 0.0.0.0/0 + 10.10.1.1 + + + + + 42 + 9 + + + + +See also https://www.w3.org/TR/1998/REC-xml-19980210. + +XPath Concepts +++++++++++++++ + +The XPath expression language allows selection of arbitrary nodes from +with an XML document. XSLT uses the XPath standard to specify and +locate elements in the input document's XML hierarchy. XPath's +powerful expression syntax allows complex criteria for selecting +portions of the XML input document. + +XPath views every piece of the document hierarchy as a node, including +element nodes, text nodes, and attribute nodes. + +An XPath expression can include a path of XML node names, which +select child nodes based on their ancestors' names. Each member of +the path must match an existing node, and only nodes that match all +path members will be included in the results. The members of the path +are separated by the slash character ('/'). + +For example, the following expression selects all elements +that are parented by a
element, which in turn must be +parented by a element, which must be parented by a +element:: + + doc/chapter/section/paragraph + +XSLT views nodes as being arranged in certain "axes". The "ancestor" +axis points from a node up through it's series of parent nodes. The +"child" axis points through the list of an element node's direct child +nodes. The "attribute" axis points through the list of an element +node's set of attributes. The "following-sibling" axis points through +the nodes which follow a node but are under the same parent, while the +"proceeding-sibling" axis points through the nodes that appear before +a node and are under the parent. The "descendant" axis contains all +the descendents of a node. There are numerous other axes which are +not detailed here. + +When referring to an axis, use the axis name followed by two colons +followed by the element name (which may include an optional prefix and +it's trailing colon). + +There are two axis aliases that make a convenient shorthand when +writing expressions. The "@" alias refers to the attribute axis, +allowing either "attribute::number" or "@number" to refer to the +"number" attribute. The "//" alias refers to the "descendant-or-self" +axis, so "doc//paragraph" will find all elements that have +a element as an ancestor. + +See also ..... + +Each XPath expression is evaluated from a particular node, which is +referred to as the "context node" (or simply "context"). XSLT changes +the context as the document's hierarchy is traversed, and XPath +expressions are evaluated from that particular context node. + +XPath expression contain two types of syntaxes, a path syntax and a +predicate syntax. Path syntax allows traversal along one of the axis +in the document's hierarchy from the current context node. + +accounting-options + selects an element node named "accounting-options" that is a child + of the current context + +server/name + selects an element node named "name" that is parented by an + element named "server" that is a child of the current context + +/configuration/system/domain-name + selects an element node named "domain-name" that is parented by + a "system" element that is parented by a "configuration" element + that is the root element of the document. + +parent::system/host-name + selects an element node name "host-name" that is parented by an + element named "system" that is the parent of the current context + node. The "parent::" axis can be abbreviated as "..". + +A predicate is a boolean test must be satisfied for a node to be +selected. Each path member of the XPath expression can have zero or +more predicates specified, and the expression will only select nodes +for which all the predicates are true. + +The predicate syntax allows tests to be performed at each member of +the path syntax, and only nodes that pass the test are selected. A +predicate appears inside square brackets ("[]") after a path member. + +server[name == '10.1.1.1'] + selects a "server" element that is a child of the current context + and has a "name" element whose value is '10.1.1.1' + +\*[@inactive] + selects any node ('\*' matches any node) that is a child of the + current context that has an attribute ('@' selects node from the + "attribute" axis) named "inactive" + +route[starts-with(next-hop, '10.10.')] + selects a "route" element that is a child of the current context + and has a "next-hop" element whose value starts with the string + "10.10." + +The "starts-with" function is one of many functions that are built +into XPath. XPath also supports relational tests, equality tests, +boolean operations, and many more features not listed here. + +SLAX defines a concatenation operator "_" that concatenates its two +arguments using the XPath "concat()" function. The following two +lines are equivalent:: + + expr "Today is " _ $date _ ", " _ $user _ "!!"; + expr concat("Today is ", $date, ", ", $user, "!!"); + +The SLAX statement "expr" evaluates an XPath expression and inserts +its value into the output tree. + +XPath is fully described in the W3C's specification, +http://w3c.org/TR/xpath. + +XSLT Concepts ++++++++++++++ + +This section contains some overview material, intended as both +overview and introduction. Careful reading of the specification or any +of the numerous books on XSLT will certainly be helpful before using +commit scripts, but the information here should provide a starting +point. + +XSLT is a language for transforming one XML document into another XML +document. The basic model is that an XSLT engine (or processor) reads +a script (or stylesheet) and an XML document. The XSLT engine uses the +instructions in the script to process the XML document by traversing +the document's hierarchy. The script indicates what portion of the +tree should be traversed, how it should be inspected, and what XML +should be generated at each point. + +:: + + +-------------+ + | XSLT | + | Script | + +-------------+ + | + +-----------+ | +-----------+ + |XML Input | v |XML Output | + | Document | +-------------+ | Document | + | i |-->| XSLT |--->| o | + | /|\ | | Engine | | / \ | + | i i i | +-------------+ | o o | + | /| | \ | | /|\ | | + | i i i i | | o o o o | + +-----------+ +-----------+ + +XSLT has seven basic concepts: + +- XPath -- expression syntax for selecting node from the input document +- Templates -- maps input hierarchies to instructions that handle them +- Parameters -- a mechanism for passing arguments to templates +- Variables -- defines read-only references to nodes +- Programming Constructs -- how to define logic in XSLT +- Recursion -- templates that call themselves to facilitate looping +- Context (Dot) -- the node currently be inspected in the input document + +XPath has be discussed above. The other concepts are discussed in the +following sections. These sections are meant to be introductory in +nature, and later sections will provide additional details and +complete specifications. + +Templates +~~~~~~~~~ + +An XSLT script consists of a series of template definitions. There are +two types of templates, named and unnamed. Named templates operate +like functions in traditional programming languages, although with a +verbose syntax. Parameters can be passed into named templates, and can +be declared with default values. + +:: + + template my-template ($a, $b = 'false', $c = name) { + /* ... body of the template goes here ... */ + } + +A template named "my-template" is defined, with three parameters, one +of which defaults to the string "false", and one of which defaults to +the contents of the element node named "name" that is a child of the +current context node. If the template is called without values for +these parameters, the default values will be used. If no select +attribute is given for a parameter, it defaults to an empty value. + +:: + + call my-template($c = other-name); + +In this example, the template "my-template" is called with the +parameter "c" containing the contents of the element node named +"other-name" that is a child of the current context node. + +The parameter value can contain any XPath expression. If no nodes +are selected, the parameter is empty. + +Unnamed Templates +~~~~~~~~~~~~~~~~~ + +Unnamed templates are something altogether different. Each unnamed +template contains a select attribute, specifying the criteria for +nodes upon which that template should be invoked. + +:: + + match route[starts-with(next-hop, '10.10.')] { + /* ... body of the template goes here ... */ + } + +By default, when XSLT processes a document, it will recursively +traverse the entire document hierarchy, inspecting each node, looking +for a template that matches the current node. When a matching +template is found, the contents of that template are evaluated. + +The element can be used inside a template to +continue XSLT's default, hierarchical traversal of nodes. If the + element is used with a "select" attribute, only +nodes matching the XPath expression are traversed. If no nodes are +selected, nothing is traversed and nothing happens. Without a +"select" attributes, all children of the context node are traversed. +In the following example, a element is processed. First all +the nodes containing a "changed" attribute are processed under a +element. Then all children are processed under an element. The +particular processing depends on the other templates in the script and +how they are applied. + +:: + + match route { + { + apply-templates *[@changed]; + } + { + apply-templates; + } + } + +Named templates can also use the "match" statement to perform dual +roles, so the template can be used via "apply-templates" or be calling +it explicitly. + +Parameters +~~~~~~~~~~ + +Parameters can be passed to either named or unnamed templates using +either parameter lists or the "with" statement. Inside the template, +parameters must be declared with a "param" statement and can then be +referenced using their name prefixed by the dollar sign. + +:: + + /* + * This template matches on "/", the root of the XML document. + * It then generates an element named "outer", and instructs + * the XSLT engine to recursively apply templates to only the + * subtree only "configuration/system". A parameter called + * "host" is passed to any templates that are processed. + */ + match / { + { + apply-templates configuration/system { + with $host = configuration/system/host-name; + } + } + } + + /* + * This template matches the "system" element, which is the top + * of the subtree selected above. The "host" parameter is + * declared with no default value. An "inner" element is + * generated, which contains the value of the host parameter. + */ + match system { + param $host; + $host; + } + +Parameters can be declares with default values by using the "select" +attribute to specify the desired default. If the template is invoked +without the parameter, the XPath expression is evaluated and the +results are assigned to the parameter. + +:: + + match system { + call report-changed($changed = @changed || ../@changed); + } + + template report-changed($dot = ., $changed = $dot/@changed) { + /* ... */ + } + +The second template declares two parameters, $dot which defaults to +the current node, and $changed, which defaults to the "changed" +attribute of the node $dot. This allows the caller to either use a +different source for the "changed" attribute, use the "changed" +attribute but relative to a different node that the current one, or +use the default of the "changed" attribute on the current node. + +Variables +~~~~~~~~~ + +XSLT allows the definition of both local and global variables, but the +value of variables can only be set when the variable is defined. After +that point, they are read only. + +A variable is defined using the "var" statement. + +:: + + template emit-syslog ($device, $date, $user) { + var $message = "Device " _ $device _ " was changed on " + _ $date _ " by user '" _ $user _ "'"; + { + $message; + } + } + +Although this example used an XSL variable, the above example could have +used an XSL parameter for $message, allowing users to pass in their own +message. + +Mutable Variables +~~~~~~~~~~~~~~~~~ + +SLAX adds the ability to assign new values to variables and to append +to node sets. + +:: + + mvar $count = 10; + if (this < that) { + set $count = that; + } + + mvar $errors; + if ($count < 2) { + append $errors += { + location; + "Not good, dude."; + } + } + +Mutable variables can be used like normal variables, including use in +XPath expressions. + +Character Encoding +~~~~~~~~~~~~~~~~~~ + +SLAX supports a C-like escaping mechanism for encoding characters. +The following escapes are available: + +============= ============================ + Escape Meaning +============= ============================ + "\n" Newline (0x0a) + "\r" Return (0x0d) + "\t" Tab (0x09) + "\xXX" Hex-based character number + "\u+XXXX" UTF-8 4-byte hex value + "\u-XXXXXX" UTF-8 6-byte hex value + "\\" The backslash character +============= ============================ + +Other character encodings based on '\' may be added at a later time. + +Programming Constructs +~~~~~~~~~~~~~~~~~~~~~~ + +XSLT has a number of traditional programming constructs:: + + if (xpath-expression) { + /* Code here is evaluated if the expression is true */ + } + + if (xpath-expression) { + /* + * xsl:choose is similar to a switch statement, but + * the "test" expression can vary among "when" statements. + */ + + } else if (another-xpath-expression) { + /* + * xsl:when is the case of the switch statement. + * Any number of "when" statements may appear. + */ + + } else { + /* xsl:otherwise is the 'default' of the switch statement */ + } + + for-each (xpath-expression) { + /* + * Code here is evaluated for each node that matches + * the xpath expression. The context is moved to the + * node during each pass. + */ + } + + for $item (items) { + /* + * Code here is evaluated with the variable $item set + * to each node that matches the xpath expression. + * The context is not moved. + */ + } + + for $i (1 ... 20) { + /* + * Code here is evaluated with the variable $i moving + * thru a sequence of values between 1 and 20. The + * context is not changed. + */ + } + + while ($count < 10) { + /* + * Code here is evaluated until the XPath expression is + * false. Note that this is normally only useful with + * mutable variables. + */ + } + +XSLT is a declarative language, mixing language statements (in the +"xsl" namespace) with output elements in other namespaces. For +example, the following snippet makes a element containing +the value of the "changed" attribute:: + + if (@changed) { + { + name(); + if (@changed == "changed") { + ; + + } else { + $changed; + } + } + } + +Recursion +~~~~~~~~~ + +XSLT depends on recursion as a looping mechanism. Recursion occurs +when a section of code calls itself, either directly or +indirectly. Both named and unnamed templates can recurse, and +different templates can mutually recurse, with one calling another +that in turn calls the first. + +Care must be taken to prevent infinite recursion. The XSLT engine used +by JUNOS limits the maximum recursion, to avoid excessive consumption +of system resources. If this limit is reached, the commit script fails +and the commit is stopped. + +In the following example, an unnamed template matches on a +element. It then calls the "count-to-max" template, passing the value +of that element as "max". The "count-to-max" template starts by +declaring both the "max" and "cur" parameters, which default to +one. Then the current value of "$cur" is emitted in an +element. Finally, if "$cur" is less than "$max", the "count-to-max" +template recursively invokes itself, passing "$cur + 1" as "cur". This +recursive pass then output the next number and recurses again until +"$cur" equals "$max". + +:: + + match count { + call count-to-max($max = count); + } + + template count-to-max ($cur = "1", $max = "1") { + param $cur = "1"; + param $max = "1"; + + expr "count: " _ $cur; + if ($cur < $max) { + call count($cur = $cur + 1, $max); + } + } + +Context (Dot) +~~~~~~~~~~~~~ + +As mentioned earlier, the current context node changes as the +apply-templates logic traverses the document hierarchy and as +an iterates through a set of nodes that match an XPath +expression. All relative node references are relative to the current +context node. This node is abbreviated "." (read: dot) and can be +referred to in XPath expressions, allowing explicit references to the +current node. + +:: + + match system { + var $system = .; + + for-each (name-server/name[starts-with(., "10.")]) { + .; + if (. == "10.1.1.1") { + $system/host-name; + } + } + } + +This example contains four uses for ".". The "system" node is saved +in the "system" variable for use inside the "for-each", where the +value of "." will have changed. The "for-each"'s "select" expression uses +"." to mean the value of the "name" element. "." is then used to pull +the value of the "name" element into the element. The +test then uses ".", also to reference the value of the current context +node. + +Additional Resources +++++++++++++++++++++ + +The `XPath specification`_ +and the `XSLT specification`_ are on the `W3C`_ web site. + +.. _XPath specification: http://www.w3c.org/TR/xpath +.. _XSLT specification: https://www.w3.org/TR/1999/REC-xslt-19991116 +.. _W3C: https://www.w3c.org + +Books and tutorials on XSLT abound, helping programmers learn the +technology. XSLT processors (programs that run XSLT scripts) are +available from both commercial and open-source developers, allowing +users to play with XSLT offline. IDEs with extended debuggers also +exist. XSLT is common enough that piecing together a simple script is +easy, as is finding help and advice. + +This document lists the SLAX statements, with brief examples followed +by their XSLT equivalents. The utility of SLAX will hopefully be +appearent, as will the simple transformation that SLAX parsing code is +performing. From 67018fa6dc38f0035b1ce17dee4a7840f37cab30 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:18 -0500 Subject: [PATCH 024/104] Move documentation to Sphinx/RST --- doc/conf.py | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 doc/conf.py diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 00000000..7a0e2aae --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,178 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# libslax documentation build configuration file, created by +# sphinx-quickstart on Tue Oct 10 10:18:55 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'slax' + +# General information about the project. +project = 'libslax' +copyright = '2017, Juniper Networks' +author = 'Phil Shafer' +default_role = 'code' +primary_domain = 'c' +smart_quotes = False + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.22.0' +# The full version, including alpha/beta/rc tags. +release = '0.22.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinxdoc' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} +html_theme_options = { + "sidebarwidth": 320, +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +alabaster_html_sidebars = { + '**': [ + 'about.html', + 'navigation.html', + 'relations.html', # needs 'show_related': True theme option to display + 'searchbox.html', + 'donate.html', + ] +} + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'libxo-manual' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'libxo.tex', 'libxo Documentation', + 'Phil Shafer', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'libxo', 'libxo Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'libxo', 'libxo Documentation', + author, 'libxo', 'A Library for Generating Text, XML, JSON, and HTML Output', + 'Miscellaneous'), +] + + + From c6b2ac5c6e4fb6203d42b5d6dce6eda02ec47787 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:19 -0500 Subject: [PATCH 025/104] Move documentation to Sphinx/RST --- doc/constructs.rst | 579 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 579 insertions(+) create mode 100644 doc/constructs.rst diff --git a/doc/constructs.rst b/doc/constructs.rst new file mode 100644 index 00000000..2604a17c --- /dev/null +++ b/doc/constructs.rst @@ -0,0 +1,579 @@ + +====================== +Programming Constructs +====================== + +This section covers the programming constructs in SLAX. SLAX tries to +use language paradigms and constructs from traditional languages +(primarily C and Perl) to aid the user in readability and familiarity. +But SLAX is built on top of XSLT, and the declarative nature of XSLT +means that many of its constructs are visible. + +.. _main-var: + +Variables +--------- + +Variables in SLAX are immutable. Once defined, the value of a +variable cannot be changed. This is a major change from traditional +programming language, and requires a somewhat different approach to +programming. There are two tools to help combat this view: recursion +and complex variable assignments. + +Recursion allows new values for variables to be set, based on the +parameters passed in on the recursive call:: + + template count ($cur = 1, $max = 10) { + if ($cur < $max) { + $cur; + call count($cur = $cur + 1, $max); + } + } + +Complex variable assignments allow the use of programming constructs +inside the variable definition:: + + var $message = { + if ($red > 40) { + expr "Invalid red value"; + } else if ($blue > 80) { + expr "Invalid red value"; + } else if ($green > 10) { + expr "Invalid green value"; + } + } + +This requires different approaches to problems. For example, +instead of appending to a message as you loop thru a list of nodes, +you would need to make the message initial value contain a `for-each` +loop that emits parts of the message:: + + var $message = { + "acceptable colors: "; + for-each (color) { + if (red <= 40 && blue <= 80 && green < 10) { + " " _ name _ + " (" _ red _ "," _ green _ "," _ blue _ ")"; + } + } + } + +Variable and parameter syntax uses the `var` and `param` statements to +declare variables and parameters, respectively. SLAX declarations +differ from XSLT in that the variable name contains the dollar sign +even in the declaration, which is unlike the "name" attribute of + and . This was done to enhance the +consistency of the language:: + + param $fido; + var $bone; + +An initial value can be given by following the variable name with an +equals sign and an expression:: + + param $dot = .; + var $location = $dot/@location; + var $message = "We are in " _ $location _ " now."; + +.. admonition:: XSLT Equivalent + + The following is the XSLT equivalent of the above examples:: + + + + + + + + + SLAX is using the same constucts as XSLT, but packaged in a more + readable, maintainable syntax. + +.. _var: + +The `var` Statement ++++++++++++++++++++ + +Variable are defined using the `var` statement, which accept a +variable name and an initial value. Variable names (and parameter +names) always begin with a dollar sign ("$"):: + + SYNTAX:: + 'var' name '=' initial-value ';' + 'var' name '=' '{' initial-value-block '}' + +The initial value can be an XPath expresion, an element, or a block of +statements (enclosed in braces) that emit a set of nodes:: + + var $x = 4; + var $y = cost div weight; + var $z = { + expr "this: "; + copy-of $this; + } + +.. _mvar: + +The `mvar` Statement +++++++++++++++++++++ + +In XSLT, all variables are immutable, meaning that once created, their +value cannot be changed. This creates a distinct programming +environment which is challenging to new programmers. Immutable +variables allow various optimizations and advanced streaming +functionality. + +Given the use case and scenarios for libslax (especially our usage +patterns in JUNOS), we've added mutable variables, which are variables +that can be changed. The `set` statement allows a new value to be +assigned to a variable and the `append` statement allows the value to +be extended, with new data appended to it:: + + SYNTAX:: + 'mvar' variable-name '=' initial-value ';' + 'set' variable-name '=' new-value ';' + 'append' variable-name '+=' new-content ';' + +The mvar is typically a node set, and appended adds the new objects to +the nodeset:: + + mvar $test; + + set $test = "start here"; + + for $item (list) { + append $test += { + $item/name; + $item/size; + } + } + +Result Tree Fragments +--------------------- + +The most annoying "features" of XSLT is the concept of "Result Tree +Fragments" (aka RTF). These fragments are produced with nodes are +created that are not directly emitted as output. The main source is +variable or parameter definitions that have complex content:: + + var $x = { + { + "cornflower blue"; + 100; + 149; + 237; + } + } + +Only three operations can be performed on an RTF: + +- Emit as output +- Conversion to a string +- Conversion to a proper node-set + +In this example, an RTF is generated, and then each of the three valid +operations is performed:: + + var $rtf = { + "bad"; + } + if ($rtf == "bad") { /* Converts the RTF into a string */ + copy-of $rtf; /* Emits the RTF to the output tree */ + + /* Convert RTF to a node set (see discussion below) */ + var $node-set = ext:node-set($rtf); + } + +Any XPath operation performed against an RTF will result in an +"Invalid type" error. + +In truth, the only interesting thing to do with an RTF is to convert +it to a node set, which is not a standard XPath/XSLT operation. Most +scripts will use the extension function "ext:node-set()" (which is +specific to libxslt) or "exslt:node-set()" (which is in the EXSLT +extension library; see http://exslt.org for additional information):: + + ns ext = "http://xmlsoft.org/XSLT/namespace"; + ... + var $alist = ext:node-set($alist-raw); + +This must be done when a variable or paramter has a complex initial +value:: + + var $this-raw = { + ; + ; + } + var $this = ext:node-set($this-raw); + +Fortunately for SLAX programmers, the ":=" operator does away with +these conversion issues, as the following section details. + +.. _colon-equals: + +The ":=" Operator ++++++++++++++++++ + +The ":=" operator is designed to hide the conversion of RTFs to node +sets from the programmer. It is used in assigning initial values to +variables and parameters:: + + var $this := { + "one"; + "one"; + } + if ($this/that == "one") { + "not an invalid type error"; + } + +Calling named templates can also produce RTFs, since the `call` +statement would be considered complex variable content. But using the +":=" operator removes this problem:: + + var $output := call matching-color($match = "corn"); + +Behind the scenes, SLAX is performing the ext:node-set() call but the +details are hidden from the user. + +Control Statements +------------------ + +This section gives details and examples for each of the control +statements in SLAX. + +.. _if-else: + +The `if` and `else` Statements +++++++++++++++++++++++++++++++ + +SLAX supports an `if` statement that uses a C-like syntax. The +expressions that appear in parentheses are extended form of XPath +expressions, which support the double equal sign ("==") in place of +XPath's single equal sign ("="). This allows C programmers to avoid +slipping into dangerous habits:: + + if (this && that || the/other[one]) { + /* SLAX has a simple "if" statement */ + } else if (yet[more == "fun"]) { + /* ... and it has "else if" */ + } else { + /* ... and "else" */ + } + +Depending on the presence of the `else` clause, an `if` statement can +be transformed into either an element or an +element:: + + if (starts-with(name, "fe-")) { + if (mtu < 1500) { + /* Deal with fast ethernet interfaces with low MTUs */ + } + } else { + if (mtu > 8096) { + /* Deal with non-fe interfaces with high MTUs */ + } + } + +.. admonition:: XSLT Equivalent + + The following is the XSLT equivalent of the above example:: + + + + + + + + + + + + + + +.. _for-each: + +The `for-each` Statement +++++++++++++++++++++++++ + +The `for-each` statement iterates through the members of a node set, +evaluating the contents of the statement with the context set to each +node:: + + SYNTAX:: + 'for-each' '(' xpath-expression ')' '{' + contents + '}' + +The XPath expression is evaluated into a set of nodes, and then each +node is considered as the "context" node, the contents of the +`for-each` statement are evaluated:: + + for-each ($inventory/chassis/chassis-module + /chassis-sub-module[part-number == '750-000610']) { + "Down rev PIC in " _ ../name _ ", " + _ name _ ": " _ description; + } + +The `for-each` statement mimics functionality of the +element. The statement consists of the `for-each` keyword, the +parentheses-delimited select expression, and a block:: + + for-each ($inventory/chassis/chassis-module + /chassis-sub-module[part-number == '750-000610']) { + "Down rev PIC in " _ ../name _ ", " + _ name _ ": " _ description; + } + +.. admonition:: XSLT Equivalent + + The following is the XSLT equivalent of the above example:: + + + + + + + +.. _for: + +The `for` Statement ++++++++++++++++++++ + +In addition to the standard XSLT `for-each` statement, SLAX +incorporates a `for` statement that allows iteration through a node +set without changing the context ("."):: + + SYNTAX:: + 'for' variable-name '(' xpath-expression ')' '{' + contents + '}' + +The variable is assigned each member of the node-set selected by +the expression in sequence, and the contents are then evaluated. + +:: + + for $item (item-list) { + $item; + } + +Internally, this is translated into normal XSLT constructs involving a +pair of nested for-each loops, one to iterate and one to put the +context back to the previous setting. This allows the script writer +to ignore the context change. + +.. _while: + +The `while` Statement ++++++++++++++++++++++ + +The `while` statement allows a block of code to be repeated until a +condition is no longer true. This construct is only useful when +combined with mutable variables (:ref:`mvar`):: + + SYNTAX:: + 'while' '(' xpath-expression ')' '{' + contents + '}' + +The xpath-expression is cast to a boolean type and if true, the +contents are evaluated. The context is not changed. This loop +continues until the expression is no longer true. Care must be +taken to avoid infinite loops:: + + mvar $seen; + mvar $count = 1; + while (not($seen)) { + if (item[$count]/value) { + set $seen = true(); + } + set $count = $count + 1; + } + +.. _sort: + +The `sort` Statement +++++++++++++++++++++ + +The `for-each` normally considers nodes in document order, but the +`sort` statement indicates the specific order the programmer needs. + +The `sort` statement takes an expression argument that is used as the +key, as well as substatements that alter the normal sort behavior. + +============ ================================ + Statement Values +============ ================================ + language Not implemented in libxslt + data-type "text", "number", or qname + order "ascending" or "descending" + case-order "upper-first" or "lower-first" +============ ================================ + +Multiple `sort` statements can be used to given secondary sorting keys:: + + for-each (author) { + sort name/last; + sort name/first; + sort age { + order "descending"; + } + copy-of .; + } + +.. admonition:: XSLT Equivalent + + The following is the XSLT equivalent of the above example:: + + + + + + + + +.. _dotdotdot: + +The "..." Operator +++++++++++++++++++ + +Often a loop is required to iterator through a range of integer +values, such a 1 to 10. SLAX introduces the "..." operator to +generate sequences of such numbers:: + + for $i (1 ... 10) { + ; + } + +The operator translates into an XPath function that generates the +sequence as a node set, which contains a node for each value. The +`for` and `for-each` statements can be used to iterate thru the +nodes in a sequence:: + + for-each ($min ... $max) { + message "Value: " _ .; + } + +.. _question-colon: + +The "?:" Operator ++++++++++++++++++ + +The "?:" operator allows simple logic tests to be coded with the +familiar C and Perl operator:: + + var $x = ($a > 10) ? $b : $c; + var $y = $action ?: "display"; + +The use of slax:value() make the "?:" operator non-standard, in that +it requires a non-standard extension function. Use of the "?:" should +be limited to environments where this function is available. + +The use of means that attributes cannot be used in +a ?: expression, directly or indirectly:: + + /* These are examples of invalid use of attributes */ + var $direct = $test ? @broken : will-not-work; + var $attrib = @some-attribute; + var $indirect = $test ? $attrib : wont-work-either; + +.. admonition:: XSLT Equivalent + + The generated XSLT uses an element. The following is + the equivalent of the first example above:: + + + + + + + + + + + + + +Functions +--------- + +Functions are one of the coolest extensions defined by EXSLT. They +allow a script to define an extension function that is available in +XPath expressions. Functions have several advantages over templates: + +- Arguments are passed by position, not name +- Return values _can_ be objects (not RTFs) +- Can be used in expressions +- Can be resolved dynamically (using EXSLT's dyn:evaluate()) + +This section describes how functions are defined. + +.. _function: + +The `function` Statement +++++++++++++++++++++++++ + +The `function` statement defines a function that can be called in +XPath expressions:: + + SYNTAX:: + 'function' function-name '(' argument-list ')' '{' + function-template + '}' + +The argument-list is a comma separated list of parameter names, which +will be positionally assigned based on the function call. Trailing +arguments can have default values, in a similar way to templates. If +there are fewer parameters in the invocation than in the definition, +then the default values will be used for any trailing arguments. If +is an error for the function to be invoke with more arguments than are +defined:: + + function size ($width, $length, $scale = 1) { + ... + } + +Function parameters can also be defined using the `param` statement. + +.. _result: + +The `result` Statement +++++++++++++++++++++++ + +The `result` statement defines a value or template used as the return +value of the function:: + + SYNTAX:: + 'result' value ';' + 'result' element + 'result' '{' + result-template + '}' + +The value can be a simple XPath expression, an XML element, or a set +of instructions that emit the value to be returned:: + + + function size ($width, $length, $scale = 1) { + result $width * $length * $scale; + } + + function box-parts ($width, $height, $depth, $scale = 1) { + result { + size($width, $depth); + size($width, $height); + size($depth, $height); + } + } + + function ark () { + result { + { + expr box-parts(2.5, 1.5, 1.5); + } + } + } From c30fe85de885dd6fba339473e4eb84ba89879161 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:20 -0500 Subject: [PATCH 026/104] Move documentation to Sphinx/RST --- doc/content.rst | 1109 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1109 insertions(+) create mode 100644 doc/content.rst diff --git a/doc/content.rst b/doc/content.rst new file mode 100644 index 00000000..e08532df --- /dev/null +++ b/doc/content.rst @@ -0,0 +1,1109 @@ + +========================== +Building Content with SLAX +========================== + +SLAX (and XSLT) is a "declarative" language, meaning that a SLAX +script will describe the output that should be generated, not give +imperative instructions about how to generate that output. This is +quite different than traditional procedural programming, in both +content and style. + +As a SLAX script executes, it uses the description contained in rules +and templates to generate a "result tree", which is a hierarchy of XML +output nodes. Some logic statements and conditional processing +statements are intermixed with the output description to allow +flexibility in the output generated. + +We'll start by examining how SLAX generated these output nodes. + +.. _expressions: + +Expressions +----------- + +SLAX makes extensive use of the XPath expression language. +Expressions are used to select nodes, specify conditions, and to +generate output content. Expressions contain five constructs: + +- Paths to elements + + - Select nodes based on node names + + - Example: chapter + + - Selects child nodes based on parent node names + + - Example: doc/chapter/section/paragraph + + - Selects child nodes under at any depth + + - Example: doc//paragraph + + - Selects parent nodes relative to the current node + + - Example: ../../chapter + + - Selects attributes using "@" followed by attribute name + + - Example: ../../chapter/\@number + +- Predicate tests + + - Selects nodes for which the expression in the square brackets + evaluates to "true" (with boolean() type conversion) + + - Example chapter[@number == 1] + + - Can be applied to any path member + + - Example: chapter[@number == 1]/section[@number == 2] + + - Use a number to select the th node from a node set + + - Example: chapter[1] + + - Multiple predicate tests can be specified (ANDed together) + + - Example: chapter[@number > 15][section/\@number > 15] + +- References to variables or parameters + + - Variable and parameter names start with "$" + + - Example: $this + + - Variables can hold expressions, node sets, etc + + - Example: $this/paragraph + +- Literal strings + + - SLAX accepts single or double quotes + + - Example: "test" + + - Character escaping is allowed + + - Example: '\tthat\'s good\n\tnow what?\n' + +- Calls to functions + + - Function calls can be used in expressions or predicate tests + + - Example: chapter[count(section) > 15] + + - Allows calls to pre-defined or user-defined functions + + - Example: chapter[substring-before(title, "ne") == "O"] + +SLAX follows XPath syntax, with the following additions: + +- "&&" may be used in place of the "and" operator +- "||" may be used in place of the "or" operator +- "==" may be used in place of the "=" operator +- "!" may be used in place of the "not()" operator +- "_" is the concatenation operator ("x" _ "y" === concat("x", "y")) +- "?:" is converted into choose/when/otherwise elements + +The first four additions are meant to prevent programmers from +learning habits in SLAX that will negatively affect their ability to +program in other languages. The last two additions are for +convenience. + +When referring to XPath expressions in this document, we +mean this extended syntax. + +Strings are encoded using quotes (single or double) in a way that will +feel natural to C programmers. The concatenation operator is +underscore ("_"), which is the new concatenation operator for Perl 6. +(The use of "+" or "." would have created ambiguities in the SLAX +language.) + +XPath expression can be added to the result tree using the "expr" and +"uexpr" statements. + +In this example, the contents of the and element are +identical, and the element's contents are nearly identical, +differing only in the use of the XPath concat() function:: + + { + "test"; + "The answer is " _ results/answer _ "."; + results/count _ " attempts made by " _ results/user; + { + expr results/count _ " attempts made by " _ results/user; + } + { + expr results/count; + expr " attempts made by "; + expr results/user; + } + results/message; + } + +.. admonition:: XSLT Equivalent + + The following is the XSLT equivalent of the above example:: + + + test + + + + + + attempts made by + + + + + +Using Elements as Function Arguments +++++++++++++++++++++++++++++++++++++ + +Beginning with SLAX-1.2, elements may be used directly as function +arguments. Arguments can be either a single element or a block of +SLAX code, placed inside braces. + +:: + + var $a = my:function(, 15); + var $b = my:test({ + 5; + 15; + if ($step) { + $step; + } + }); + var $c = my:write( { + "total.txt"; + $file/size; + if (node[@type == "full]) { + ; + } + }); + +The `expr` Statement +++++++++++++++++++++ + +The `expr` statement adds an XPath expression to the result tree. The +expression is the argument to the statement:: + + expr "Test: "; + expr substring-before(name, "."); + expr status; + +The `uexpr` Statement ++++++++++++++++++++++ + +The `uexpr` behaves identically to the `expr` statement, except that +the contents are not escaped. Normally characters like "<", ">", and +"&" are escaped into proper XML (as "<", ">", and "&", +respectively), but uexpr avoids this escaping mechanism. + +:: + + uexpr "<:-&>"; + +.. admonition:: XSLT Equivalent + + https://www.w3.org/TR/1999/REC-xslt-19991116#disable-output-escaping + +Elements +-------- + +Elements are the primary encoding mechanism of XML, and can be +combined and arranged to encoding complex hierarchical constructs. + +The XML encoding uses three tags: the start tag, the end tag, and the +empty tag. The start tag consists of the less than character ('<'), +the element name, a set of optional attributes (discussed later), and +the greater than character ('>'). This is followed by the contents of +the XML element, which may include additional elements. The end tag +consists of the less than character ('<'), the slash character ('/'), +the element name, and the greater than character ('>'). If an element +has no content, an empty tag can be used in place of an open and close +tags. The empty tag consists of the less than character ('<'), the +element name, a set of optional attributes (discussed later), the +slash character ('/'), and the greater than character ('>'). + +:: + + + +
+ A brief introduction +
+
+ +
+ +.. _xml-elements: + +XML Elements +++++++++++++ + +In SLAX, XML elements are encoded using braces instead of the closing +tag. The element is given, wrapped in chevrons as in XML, but it then +followed by an open brace, the elements contents, and a close brace. +If the element is empty, a semi-colon can be used to signify an empty +element. If the element contains only a single XPath expression, that +expression can be used in place of the braces and the element is ended +with a single semi-colon. + +Elements are written with in a C-like syntax, with only the open tag. +The contents of the tag appear immediately following the open tag. +These contents can either be a simple expression, or a more complex +expression placed inside braces. + +The following SLAX is equivalent to the above XML data:: + + { + +
{ + "A brief introduction"; + } + } + ; + } + +Programmers are accustomed to using braces, indentations, and editor support +to delineate blocks of data. Using these nesting techniques and +removing the close tag reduces the clutter and increases the clarity +of code. + +:: + + { + 1; + { + 3; + 4; + { + 6; + } + } + } + +This is equivalent to:: + + + 1 + + 3 + 4 + + 6 + + + + +.. _element: + +The `element` Statement ++++++++++++++++++++++++ + +The name of an element can be specified by an XPath expression, using +the `element` statement. The contents of the element must be placed +inside a set of braces. + +In this example, the value of the "name" node (rather than the literal +string "name") will be used to create an XML element, whose contents +are an empty element with a name of "from-" concatenated with the +value of the address node and an emply element whose name is the value +of the variable "$my-var" (refer to :ref:`main-var` for more +information about variables). Node values are selected from the +current context. + +:: + + element name { + element "from-" _ address; + element $my-var; + } + +.. _json-elements: + +JSON Elements ++++++++++++++ + +XML elements can also be specified using a JSON-like style, where +quoted strings name the element, followed by a colon and the contents +of the element. The contents can be any of the following: + +========= ===================================== + Type Examples +========= ===================================== + String "test", "when in the course", "42" + Number 42, 1.5, 2e45.5 + boolean true, false + null null + Array [ 1, 2, 3, 4, 5 ] + Object { "this": { "that": "the other" } } +========= ===================================== + +Hierarchical nesting is done using objects:: + + "top" : { + "one": 1, + "two": { + "three": 3, + "four": 4, + "five": { + "six: 6 + } + } + } + +This would generate XML equivalent to the examples in :ref:`xml-elements`. + +.. _json-attributes: + +Attributes for JSON Elements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Since there is a mismatch between the data encoding capabilities in +XML and JSON, a set of attributes can be used to control the exact +rendering of JSON data. + +=========== ======== ============================================ + Attribute Value Description +=========== ======== ============================================ + name string A name to use in place of the element name + type string An indication of the desired encoding +=========== ======== ============================================ + +The value of the "type" attribute must be one of the subset listed +below. This allows SLAX to distinguish between '{ "value": "5" }' and +'{ "value": 5 }' to control the encoding of the value as a string or a +number. Similarly the caller can control whether "null" is a string +or the special null value. If the type attribute is missing, the +element is assumed to be a simple field. + +======== ================================= + Type Description +======== ================================= + array Contains a JSON array + false Contains the JSON "false" value + null Contains the JSON "null" value + member Is a member of an array + number Contains a number value + true Contains the JSON "true" value +======== ================================= + +In this example, the type attribute is used to indicate the encoding of +JSON in XML. + +:: + + JSON: + "name": "Skip Tracer", + "location": "The city that never sleeps", + "age": 5, + "real": false, + "cases": null, + + XML: + Skip Tracer + The city that never sleeps + 5 + false + null + +.. _json-arrays: + +Encoding JSON Arrays in XML +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The mismatch of capabilities between JSON and XML also requires the use of +alternative encodings for arrays. The element is used to +contain member (type="member" of an array (of type="array"). + +In this example, alternative encodings are used for array values. +Also the "type" attribute is used to hold the JSON type:: + + "book" : { + "topics": [ "colors", "fish", "spots", "stars", "cars" ], + "pages": 63, + "counts": [ + { "red": 1 }, + { "blue": 1 }, + { "sad": "some" }, + { "glad": "some" }, + ] + } + +The equivalent in SLAX elements would be:: + + { + { + "colors"; + "fish"; + "spots"; + "stars"; + "cars"; + } + "63"; + { + { + "1"; + } + { + "1"; + } + { + "some"; + } + { + "some"; + } + } + } + +.. admonition:: XML Equivalent + + The following is the XML equivalent of the above example:: + + + + colors + fish + spots + stars + cars + + 63 + + + 1 + + + 1 + + + some + + + some + + + + +.. _json-names: + +Encoding Invalid JSON Names +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In addition, JSON allows values for the names which an invalid in +XML. When this occurs, an element named "element" is used to hold the +content with the "name" attribute containing the real name:: + + JSON style: + "": { + "<>": "<>" + } + + SLAX style: + { + "<>"; + } + + XML content: + + <> + + +Attributes +---------- + +XML allows a set attribute value to be specified on an open or empty +tag. These attributes are an unordered set of name/value pairs. The +XML encoding uses the attribute name, an equals sign ('='), and the +value of the attribute in quotes:: + + +
+ +
+
+ +XML Attributes +++++++++++++++ + +SLAX uses an identical encoding scheme for attributes:: + + { +
{ + /* .... content ... */ + } + } + +In addition, XSLT introduces a means of assigning attribute values, +called "attribute value templates" (AVT). SLAX encodes these as XPath +values for attributes: + +Attributes on elements follow the style of XML, with the attribute +name, an equals sign, and the value of the attribute. + +:: + + ; + +In this example, the attributes are assigned values using XPath +values. The "tag" node value is assigned to the "ref" attribute, +while the "title" attribute is assigned the value of the "$title" +variable. + +:: + + { +
{ + /* .... content ... */ + } + } + +Where XSLT allow attribute value templates using curly braces, SLAX +uses the normal expression syntax. Attribute values can be any XPath +expression, including quoted strings, parameters, variables, and +numbers, as well as the SLAX concatenation operator ("_"). + +:: + + ; + +The XSLT equivalent:: + + + +Note that curly braces placed inside SLAX quoted strings are not +interpreted as attribute value templates, but as real braces and are +escaped when translated into XSLT. + +:: + + ; + +The XSLT equivalent:: + + + + +.. _attribute: + +The `attribute` Statement ++++++++++++++++++++++++++ + +The name of an attribute can be specified by an XPath expression, using +the `attribute` statement. The contents of the attribute must be placed +inside a set of braces. + +In this example, the value of the "name" node (rather than the literal +string "name") will be used to create an XML attribute, whose contents +are an empty element with a name of "from-" concatenated with the +value of the address node. Node values are selected from the current +context. + +:: + + attribute name { + expr "from-" _ address; + } + +Attribute Sets +-------------- + +Attribute sets can be used to define sets of attributes that can be +used together. An attribute set contains a set of `attribute` +statements that define the names and values of attributes. These +attributes can then be referred to as a collection rather than repeat +the contents in the script. + +.. admonition:: FAQ: Do people really use this? + + My guess (which could be wildly wrong) is that this is a rarely + used feature that are created to cover the condition that a + template cannot return a set of attributes. That's my guess + anyway. + +.. _attribute-set: + +The `attribute-set` Statement ++++++++++++++++++++++++++++++ + +The `attribute-set` statement defines a set of attributes that can be +used repeatedly. The argument is the name of the attribute set, and +the contents are a set of attribute statements. + +:: + + attribute-set table-attributes { + attribute "order" { expr "0"; } + attribute "cellpadding" { expr $cellpadding; } + attribute "cellspacing" { expr $cellspacing; } + } + +.. _use-attribute-sets: + +The `use-attribute-sets` Statement +++++++++++++++++++++++++++++++++++ + +The `use-attribute-sets` statement adds the attributes from a given +set to the current element. + +:: + + { + use-attribute-sets table-attributes; + } + +The use-attribute-sets statement can be used under the `element`, +`copy-node`, and `attribute-sets` statements, as well as under a +normal element. + +Namespaces +---------- + +Namespaces map URI strings to prefixes that are used to indicate the +administrative domain of specific XML elements. The syntax and +semantic constraints for the element will be distinct depending +on the namespace under which it is defined. + +The URI is a string that uniquely identifies the namespace. Here are +some examples: + +Example namespaces:: + + http://xml.juniper.net/junos + http://www.example.com/example-one + http://www.w3.org/1999/XSL/Format + http://www.w3.org/Graphics/SVG/SVG-19990812.dtd + +The prefix is a string pre-pended to the local element name with a +colon. Prefixes map to namespaces and are used as "shorthand" for the +underlaying namespace. + +================ ======================= + Example Prefix Example Element Usage +================ ======================= + junos + example + fo + svg +================ ======================= + +.. _ns: + +The `ns` Statement +++++++++++++++++++ + +The `ns` statement defines a mapping from a prefix to a URI namespace +identifier. Namespaces must be defined prior to their use. + +By default, elements are in the "null" namespace, but the `ns` +statement can be used to change the namespace for unprefixed elements. + +The syntax of the `ns` statement is:: + + ns [ = ] ; + +If a prefix is the value prefixed to element names to indicate their +namespace should be that of the given URI. If no prefix is given, +the given URI will be applied to all elements that do not include a +prefix. The values and meanings of are detailed below. + +:: + + ns junos = "http://xml.juniper.net/junos"; + ns example = "http://www.example.com/example-one"; + ns fo = "http://www.w3.org/1999/XSL/Format"; + ns svg = "http://www.w3.org/Graphics/SVG/SVG-19990812.dtd"; + +In this example, a default namespace is defined, as well as a +namespace mapped to the "test" prefix:: + + ns "http://example.com/main"; + ns test = "http://example.com/test"; + +The XML equivalent is:: + + + +Namespace definitions are supplied using the `ns` statement. This +consists of either the `ns` keyword, a prefix string, an equal sign +and a namespace URI or the `ns` keyword and a namespace URI. The +second form defines the default namespace. + +:: + + ns junos = "http://www.juniper.net/junos/"; + +The `ns` statement may appear either following the `version` statement +at the beginning of the stylesheet or at the beginning of any block. + +:: + + ns a = "http://example.com/1"; + ns "http://example.com/global"; + ns b = "http://example.com/2"; + + match / { + ns c = "http://example.com/3"; + { + ns a = "http://example.com/4"; + apply-templates commit-script-input/configuration; + } + } + +When appearing at the beginning of the stylesheet, the ns statement +may include either the `exclude` or `extension` keywords. These +keywords instruct the parser to add the namespace prefix to the +"exclude-result-prefixes" or "extension-element-prefixes" attribute:: + + ns exclude foo = "http://example.com/foo"; + ns extension jcs = "http://xml.juniper.net/jcs"; + +.. admonition:: XSLT Equivalent + + https://www.w3.org/TR/1999/REC-xslt-19991116#namespaces + + The following is the XSLT equivalent of the above example:: + + + + + +.. _extension: + +The `extension` Statement ++++++++++++++++++++++++++ + +The `extension` statement instructs the processing engine that +extenstion namespaces, which will cause elements in that namespace to +be given special handling by the engine. + +For libslax, the extension keyword instructs the library to search for +an extension library associated with the namespace. If found, the +extension library is loaded and initialized so the script can use +functions and elements defined within that library. + +:: + + ns pref extension = "http://some.example.com"; + +.. admonition:: XSLT Equivalent + + https://www.w3.org/TR/1999/REC-xslt-19991116#extension-element + +.. _exclude: + +The `exclude` Statement ++++++++++++++++++++++++ + +The `exclude` statement prevents the namespace from appearing in the +final result tree, effectively blocking it from output. + +:: + + ns xslax extension = "http://libslax.org/slax"; + +.. admonition:: XSLT Equivalent + + https://www.w3.org/TR/1999/REC-xslt-19991116#literal-result-element + +Reserved Prefixes ++++++++++++++++++ + +The XML specification reserved all prefixes and attributes beginning +with the characters "xml". In addition, SLAX reserves all prefixes +and attributes that begin with the characters "slax". These +reservations help to future proof against changes and enhancements to +the language. + +Default Namespaces for Prefixes ++++++++++++++++++++++++++++++++ + +When a prefix is used without a corresponding `ns` statement in +scope, SLAX will refer to a set of default namespaces. If the prefix +has a default namespace, that namespace will be automatically mapped +to the prefix. + +The following table lists the default set of prefixes installed with +the libslax software distribution: + +======== ========= ==================================== + Prefix Source URI +======== ========= ==================================== + bit libslax http://xml.libslax.org/bit + curl libslax http://xml.libslax.org/curl + db libslax http://xml.libslax.org/db + exsl exslt http://exslt.org/common + crypto exslt http://exslt.org/crypto + math exslt http://exslt.org/math + set exslt http://exslt.org/sets + func exslt http://exslt.org/functions + str exslt http://exslt.org/strings + date exslt http://exslt.org/dates-and-times + dyn exslt http://exslt.org/dynamic + saxon libxslt http://icl.com/saxon + os libslax http://xml.libslax.org/os + xutil libslax http://xml.libslax.org/xutil +======== ========= ==================================== + +The libslax extension libraries are documented in this document under +the :ref:`libslax-extensions` section. The exslt extension libraries +are documented at http://exslt.org and the libxslt extension library +is documented at http://xmlsoft.org. + +When using the `slaxproc` tool with the `--format` or `--slax-to-xslt` +command line options, the namespace will be properly displayed:: + + % cat /tmp/foo.slax + version 1.1; + + match / { + { + expr date:time(); + } + } + % slaxproc --format /tmp/foo.slax + version 1.1; + + ns date extension = "http://exslt.org/dates-and-times"; + + match / { + date:time(); + } + +Processing Instructions +----------------------- + +An XML processing instruction is a mechanism to convey +application-specific information inside an XML document. The +application can detect processing instructions and change behaviour +accordingly. + +.. _processing-instruction: + +The `processing-instruction` Statement +++++++++++++++++++++++++++++++++++++++ + +The `processing-instruction` statement adds a processing instruction +to the result tree. The argument to the statement is that name of the +processing instruction and the contents of the statement (within +braces) is the value of that instruction. + +:: + + processing-instruction "my-app" { + expr "my-value"; + } + +Both the argument and the value may be XPath expressions. + +Comments +-------- + +Comments are information for the user or author. They are not formal +content and should not be inspected or parsed. They can be discarded +without affecting the content of the XML. + +:: + + + +SLAX comments are distinct from XML comments. SLAX comments appear as +part of the SLAX script, and are not part of either the input or +output XML documents. SLAX comments follow the C/Perl style of a "/*" +followed by the comment, terminated by "*/". + +:: + + /* This is a SLAX comment */ + +XML comments may not appear inside a SLAX script. + +Comments in SLAX are entered in the traditional C style, beginning the +"/*" and ending with "*/". These comments are preserved in the +in-memory XML tree representation of the SLAX script. This allows +comments to be preserved if the tree is emitted using the normal +XML output renderer. + +:: + + /* + * This is a SLAX comment. + */ + +.. admonition:: XSLT Equivalent + + The following is the XSLT equivalent of the above example:: + + + +.. _comment: + +The `comment` Statement ++++++++++++++++++++++++ + +The `comment` statement adds an XML comment to the result tree. The +argument is an XPath expression containing the comment to be added:: + + comment "This script was run by " _ $user _ " on " _ $date; + comment "Added by user " _ $user _ " on " _ $date; + +.. admonition:: XSLT Equivalent + + The `comment` statement mimics the element. The + following is the XSLT equivalent of the above example:: + + + + + +Copying Content +--------------- + +On many occasions, parts of the input XML document will be copied to +the output XML document. Such copies can be deep or shallow, meaning +that the entire node hierarchy is copied or just the node itself. +SLAX contains two distinct statements for these two styles of +copying. + +.. _copy-of: + +The `copy-of` Statement ++++++++++++++++++++++++ + +The `copy-of` statement performs a deep copy of a given set of nodes. +The argument to the statement is an XPath expression specifying which +nodes should be copied. + +:: + + copy-of $top/my/stuff; + copy-of .; + copy-of configuration/protocols/bgp; + +See also copy-node (:ref:`copy-node`). + +.. admonition:: XSLT Equivalent + + The `copy-of` statement mimics the functionality of the + element. The following is the XSLT equivalent of the above example:: + + + +.. _copy-node: + +The `copy-node` Statement ++++++++++++++++++++++++++ + +The `copy-node` statement performs a shallow copy of the specific node +to the result tree, along with any namespace nodes, but none other +child nodes (including attribute nodes) are copied. The contents of +the statement are a template specifying what should be inserted into +the new node. + +:: + + copy-node { + "one"; + } + +See also copy-of (:ref:`copy-of`). + +Formatting +---------- + +This section contains information about statements that control +formatting of output. See also the :ref:`output-method` and +:ref:`decimal-format`. + +.. _number: + +The `number` Statement +++++++++++++++++++++++ + +The `number` statement inserts a generated number into the result +tree. This statement has two distinct forms. When used with an +argument, the statement inserts the number given by that XPath +expression, and a set of optional statements can be used to +specify the formatting to be used for that number. + +When used without an argument, the number is generated based on +position of the current node in the source document, and a set of +optional statements can be used to specify formatting. + +The formatting statements are given in the following table: + +==================== =========== =============================== + Statement Value Description +==================== =========== =============================== + format see below Style of numbering + letter-value Not implemented in libxslt + grouping-separator character Used between groups of digits + grouping-size number Number of digits in a group +==================== =========== =============================== + +The value of the `format` statement gives the style of numbering, as +#detailed in the following table: + +======= ============= + Value Style +======= ============= + "1" 1 2 3 4 + "01" 01 02 03 04 + "a" a b c d + "A" A B C D + "i" i ii iii iv + "I" I II III IV +======= ============= + +The selection statements used when the number statement has no +argument are given in the following table: + +=========== =========== ============================== + Statement Value Description +=========== =========== ============================== + count XPath What to count + from XPath Where to start counting from + level See below How to count +=========== =========== ============================== + +The `level` statement indicates how to count tags: + +========== ================================ + Value Behavior +========== ================================ + single Count from first ancestor node + multiple Count from any ancestor node + any Count from any node +========== ================================ + +In the following example, the value of $this is formatted with three +digits of output and the number of "section" elements before the +current context value is emitted. + +:: + + number $this { + format "001"; + } + number { + count section; + } + +See also the format-number() XPath function. From 1ea4249617f1d66b62d9dd8eed5edf7b9c8a5297 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:21 -0500 Subject: [PATCH 027/104] Move documentation to Sphinx/RST --- doc/distribution.rst | 698 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 698 insertions(+) create mode 100644 doc/distribution.rst diff --git a/doc/distribution.rst b/doc/distribution.rst new file mode 100644 index 00000000..5657e016 --- /dev/null +++ b/doc/distribution.rst @@ -0,0 +1,698 @@ + +======================== +The libslax Distribution +======================== + +SLAX is available as an open-source project with the "New BSD" +license. Current releases, source code, documentation, and support +materials can be downloaded from: + + https://github.com/Juniper/libslax + +The libslax Library +------------------- + +The core of the distribution is the libslax library, which +incorporates a SLAX parser to read SLAX files, a SLAX writer to write +SLAX files, a debugger, a profiler, and a commandline tool. + +The reader turns a SLAX source file into an XSLT tree (xmlDocPtr) +using the xsltSetLoaderFunc() hook. The writer turns an XSLT tree +(xmlDocPtr) into a file containing SLAX statements. + +To support SLAX in your application, link with libslax and call the +libslax initializer function:: + + #include + + slaxEnable(1); + +slaxproc: The SLAX Processor +---------------------------- + +The SLAX software distribution contains a library (libslax) and a +command line tool (slaxproc). The command line tool can be used to +convert between XSLT and SLAX syntax, as well as run stylesheets and +check syntax. + +:: + + Usage: slaxproc [mode] [options] [script] [files] + Modes: + --check OR -c: check syntax and content for a SLAX script + --format OR -F: format (pretty print) a SLAX script + --json-to-xml: Turn JSON data into XML + --run OR -r: run a SLAX script (the default mode) + --show-select: show XPath selection from the input document + --show-variable: show contents of a global variable + --slax-to-xslt OR -x: turn SLAX into XSLT + --xml-to-json: turn XML into JSON + --xpath OR -X : select XPath data from input + --xslt-to-slax OR -s: turn XSLT into SLAX + + Options: + --debug OR -d: enable the SLAX/XSLT debugger + --empty OR -E: give an empty document for input + --exslt OR -e: enable the EXSLT library + --expression : convert an expression + --help OR -h: display this help message + --html OR -H: Parse input data as HTML + --ignore-arguments: Do not process any further arguments + --include OR -I : search dir for includes/imports + --indent OR -g: indent output ala output-method/indent + --input OR -i : take input from the given file + --json-tagging: tag json-style input with the 'json' attribute + --keep-text: mini-templates should not discard text + --lib OR -L : search dir for extension libraries + --log : use given log file + --mini-template OR -m : wrap template code in script + --name OR -n : read the script from the given file + --no-randomize: do not initialize the random number generator + --no-tty: Do not use tty for sdb and other input needs + --no-json-types: do not insert 'type' attribute for --json-to-xml + --output OR -o : make output into the given file + --param OR -a : pass parameters + --partial OR -p: allow partial SLAX input to --slax-to-xslt + --slax-output OR -S: emit SLAX-style XML output + --trace OR -t : write trace data to a file + --verbose OR -v: enable debugging output (slaxLog()) + --version OR -V: show version information (and exit) + --write-version OR -w : write in version + + Project libslax home page: https://github.com/Juniper/libslax + +To use slaxproc to convert a SLAX file to XSLT:: + + $ slaxproc -x mine.slax new.xsl + +To convert an XSLT file to SLAX:: + + $ slaxproc -s existing.xsl new.slax + +To run a script:: + + $ slaxproc mine.slax infile.xml outfile.xml + +Use the :option:`-g` option to produce good-looking output by enabling +indenting (aka "pretty-printing") of output. In this example, +since the output filename is not given, the output is written to +the standard output stream (stdout):: + + $ slaxproc -g mine.slax infile.xml + +Use the :option:`-p` flag to perform conversion of SLAX and XML +formats for partial data files. This can be used as a filter inside +an editor to convert a region from one format to the other:: + + $ cat in.xml | slaxproc -s -p > out.slax + +Use the :option:`-w` option to restrict the output of slaxproc to 1.0 +features. + +.. _slaxproc-arguments: + +Argument Handling ++++++++++++++++++ + +`slaxproc` accepts the script name, input name, and output name in two ways. +You can say:: + + slaxproc script.slax input.xml output.xml + +using positional arguments. This way allows slaxproc to be plug +compatible with xsltproc. + +The other way is to give explicit option values using :option:`-n`, +:option:`-i`, and :option:`-o`. The above command line can be given +as:: + + slaxproc -i input.xml -n script.slax -o output.xml + +These options can be in any order and can be intermixed with other +arguments. If none of the values are given, they can still be +parsed positionally. In this example, the script name is positional +but the input and output file names are positional:: + + slaxproc -i input.xml -o output.xml -g -v script.slax + +.. _pound-bang: + +"#!" Support +~~~~~~~~~~~~ + +SLAX supports the "#!" unix scripting mechanism, allowing the first +line of a script to begin with the characters "#" and "!" followed by +a path to the executable that runs the script and a set of command +line arguments. For SLAX scripts, this might be something like:: + + #!/usr/bin/slaxproc -n + +or:: + + #!/opt/local/bin/slaxproc -n + +or:: + + #!/usr/bin/env slaxproc -n + +The operating system will add the name of the scripts and any command +line arguments to the command line that follows the "#!". Adding the +:option:`-n` option (as shown above) allows additional arguments to be +passed in on the command line. Flexible argument parsing allows +aliases and #! arguments to tailor the slaxproc invocation to match +specific needs. For example if a script begins with:: + + #!/usr/bin/slaxproc -E -n + +then additional slaxproc arguments can be given:: + + $ that-script -g output.xml + +and the resulting command should be:: + + /usr/bin/slaxproc -E -n /path/to/that-script -g output.xml + +The :option:`-E` option tells slaxproc to use an empty input document, +removing the need for the :option:`-i` option or a positional argument. + +If the input or output arguments have the value "-" (or is not +given), the standard input or standard output file will be used. +This allows slaxproc to be used as a traditional unix filter. + +Command Line Options +++++++++++++++++++++ + +Command line options to slaxproc can be divided into two types. Mode +options control the operation of slaxproc, and are mutually exclusive. +Behavioral options tailor the behavior of slaxproc in minor ways. + +.. _slaxproc-modes: + +Modes Options +~~~~~~~~~~~~~ + +.. option:: --check +.. option:: -c + + Perform syntax and content check for a SLAX script, reporting any + errors detected. This mode is useful for off-box syntax checks for + scripts before installing or uploading them. + + :: + + % slaxproc --check ~/trash/test.slax + script check succeeds + +.. option:: --format +.. option:: -F + + Format (aka "pretty print") a SLAX script, correcting indentation and + spacing to the style preferred by the author (that is, me). + + :: + + % slaxproc --format ugly.slax pretty.slax + +.. option:: --json-to-xml + + Transform JSON input into XML, using the conventions defined in + :ref:`json-elements`. + + :: + + % echo '{"a": "b"}' | slaxproc --json-to-xml + + + b + + +.. option:: --run +.. option:: -r + + Run a SLAX script. The script name, input file name, and output file + name can be provided via command line options and/or using positional + arguments as described in :ref:`slaxproc-arguments`. Input defaults to + standard input and output defaults to standard output. `-r` is the + default mode for slaxproc. + + The following command lines are equivalent:: + + % slaxproc my-script.slax input.xml output.xml + % slaxproc -r -n my-script.slax -i input.xml -o output.xml + +.. option:: --show-select + + Show an XPath selection from the input document. Used to extract + selections from a script out for external consumption. This allows + the consumer to avoid a SLAX parser, but still have visibility into + the contents of the script. + + The output is returned inside an XML hierarchy with a root element + named "select". This makes it possible to return attributes:: + + % slaxproc --show-select 'xsl:template/@match' script.slax + + + + + + + + + + + + +.. option:: --slax-to-xslt +.. option:: -x + + Convert a SLAX script into XSLT format. The script name and output file + name can be provided via command line options and/or using positional + arguments as described in :ref:`slaxproc-arguments`. + + :: + + % slaxproc --slax-to-xslt my-script.slax your-script.xsl + +.. option:: --xml-to-json + + Transform XML input into JSON, using the conventions defined in + :ref:`json-elements`. + + :: + + % echo 'b' | slaxproc --xml-to-json + { "a": "b" } + +.. option:: --xpath +.. option:: -X + + Select data matching an XPath data from input document. This allows + slaxproc to operate as a filter. Note that :option:`--xpath` and + :option:`--show-select` differ only in the lack of the root element + on the latter:: + + % slaxproc --xpath 'xsl:stylesheet/xsl:template/@match' /tmp/foo.xsl + + + +.. option:: --xslt-to-slax +.. option:: -s + + Convert a XSLT script into SLAX format. The script name and output file + name can be provided via command line options and/or using positional + arguments as described in :ref:`slaxproc-arguments`. + + :: + + % slaxproc --xslt-to-slax your.xsl my.slax + + +.. _slaxproc-options: + +Behavioral Options +~~~~~~~~~~~~~~~~~~ + +.. option:: --debug +.. option:: -d + + Enable the SLAX/XSLT debugger. See :ref:`sdb` for complete details on the + operation of the debugger. + +.. option:: --empty +.. option:: -E + + Provide an empty document as the input data set. This is useful for + scripts that do not expect or need meaningful input. The input + document consists only of a root element ("top"):: + + % slaxproc -E -m 'main { copy-of /;} ' + + + +.. option:: --exslt +.. option:: -e + + Enables the EXSLT library, which provides a set of standard extension + functions. See exslt.org for more information. + + This option is deprecated; SLAX now finds all extension functions + automatically and no longer needs specific instructions for the + EXSLT library. + +.. option:: --expression + + Converts a SLAX expression to an XPATH one, or vice versa, depending + on the presence of --slax-to-xslt and --xslt-to-slax. + + :: + + % slaxproc -x --expression 'f[name == $one _ "-ext" && mtu]' + f[name = concat($one, "-ext") and mtu] + +.. option:: --help +.. option:: -h + + Displays this help message and exits. The help message has received + an unknown number of industry awards from various well-meaning + organizations. + +.. option:: --html +.. option:: -H + + Parse input data using the HTML parser, which differs from XML. The + rules are more flexible, but are HTML specific. + +.. option:: --ignore-arguments + + Do not process any further arguments. This can be combined + with "#!" to allow "distinct" styles of argument parsing. + +.. option:: --include +.. option:: -I + + Add a directory to the list of directories searched for + :ref:`include-import ` files. The environment + variable SLAXPATH can be set to a list of search directories, + separated by colons. + +.. option:: --indent +.. option:: -g + + Indent output to make it good looking. This option is identical to + the behavior triggered by the ref:`output-method `'s + `indent` statement:: + + output-method { + indent "true"; + } + +.. option:: --input +.. option:: -i + + Use the given file for input. + +.. option:: --json-tagging + + Tag JSON elements in SLAX script input with the 'json' attribute as + they are parsed into XML. This allows the :option:`--format` mode + to transform them back into JSON format. + +.. option:: --keep-text + + When building a script from mini-templates, do not add a template to + discard normal text. By default XSLT will display unmatched text + data, but mini-templates adds a discard action automatically. The + `--keep-text` option preserves the original default behavior instead + of replacing it with the discard action that is typically more + desirable . + +.. option:: --lib +.. option:: -L + + Add a directory to the list of directories searched for extension + libraries. + +.. option:: --log + + Write log data to the given file, rather than the default of + the standard error stream. + +.. option:: --mini-template or -m + + Allows a simple script to be passed in via the command line using one + of more `-m` options. The argument to `-m` is typically a template, + such as a named or match template, but can be any top-level SLAX + statement. + + % slaxproc -E -m 'main { expr date:time(); }' + + 19:51:11-05:00 + +.. option:: --name +.. option:: -n + + Use the given file as the SLAX script. + +.. option:: --no-json-types + + Do not generate the "type" attribute in the XML generated by + `--json-to-xml`. This type is needed to "round-trip" data back + into JSON, but is not needed for simple XML output. + +.. option:: --no-randomize + + Do not initialize the random number generator. This is useful if you + want the script to return identical data for a series of invocation, + which is typically only used during testing. + +.. option:: --no-tty + + Do not use a tty for `sdb` and other tty-related input needs. + +.. option:: --output +.. option:: -o + + Write output into the given file. + +.. option:: --param +.. option:: -a + + Pass a parameter to the script using the name/value pair provided. + Note that all values are string parameters, so normal quoting + rules apply. + +.. option:: --partial +.. option:: -p + + Allow the input data to contain a partial SLAX script, with more + flexible input parsing. This can be used with the `--slax-to-xslt` + to perform partial transformations, or with `--format` to format + sections of SLAX input or to convert XML into SLAX:: + + % echo 'b' | slaxproc -s -p + { + "b"; + } + +.. option:: --slax-output +.. option:: -S + + Write the output of a script using SLAX-style XML (braces, etc). + +.. option:: --trace +.. option:: -t + + Write trace data to the given file. + +.. option:: --verbose +.. option:: -v + + Adds very verbose internal debugging output to the trace data output, + including calls to the slaxLog() function. + +.. option:: --version +.. option:: -V + + Show version information and exit. + +.. option:: --write-version +.. option:: -w + + Write in the given version number on the output file for `-x` or `-s` + output. This can be also be used to limit the conversion to avoid + SLAX 1.1 feature (using `-w 1.0`). + + In this example, the `-w 1.0` option causes `slaxproc` to write the + `main` statement introduced in SLAX-1.2 in a 1.0 compatible manor:: + + % slaxproc --format -m 'main { } ' -w 1.0 --keep-text + version 1.0; + + match / { + ; + } + +.. _sdb: + +The SLAX Debugger (sdb) +----------------------- + +The SLAX distribution includes a debugger called `sdb`, which can be +accessed via the `slaxproc` command using the `-d` option. The +debugger resembles `gdb` command syntax and operation. + +:: + + (sdb) help + List of commands: + break [loc] Add a breakpoint at [file:]line or template + callflow [val] Enable call flow tracing + continue [loc] Continue running the script + delete [num] Delete all (or one) breakpoints + finish Finish the current template + help Show this help message + info Showing info about the script being debugged + list [loc] List contents of the current script + next Execute the over instruction, stepping over calls + over Execute the current instruction hierarchy + print Print the value of an XPath expression + profile [val] Turn profiler on or off + reload Reload the script contents + run Restart the script + step Execute the next instruction, stepping into calls + where Show the backtrace of template calls + quit Quit debugger + +The `info` command can display the following information: + +:: + + (sdb) info help + List of commands: + info breakpoints Display current breakpoints + info insert Display current insertion point + info locals Display local variables + info output Display output document + info profile [brief] Report profiling information + +Many of these commands follow their "gdb" counterparts, to the extent +possible. + +The location for the `break`, `continue`, and `list` commands can be +either a line number of the current file, a filename and a line +number, separated by a colon, or the name of a template. + +:: + + (sdb) b 14 + Breakpoint 1 at file ../tests/core/test-empty-21.slax, line 14 + (sdb) b 19 + Breakpoint 2 at file ../tests/core/test-empty-21.slax, line 19 + (sdb) b three + Breakpoint 3 at file ../tests/core/test-empty-21.slax, line 24 + (sdb) info br + List of breakpoints: + #1 template one at ../tests/core/test-empty-21.slax:14 + #2 template two at ../tests/core/test-empty-21.slax:19 + #3 template three at ../tests/core/test-empty-21.slax:24 + (sdb) + +Information on the profiler is in the next section (:ref:`profiler`). + +The `info insert` and `info output` commands allow visibility into the +current output document being generated by libxslt. `insert` shows +the current insertion point, typically as an XML hierarchy, where the +next element inserted will appear at the end of that hierarchy. +`output` displays the current state of the entire output document. + +The `info locals` command displays the current set of local variables +and their values. + +.. _profiler: + +The SLAX Profiler +----------------- + +The SLAX debugger includes a profiler which can report information +about the activity and performance of a script. The profiler is +automatically enabled when the debugger is started, and tracks script +execution until the script terminates. At any point, profiling +information can be displayed or cleared, and the profiler can be +temporarily disabled or enabled. + +Use the `profile` command to access the profiler:: + + (sdb) help profile + List of commands: + profile clear Clear profiling information + profile off Disable profiling + profile on Enable profiling + profile report [brief] Report profiling information + (sdb) + +The profile report includes the following information: + +- Line -- line number of the source file +- Hits -- number of times this line was executed +- User -- the number of microseconds if "user" time spent processing this line +- U/Hit -- average number of microseconds per hit +- System -- the number of microseconds if "system" time spent + processing this line +- S/Hit -- average number of microseconds per hit +- Source -- Source code line + +The `brief` option instructs sdb to avoid showing lines that were not +hit, since there is no valid information for them. Without the +`brief` option, dashes are displayed. + +In the following example, the source code data is heavily truncated +(with "....") to allow the material to fit on this page. sdb would +not truncate these lines:: + + (sdb) run + + Down rev PIC in Fruvenator, Fru-Master 3000 + Script exited normally. + (sdb) profile report + Line Hits User U/Hit System S/Hit Source + 1 - - - - - version 1.0; + 2 - - - - - + 3 2 4 2.00 8 4.00 match / { + 4 1 25 25.00 13 13.00 var .... + 5 - - - - - + 6 - - - - - for-each.... + 7 1 45 45.00 10 10.00 .. + 8 1 12 12.00 5 5.00 + 9 1 45 45.00 15 15.00 .... + 10 - - - - - } + 11 - - - - - } + Total 6 131 51 Total + (sdb) pro rep b + Line Hits User U/Hit System S/Hit Source + 3 2 4 2.00 8 4.00 match / { + 4 1 25 25.00 13 13.00 var .... + 7 1 45 45.00 10 10.00 .... + 8 1 12 12.00 5 5.00 + 9 1 45 45.00 15 15.00 .... + Total 6 131 51 Total + (sdb) + +This information not only shows how much time is spent during code +execution, but also shows which lines are being executed, which +can help debug scripts where the execution does not match +expectations. + +The profiling is not "Monte Carlo", or clock based, but is based on +trace data generated as each SLAX instruction is executed, giving +more precise data. + +callflow +-------- + +The `callflow` command enables the printing of informational data when +levels of the script are entered and exited. The lines are simple, +but reference the instruction, filename, and line number of the +frame:: + + callflow: 0: enter in match / at empty-15.slax:5 + callflow: 1: enter at empty-15.slax:13 + callflow: 1: exit at empty-15.slax:13 + callflow: 1: enter at empty-15.slax:20 + callflow: 1: exit at empty-15.slax:20 + callflow: 0: exit in match / at empty-15.slax:5 From 411d60ce68d5f1fe8e455fb80937a947a7a91767 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:22 -0500 Subject: [PATCH 028/104] Move documentation to Sphinx/RST --- doc/examples.rst | 134 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 doc/examples.rst diff --git a/doc/examples.rst b/doc/examples.rst new file mode 100644 index 00000000..26bd7542 --- /dev/null +++ b/doc/examples.rst @@ -0,0 +1,134 @@ + +=================== +Example Stylesheets +=================== + +This section contains a few examples, converted from the libxslt test/ +directory. The XSLT form can be found in the libxslt source code. +They were converted using the "slaxproc" tool. + +general/itemschoose.xsl +----------------------- + +:: + + version 1.1; + + ns fo = "http://www.w3.org/1999/XSL/Format"; + + strip-space itemlist; + match doc { + { + apply-templates; + } + } + + match orderedlist/listitem { + { + { + var $level = count(ancestor::orderedlist) mod 3; + + if ($level=1) { + ; + + } else if ($level=2) { + ; + + } else { + ; + } + expr ". "; + } + { + apply-templates; + } + } + } + +REC2/svg.xsl +------------ + +:: + + version 1.1; + + ns "http://www.w3.org/Graphics/SVG/SVG-19990812.dtd"; + + output-method xml { + indent "yes"; + media-type "image/svg"; + } + + match / { + { + { + /* draw the axes */ + ; + ; + "Revenue"; + "Division"; + + for-each (sales/division) { + + /* define some useful variables */ + /* the bar's x position */ + var $pos = (position()*40)-30; + + /* the bar's height */ + var $height = revenue*10; + + /* the rectangle */ + ; + + /* the text label */ + @id; + + /* the bar value */ + revenue; + } + } + } + } + +XSLTMark/metric.xsl +------------------- + +:: + + version 1.1; + + output-method html { + encoding "utf-8"; + } + + match measurement { + var $m = { + if (@fromunit == 'km') { + expr . * 1000; + + } else if (@fromunit == 'm') { + expr .; + + } else if (@fromunit == 'cm') { + expr . * 0.01; + + } else if (@fromunit == 'mm') { + expr . * 0.001; + } + } + { + if (@tounit == 'mi') { + expr 0.00062137 * $m; + + } else if (@tounit == 'yd') { + expr 1.09361 * $m; + + } else if (@tounit == 'ft') { + expr 3.2808 * $m; + + } else if (@tounit == 'in') { + expr 39.37 * $m; + } + } + } From bf3238ff0f4eeccabb4951db9aae72e8ded8812f Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:23 -0500 Subject: [PATCH 029/104] Move documentation to Sphinx/RST --- doc/extensions.rst | 1571 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1571 insertions(+) create mode 100644 doc/extensions.rst diff --git a/doc/extensions.rst b/doc/extensions.rst new file mode 100644 index 00000000..a3b97e08 --- /dev/null +++ b/doc/extensions.rst @@ -0,0 +1,1571 @@ + +.. _libslax-extensions: + +============================== +Extension Libraries in libslax +============================== + +libslax supports a means of dynamically loading extension libraries. +After a script is parsed, any extension prefixes are determined, along +with their namespaces. Each namespace are then URL-escaped and a +".ext" suffix is appended to generate a filename for the extension +library that supports that namespace. + +Extension libraries should be placed in the directory named that is +either: + +- the /usr/local/lib/slax/extensions directory + +- the "lib/slax/extensions" directory under the "configure --prefix" + option given at build time + +- the directory specified with the "configure --with-extension-dir" + option given at build time + +- one of the directories listed in the environment variable + SLAX_EXTDIR (colon separated) + +- one of the directories provided via the --lib/-L argument to "slaxproc" + +The "bit" Extension Library +--------------------------- + +The "bit" extension library has functions that interpret a string as a +series of bit, allowing arbitrary length bit arrays and operations on +those arrays. + +========================= ==================================== + Function and Arguments Description +========================= ==================================== + bit:and(b1, b2) Return AND of two bit strings + bit:or(b1, b2) Return OR of two bit strings + bit:nand(b1, b2) Return NAND of two bit strings + bit:nor(b1, b2) Return NOR of two bit strings + bit:xor(b1, b2) Return XOR of two bit strings + bit:xnor(b1, b2) Return XNOR of two bit strings + bit:not(b1) Return NOT of a bit string + bit:clear(b, off) Clear a bit within a bit string + bit:compare(b1, b2) Compare two bit strings + bit:set(b, off) Set a bit within a bit string + bit:mask(count, len?) Return len bits set on + bit:to-int(bs) Return integer value of bit string + bit:from-int(val, len?) Return bit string of integer value + bit:to-hex(bs) Return hex value of a bit string + bit:from-hex(str, len?) Return bit string of hex value +========================= ==================================== + +The "curl" Extension Library +---------------------------- + +curl and libcurl are software components that allow access to a number +of protocols, include http, https, smtp, ftp, and scp. They are open +source and available from the web site http://curl.haxx.se/libcurl/. +Please refer to that site for additional information. + +.. _curl-elements: + +curl Elements ++++++++++++++ + +Curl operations are directed using a set of elements, passed to the +curl extension functions. These elements closely mimic the options +used by the native C libcurl API via libcurl's curl_easy_setopt() +function), as documented on the following web page:: + + http://curl.haxx.se/libcurl/c/curl_easy_setopt.html + +Once these values are set, a call to curl_easy_perform() performs the +requested transfer. + +In the SLAX curl extension library, these options are represented as +individual elements. This means the element is mapped to the +"CURLOPT_URL" option, the option is mapped to the +CURLOPT_CUSTOMREQUEST option, and so forth. + +These elements can be used in three ways: + +- The curl:single() extension function allows a set of options to be + used in a single transfer operation with no persistent connection + handle. + +- The curl:perform() extension function allows a set of options to be + used with a persistent connection handle. The handle is returned from + the curl:open() extension function and can be closed with the + curl:close() extension function. + +- The curl:set() extension function can be used to record a set of + options with a connection handle and keep those options active for + the lifetime of the connection. + +For example, if the script needs to transfer a number of files, it can +record the and options and avoid repeating them +in every curl:perform() call. + +This section gives details on the elements supported. The functions +themselves are documented in the next section (:ref:`curl-functions`). + + +~~~~ + +The element gives a "Cc" address for "email" (SMTP) requests. +For multiple address, use multiple elements:: + + SYNTAX:: + "cc-user@email.examplecom"; + + +~~~~~~~~~~~~~~~~~ + +The element gives the number of seconds before a +connection attempt is considered to have failed:: + + SYNTAX:: + 10; + + +~~~~~~~~~~ + +The element gives the contents to be transfered:: + + SYNTAX:: + "multi-\nline\ncontents\n"; + + +~~~~~~~~~~~~~~ + +The element gives the MIME type for the transfer +payload. + + SYNTAX:: + "mime/type"; + + +~~~~~~~~ + +The element controls how HTML and XML parsing errors are +handled. The default (display them on stderr) is often not +attractive. Instead errors can be ignored, logged, or recorded, based +on the contents of the element: + +========= =================================== + Value Special behavior +========= =================================== + default Errors are displayed on stderr + ignore Errors are discarded + log Errors are logged (via slaxLog()) + record Errors are recorded +========= =================================== + +When is set to "record", all errors appear in a string under +the element in the XML node (as returned by +e.g. curl:perform). If no errors are generated, the element +will not be present, allowing it to be used as a test for errors:: + + var $opt = { + $url; + "html"; + "record"; + } + var $res = curl:single($opts); + if ($res/errors) { + terminate "failure: " _ $res/errors; + } + + +~~~~~~~~~~~~~~~ + +The element indicates that the transfer should fail if +any errors where detected, including insignificant ones:: + + SYNTAX:: + ; + + +~~~~~~~~ + +The element gives the expected format of the returned +results, allowing the curl extension to automatically make the content +available in the native format:: + + "xml"; + +============= ============================= + Format name Special behavior +============= ============================= + html Result is parsed as HTML + name Result is name-value pairs + text None + url-encoded Result is n1-v1&n2-v2 pairs + xml Result is parsed as XML +============= ============================= + +The "name" encoding is used for name=value pairs separated by +newlines, where the url-encoded encoding is used when the name=value +pairs are separated by "&". + +The parsed data is returned in the element, using +elements. In the following example results, was set +to "url-encoded":: + + + https://api.example.com/request_token + + HTTP/1.1 200 OK + Server: XXXX + Date: Tue, 18 Jun 2013 18:56:31 GMT + Content-Type: application/x-www-form-urlencoded + Transfer-Encoding: chunked + Connection: keep-alive + x-server-response-time: 69 + x-example-request-id: 123456 + pragma: no-cache + cache-control: no-cache + x-http-protocol: None + x-frame-options: SAMEORIGIN + X-RequestId: 12345 + + + + HTTP/1.1 + 200 + OK +
XXXXX
+
Tue, 18 Jun 2013 18:56:31 GMT
+
application/x-www-form-urlencoded
+
chunked
+
keep-alive
+
69
+
123456
+
no-cache
+
no-cache
+
None
+
SAMEORIGIN
+
12345
+ + oauth_token_secret=s&oauth_token=t + + s + t + + + + +~~~~~~ + +The element gives the "From" address to use for "email" (SMTP) +requests:: + + SYNTAX:: + "source-user@email.example.com"; + +
+~~~~~~~~ + +The
element gives additional header fields for the request:: + + SYNTAX:: +
"value"; + + +~~~~~~~~~~ + +The element indicates a willingness to tolerate insecure +communications operations. In particular, it will allow SSL Certs +without checking the common name:: + + SYNTAX:: + ; + + +~~~~~~~ + +The element gives the name to use as the local hostname for +"email" (SMTP) requests:: + + SYNTAX:: + "local host name"; + + +~~~~~~~~ + +The element sets the method used to transfer data. This +controls the HTTP request type, as well as triggering other transfer +mechanisms:: + + SYNTAX:: + $method; + +Method names are listed in the table below: + +======== ================================ + Method Description +======== ================================ + get HTTP GET or FTP GET operation + post HTTP POST operation + delete HTTP DELETE operation + head HTTP HEAD operation + email SMTP email send operation + put HTTP PUT operation + upload HTTP POST or FTP PUT operation +======== ================================ + +The "get" method is the default. + + +~~~~~~~ + +The element gives additional parameter values for the +request. These parameters are typically encoded into the URL:: + + SYNTAX:: + "y"; + + +~~~~~~~~~~ + +The element sets the user's password for the transfer:: + + SYNTAX:: + "password"; + + +~~~~~~~~ + +The element requests the use of the "secure" sibling of many +protocols, including HTTPS and FTPS:: + + SYNTAX:: + ; + + +~~~~~~~~ + +The element gives the outgoing SMTP server name. At present, +MX records are not handled, but that will be fixed shortly:: + + SYNTAX:: + "email-server.example.com"; + + +~~~~~~~~~ + +The element gives the "Subject" field for "email" (SMTP) +requests:: + + SYNTAX:: + "email subject string"; + + +~~~~~~~~~ + +The element gives the number of seconds before an open +connection is considered to have failed:: + + SYNTAX:: + 10; + + +++++ + +The element gives a "To" address for "email" (SMTP) requests. +For multiple address, use multiple elements:: + + SYNTAX:: + "to-user@email.examplecom"; + + +~~~~~~~~ + +The element indicates this is a file upload request:: + + SYNTAX:: + ; + + +~~~~~ + +The element sets the base URL for the request:: + + SYNTAX:: + "target-url"; + + +~~~~~~~~~~ + +The element sets the user name to use for the transfer:: + + SYNTAX:: + "username"; + + +~~~~~~~~~ + +The element requests an insanely detailed level of debug +information that can be useful when debugging requests. The curl +extension will display detailed information about the operations and +communication of the curl transfer:: + + SYNTAX:: + ; + +.. _curl-functions: + +curl Extension Functions +++++++++++++++++++++++++ + +The curl namespace defines a set of extension functions. This section +describes those functions. + +.. _curl-perform: + +curl:perform +~~~~~~~~~~~~ + +The "curl:perform" extension function performs simple transfers using +a persistent connection handle, as provided by curl:open (:ref:`curl-open`). + +The arguments are the connection handle and a set of option elements +as listed in :ref:`curl-elements`. The returned object is an XML hierarchy +containing the results of the transfer:: + + SYNTAX:: + object curl:perform(handle, options) + +The returned object may contain the following elements: + +============== ===================================== + Element Contents +============== ===================================== + url The requested URL + curl-success Indicates sucess (empty) + raw-headers Raw header fields from the reply + raw-data Raw data from the reply + error Contains error message text, if any + header Parsed header fields + data Parsed data +============== ===================================== + +The
element can contain the following elements: + +========= ========================================== + Element Contents +========= ========================================== + code HTTP reply code + version HTTP reply version string + message HTTP reply message + field HTTP reply fields (with @name and value) +========= ========================================== + +The following is an example of the
element, with header +fields parsed into elements:: + +
+ HTTP/1.1 + 404 + Not Found + text/html + 345 + Mon, 08 Aug 2011 03:40:21 GMT + lighttpd/1.4.28 juisebox +
+ +.. _curl-open: + +curl:open +~~~~~~~~~ + +The "curl:open" extension function opens a connection to a remote +server, allowing multiple operations over a single connection:: + + SYNTAX:: + handle curl:open(); + +The returned handle can be passed to curl:perform() or curl:close(). + +curl:set +~~~~~~~~ + +The "curl:set" extension function records a set of parameters that +will persist for the lifespan of a connection:: + + SYNTAX:: + void cur:set(handle, options); + +curl:set() sets options on the handle, so they don't need to be +repeated on each curl:perform() call:: + + var $curl = curl:open(); + var $global-options = { + "post"; +
"phil"; +
"raleigh"; + } + + expr curl:set($curl, $global-options); + + call some-other-template($curl); + +curl:single +~~~~~~~~~~~ + +The "curl:single" extension function performs transfer operations +without using a persistent connection:: + + SYNTAX:: + object curl:single(options); + +The returned object is identical in structure to the one returned by +curl:perform. Refer to :ref:`curl-perform` for additional information. + +curl:close +~~~~~~~~~~ + +The "curl:close" extension function closes an open connection. +Further operations cannot be performed over the connection:: + + SYNTAX:: + void curl:close(handle); + +Examples +++++++++ + +This section contains a set of example scripts that use the curl +extension to perform simple gets, google authorization, and send +email. + +Simple GET +~~~~~~~~~~ + +This script gets a vanilla web page, but just to be interesting, +includes a header field for the HTTP header and a parameter that is +incorporated into the requested URL:: + + version 1.1; + + ns curl extension = "http://xml.libslax.org/curl"; + + param $url = "http://www.juniper.net"; + + match / { + { + var $options = { +
"slaxproc"; + "bandit"; + } + + var $results = curl:single($url, $options); + message "completed: " _ $results/headers/message; + { + copy-of $results; + } + } + } + +Google Auth +~~~~~~~~~~~ + +This script take a username and password and uses the google login +services to translate them into an "Authorization" string:: + + version 1.1; + + ns curl extension = "http://xml.libslax.org/curl"; + + param $url = "https://www.google.com/accounts/ClientLogin"; + param $username; + param $password; + + var $auth-params := { + $url; + "post"; + ; + $username; + $password; + "GOOGLE"; + "wise"; + "test-app"; + } + + match / { + var $curl = curl:open(); + + var $auth-cred = curl:perform($curl, $auth-params); + + { + for-each(slax:break-lines( $auth-cred/raw-data )) { + if(starts-with(.,"Auth")) { +
"3.0"; +
"GoogleLogin " _ .; + } + } + } + + expr curl:close($curl); + } + +Email +~~~~~ + +This script sends an email via a server provided as a parameter:: + + version 1.1; + + ns curl extension = "http://xml.libslax.org/curl"; + + param $server; + + match / { + { + var $info = { + "email"; + $server; + "muffin@example.com"; + "phil@example.net"; + "Testing..."; + "Hello, + This is an email. But you know that. + + Thanks, + Phil + "; + } + + var $res = curl:single($info); + { + copy-of $res; + } + } + } + +The "db" Extension Library +-------------------------- + +The db extension library provides a way to store/retrieve/manipulate/delete +data stored in a backend database from SLAX scripts + +db Elements ++++++++++++ + +Following are the elements that can be used in options and data to db +extension functions + + +~~~~~~~~ + +Used to specify the backend database engine that is used to +access/store data:: + + "sqlite"; + +"sqlite" is the currently supported backend engine. The +element can also take mysql/mongodb as values once the adapters for +corresponding database engines are made available. + + +~~~~~~~~~~ + +Used to specify the name of the database to operate on:: + + "test.db"; + + +~~~~~~~~~~~~ + +This is used to specify the data collection on which to perform operations. +This corresponds to a database table in SQL world:: + + "employee"; + + +~~~~~~~~ + +This is used to specify meta data about various fields that a collection +contain using elements:: + + { + { + ... + ... + } + { + ... + ... + } + } + + +~~~~~~~ + +Contains meta data about each field in collection. This corresponds to column +definition in SQL world and is used when creating a collection. + +:: + + { + "name"; + "integer"; + ; + } + + can contain following elements: + +================ ========================================================== + Element Description +================ ========================================================== + name Name of the field + type Type of this field. Can take integer/text/real as values + primary Field is primary key + unique Field value are unique + notnull Field value must be specified + auto-increment Field value is auto incremented; must be integer type + default Value field will have if not specified by the user +================ ========================================================== + + +~~~~~~~~~~ + +Represents a single instance from collection. Contains fields and their +corresponding values in that record. Used when inserting/manipulating data in +the datastore. Example:: + + { + 5; + "John"; + } + + + +~~~~~~~~~~~ + +Used to hold multiple instances:: + + { + { + ... + ... + } + { + ... + ... + } + } + + +~~~~~~~~~~~ + +Used to specify a condition that must to be satisfied when operating with +data instances from datastore. This forms the condition used with WHERE clause +when operating with SQL datastore + + will contain following mandatory elements. + +================ ========================================================== + Element Description +================ ========================================================== + selector Name of the field to apply this condition + operator Operator for this condition. Can take one of comparison + or logical operators (<, >, <=, >=, =, LIKE, IN, NOT) + value Value to be used with operator on this field +================ ========================================================== + +Example:: + + { + "id; + "in"; + "(1, 10)"; + } + + +~~~~~~~~~~~~ + +This is used to specify multiple conditions with or as parent +node. For example:: + + { + { + { + ... /* c1 */ + } + { + ... /* c2 */ + } + { + { + ... /* c3 */ + } + { + ... /* c4 */ + } + } + } + } + +Above condition set gets translated to "c1 AND c2 AND c3 OR c4" + + +~~~~~~~~~~ + +This is used to specify only the fields that should appear as part of result +set when querying the datastore. For example:: + + { + ; + ; + } + + +~~~~~~ + +Used to specify the fields and order by which the result set must be sorted +before returning. List of fields can be specified using and order using +. "asc" and "desc", corresponds to ascending and descending order are +the only valid values for order, which defaults to "asc":: + + { + "id"; + "age"; + "desc"; + } + + +~~~~~~~ + +Used to limit the number of instances that a result can contain:: + + 10; + + +~~~~~~ + +Used to skip over a specified number of instances in the result set before +returning to the user:: + + 5; + + +~~~~~~~~ + +This is the output node from most of the extension functions. This contains + and may contain one or more s. + + can take one of the following values: + +=============== ======================================================= + Value Description +=============== ======================================================= + Operation ran to completion. Usually means no more + data to return + Operation is successful. Returned with insert/update + functions + Data is available in the result as elements + Error has occurred. Error message will be the value of + this element +=============== ======================================================= + +db Extension Functions +++++++++++++++++++++++ + +The db extension functions require the following ns statement:: + + ns db extension = "http://xml.libslax.org/db"; + +db:open() +~~~~~~~~~ + +Used to open a database connection using provided options. Options contain +backend engine and database name. For example:: + + var $options = { + "sqlite"; + "test.db"; + } + + var $handle = db:open($options); + +db:open() returns database handle (a session cookie), that can be used to +perform further operations on this opened connection. + +If sqlcipher is available, db:open() also takes an optional config +where in we can specify the key that can be used to encrypt/decrypt the +database. In such a case, options will look as below:: + + var $options = { + "sqlite"; + "test.db"; + { + "testKey"; + } + } + +If the user provides a rekey in access, database key will be changed to the +valued mentioned in rekey:: + + var $options = { + "sqlite"; + "test.db"; + { + "testKey"; + "newTestKey"; + } + } + +Above options when used in with db:open() will change test.db key from +"testKey" to "newTestKey". + +db:create() +~~~~~~~~~~~ + +Used to create a collection using opened database handle and information +about the fields that this collection contains. For example:: + + var $schema = { + "employee"; + { + { + "id"; + "integer"; + ; + } + { + "name"; + "text"; + "John"; + } + } + } + + var $result = db:create($handle. $schema); + +db:create() returns result node which contains status of the operation. +Status is returned as ok in case of success and has error with message if it +fails. + +db:insert() +~~~~~~~~~~~ + +Used to insert data into a collection using a handle and input data. For +example, to insert one instance into a collection, we use:: + + var $data = { + "employee"; + { + 3; + "Joey"; + } + } + + var $result = db:insert($handle, $data); + +To insert a batch of instances, we use:: + + var $data = { + "employee"; + { + { + 1; + "Rachael"; + } + { + 2; + "Chandler"; + } + { + 3; + "Monica"; + } + } + } + + var $result = db:insert($handle, $data); + +db:insert() returns a result node and includes result of operation in status. +Status is returned as ok in case of success and error with message in case of +failure. + +db:update() +~~~~~~~~~~~ + +Used to update a set of instances matching given conditions with a new +provided instance. Takes database handle as first argument and input +as second:: + + var $input = { + "employee"; + { + { + { + "id"; + ">"; + "2"; + } + { + "name"; + "like"; + "Monica"; + } + } + } + { + "Ross"; + } + } + + var $result = db:update($handle, $input); + +Above example will update all the employee instances whose id is greater than +2 with names Monica, to Ross. db:update() returns result set like create/insert +with status of the operation. + +db:delete() +~~~~~~~~~~~ + +Used to delete instances matching given conditions. For example:: + + var $input = { + { + { + "id"; + ">"; + "4"; + } + } + 10; + } + + var $result = db:delete($handle, $input); + +Above operation deletes up to 10 employee instances whose id is greater than 4. +db:delete() returns result set with status similar to insert/update/create +operations + +db:find() +~~~~~~~~~ + +This call returns a cursor for instances matching given conditions. For +example:: + + var $query = { + "employee"; + { + "id"; + "desc"; + } + { + ; + } + { + { + "id"; + ">"; + "5"; + } + } + 10; + 5; + } + + var $cursor = db:find($handle, $query); + +Above example returns a cursor to result set containing names first 10 +employees skipping first 5 whose id is more than 5 sorted in descending order. +We will have to use db:fetch() call to retrieve each of these result +instances. + +db:fetch() +~~~~~~~~~~ + +This function call is used to fetch result instance using cursor returned +from find/query call:: + + var $result = db:fetch($cursor); + +Returned result contains status and with fields and values if +available. Status will be returned as if instance is available. It +will be if the query ran to completion and no more data is available +to be read. + +db:fetch() also takes an optional second argument that can be used to specify +additional data. This can be useful when fetching on the cursor returned from +custom query using db:query(). + +db:find-and-fetch() +~~~~~~~~~~~~~~~~~~~ + +This function call is used to find and read all the instances in one step. +Usage is as below:: + + var $result = db:find-and-fetch($handle, $query); + +Returned result contains all the available instances from the query and status +will be . "status" will be with message in case of errors. + +db:query() +~~~~~~~~~~ + +This function can be used to run custom queries. For example:: + + var $queryString = "INSERT INTO employee (id, name) " + _ "VALUES (@id, @name)"; + var $cursor = db:query($queryString); + + var $input = { + 11; + "Phoebe"; + } + + var $result = db:fetch($cursor, $input); + +Above example runs a custom query and receives cursor from db:query() +and used db:fetch() to insert data into employee collection using the +previous cursor. + +db:close() +~~~~~~~~~~ + +Used to close the database connection and free all the structures +associated with previous operations performed on this handle:: + + var $result = db:close($handle); + +The "xutil" Extension Library +----------------------------- + +The xutil extension library provides a number of XML- and XSLT-related +utility functions. + +"xutil" Extension Functions ++++++++++++++++++++++++++++ + +The "xutil" extension functions require the following ns statement:: + + ns xutil extension = "http://xml.libslax.org/xutil"; + +xutil:max-call-depth() +~~~~~~~~~~~~~~~~~~~~~~ + +SLAX and XSLT use recursion as a programming tool for iteration, but +unlimited recursion can lead to disaster. To avoid this, the libxslt +engine limits the depth of recursive calls to 3,000. This limit +should be find for almost all uses, but it the value is not suitable, +it can be adjusted using the xutil:max-call-depth() function. + +If invoked without an argument, the function returns the current +value. If a number is passed as the argument, that number is used as +the new max call depth limit:: + + EXAMPLE:: + var $limit = xutil:max-call-depth(); + expr xutil:max-call-depth($limit * 2); + +xutil:string-to-xml() +~~~~~~~~~~~~~~~~~~~~~ + +The xutil:string-to-xml() function turns a string containing XML data +into the native representation of that data:: + + EXAMPLE:: + var $data = "fred"; + var $xml = xutil:string-to-xml($data); + message "title is " _ $xml/title; + +Multiple strings can be passed, in which case, they will be +concatenated before the XML conversion:: + + EXAMPLE:: + var $xml2 = xutil:string-to-xml("", $content, " "red"; + var $str = xutil:xml-to-string($xml); + /* str is now the string "red" */ + +xutil:json-to-xml() +~~~~~~~~~~~~~~~~~~~ + +The xutil:json-to-xml() function turns a string containing JSON data +into the native representation of that data in XML:: + + EXAMPLE:: + var $data = "[ { "a" : 4, "name": "fish"}, 4, 5]"; + var $xml = xutil:json-to-xml($data); + message "title is " _ $xml/json/name; + +An optional second parameter contains a node set of the following +optional elements: + +========= ======== =========================================== + Element Value Description +========= ======== =========================================== + types "no" Do not encode type information + root string Name of root node to be returned ("json") +========= ======== =========================================== + +:: + + var $options = { + "my-top"; + "no"; + } + var $xml = xutil:json-to-xml($data, $options); + +The XML returned from json-to-xml() is decorated with attributes +(including the "type" and "name" attributes) which allow the data to +be converted back into JSON using xml-to-json(). Refer to that +function for additional information. + +For details on the JSON to XML encoding, refer to :ref:`json-attributes`, +:ref:`json-arrays`, and :ref:`json-names`. + +xutil:xml-to-json() +~~~~~~~~~~~~~~~~~~~ + +The xutil:xml-to-json() function turns XML content into a string of +JSON data. This is different than the normal XPath stringification, +which discards open and close tag. xml-to-json will encode tags as +JSON objects inside a string:: + + EXAMPLE:: + var $xml = { + "red"; + } + var $str = xutil:xml-to-json($xml); + /* str is now the string '{ "color": "red" }' */ + +An optional second parameter contains a node set of the following +optional elements: + +========= ============ ======================================== + Element Value Description +========= ============ ======================================== + pretty empty Add newlines and indentation to output + quotes "optional" Avoid quotes for names +========= ============ ======================================== + +For details on the JSON to XML encoding, refer to :ref:`json-attributes`, +:ref:`json-arrays`, and :ref:`json-names`. + +The "os" Extension Library +-------------------------- + +The "os" extension library provides a set of functions to invoke +operating system-related operations on the local host. Note that +these are _not_ run on the remote target, but on the machine where the +script is being executed. + +"os" Extension Functions +++++++++++++++++++++++++ + +The "os" extension functions require the following ns statement: + + ns os extension = "http://xml.libslax.org/os"; + +.. _error-nodes: + +Error Nodes +~~~~~~~~~~~ + +The return value of many os:* functions consists of a set of zero or +more error nodes. Each node may contain an element, which +in turn may contain the following elements: + +========= =================================== + Element Description +========= =================================== + errno Error message based on errno + path The path that triggered the error + message The error message +========= =================================== + +In addition, the element contains a "code" attribute which +holds the tag for the errno value, if known:: + + + No such file or directory + unknown group: phil + + +.. _chmod: + +os:chmod +~~~~~~~~ + +The os:chmod function changes the permissions of one or more files, +allowing or preventing different sets of users from accessing those +files. + +The first argument is a mode specification similar to the chmod +command, with either an octal number to set the permissions to, or an +expression consisting of one or more of the letters 'u', 'g', 'o', and +'a' (for user, group, other, and all) followed by '+' or '-' (for +setting or clearing) and one or more of the letters 'r', 'w', and 'x' +(for read, write, and execute). The expression "ug+rw" would give +read and write permission to the user and group which own the file or +directory. + +The second and subsequent arguments can be either a path name string +or a nodeset of , , and elements, with the +former two contain path for files and directories, and the latter +contains shell/glob-style wildcard patterns. The following patterns +are permitted: + +- '*' matches zero or more characters +- '?' matches any single character +- '[...]' matches any of the enclosed characters +- '{...}' matches any of the enclosed comma-separated sequences + +For example, "\*.txt" matches all text files:: + + SYNTAX:: + void os:chmod(mode, files, ...); + + EXAMPLE:: + $res = os:chmod("g+w", "file1", { + "test.test"; + "dir"; + "*.c"; + }); + +If successful, nothing is returned. On failure, a set of error nodes +is returned. See :ref:`error-nodes` for details. + +os:chown +~~~~~~~~ + +The os:chown function changes for owning user and group for one or +more files. + +The first argument is the target name and/or group, in either symbolic +or numeric format:: + + SYNTAX:: + [ ]? [ ':' ] + EXAMPLE: + phil + phil:eng + :eng + :12 + 0:0 + +The second and subsequent arguments can be either a path name string +or a nodeset of , , and elements. See +:ref:`chmod` for details:: + + SYNTAX:: + void os:chown(owner, files, ...); + + EXAMPLE:: + $res = os:chown(":eng", "file1", { + "test.test"; + "dir"; + "*.c"; + }); + +If successful, nothing is returned. On failure, a set of error nodes +is returned. See :ref:`error-nodes` for details. + +os:exit-code +~~~~~~~~~~~~ + +The os:exit-code function sets the exit code for the process running +the script. This can be used to indicate an error to the caller. The +argument to the function is the exit code value, in numeric form:: + + SYNTAX:: + void os:exit-code(number); + + EXAMPLE:: + expr os:exit-code(1); + +os:mkdir +~~~~~~~~ + +The os:mkdir function makes directories, similar to the "mkdir" +command or the POSIX "mkdir" library function. These are two +arguments; the first is name of the directory to be made and the +second is an node-set containing options to be used during the +operation. The options can include the values in the following table. + +========= ============================================== + Element Description +========= ============================================== + create Error if the last element of the path exists + mode Octal value of directory permissions + path Create intermediate directories as required +========= ============================================== + +:: + + SYNTAX:: + node-set os:mkdir(path [, options]); + + EXAMPLE:: + var $res = os:mkdir("/tmp/foo"); + var $opts = { + "0700"; + ; + ; + } + var $res2 = os:mkdir("/tmp/foo/a/b/c/d/e/f", $opts); + +If the value for is a string, it will be converted to an +integer using the default numeric base of 8 (octal), so ' "644"' +will work, but ' 644' will see 644 as a number with base 10 +(decimal), which will result in undesirable results since 644 base 10 +is 01204 base 8. + +If the value of is not a valid mode integer value, it will be +ignored. + +The return value of os:mkdir is a node-set which may contain an + element is an error occurred. This element may contain +the following elements: + +========= =================================== + Element Description +========= =================================== + errno Error message based on errno + path The path that triggered the error + message The error message +========= =================================== + +In addition, the element contains a "code" attribute which +holds the tag for the errno value, if known. + +If successful, nothing is returned. On failure, a set of error nodes +is returned. See :ref:`error-nodes` for details. + +os:remove +~~~~~~~~~ + +The os:remove function removes files and directories. The input +arguments are nodesets containing either strings or XML content. The +XML nodes can be either , , or elements +containing the name of a file, directory, or glob-style wildcard +expression to remove. Directories must be empty. If an nodeset +member is a string, it defaults to :: + + var $file = { expr "/tmp/some-file"; } + var $dir = { expr "/tmp/some-dir"; } + var $wild = { expr "/tmp/some-*-wild"; } + var $res = os:remove("/tmp/another-file", $file, $dir, $wild); + { copy-of $res; } + +os:stat +~~~~~~~ + +The os:stat function returns information about files and directories, +similar to the POSIX stat() function, returning a node-set of +elements containing details about each file. + +The arguments to the os:stat() function are either strings or +node-sets. os:stat() allows any number of arguments. If the argument +is a string, it is used as a path specification and information on +matching files is returned. The path specification can include +glob-style wildcards (e.g. test\*.c, \*.slax). If the argument is a +node-set, then the node can contains the following elements: + +========= ============================================== + Element Description +========= ============================================== + brief Only summary information is emitted + depth The number of subdirectory levels to descend + hidden Return information on hidden files + name File specification (same as string argument) + recurse Show all subdirectories +========= ============================================== + +Note the element functions identically to the string argument +details given above:: + + var $files = os:stat("/etc/m*"); + var $options = { + ; + 3; + } + var $logs = os:stat("/var/log/*txt", $options); + for-each ($logs) { + message name _ " is a " _ type; + } + +The return value is a node-set of elements. Each entry +contains the following elements: + +================ ====================================== ======= + Element Description Brief +================ ====================================== ======= + name Path to the entry Y + type Type of file (see below) Y + executable Present if entry is executable Y + symlink Present if entry is a symbolic link Y + symlink-target Contents of the symbolic link N + permissions Permissions for the entry N + owner Name of the owning user N + group Name of the owning group N + links Number of hard links to this entry N + size Number of bytes used by the entry N + date Time and date of last modification N + entry Directory contents N +================ ====================================== ======= + +Only elements tagged "Y" are emitted when the option is used. + +The element contains one of the following: + +=========== ======================================= + Value Description +=========== ======================================= + directory Directory containing additional files + file Regular file + character Character-oriented device (tty) + block Block-oriented device (disk) + link Symbolic link + socket AF_UNIX Socket + fifo Named pipe (First-in/first-out) + unknown Other/unknown file type +=========== ======================================= + +In some cases, attributes are used to attach useful information to +elements. The following table lists these attributes and values. + +============= =========== ================================== + Element Attribute Description +============= =========== ================================== + permissions mode Octal value for the mode + owner uid Numeric value of the user's uid + group gid Numeric value of the group's gid + date date Seconds since Jan 1, 1970 +============= =========== ================================== + +os:user-info +~~~~~~~~~~~~ + +The os:user-info helps know the details of user running the script. + +:: + + var $userinfo = os:user-info(); + +This function returns a user element with following information + +========== ================================================== + Element Description +========== ================================================== + class User class (if available) + dir User home directory + gecos User information + name Username + shell User shell program +========== ================================================== + +This functions returns empty when an error occurs. From e53f035174ebbd72cc7acf48b40aa20a57ffd49e Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:24 -0500 Subject: [PATCH 030/104] Move documentation to Sphinx/RST --- doc/functions.rst | 302 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 302 insertions(+) create mode 100644 doc/functions.rst diff --git a/doc/functions.rst b/doc/functions.rst new file mode 100644 index 00000000..155ffc22 --- /dev/null +++ b/doc/functions.rst @@ -0,0 +1,302 @@ + +============== +SLAX Functions +============== + +SLAX includes a number of utility functions, both for internal and +external use. This section documents the external functions. + +SLAX External Functions +----------------------- + +SLAX defines a set of built-in extension functions. When one of these +functions is referenced, the SLAX namespace is automatically added to +the script. + +slax:base64-decode +++++++++++++++++++ + +Use the slax:base64-decode function to decode BASE64 encoded data. +BASE64 is means of encoding arbitrary data into a radix-64 format +that can be more easily transmitted, typically via STMP or HTTP. + +The argument is a string of BASE64 encoded data and an option string +which is used to replace any non-XML control characters, if any, in +the decoded string. If this argument is an empty string, then non-xml +characters will be removed. The decoded data is returned to the caller. + +:: + + SYNTAX:: + string slax:base64-decode(string [,control]) + + EXAMPLE:: + var $real-data = slax:base64-decode($encoded-data, "@"); + +slax:base64-encode +++++++++++++++++++ + +Use the slax:base64-encode function to encode a string of data in the +BASE64 encoding format. BASE64 is means of encoding arbitrary data +into a radix-64 format that can be more easily transmitted, typically +via STMP or HTTP. + +The argument is a string of data, and the encoded data is returned. + +:: + + SYNTAX:: + string slax:base64-encode(string) + + EXAMPLE:: + var $encoded-data = slax:base64-encode($real-data); + +slax:break-lines +++++++++++++++++ + +Use the slax:break-lines function to break multi-line text content +into multiple elements, each containing a single line of text. + +:: + + SYNTAX:: + node-set slax:break-lines(node-set) + + EXAMPLE:: + var $lines = slax:break-lines(.//p); + for-each ($lines) { + if (start-with("pfe:", .)) { + .; + } + } + +For historical reasons, this function is also available using the name +"slax:break_lines" (with an underscore instead of a dash). Scripts +should however avoid using this name. + +slax:dampen ++++++++++++ + +Use the slax:dampen() function to limit the rate of occurrence of a +named event. If slax:dampen() is called more than "max" times in +"time-period" minutes, it will return "true", allowing the caller to +react to this condition. + +:: + + SYNTAX:: + boolean slax:dampen(name, max, time-period) + + EXAMPLE:: + if (slax:dampen("reset", 2, 10)) { + message "reset avoided"; + } else { + ; + } + +slax:document ++++++++++++++ + +Use the slax:document() function to read a data from a file or URL. +The data can be encoded in any character set (defaulting to "utf-8") +and can be BASE64 encoded. In addition, non-XML control characters, +if any, can be replaced. + +:: + + SYNTAX:: + string slax:document(url [, options]) + + EXAMPLE:: + var $data = slax:document($url); + + var $options := { + "ascii"; + "base64"; + "#"; + } + var $data2 = slax:document($url, $options); + +============ ============================================= + Option Description +============ ============================================= + Character encoding scheme ("utf-8") + "base64" for BASE64-encoded data + Replace non-xml characters with this string +============ ============================================= + +If the value is an empty string, then non-xml characters +will be removed, otherwise they will be replaced with the given +string. + +slax:evaluate ++++++++++++++ + +Use the slax:evaluate() function to evaluate a SLAX expression. This +permits expressions using the extended syntax that SLAX provides in +addition to what is allowed in XPath (see :ref:`expressions`). The +results of the expression are returned. + +:: + + SYNTAX:: + object slax:evaluate(expression) + + EXAMPLE:: + var $result = slax:evaluate("expr[name == '&']"); + +slax:first-of ++++++++++++++ + +Use the slax:first-of() function to find the first value present in a +test of arguments. The first non-empty or non-zero length string will +be returned. + +:: + + SYNTAX:: + object slax:first-of(object+) + + EXAMPLE:: + var $title = slax:first-of(@title, $title, "Unknown"); + +slax:get-command +++++++++++++++++ + +Use the slax:get-command() function to return an input string provided +by the user in response to a given prompt string. If the "readline" +(or "libedit") library was found at install time, the returned value +is entered in the readline history, and will be available via the +readline history keystrokes (Control-P and Control-N). + +:: + + SYNTAX:: + string slax:get-command(prompt) + + EXAMPLE:: + var $response = slax:get-command("# "); + +slax:get-input +++++++++++++++ + +Use the slax:get-input() function to return an input string provided +by the user in response to a given prompt string. + +:: + + SYNTAX:: + string slax:get-input(prompt) + + EXAMPLE:: + var $response = slax:get-input("Enter peer address: "); + +slax:get-secret ++++++++++++++++ + +Use the slax:get-secret() function to return an input string provided +by the user in response to a given prompt string. Any text entered by +the user will not be displayed or echoed back to the user, making this +function suitable for obtaining secret information such as passwords. + +:: + + SYNTAX:: + string slax:get-secret(prompt) + + EXAMPLE:: + var $response = slax:get-secret("Enter password: "); + +slax:is-empty ++++++++++++++ + +Use the slax:is-empty() function to determine if a node-set or RTF is +truly empty. + +:: + + SYNTAX:: + boolean slax:is-empty(object) + + EXAMPLE:: + if (slax:is-empty($result)) { + message "missing result"; + } + +slax:printf ++++++++++++ + +Use the slax:printf() function to format text in the manner of the +standard "C" "printf" function (printf(3)). The normal printf format +values are honored, as are a number of "%j" extensions. + +============= ===================================== + Format Description +============= ===================================== + "%jcs" Capitalize first letter + "%jt{TAG}s" Prepend TAG if string is not empty + "%j1s" Skip field if value has not changed +============= ===================================== + +:: + + SYNTAX:: + string slax:printf(format, string*) + + EXAMPLE:: + for-each (article) { + for-each (author) { + message slax:printf("%8j1s%8s%8jcj1s %jt{b:}s", + ../title, name, dept, born); + } + } + +slax:regex +++++++++++ + +:: + + SYNTAX:: + node-set slax:regex(pattern, string, opts?) + +Match a regex, returning a node set of the full string matched plus any parenthesized matches. Options include "b", "i", "n", "^", and "$", for boolean results, ICASE, NEWLINE, NOTBOL, and NOTEOL. + +slax:sleep +++++++++++ + +:: + + SYNTAX:: + void slax:sleep(seconds, milliseconds) + +Sleep for a given time period. + +slax:split +++++++++++ + +:: + + SYNTAX:: + node-set slax:split(pattern, string, limit) + +Break a string into a set of elements, up to the limit times, at the pattern. + +slax:sysctl ++++++++++++ + +:: + + SYNTAX:: + string slax:sysctl(name, format) + +Retrieve a sysctl variable. Format is "i" or "s". + +slax:syslog ++++++++++++ + +:: + + SYNTAX:: + void slax:syslog(priority, string+) + +Syslog the concatenation of set of arguments. From d08523b9c9e88a36a5ed01cb3adf0bfd0d4a36fa Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:25 -0500 Subject: [PATCH 031/104] Move documentation to Sphinx/RST --- doc/more-statements.rst | 458 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 458 insertions(+) create mode 100644 doc/more-statements.rst diff --git a/doc/more-statements.rst b/doc/more-statements.rst new file mode 100644 index 00000000..8b333e9d --- /dev/null +++ b/doc/more-statements.rst @@ -0,0 +1,458 @@ + +========================== +Additional SLAX Statements +========================== + +This section contains statements and constructs that don't easily +fit into other categories. + +The "#!" Line +------------- + +If the first line of a SLAX script begins with the characters "#!", +the rest of that line is ignored. This allows scripts to be invoked +directly by name on a unix command line. + +See :ref:`slaxproc-arguments` for details about the slaxproc utility +argument handling and the "#!" line. + +Additional details are available at the following site: + + http://en.wikipedia.org/wiki/Shebang_%28Unix%29 + +.. admonition:: Potato, tomato + + Personally, I've never heard it pronounced "shebang" before; we + call it "pound-bang" around here, just as we say "pound define" + rather than "hash define". + +.. _include-import: + +Combining Scripts (`include` and `import`) +------------------------------------------ + +Scripts files can use multiple source files, allowing library files to +be shared among a number of source files. The `import` and `include` +statements incorporate the templates and functions from one file into +another, allowing them to be used implicitly or explicitly by the XSLT +engine. Files need not be SLAX files, but can be traditional XSLT +files. + +:: + + include "foo.slax"; + import "goo.xsl"; + +A script may include another script using the `include` statement. +Content from included files is conceptually inserted into the script +at the point where the `include` statement is used. The `import` +statement works similarly, but the contents of an imported file are +given a lower priority (for expression matching and template or +function redefinition). Conceptually, imported files are inserted at +the top of the script, in the order in which they are given in the +source files. + +Import and include documents do _not_ need to be in written in SLAX. +SLAX can import and include normal XSLT documents. + +.. admonition:: XSLT Equivalent + + https://www.w3.org/TR/1999/REC-xslt-19991116#section-Combining-Stylesheets + + The `include` and `import` statements mimic the and + elements. The following is the XSLT equivalent of + the above example:: + + + + +.. _key: + +The `key` Statement +------------------- + +The `key` statement defines a key for use by the "key()" XPath +function. Keys allow a script to locate nodes in a document that are +referenced by other nodes. Each key definition indicates the nodes on +which the key is defined and the value of the key. The key() function +can then be used to locate the appropriate node. + +:: + + SYNTAX:: + 'key' key-name '{' + 'match' match-expression ';' + 'value value-expression ';' + '}' + +The `key-name` uniquely identifies the key within the script, and is +passed as the first argument to the key() function. The `match` +statement gives an XPath expression selecting the set of nodes on +which the keys are found, and the `value` statement gives an XPath +expression for the value of the key. + +:: + + key func { + match prototype; + value @name; + } + +.. admonition:: XSLT Equivalent + + https://www.w3.org/TR/1999/REC-xslt-19991116#key + +.. _decimal-format: + +The `decimal-format` Statement +------------------------------ + +The `decimal-format` statement defines formatting parameters for use +by the format-number() XPath function. + +:: + + SYNTAX:: + 'decimal-format' format-name ';' + 'decimal-format' format-name '{' + 'decimal-separator' data_value ';' + 'grouping-separator' data_value ';' + 'infinity' data_value ';' + 'minus-sign' data_value ';' + 'nan' data_value ';' + 'percent' data_value ';' + 'per-mille' data_value ';' + 'zero-digit' data_value ';' + 'digit' data_value ';' + 'pattern-separator' data_value ';' + '}' + +The format-name is the name passed as the third argument to the +format-number() XPath function. The statements under the +`decimal-format` statement follow the meaning of their counterparts +under the element, as detailed in the reference +below. + +:: + + decimal-format us { + decimal-separator "."; + grouping-separator ","; + } + decimal-format eu { + decimal-separator ","; + grouping-separator "."; + } + + match / { + { + format-number(24535.2, "###.###,00", "eu"); + format-number(24535.2, "###,###.00", "us"); + } + } + +.. admonition:: XSLT Equivalent + + https://www.w3.org/TR/1999/REC-xslt-19991116#format-number + +Messages +-------- + +Typical scripts work by generating XML content as a result tree, but +occasionally a script may need to make explicit, immediate output. +The statements in this section allow for such output. + +.. _message: + +The `message` Statement ++++++++++++++++++++++++ + +The `message` statement allows output to be generated immediately, +without waiting until the script generates its final result tree. + +:: + + SYNTAX:: + 'message' message-expression ';' + 'message' '{' + block-statements + '}' + + if (not(valid)) { + message name() _ " invalid"; + } else if (failed) { + message { + expr "Failed"; + if ($count > 1) { + expr ", again!"; + } + } + } + +The message-expression is an XPath expression that is emitted as +output, typically on the standard error file descriptor. +Alternatively, a block of statements can be used to generate the +content of the message. The output of the block will be converted to +a string using the normal XSLT rules. + +.. admonition:: XSLT Equivalent + + https://www.w3.org/TR/1999/REC-xslt-19991116#message + + The following is the XSLT equivalent of the above example:: + + + + + + + + + + Failed + + , again! + + + + + +.. _terminate: + +The `terminate` Statement ++++++++++++++++++++++++++ + +The `terminate` statement can be used to deliver a message to the user +and then exit the script. + +:: + + SYNTAX:: + 'terminate' message-expression ';' + 'terminate' '{' + block-statements + '}' + +The `terminate` statement mimics :ref:`message`. The +message-expression is an XPath expression that is emitted as output, +like the `message` statement. Alternatively, a block of statements +can be used to generate the content of the message. The output of the +block will be converted to a string using the normal XSLT rules. + +After emitting the message, the script stops any further processing. + +.. _trace: + +The `trace` Statement ++++++++++++++++++++++ + +Trace output is vital to writing, debugging, and maintaining scripts. +SLAX introduces a trace facility that will record XPath expressions or +template contents in a trace file. If tracing is not enabled, then +the trace template is not evaluated and no trace output is generated. +The enabling of tracing and the naming of trace files is not covered +here, since it is typically a feature of the environment in which a +SLAX script is called. For example, the `slaxproc` command uses the +`-t` and `-T file` to enable tracing. + +:: + + SYNTAX:: + 'trace' trace-message ';' + 'trace' '{' + trace-template + '}' + +The trace-message is an XPath expression that is written to the trace +file. The trace-template is executed and the results are written to +the trace file. + +:: + + trace "max " _ $max _ "; min " _ $min; + trace { + $max; + $min; + } + trace { + if ($my-trace-flag) { + expr "max " _ $max _ "; min " _ $min; + copy-of options; + } + } + +Since `trace` is non-standard, it can only be used when the associated +extension functions are present, such as with the `libslax` software. + +.. _output-method: + +The `output-method` Statement +----------------------------- + +The `output-method` statement defines the output style to be used when +outputing the result tree. + +:: + + SYNTAX:: + 'output-method' [style] '{' + 'version' data_value ';' + 'encoding' data_value ';' + 'omit-xml-declaration' data_value ';' + 'standalone' data_value ';' + 'doctype-public' data_value ';' + 'doctype-system' data_value ';' + 'cdata-section-elements' cdata_section_element_list ';' + 'indent' data_value ';' + 'media-type' data_value ';' + '}' + +The style can be `xml`, `html`, or `text` (without quotes). + +======================== ====================================== + Statement Description +======================== ====================================== + version Version number of output method + encoding Character set + omit-xml-declaration (yes/no) Omit initial XML DECL + standalone (yes/no) Emit standalone declaration + doctype-public Public identifier in DTD + doctype-system System identifier in DTD + cdata-section-elements List of elements to use CDATA + indent (yes/no) Emit pretty indentation + media-type MIME type for document +======================== ====================================== + +.. admonition:: XSLT Equivalent + + https://www.w3.org/TR/1999/REC-xslt-19991116#output + + The substatements of `output-method` correspond to the attributes of + the XSLT element. + + +.. _fallback: + +The `fallback` Statement +------------------------ + +The `fallback` statement directs the XSLT engine to perform a block of +code when an extension element is invoked which is not supported. + +:: + + SYNTAX:: + 'fallback' '{' statements '}' + + EXAMPLE:: + if ($working) { + "thing"; + fallback { + message "nothing fancy, please"; + } + } + +Whitespace Handling +------------------- + +SLAX includes a means of retaining or removing text nodes that contain +only whitespace. Whitespace for XML is the space, tab, newline or +carriage return characters. + +.. _strip-space: + +The `strip-space` Statement ++++++++++++++++++++++++++++ + +The `strip-space` statement tells the engine to discard the given +elements if they contain only whitespace. + +:: + + SYNTAX:: + 'strip-space' list-of-element-names ';' + +The list-of-element-names is a space separated list of element names +that should have their contents discarded if they contain only +whitespace:: + + strip-space section paragraph bullet; + +.. admonition:: XSLT Equivalent + + https://www.w3.org/TR/1999/REC-xslt-19991116#strip + + The `strip-space` statement mimics the element. + The following is the XSLT equivalent of the above example:: + + + +.. _preserve-space: + +The `preserve-space` Statement +++++++++++++++++++++++++++++++ + +The `preserve-space` statement works similar to the `strip-space` +statement, but with the opposite result. + +:: + + SYNTAX:: + 'preserve-space' list-of-element-names ';' + +The list-of-element-names is a space separated list of element names +that should have their contents retained even if they contain only +whitespace. + +:: + + preserve-space art picture line; + +.. admonition:: XSLT Equivalent + + https://www.w3.org/TR/1999/REC-xslt-19991116#strip + + The `preserve-space` statement mimics the + element. The following is the XSLT equivalent of the above + example:: + + + +.. _version: + +The `version` Statement +----------------------- + +The `version` statement contains the current version of the SLAX +language, allowing scripts and interpreters to progress independently. +Old engines will not understand new constructs and should stop with an +error when a version number that is unknown to them is seen. New +engines should accept any previous language version number, so allow +old scripts to run on new engines. + +:: + + SYNTAX:: + 'version' version-number ';' + +The version-number should be either "1.2", "1.1" or "1.0". The +current version is "1.2" and newly developed scripts should use this +version number. + +:: + + version 1.2; + +All SLAX stylesheets must begin with a `version` statement, which +gives the version number for the SLAX language. This is currently +fixed at "1.2" and will increase as the language evolves. Version 1.2 +is completely backward compatible with version 1.1, which is in turn +completely backward compatible with version 1.0. Newer versions add +additional functionality that may cause issues when used with earlier +implementations of SLAX. + +SLAX version 1.2 implies XML version 1.0 and XSLT version 1.1. + +In addition, the "xsl" namespace is implicitly defined (as +'xmlns:xsl="http://www.w3.org/1999/XSL/Transform"'). From 5b8da9733d3c7c1aea851b56dc55f9030085a929 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:26 -0500 Subject: [PATCH 032/104] Move documentation to Sphinx/RST --- doc/notes.rst | 460 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 460 insertions(+) create mode 100644 doc/notes.rst diff --git a/doc/notes.rst b/doc/notes.rst new file mode 100644 index 00000000..929c29f0 --- /dev/null +++ b/doc/notes.rst @@ -0,0 +1,460 @@ + +================ +Additional Notes +================ + +This section contains additional notes regarding SLAX, libslax, its +history, problems, and future. + +Language Notes +-------------- + +This section includes discussion of SLAX language issues. + +Type Promotion for XPath Expressions +++++++++++++++++++++++++++++++++++++ + +XPath expressions use a style of type promotion that coerces values +into the particular type needed for the expression. For example, if +a predicate refers to a node, then that predicate is true if the node +exists. The value of the node is not considered, just it's +existence. + +For example, the expression "chapter[section]" selects all +chapters that have a section element as a child. + +Similarly, if a predicate uses a function that needs a string, the +argument is converted to a string value by concatenating all the text +values of that node and all that node's child elements. + +For example, the expression "chapter[starts-with(section, 'A')]" will +inspect all elements, convert their
elements to +strings, and select those whose string value starts with 'A'. This +may be an expensive operation. + +.. _ternary-operator: + +The Ternary Conditional Operator +++++++++++++++++++++++++++++++++ + +As the last touch to SLAX-1.1, I've added the ternary operator from C, +allowing expressions like:: + + var $a = $b ? $c : $d; + var $e = $f ?: $g; + +The caveat is that this uses an extension function slax:value() which +may not be available in all XSLT environments. Coders must consider +whether should a restriction deems this operator unusable. Portability +considerations are identical to mutable variables (mvars). + +Mutable Variables ++++++++++++++++++ + +XSLT has immutable variables. This was done to support various +optimizations and advanced streaming functionality. But it remains one +of the most painful parts of XSLT. We use SLAX in JUNOS and provide +the ability to perform XML-based RPCs to local and remote JUNOS +boxes. One RPC allows the script to store and retrieve values in an +SNMP MIB (the jnxUtility MIB). We have users using this to "fake" +mutable variables, so for our environment, any theoretical arguments +against the value of mutable variables are lost. They are happening, +and the question becomes whether we want to force script writers into +mental anguish to allow them. + +Yes, exactly. That was an apologetical defense of the following code, +which implements mutable variables. Dio, abbi pieta della mia anima. + +The rest of this section contacts mind-numbing comments on the +implementation and inner working of mutable variables. + +For the typical scriptor, the important implications are: + +- Non-standard feature: mutable variables are not available outside + the libslax environment. This will significantly affect the + portability of your scripts. Avoid mutable variables if you want to + use your scripts in other XSLT implementations or without libslax. + +- Memory Overhead: Due to the lifespan of XML elements and RTFs inside + libxslt, mutable variables must retain copies of their previous + values (when non-scalar values are used) to avoid dangling + references. This means that heavy use of mutable variables will + significantly affect memory overhead, until the mutable variables + fall out of scope. + +- Axis Implications: Since values for mutable variables are copied + (see above), the operations of axes will be affected. This is a + relatively minor issue, but should be noted. + +Let's consider the memory issues associated with mutable variables. +libxslt gives two ways to track memory WRT garbage collection: + +contexts + as RTF/RVT (type XPATH_XSLT_TREE) + +variables + strings (simple; forget I even mentioned them) or node + sets (type XPATH_NODESET) + +via the nodesetval field + does not track nodes, but references nodes in other trees + +The key is that by having node sets refer to nodes "in situ" where +they reside on other documents, the idea of refering to nodes in the +input document is preserved. Node sets don't require an additional +memory hook or a reference count. + +The key functions here are xmlXPathNewValueTree() and +xmlXPathNewNodeSet(). Both return a fresh xmlXPathObject, but +xmlXPathNewValueTree will set the xmlXPathObject's "boolval" to 1, +which tells xmlXPathFreeObject() to free the nodes contained in a +nodeset, not just the nodeTab that holds the references. + +Also note that if one of the nodes in the node set is a document (type +XML_DOCUMENT_NODE) then xmlFreeDoc() is called to free the +document. For RTFs, the only member of the nodeset is the root of the +document, so freeing that node will free the entire document. + +All this works well for immutable objects and RTFs, but does not allow +my mutable variables to work cleanly. This is quite annoying. + +I need to allow a variable to hold a nodeset, a document, or a scalar +value, without caring about the previous value. But I need to hold on +to the previous values to allow others to refer to them without +dangling references. Dangling References + +Consider the following input document:: + + + + + + + +The following code makes a nodeset (type XPATH_NODESET) whose nodeTab +array points into the input document:: + + var $x = top/*[starts-with("x", name())]; + +The following code make an RTF/RVT (type XPATH_XSLT_TREE), whose +"fake" document contains a root element (type XML_DOCUMENT_NODE) that +contains the "top" element node. + +:: + + var $y = { + ; + ; + ; + } + +The following code makes a nodeset (type XPATH_NODESET) that refers to +nodes in the "fake" document under $y:: + + var $z = $y/*[starts-with("x", name())]; + +Now consider the following code:: + + mvar $z = $y/*[starts-with("x", name())]; + var $a = $z[1]; + if ($a) { + set $z = "a"; /* RVT */ + var $b = $z[1]; /* refers to nodes in "fake" $y doc */ + set $z = "b"; /* RVT */ + var $c = $z[1]; /* refers to node in RVT */ + $a; + $b; + $c; + } + +In this chunk of code, the changing value of $z cannot change the +nodes recorded as the values of $a, $b, or $c. Since I can't count on +the context or variable memory garbage collections, my only choice is +to roll my own. This is quite annoying. + +The only means of retaining arbitrary previous values of a mutable +variable is to have a complete history of previous values. + +The "overhead" for an mvar must contain all previous values for the +mvar, so references to the node in the mvar (from other variables) +don't become dangling when those values are freed. This is not true +for scalar values that do not set the nodesetval field. + +Yes, this is pretty much as ugly as it sounds. After a variable has +been made, it cannot be changed without being risking impacting +existing references to it. + +So a mutable variable needs to make two things, a real variable, whose +value can be munged at will, and a hook to handle memory management. + +The Rules + +- Assigning a scalar value to an mvar just sets the variables value + (var->value). + +- Assigning a non-scalar value to an mvar means making deep copy, + keeping this copy in "overhead". + +But where does the "overhead" live? + +In classic SLAX style, the overhead is kept in a shadow variable. The +shadow variable (svar) holds an RTF/RVT that contains all the nodes +ever assigned to the variable, a living history of all values of the +variable. + +We don't need to record scalar values, so:: + + mvar $x = 4; + +becomes:: + + + + +But for RTFs, the content must be preserved, so:: + + mvar $x = "one"; + +becomes:: + + + one + + + +where slax:mvar-init() is an extension function that returns the value +of another variable, either as a straight value or as a nodeset. + +If an mvar is only ever assigned scalar values, the svar will not be +touched. When a non-scalar value is assigned to an mvar, the content +is copied to the svar and the mvar is given a nodeset that refers to +the content inside the svar. Appending to a mvar means adding that +content to the svar and then appending the node pointers to the mvar. + +If the mvar has a scalar value, appending discards that value. If the +appended value is a scalar value, then the value is simply assigned to +the mvar. This will be hopelessly confusing, but there's little that +can be done, since appending to an RTF to a number or a number to an +RTF makes little sense. We will raise an error for this condition, to +let the scriptor know what's going on. Memory + +When the mvar is freed, its "boolval" is zero, so the nodes are not +touched but the nodesetval/nodeTab are freed. When the svar is freed, +its "boolval" is non-zero, so xmlXPathFreeObject will free the nodes +referenced in the nodesetval's nodeTab. The only node there will be +the root document of a "fake" RTF document, which will contain all the +historical values of the mvar. In short, the normal libxslt memory +management will wipe up after us. Implications + +The chief implications are: + +- memory utilization -- mvar assignments are very sticky and only + released when the mvar (and its svar) go out of scope + +- axis -- since the document that contains the mvar contents is a + living document, code cannot depend on an axis staying + unchanged. I'm not sure of what this means yet, but following::foo + is a nodeset that may change over time, though it won't change + once fetched (e.g. into a specific variable). + +Historical Notes +---------------- + +This section discusses some historical issues with SLAX and libslax. + +Why on earth did you make SLAX? ++++++++++++++++++++++++++++++++ + +I have worked with XSLT for over ten years, as part of my work for +Juniper Networks. Beginning in 2001, we made an XML API for our line +of routers so that any command that can be issued at the command line +(CLI) can be issued as an XML RPC and the response received in +XML. This work was the foundation for the IETF NETCONF protocol +(RFC6241) (see also RFC6244). + +Internally, we used this API with XSLT to make our Junoscope network +management platform, and were happy working with XSLT using multiple +XSLT implementations. + +In the 2005-2006 timeframe, we started developing on-box script +capabilities using XSLT. I like the niche and properties of XSLT, but +the syntax makes development and maintenance problematic. First class +constructs are buried in attributes, with unreadable +encodings. Customers objections were fairly strong, and they asked for +a more perl-like syntax. SLAX was our answer. + +SLAX simplifies the syntax of XSLT, making an encoding that makes +scripts more readable, maintainable, and helps the reader to see +what's going on. XML escaping is replaced by unix/perl/c-style +escaping. Control elements like are replaced with the +familiar "if" statement. Minor details are more transparent. + +The majority of our scripts are simple, following the pattern:: + + if (find/something/bad) { + call error($message = "found something bad"); + } + +The integration of XPath into familiar control statements make the +script writers job fairly trivial. + +At the same time, using XSLT constrains our scripting environment and +limits what scripts can and cannot do. We do not need to worry about +system access, processes, connections, sockets, or other features that +are easily available in perl or other scripting languages. The scripts +emit XML that instructs our environment on what actions to take, so +those actions can be controlled. + +So SLAX meets our needs. I hope making this an open source projects +allows it to be useful to a broader community. + +Why the name conflict? +++++++++++++++++++++++ + +The SLAX language is named for "eXtensible Stylesheet Language Alternate +syntaX". Juniper started development on SLAX as part of the on-box +scripting features in the 2004/2005 time frame. The name "SLAX" was +adopted after the Juniper management requested that we remove the +leading "X" from the original internal name. + +What about the SLAX linux distro? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +At about this same time, the "SLAX" linux distro was named, but not +being involved in the linux world (we're a FreeBSD house), we were not +aware of this name conflict for many years. + +When we were made aware of the name conflict, we consulted with +various parts of the Juniper family, and no one was interested in +changing the language name. We repeated this procedure as we were +publishing this open source version, but again, no one was interested +in doing the internal and external work to change the language name, +since the name conflict was considered minor and not an issue for our +customers. + +Developers Notes +---------------- + +This section contains notes for developers wanting to work on or near +libslax. + +Dynamic Extension Libraries ++++++++++++++++++++++++++++ + +libslax provides a means of dynamically loading extension libraries +based on the contents of the "extension-element-prefixes" +attribute. During initialization, a parsed SLAX document is inspected +for both the "extension-element-prefix" attribute on the +element, and the "xsl:extension-element-prefix" on arbitrary tags. + +The prefixes found in the document are translated into namespace URIs, +which are then escaped using the URL-escaping algorithm that turns +unacceptable characters into three character strings like "%2F". + +An extension of ".ext" is appended to the URL-escaped URI and this +file is searched but in ${SLAX_EXTDIR} and any directories given via +the "--lib/-L" argument. + +When the extension library is found, we dlopen() it and look for the +magic symbol "slaxDynLibInit". This function is called with two +arguments, the API version number and a struct that contains +information about the extension library. + +:: + + /* + * This structure is an interface between the libslax main code + * and the code in the extension library. This structure should + * only be extended by additions to the end. + */ + typedef struct slax_dyn_arg_s { + unsigned da_version; /* Version of the caller */ + void *da_handle; /* Handle from dlopen() */ + void *da_custom; /* Memory hook for the extension */ + char *da_uri; /* URI */ + slax_function_table_t *da_functions; /* Functions */ + slax_element_table_t *da_elements; /* Elements */ + } slax_dyn_arg_t; + +The da_functions and da_elements allow the library to register and +unregister there functions and elements. + +At cleanup time, in addition to removing functions and elements, a +search is made for the library to find the symbol +"slaxDynLibClean". If the symbol is found, it is called also. + +The file slaxdyn.h defines some macros for helping define extension +libraries. + +Default Prefixes for Extension Libraries +++++++++++++++++++++++++++++++++++++++++ + +When a default prefix is used with an extension library, the prefix is +mapped to the extension using a symbolic link ("ln -s"). The source +of the symlink should be the prefix with a ".prefix" appended and +should be located in the extension directory ("${SLAX_EXTDIR}"). The +target of the symlink should be the namespace URI with the escaping +and ".ext" extension as described above. + +See the Makefile.am file in any of the libslax extension directories +for examples of creating the appropriate symlink. + +Example ++++++++ + +Here's a quick example:: + + slax_function_table_t slaxBitTable[] = { + { "and", extBitAnd }, + { "or", extBitOr }, + { "nand", extBitNand }, + { "nor", extBitNor }, + { "xor", extBitXor }, + { "xnor", extBitXnor }, + { "not", extBitNot }, + { NULL, NULL }, + }; + + SLAX_DYN_FUNC(slaxDynLibInit) + { + /* Fill in our function table */ + arg->da_functions = slaxBitTable; + + return SLAX_DYN_VERSION; + } + +External Documentation +---------------------- + +My documentation style tends to be man-page-like, rather than +tutorial-ish. But folks at Juniper Networks have made some +outrageously great documentation and it's available on the Juniper +website. Many thanks for Curtis Call, Jeremy Schulman, and others for +doing this work. + +`Junos Automation Reference for SLAX 1.0`_ does not cover any of +the new SLAX-1.1 or -1.2 material, but is an incredible reference +book. + +.. _Junos Automation Reference for SLAX 1.0: + https://www.juniper.net/us/en/community/junos/training-certification/ + day-one/automation-series/junos-automation-slax/ + +`Mastering Junos Automation Programming`_ covers many introductory +tasks with a tutorial style. + +.. _Mastering Junos Automation Programming: + https://www.juniper.net/us/en/community/junos/training-certification/ + day-one/automation-series/mastering-junos-automation/ + +The `Script Library`_ contains a set of scripts that will help get you +started. + +.. _Script Library: + https://www.juniper.net/us/en/community/junos/script-automation/ + +Note these require Juniper-specific permissions, JNet logins, and +other hurdles. Apologies for the inconvenience. + +News! The Day One Guides are available for <$2 (some free) on the +itunes store! Search under books for "juniper". From 1fea57c1129ab4768da00fb7dab288305adf35e8 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:27 -0500 Subject: [PATCH 033/104] Move documentation to Sphinx/RST --- doc/slax.rst | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 doc/slax.rst diff --git a/doc/slax.rst b/doc/slax.rst new file mode 100644 index 00000000..29bc872e --- /dev/null +++ b/doc/slax.rst @@ -0,0 +1,67 @@ +.. # + # Copyright (c) 2014, Juniper Networks, Inc. + # All rights reserved. + # This SOFTWARE is licensed under the LICENSE provided in the + # ../Copyright file. By downloading, installing, copying, or + # using the SOFTWARE, you agree to be bound by the terms of that + # LICENSE. + # Phil Shafer, July 2014 + # + +XSLT is a commonly used transformation language for XML. It is a +declarative language that uses XPath expressions to inspect an XML +input document and can generate XML output based on that input +hierarchy. It's a simple but powerful tool for handling XML, but the +syntax is problematic for developers. + +XSLT uses an XML-based syntax, and while XML is great for +machine-to-machine communication, it is inconvenient for humans to +write, especially when writing programs. The occasional benefits of +having an XSLT stylesheet be an XML document are outweighed by the +readability issues of dealing with the syntax. + +SLAX has a simple syntax which follows the style of C and Perl. +Programming constructs and XPath expressions are moved from XML +elements and attributes to first class language constructs. XML angle +brackets and quotes is replaced by parentheses and curly braces +which are familiar delimiters for programmers. + +SLAX allows you to: + +- Use if/then/else instead of and elements +- Put test expressions in parentheses +- Use "==" to test equality (to avoid building dangerous habits) +- Use curly braces to show containment instead of closing tags +- Perform concatenation using the "_" operator (lifted from perl6) +- Perform simple logic using the "?:" operator +- Write text strings using simple quotes instead of the element +- Simplify invoking named templates with a syntax resembling a + function call +- Simplify defining named template with a syntax resembling a + function definition +- Simplify namespace declarations +- Reduce the clutter in scripts, allowing the important parts to be + more obvious to the reader +- Write more readable scripts + +The benefits of SLAX are particularly strong for new developers, since +it puts familiar constructs in familiar syntax, allowing them to +concentrate in the new topics introduced by XSLT. + +.. default-role:: code + +.. toctree:: + :maxdepth: 3 + :caption: Documentation Contents: + + concepts + content + templates + constructs + more-statements + functions + distribution + extensions + examples + notes + From c9b2e8e5438c07d2ccd9da5c98c0c70587f040a7 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 14 Dec 2017 20:45:28 -0500 Subject: [PATCH 034/104] Move documentation to Sphinx/RST --- doc/templates.rst | 542 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 542 insertions(+) create mode 100644 doc/templates.rst diff --git a/doc/templates.rst b/doc/templates.rst new file mode 100644 index 00000000..94d56b42 --- /dev/null +++ b/doc/templates.rst @@ -0,0 +1,542 @@ +.. templates: + +========= +Templates +========= + +A SLAX script consists of a set of templates. There are two types of +templates, match templates and named templates. This section +discusses each of these types. + +Named Templates +--------------- + +In addition to the template processing, templates can be given +explicit names and called directly, allowing a programming style that +follows more traditional procedural languages. Named templates are +called like function, returning their XML output nodes to the caller, +where they can be merged into the caller's XML output tree. + +.. _template: + +The `template` Statement +++++++++++++++++++++++++ + +Named templates are defined using their name and parameters and +invoked using the `call` statement. The template definition consists +of the `template` keyword, the template name, a set of parameters, and +a braces-delineated block of code. Parameter declarations can be +either inline, with the parameter name and optionally an equals sign +("=") and a value expression. Additional parameters can be declared +inside the block using the `param` statement. + +The template is invoked using the `call` statement, which consists of +the `call` keyword followed by a set of parameter bindings. These +binding are a comma-separated list of parameter names, optionally +followed by an equal sign and a value expression. If the value is not +given, the current value of that variable or parameter is passed, +giving a simple shorthand for passing parameters if common names are +used. Additional template parameters can be supplied inside the block +using the `with` statement. + +.. _call: + +The `call` Statement +++++++++++++++++++++ + +Named templates accept parameters by name, rather than by position. +This means the caller needs to indicate the name of the desired +parameter when passing a value:: + + call test($arg1 = 1, $arg4 = 4, $arg2 = 2); + +As a convenience, arguments with the same local name as the argument +name can be passed directly:: + + var $message = "test " _ $name _ " is " _ $status; + call emit-message($message) + +This is identical to "call emit-message($message = $message)", but is +simpler and the use of common names increased readability. + +The call statement can be used as the initial value of a variable or +parameter, without using an enclosing set of braces:: + + var $a = call test($a = 1); + +.. _with-call: + +Using the `with` Statement with `call` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In addition, template arguments can be passed using the `with` +statement. This statement is placed inside braces after the `call` +statement, and gives the parameter name and the value:: + + call test { + with $arg1 = 1; + with $arg4 = 4; + with $arg2 = 2; + } + +.. admonition:: Variables Always Use Dollar Signs + + Note that in SLAX parameter names are always prefixed with the + dollar sign ("$"). This is not true for XSLT, where the dollar + sign is not used when defining variables. + +The `with` statement is described in more detail below (:ref:`with`). + +Using Elements As Argument Values +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Beginning with SLAX-1.2, elements may be used directly as argument +values for templates. Arguments can be either a single element or +a block of SLAX code, placed inside braces:: + + call my-template($a = , $b = 15); + call test($params = { + 5; + 15; + if ($step) { + $step; + } + } + call write($content = { + "total.txt"; + $file/size; + if (node[@type == "full"]) { + ; + } + }); + +Combination Templates +~~~~~~~~~~~~~~~~~~~~~ + +While rarely used, XSLT allows named template to be used as match +templates. This is done using the `match` statement after the +`template` statement. For more information on `match` statements, see +:ref:`match`. + +:: + + SYNTAX:: + 'template' template-name 'match' xpath-expression '{' + template-contents + '}' + + template test match paragraph ($message) { + $message; + } + + match / { + call test($message = "called as named template"); + apply-templates { + with $message = "called as match template"; + } + } + +Example with XSLT Translation ++++++++++++++++++++++++++++++ + +This section includes a short example, along with the XSLT into which +the script translates. + +:: + + match configuration { + var $name-servers = name-servers/name; + call my:thing(); + call my:thing($name-servers, $size = count($name-servers)); + call my:thing() { + with $name-servers; + with $size = count($name-servers); + } + } + + template my:thing($name-servers, $size = 0) { + "template called with size " _ $size; + } + +The XSLT equivalent:: + + + + + + + + + + + + + + + + + + + + + + + +.. _match-templates: + +Match Templates +--------------- + +The processing model for SLAX is identical to that of XSLT. A set of +XML input nodes are processed to generate a set of XML output nodes. +This processing begins at the top of the XML input document and +proceeds recursively through the entire document, using rules defined +in the SLAX script, rules imported from other scripts, and a set of +default rules defined by the XSLT specification. + +Each rule defines the matching criteria that controls when the rule is +applied, followed by a template for the creation of the XML output +nodes. The processing engine inspects each node, finds the +appropriate rule that matches that node, executes the template +associated with the rules, builds the XML output nodes, and merges +those nodes with the XML output nodes from other rules to build the +XML output nodes. + +.. _match: + +The `match` Statement ++++++++++++++++++++++ + +The `match` statement defines a match template, with its matching +criteria and its template. The keyword `match` is followed by an +XPath expression that selects the nodes on which this template should +be executed. This is followed by a set of curly braces containing the +template. + +:: + + SYNTAX:: + 'match' xpath-expression '{' + template-contents + '}' + +The template consists of SLAX code, whose statements are defined later +in this document. + +:: + + match configuration { + { + "System is named " _ system/host-name; + } + } + +.. _apply-templates: + +The `apply-templates` Statement ++++++++++++++++++++++++++++++++ + +The `apply-templates` statement instructs the processing engine to +apply the set of templates given in the script to a set of nodes. The +statement takes as its argument an XPath expression that selects a set +of nodes to use. If no expression is given, the current node is used. + +The set of XML input nodes is processed according to the set of +templates, and the XML output nodes are given to the context in which +the apply-templates statement was issued. + +Match templates are applied using the `apply-templates` statement. + +:: + + match configuration { + apply-template system/host-name; + } + + match host-name { + .; + } + +.. admonition:: XSLT equivalent + + The following is the XSLT equivalent of the above example:: + + + + + + + + + + + +.. _apply-imports: + +The `apply-imports` Statement ++++++++++++++++++++++++++++++ + +The `apply-imports` statement mimics the element, +allowing the script to invoke any imported templates. + +:: + + apply-imports; + +.. admonition:: XSLT equivalent + + The following is the XSLT equivalent of the above example:: + + + +.. _mode: + +The `mode` Statement +++++++++++++++++++++ + +The `mode` statement allows the apply-template to choice a distinct +set of rules to use during processing. The argument to the `mode` +statement is a text string that identifies the mode for both the +template and the template processing. Templates processing will only +select templates that match the current mode value. If no mode +statement is given with an `apply-templates` invocation, then the +current mode remains in effect. + +This statement can appear inside a `match` statement, limited that +template to the given mode, and inside an `apply-templates` statement, +directing that only that templates matching that mode should be used. +The mode is not `sticky`, so additional `apply-templates` statements +should specify the proper mode. + +In this example, template processing is invoked twice, first for mode +"one" and then for mode "two". + +:: + + match * { + mode "one"; + .; + } + + match * { + mode "two"; + string-length(.); + } + + match / { + apply-templates version { + mode "one"; + } + apply-templates version { + mode "two"; + } + } + +.. admonition:: XSLT Equivalent + + https://www.w3.org/TR/1999/REC-xslt-19991116#modes + + The the `mode` statement mimics the "mode" attribute of the + element. The following is the XSLT equivalent of + the above example:: + + + + + + + + + + + + + + + + + + +.. _priority: + +The `priority` Statement +++++++++++++++++++++++++ + +The `priority` statement sets the priority of the template, which is +used as part of the conflict resolution when more that one template +matches a source node. The highest priority rule is chosen. The +argument to the `priority` statement is a real number (positive or +negative). The `priority` statement appears inside a `match` +statement. + +In this example, the template is given a high priority:: + + match * { + priority 10; + .; + } + +.. admonition:: XSLT Equivalent + + https://www.w3.org/TR/1999/REC-xslt-19991116#conflict + + The `priority` statement mimics the `priority` attribute of the + element. The following is the XSLT equivalent of + the above example:: + + + + + + + +.. _param: + +The `param` Statement ++++++++++++++++++++++ + +Template can accept parameters from their callers, and scripts can +accept parameters from the calling environment (typically the command +line). The `param` statement declares a parameter, along with an +optional default value. + +:: + + SYNTAX:: + 'param' parameter-name ';' + 'param' parameter-name '=' optional-value ';' + 'param' parameter-name '=' '{' value-block '}' + + EXAMPLE:: + param $address = "10.1.2.3"; + param $count = 25; + + templace count { + /* + * This defines a local parameter $count and sets + * its value to that of the global parameter $count. + */ + param $count = $count; + } + +Like variables, parameters are immutable. Once created, their value +cannot be changed. See :ref:`main-var` for a discussion on dealing with +immutable values. + +Template parameters can also be defined in a C style following the +template name:: + + template area ($width = 10, $length = 10, $scale = 1) { + $width * $length * $scale; + } + +.. _with: + +The `with` Statement +++++++++++++++++++++ + +The `with` statement supplies a value for a given parameter. + +:: + + call area { + with $length = 2; + with $width = 100; + with $max; + } + +Parameter values may also be passed using a C/perl style, but since +arguments in SLAX (and XSLT) are passed by name, the parameter names +are also given:: + + call area($width = 100, $length = 2, $max); + +If a parameter is not supplied with a value, the current value of that +parameter variable (in the current context) is used, meaning that:: + + with $max; + +is equivalent to:: + + with $max = $max; + +Parameters may be passed to match templates using the `with` +statement. The `with` statement consists of the keyword `with` and +the name of the parameter, optionally followed by an equals sign ("=") +and a value expression. If no value is given, the current value of +that variable or parameter (in the current scope) is passed, giving a +simple shorthand for passing parameters if common names are used. + +:: + + match configuration { + var $domain = domain-name; + apply-template system/host-name { + with $message = "Invalid host-name"; + with $domain; + } + } + + match host-name { + param $message = "Error"; + param $domain; + $message _ ":: " _ . _ " (" _ $domain _ ")"; + } + +.. admonition:: XSLT equivalent + + The following is the XSLT equivalent of the above example:: + + + + + + + + + + + + + + + + +.. _main-template: + +The `main` Template +------------------- + +The XSLT programming model used with SLAX calls for a traversal of the +input data hierarchy. Since the first step is typically the match of +the top of the hierarchy and the creation of the top-level tag of the +output hierarchy. The `main` statement allows both of these +objectives. Two forms of the statement are supported, with and +without the output tag. Without an output element, the `main` +template is equivalent to "match /". The token `main` is followed by +a block of statements within a set of braces:: + + main { + { + 42; + } + } + +The `main` template can also be used with a top-level output element +following the `main` token. The element can include attributes. + +:: + + main { + 42; + } + +Both of the preceding examples are equivalent to the following XSLT:: + + + + 42 + + From ec51b36f0e7e89274816d5e8a706777939c8ed89 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 15 Dec 2017 01:53:03 -0500 Subject: [PATCH 035/104] Ensure two spaces after periods --- doc/notes.rst | 78 +++++++++++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/doc/notes.rst b/doc/notes.rst index 929c29f0..492276fe 100644 --- a/doc/notes.rst +++ b/doc/notes.rst @@ -44,26 +44,26 @@ allowing expressions like:: var $e = $f ?: $g; The caveat is that this uses an extension function slax:value() which -may not be available in all XSLT environments. Coders must consider -whether should a restriction deems this operator unusable. Portability +may not be available in all XSLT environments. Coders must consider +whether should a restriction deems this operator unusable. Portability considerations are identical to mutable variables (mvars). Mutable Variables +++++++++++++++++ -XSLT has immutable variables. This was done to support various -optimizations and advanced streaming functionality. But it remains one -of the most painful parts of XSLT. We use SLAX in JUNOS and provide +XSLT has immutable variables. This was done to support various +optimizations and advanced streaming functionality. But it remains one +of the most painful parts of XSLT. We use SLAX in JUNOS and provide the ability to perform XML-based RPCs to local and remote JUNOS -boxes. One RPC allows the script to store and retrieve values in an -SNMP MIB (the jnxUtility MIB). We have users using this to "fake" +boxes. One RPC allows the script to store and retrieve values in an +SNMP MIB (the jnxUtility MIB). We have users using this to "fake" mutable variables, so for our environment, any theoretical arguments -against the value of mutable variables are lost. They are happening, +against the value of mutable variables are lost. They are happening, and the question becomes whether we want to force script writers into mental anguish to allow them. -Yes, exactly. That was an apologetical defense of the following code, -which implements mutable variables. Dio, abbi pieta della mia anima. +Yes, exactly. That was an apologetical defense of the following code, +which implements mutable variables. Dio, abbi pieta della mia anima. The rest of this section contacts mind-numbing comments on the implementation and inner working of mutable variables. @@ -71,19 +71,19 @@ implementation and inner working of mutable variables. For the typical scriptor, the important implications are: - Non-standard feature: mutable variables are not available outside - the libslax environment. This will significantly affect the - portability of your scripts. Avoid mutable variables if you want to + the libslax environment. This will significantly affect the + portability of your scripts. Avoid mutable variables if you want to use your scripts in other XSLT implementations or without libslax. - Memory Overhead: Due to the lifespan of XML elements and RTFs inside libxslt, mutable variables must retain copies of their previous values (when non-scalar values are used) to avoid dangling - references. This means that heavy use of mutable variables will + references. This means that heavy use of mutable variables will significantly affect memory overhead, until the mutable variables fall out of scope. - Axis Implications: Since values for mutable variables are copied - (see above), the operations of axes will be affected. This is a + (see above), the operations of axes will be affected. This is a relatively minor issue, but should be noted. Let's consider the memory issues associated with mutable variables. @@ -101,27 +101,27 @@ via the nodesetval field The key is that by having node sets refer to nodes "in situ" where they reside on other documents, the idea of refering to nodes in the -input document is preserved. Node sets don't require an additional +input document is preserved. Node sets don't require an additional memory hook or a reference count. The key functions here are xmlXPathNewValueTree() and -xmlXPathNewNodeSet(). Both return a fresh xmlXPathObject, but +xmlXPathNewNodeSet(). Both return a fresh xmlXPathObject, but xmlXPathNewValueTree will set the xmlXPathObject's "boolval" to 1, which tells xmlXPathFreeObject() to free the nodes contained in a nodeset, not just the nodeTab that holds the references. Also note that if one of the nodes in the node set is a document (type XML_DOCUMENT_NODE) then xmlFreeDoc() is called to free the -document. For RTFs, the only member of the nodeset is the root of the +document. For RTFs, the only member of the nodeset is the root of the document, so freeing that node will free the entire document. All this works well for immutable objects and RTFs, but does not allow -my mutable variables to work cleanly. This is quite annoying. +my mutable variables to work cleanly. This is quite annoying. I need to allow a variable to hold a nodeset, a document, or a scalar -value, without caring about the previous value. But I need to hold on +value, without caring about the previous value. But I need to hold on to the previous values to allow others to refer to them without -dangling references. Dangling References +dangling references. Consider the following input document:: @@ -168,19 +168,19 @@ Now consider the following code:: } In this chunk of code, the changing value of $z cannot change the -nodes recorded as the values of $a, $b, or $c. Since I can't count on +nodes recorded as the values of $a, $b, or $c. Since I can't count on the context or variable memory garbage collections, my only choice is -to roll my own. This is quite annoying. +to roll my own. This is quite annoying. The only means of retaining arbitrary previous values of a mutable variable is to have a complete history of previous values. The "overhead" for an mvar must contain all previous values for the mvar, so references to the node in the mvar (from other variables) -don't become dangling when those values are freed. This is not true +don't become dangling when those values are freed. This is not true for scalar values that do not set the nodesetval field. -Yes, this is pretty much as ugly as it sounds. After a variable has +Yes, this is pretty much as ugly as it sounds. After a variable has been made, it cannot be changed without being risking impacting existing references to it. @@ -197,7 +197,7 @@ The Rules But where does the "overhead" live? -In classic SLAX style, the overhead is kept in a shadow variable. The +In classic SLAX style, the overhead is kept in a shadow variable. The shadow variable (svar) holds an RTF/RVT that contains all the nodes ever assigned to the variable, a living history of all values of the variable. @@ -228,22 +228,22 @@ of another variable, either as a straight value or as a nodeset. If an mvar is only ever assigned scalar values, the svar will not be touched. When a non-scalar value is assigned to an mvar, the content is copied to the svar and the mvar is given a nodeset that refers to -the content inside the svar. Appending to a mvar means adding that +the content inside the svar. Appending to a mvar means adding that content to the svar and then appending the node pointers to the mvar. -If the mvar has a scalar value, appending discards that value. If the +If the mvar has a scalar value, appending discards that value. If the appended value is a scalar value, then the value is simply assigned to -the mvar. This will be hopelessly confusing, but there's little that +the mvar. This will be hopelessly confusing, but there's little that can be done, since appending to an RTF to a number or a number to an RTF makes little sense. We will raise an error for this condition, to let the scriptor know what's going on. Memory When the mvar is freed, its "boolval" is zero, so the nodes are not -touched but the nodesetval/nodeTab are freed. When the svar is freed, +touched but the nodesetval/nodeTab are freed. When the svar is freed, its "boolval" is non-zero, so xmlXPathFreeObject will free the nodes -referenced in the nodesetval's nodeTab. The only node there will be +referenced in the nodesetval's nodeTab. The only node there will be the root document of a "fake" RTF document, which will contain all the -historical values of the mvar. In short, the normal libxslt memory +historical values of the mvar. In short, the normal libxslt memory management will wipe up after us. Implications The chief implications are: @@ -253,7 +253,7 @@ The chief implications are: - axis -- since the document that contains the mvar contents is a living document, code cannot depend on an axis staying - unchanged. I'm not sure of what this means yet, but following::foo + unchanged. I'm not sure of what this means yet, but following::foo is a nodeset that may change over time, though it won't change once fetched (e.g. into a specific variable). @@ -278,14 +278,14 @@ XSLT implementations. In the 2005-2006 timeframe, we started developing on-box script capabilities using XSLT. I like the niche and properties of XSLT, but -the syntax makes development and maintenance problematic. First class +the syntax makes development and maintenance problematic. First class constructs are buried in attributes, with unreadable encodings. Customers objections were fairly strong, and they asked for a more perl-like syntax. SLAX was our answer. SLAX simplifies the syntax of XSLT, making an encoding that makes scripts more readable, maintainable, and helps the reader to see -what's going on. XML escaping is replaced by unix/perl/c-style +what's going on. XML escaping is replaced by unix/perl/c-style escaping. Control elements like are replaced with the familiar "if" statement. Minor details are more transparent. @@ -299,9 +299,9 @@ The integration of XPath into familiar control statements make the script writers job fairly trivial. At the same time, using XSLT constrains our scripting environment and -limits what scripts can and cannot do. We do not need to worry about +limits what scripts can and cannot do. We do not need to worry about system access, processes, connections, sockets, or other features that -are easily available in perl or other scripting languages. The scripts +are easily available in perl or other scripting languages. The scripts emit XML that instructs our environment on what actions to take, so those actions can be controlled. @@ -312,8 +312,8 @@ Why the name conflict? ++++++++++++++++++++++ The SLAX language is named for "eXtensible Stylesheet Language Alternate -syntaX". Juniper started development on SLAX as part of the on-box -scripting features in the 2004/2005 time frame. The name "SLAX" was +syntaX". Juniper started development on SLAX as part of the on-box +scripting features in the 2004/2005 time frame. The name "SLAX" was adopted after the Juniper management requested that we remove the leading "X" from the original internal name. @@ -326,7 +326,7 @@ aware of this name conflict for many years. When we were made aware of the name conflict, we consulted with various parts of the Juniper family, and no one was interested in -changing the language name. We repeated this procedure as we were +changing the language name. We repeated this procedure as we were publishing this open source version, but again, no one was interested in doing the internal and external work to change the language name, since the name conflict was considered minor and not an issue for our From 6b2da1f3c11dff9c923f3615157855116e2ec0a4 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 15 Dec 2017 01:53:17 -0500 Subject: [PATCH 036/104] Add forgotten intro. --- doc/slax.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/doc/slax.rst b/doc/slax.rst index 29bc872e..682502ef 100644 --- a/doc/slax.rst +++ b/doc/slax.rst @@ -8,6 +8,29 @@ # Phil Shafer, July 2014 # +=========================== +The SLAX Scripting Language +=========================== + +SLAX is an alternate syntax for XSLT, the W3C standard XML-to-XML +transformation. XSLT is a powerful language, but uses an XML-based +syntax that is painful to read and write. SLAX uses a syntax modeled +after PERL and C which promotes the basic concepts of XSLT into first +class language constructs. The result is scripts that are easier to +develop and maintain. + +This documentation covers the SLAX language, beginning with an +overview and a reference section listing all SLAX statements. SLAX +has a number of built-in functions which are also covered. + +An implementation of the SLAX is available in an open source project +called `libslax`. Built on top of `libxslt` and `libxml2`, libslax parses +SLAX files and executes them, and can convert between SLAX and XSLT. +A debugger and profiler are included. libslax was originally +developed as part of the JUNOS Operating System by Juniper Networks +and is released under a BSD license. See the "Copyright" file for +details. + XSLT is a commonly used transformation language for XML. It is a declarative language that uses XPath expressions to inspect an XML input document and can generate XML output based on that input From 7527b796af549b1fac96c3865dfdef9a6c35bac7 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 15 Dec 2017 02:04:42 -0500 Subject: [PATCH 037/104] rename conf.py to conf.py.in --- doc/conf.py.in | 178 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 doc/conf.py.in diff --git a/doc/conf.py.in b/doc/conf.py.in new file mode 100644 index 00000000..7a0e2aae --- /dev/null +++ b/doc/conf.py.in @@ -0,0 +1,178 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# libslax documentation build configuration file, created by +# sphinx-quickstart on Tue Oct 10 10:18:55 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'slax' + +# General information about the project. +project = 'libslax' +copyright = '2017, Juniper Networks' +author = 'Phil Shafer' +default_role = 'code' +primary_domain = 'c' +smart_quotes = False + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.22.0' +# The full version, including alpha/beta/rc tags. +release = '0.22.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinxdoc' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} +html_theme_options = { + "sidebarwidth": 320, +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +alabaster_html_sidebars = { + '**': [ + 'about.html', + 'navigation.html', + 'relations.html', # needs 'show_related': True theme option to display + 'searchbox.html', + 'donate.html', + ] +} + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'libxo-manual' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'libxo.tex', 'libxo Documentation', + 'Phil Shafer', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'libxo', 'libxo Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'libxo', 'libxo Documentation', + author, 'libxo', 'A Library for Generating Text, XML, JSON, and HTML Output', + 'Miscellaneous'), +] + + + From 103575175e9bc0f0615d66ff37d7dca0de2f1574 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Fri, 15 Dec 2017 02:04:56 -0500 Subject: [PATCH 038/104] rename conf.py to conf.py.in --- doc/conf.py | 178 ---------------------------------------------------- 1 file changed, 178 deletions(-) delete mode 100644 doc/conf.py diff --git a/doc/conf.py b/doc/conf.py deleted file mode 100644 index 7a0e2aae..00000000 --- a/doc/conf.py +++ /dev/null @@ -1,178 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# libslax documentation build configuration file, created by -# sphinx-quickstart on Tue Oct 10 10:18:55 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'slax' - -# General information about the project. -project = 'libslax' -copyright = '2017, Juniper Networks' -author = 'Phil Shafer' -default_role = 'code' -primary_domain = 'c' -smart_quotes = False - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '0.22.0' -# The full version, including alpha/beta/rc tags. -release = '0.22.0' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = [] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinxdoc' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} -html_theme_options = { - "sidebarwidth": 320, -} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# This is required for the alabaster theme -# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars -alabaster_html_sidebars = { - '**': [ - 'about.html', - 'navigation.html', - 'relations.html', # needs 'show_related': True theme option to display - 'searchbox.html', - 'donate.html', - ] -} - - -# -- Options for HTMLHelp output ------------------------------------------ - -# Output file base name for HTML help builder. -htmlhelp_basename = 'libxo-manual' - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'libxo.tex', 'libxo Documentation', - 'Phil Shafer', 'manual'), -] - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'libxo', 'libxo Documentation', - [author], 1) -] - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'libxo', 'libxo Documentation', - author, 'libxo', 'A Library for Generating Text, XML, JSON, and HTML Output', - 'Miscellaneous'), -] - - - From b36519324e034682b078bab04fee157503350a11 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sat, 16 Dec 2017 12:32:12 -0500 Subject: [PATCH 039/104] restore conf.py --- doc/conf.py.in | 178 ------------------------------------------------- 1 file changed, 178 deletions(-) delete mode 100644 doc/conf.py.in diff --git a/doc/conf.py.in b/doc/conf.py.in deleted file mode 100644 index 7a0e2aae..00000000 --- a/doc/conf.py.in +++ /dev/null @@ -1,178 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# libslax documentation build configuration file, created by -# sphinx-quickstart on Tue Oct 10 10:18:55 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'slax' - -# General information about the project. -project = 'libslax' -copyright = '2017, Juniper Networks' -author = 'Phil Shafer' -default_role = 'code' -primary_domain = 'c' -smart_quotes = False - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '0.22.0' -# The full version, including alpha/beta/rc tags. -release = '0.22.0' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = [] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinxdoc' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} -html_theme_options = { - "sidebarwidth": 320, -} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# This is required for the alabaster theme -# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars -alabaster_html_sidebars = { - '**': [ - 'about.html', - 'navigation.html', - 'relations.html', # needs 'show_related': True theme option to display - 'searchbox.html', - 'donate.html', - ] -} - - -# -- Options for HTMLHelp output ------------------------------------------ - -# Output file base name for HTML help builder. -htmlhelp_basename = 'libxo-manual' - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'libxo.tex', 'libxo Documentation', - 'Phil Shafer', 'manual'), -] - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'libxo', 'libxo Documentation', - [author], 1) -] - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'libxo', 'libxo Documentation', - author, 'libxo', 'A Library for Generating Text, XML, JSON, and HTML Output', - 'Miscellaneous'), -] - - - From 74f42ae7413b0d70bae94d29281428886da0c7bc Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sat, 16 Dec 2017 12:32:21 -0500 Subject: [PATCH 040/104] fix reference --- doc/distribution.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/distribution.rst b/doc/distribution.rst index 5657e016..5f73567d 100644 --- a/doc/distribution.rst +++ b/doc/distribution.rst @@ -387,7 +387,7 @@ Behavioral Options .. option:: -I Add a directory to the list of directories searched for - :ref:`include-import ` files. The environment + :ref:`include and import ` files. The environment variable SLAXPATH can be set to a list of search directories, separated by colons. From 628ffe9dbdda426f9749c64e4e1cf7162ca02823 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sat, 16 Dec 2017 12:32:40 -0500 Subject: [PATCH 041/104] restore conf.py --- doc/conf.py | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 doc/conf.py diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 00000000..7a0e2aae --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,178 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# libslax documentation build configuration file, created by +# sphinx-quickstart on Tue Oct 10 10:18:55 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'slax' + +# General information about the project. +project = 'libslax' +copyright = '2017, Juniper Networks' +author = 'Phil Shafer' +default_role = 'code' +primary_domain = 'c' +smart_quotes = False + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.22.0' +# The full version, including alpha/beta/rc tags. +release = '0.22.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinxdoc' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} +html_theme_options = { + "sidebarwidth": 320, +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +alabaster_html_sidebars = { + '**': [ + 'about.html', + 'navigation.html', + 'relations.html', # needs 'show_related': True theme option to display + 'searchbox.html', + 'donate.html', + ] +} + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'libxo-manual' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'libxo.tex', 'libxo Documentation', + 'Phil Shafer', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'libxo', 'libxo Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'libxo', 'libxo Documentation', + author, 'libxo', 'A Library for Generating Text, XML, JSON, and HTML Output', + 'Miscellaneous'), +] + + + From 8f61a053d165b6054059f940de6cf84aff2abf83 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sat, 16 Dec 2017 13:01:08 -0500 Subject: [PATCH 042/104] set version and release to "development-branch" --- doc/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 7a0e2aae..aaf8d714 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -58,9 +58,9 @@ # built documents. # # The short X.Y version. -version = '0.22.0' +version = 'development-branch' # The full version, including alpha/beta/rc tags. -release = '0.22.0' +release = 'development-branch' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 1c2b4b8b0d35feaaea2766c99b6a5c034fdd3c43 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sat, 16 Dec 2017 13:01:15 -0500 Subject: [PATCH 043/104] Add index --- doc/index.rst | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 doc/index.rst diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 00000000..2ae4a2ad --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,5 @@ +.. toctree:: + :maxdepth: 3 + :caption: Documentation Contents: + + slax From 0739d7cb7f065b221926887cdd0afccee1492e60 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sat, 16 Dec 2017 14:40:46 -0500 Subject: [PATCH 044/104] s/External/Additional/ --- doc/notes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/notes.rst b/doc/notes.rst index 492276fe..bea3a73c 100644 --- a/doc/notes.rst +++ b/doc/notes.rst @@ -423,7 +423,7 @@ Here's a quick example:: return SLAX_DYN_VERSION; } -External Documentation +Additional Documentation ---------------------- My documentation style tends to be man-page-like, rather than From fe154afe2b28146836d299c4660bdf50ac51fa87 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sat, 16 Dec 2017 18:02:59 -0500 Subject: [PATCH 045/104] Fix copyright --- Copyright | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Copyright b/Copyright index 95882adf..a1d8c12b 100644 --- a/Copyright +++ b/Copyright @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007-2015, Juniper Networks Inc. + * Copyright (c) 2007-2017, Juniper Networks Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without From 085022d75add1576f874557598dccda8bc576807 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sat, 16 Dec 2017 18:03:00 -0500 Subject: [PATCH 046/104] Fix copyright --- doc/slax.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/slax.rst b/doc/slax.rst index 682502ef..b53b6305 100644 --- a/doc/slax.rst +++ b/doc/slax.rst @@ -1,5 +1,5 @@ .. # - # Copyright (c) 2014, Juniper Networks, Inc. + # Copyright (c) 2014-2017, Juniper Networks, Inc. # All rights reserved. # This SOFTWARE is licensed under the LICENSE provided in the # ../Copyright file. By downloading, installing, copying, or From b00d49cf66b5c570bb2dfb4dceeab3f2d8399722 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sun, 17 Dec 2017 03:47:47 -0500 Subject: [PATCH 047/104] add "html" to "make docs" --- doc/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Makefile.am b/doc/Makefile.am index 26b5c8a0..af8bc6e0 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -72,7 +72,7 @@ OXTRADOC_SRC_FILES = \ EXTRA_DIST += ${OXTRADOC_SRC_FILES} -doc docs: ${OUTPUT}.txt ${OUTPUT}.html +doc docs: ${OUTPUT}.txt ${OUTPUT}.html html ${OUTPUT}.txt: ${INPUT} ${OXTRADOC} ${OXTRADOC_CMD} -m text -o $@ $< From 160c26cf0eb3e1ba2e621da7a62501e00291b267 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sun, 17 Dec 2017 03:48:19 -0500 Subject: [PATCH 048/104] add index entries --- doc/concepts.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/concepts.rst b/doc/concepts.rst index c9319ea4..89fab54d 100644 --- a/doc/concepts.rst +++ b/doc/concepts.rst @@ -61,6 +61,8 @@ inspected, and what XML should be generated at each point. We'll examine each of these technologies in more detail in the following sections. +.. index:: XML + XML Concepts ++++++++++++ @@ -159,6 +161,8 @@ such as the following JUNOS configuration file:: See also https://www.w3.org/TR/1998/REC-xml-19980210. +.. index:: XPath + XPath Concepts ++++++++++++++ @@ -275,6 +279,8 @@ its value into the output tree. XPath is fully described in the W3C's specification, http://w3c.org/TR/xpath. +.. index:: XSLT + XSLT Concepts +++++++++++++ From 10691b0a5448d6756eb87971767443d5657c6a45 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sun, 17 Dec 2017 03:49:04 -0500 Subject: [PATCH 049/104] add index entries --- doc/constructs.rst | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/doc/constructs.rst b/doc/constructs.rst index 2604a17c..cbcb9540 100644 --- a/doc/constructs.rst +++ b/doc/constructs.rst @@ -9,6 +9,7 @@ use language paradigms and constructs from traditional languages But SLAX is built on top of XSLT, and the declarative nature of XSLT means that many of its constructs are visible. +.. index:: variables .. _main-var: Variables @@ -90,6 +91,10 @@ equals sign and an expression:: SLAX is using the same constucts as XSLT, but packaged in a more readable, maintainable syntax. +.. index:: + pair: immutable; variables + +.. index:: statements; var .. _var: The `var` Statement @@ -113,6 +118,13 @@ statements (enclosed in braces) that emit a set of nodes:: copy-of $this; } +.. index:: + pair: mutable; variables + +.. index:: statements; set +.. index:: statements; append +.. index:: statements; mvar +.. index:: operators; "+=" .. _mvar: The `mvar` Statement @@ -149,6 +161,8 @@ the nodeset:: } } +.. index:: RTF + Result Tree Fragments --------------------- @@ -210,6 +224,7 @@ value:: Fortunately for SLAX programmers, the ":=" operator does away with these conversion issues, as the following section details. +.. index:: operators; ":=" .. _colon-equals: The ":=" Operator @@ -242,6 +257,8 @@ Control Statements This section gives details and examples for each of the control statements in SLAX. +.. index:: statements; if +.. index:: statements; else .. _if-else: The `if` and `else` Statements @@ -292,6 +309,7 @@ element:: +.. index:: statements; for-each .. _for-each: The `for-each` Statement @@ -338,6 +356,7 @@ parentheses-delimited select expression, and a block:: +.. index:: statements; for .. _for: The `for` Statement @@ -366,6 +385,7 @@ pair of nested for-each loops, one to iterate and one to put the context back to the previous setting. This allows the script writer to ignore the context change. +.. index:: statements; while .. _while: The `while` Statement @@ -394,6 +414,7 @@ taken to avoid infinite loops:: set $count = $count + 1; } +.. index:: statements; sort .. _sort: The `sort` Statement @@ -436,6 +457,7 @@ Multiple `sort` statements can be used to given secondary sorting keys:: +.. index:: operators; "..." .. _dotdotdot: The "..." Operator @@ -458,6 +480,7 @@ nodes in a sequence:: message "Value: " _ .; } +.. index:: operators; "?:" .. _question-colon: The "?:" Operator @@ -512,6 +535,7 @@ XPath expressions. Functions have several advantages over templates: This section describes how functions are defined. +.. index:: statements; function .. _function: The `function` Statement @@ -539,6 +563,7 @@ defined:: Function parameters can also be defined using the `param` statement. +.. index:: statements; result .. _result: The `result` Statement From 139a5cf4dda9a7a5d027cb42230d03cee4fcdd5e Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sun, 17 Dec 2017 03:51:50 -0500 Subject: [PATCH 050/104] add index entries --- doc/content.rst | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/doc/content.rst b/doc/content.rst index e08532df..0fd3db3b 100644 --- a/doc/content.rst +++ b/doc/content.rst @@ -17,6 +17,10 @@ flexibility in the output generated. We'll start by examining how SLAX generated these output nodes. +.. index:: operators; "&&" +.. index:: operators; "||" +.. index:: operators; "!" +.. index:: operators; "_" .. _expressions: Expressions @@ -187,6 +191,8 @@ SLAX code, placed inside braces. } }); +.. index:: statements; expr + The `expr` Statement ++++++++++++++++++++ @@ -197,6 +203,8 @@ expression is the argument to the statement:: expr substring-before(name, "."); expr status; +.. index:: statements; uexpr + The `uexpr` Statement +++++++++++++++++++++ @@ -242,6 +250,7 @@ slash character ('/'), and the greater than character ('>'). +.. index:: elements; creating .. _xml-elements: XML Elements @@ -302,7 +311,8 @@ This is equivalent to:: -.. _element: +.. index:: statements; element +.. index:: elements; by name The `element` Statement +++++++++++++++++++++++ @@ -326,6 +336,9 @@ current context. element $my-var; } +.. index:: + pair: elements; json + .. _json-elements: JSON Elements @@ -361,6 +374,9 @@ Hierarchical nesting is done using objects:: This would generate XML equivalent to the examples in :ref:`xml-elements`. +.. index:: + pair: attributes; json + .. _json-attributes: Attributes for JSON Elements @@ -414,6 +430,7 @@ JSON in XML. false null +.. index:: json; arrays .. _json-arrays: Encoding JSON Arrays in XML @@ -493,6 +510,7 @@ The equivalent in SLAX elements would be:: +.. index:: json; invalid names .. _json-names: Encoding Invalid JSON Names @@ -517,6 +535,8 @@ content with the "name" attribute containing the real name:: <> +.. index:: attributes + Attributes ---------- @@ -531,6 +551,8 @@ value of the attribute in quotes::
+.. index:: attributes; concept + XML Attributes ++++++++++++++ @@ -594,6 +616,8 @@ The XSLT equivalent:: +.. index:: attributes; creating +.. index:: statements; attribute .. _attribute: The `attribute` Statement @@ -615,6 +639,8 @@ context. expr "from-" _ address; } +.. index:: attributes; attribute-set + Attribute Sets -------------- @@ -631,6 +657,7 @@ the contents in the script. template cannot return a set of attributes. That's my guess anyway. +.. index:: statements; attribute-set .. _attribute-set: The `attribute-set` Statement @@ -648,6 +675,7 @@ the contents are a set of attribute statements. attribute "cellspacing" { expr $cellspacing; } } +.. index:: statements; use-attribute-sets .. _use-attribute-sets: The `use-attribute-sets` Statement @@ -666,6 +694,8 @@ The use-attribute-sets statement can be used under the `element`, `copy-node`, and `attribute-sets` statements, as well as under a normal element. +.. index:: namespaces + Namespaces ---------- @@ -697,6 +727,7 @@ underlaying namespace. svg ================ ======================= +.. index:: statements; ns .. _ns: The `ns` Statement @@ -782,6 +813,7 @@ keywords instruct the parser to add the namespace prefix to the +.. index:: statements; extension .. _extension: The `extension` Statement @@ -804,6 +836,7 @@ functions and elements defined within that library. https://www.w3.org/TR/1999/REC-xslt-19991116#extension-element +.. index:: statements; exclude .. _exclude: The `exclude` Statement @@ -892,6 +925,7 @@ application-specific information inside an XML document. The application can detect processing instructions and change behaviour accordingly. +.. index:: statements; processing-instruction .. _processing-instruction: The `processing-instruction` Statement @@ -952,6 +986,7 @@ XML output renderer. * This is a SLAX comment */ --> +.. index:: statements; comment .. _comment: The `comment` Statement @@ -982,6 +1017,7 @@ that the entire node hierarchy is copied or just the node itself. SLAX contains two distinct statements for these two styles of copying. +.. index:: statements; copy-of .. _copy-of: The `copy-of` Statement @@ -1006,6 +1042,7 @@ See also copy-node (:ref:`copy-node`). +.. index:: statements; copy-node .. _copy-node: The `copy-node` Statement @@ -1032,6 +1069,8 @@ This section contains information about statements that control formatting of output. See also the :ref:`output-method` and :ref:`decimal-format`. +.. index:: statements; number +.. index:: statements; level .. _number: The `number` Statement From 6e0b7e42e41af93a5c245462377f530d907c8ba8 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sun, 17 Dec 2017 03:52:35 -0500 Subject: [PATCH 051/104] add index entries --- doc/distribution.rst | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/doc/distribution.rst b/doc/distribution.rst index 5f73567d..b906d3ca 100644 --- a/doc/distribution.rst +++ b/doc/distribution.rst @@ -213,6 +213,7 @@ Modes Options % slaxproc --format ugly.slax pretty.slax +.. index:: json; json-to-xml .. option:: --json-to-xml Transform JSON input into XML, using the conventions defined in @@ -289,6 +290,7 @@ Modes Options % slaxproc --slax-to-xslt my-script.slax your-script.xsl +.. index:: json; xml-to-json .. option:: --xml-to-json Transform XML input into JSON, using the conventions defined in @@ -391,12 +393,13 @@ Behavioral Options variable SLAXPATH can be set to a list of search directories, separated by colons. +.. index:: pretty-printing .. option:: --indent .. option:: -g - Indent output to make it good looking. This option is identical to - the behavior triggered by the ref:`output-method `'s - `indent` statement:: + Indent output to make it good looking, aka "pretty-printing". This + option is identical to the behavior triggered by the + ref:`output-method `'s `indent` statement:: output-method { indent "true"; @@ -407,12 +410,14 @@ Behavioral Options Use the given file for input. +.. index:: json; json-tagging .. option:: --json-tagging Tag JSON elements in SLAX script input with the 'json' attribute as they are parsed into XML. This allows the :option:`--format` mode to transform them back into JSON format. +.. index:: mini-templates; keep-text .. option:: --keep-text When building a script from mini-templates, do not add a template to @@ -433,6 +438,7 @@ Behavioral Options Write log data to the given file, rather than the default of the standard error stream. +.. index:: mini-templates; option .. option:: --mini-template or -m Allows a simple script to be passed in via the command line using one @@ -449,6 +455,7 @@ Behavioral Options Use the given file as the SLAX script. +.. index:: json; no-json-types .. option:: --no-json-types Do not generate the "type" attribute in the XML generated by @@ -528,6 +535,8 @@ Behavioral Options ; } +.. index:: sdb +.. index:: debugger .. _sdb: The SLAX Debugger (sdb) @@ -604,6 +613,7 @@ next element inserted will appear at the end of that hierarchy. The `info locals` command displays the current set of local variables and their values. +.. index:: profiler .. _profiler: The SLAX Profiler @@ -682,6 +692,8 @@ The profiling is not "Monte Carlo", or clock based, but is based on trace data generated as each SLAX instruction is executed, giving more precise data. +.. index + callflow -------- From 6d2e3dd793a3b0334fd9a68cb9cdfc9d69f3a342 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sun, 17 Dec 2017 03:53:23 -0500 Subject: [PATCH 052/104] add index entries --- doc/more-statements.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/more-statements.rst b/doc/more-statements.rst index 8b333e9d..3e2cb094 100644 --- a/doc/more-statements.rst +++ b/doc/more-statements.rst @@ -66,6 +66,7 @@ SLAX can import and include normal XSLT documents. +.. index:: statements; key .. _key: The `key` Statement @@ -102,6 +103,7 @@ expression for the value of the key. https://www.w3.org/TR/1999/REC-xslt-19991116#key +.. index:: statements; decimal-format .. _decimal-format: The `decimal-format` Statement @@ -162,6 +164,7 @@ Typical scripts work by generating XML content as a result tree, but occasionally a script may need to make explicit, immediate output. The statements in this section allow for such output. +.. index:: statements; message .. _message: The `message` Statement @@ -218,6 +221,7 @@ a string using the normal XSLT rules. +.. index:: statements; terminate .. _terminate: The `terminate` Statement @@ -242,6 +246,7 @@ block will be converted to a string using the normal XSLT rules. After emitting the message, the script stops any further processing. +.. index:: statements; trace .. _trace: The `trace` Statement @@ -285,6 +290,7 @@ the trace file. Since `trace` is non-standard, it can only be used when the associated extension functions are present, such as with the `libslax` software. +.. index:: statements; output-method .. _output-method: The `output-method` Statement @@ -332,6 +338,7 @@ The style can be `xml`, `html`, or `text` (without quotes). the XSLT element. +.. index:: statements; fallback .. _fallback: The `fallback` Statement @@ -360,6 +367,7 @@ SLAX includes a means of retaining or removing text nodes that contain only whitespace. Whitespace for XML is the space, tab, newline or carriage return characters. +.. index:: statements; strip-space .. _strip-space: The `strip-space` Statement @@ -388,6 +396,7 @@ whitespace:: +.. index:: statements; preserve-space .. _preserve-space: The `preserve-space` Statement @@ -419,6 +428,7 @@ whitespace. +.. index:: statements; version .. _version: The `version` Statement From 56e67af7cab82a28bf95dba64e61d604ef65e67e Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sun, 17 Dec 2017 03:53:36 -0500 Subject: [PATCH 053/104] fix markup --- doc/notes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/notes.rst b/doc/notes.rst index bea3a73c..ce398567 100644 --- a/doc/notes.rst +++ b/doc/notes.rst @@ -424,7 +424,7 @@ Here's a quick example:: } Additional Documentation ----------------------- +------------------------ My documentation style tends to be man-page-like, rather than tutorial-ish. But folks at Juniper Networks have made some From eebedbd3de8c87203659497e42eda7224ef478fe Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sun, 17 Dec 2017 03:54:37 -0500 Subject: [PATCH 054/104] add index entries --- doc/templates.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/doc/templates.rst b/doc/templates.rst index 94d56b42..8daf722e 100644 --- a/doc/templates.rst +++ b/doc/templates.rst @@ -17,6 +17,8 @@ follows more traditional procedural languages. Named templates are called like function, returning their XML output nodes to the caller, where they can be merged into the caller's XML output tree. +.. index:: templates; named +.. index:: statements; template .. _template: The `template` Statement @@ -39,6 +41,8 @@ giving a simple shorthand for passing parameters if common names are used. Additional template parameters can be supplied inside the block using the `with` statement. +.. index:: templates; calling +.. index:: statements; call .. _call: The `call` Statement @@ -64,6 +68,7 @@ parameter, without using an enclosing set of braces:: var $a = call test($a = 1); +.. index:: statements; with .. _with-call: Using the `with` Statement with `call` @@ -203,6 +208,8 @@ associated with the rules, builds the XML output nodes, and merges those nodes with the XML output nodes from other rules to build the XML output nodes. +.. index:: templates; match +.. index:: statements; match .. _match: The `match` Statement @@ -232,6 +239,8 @@ in this document. } } +.. index:: templates; applying +.. index:: statements; apply-templates .. _apply-templates: The `apply-templates` Statement @@ -272,6 +281,7 @@ Match templates are applied using the `apply-templates` statement. +.. index:: statements; apply-imports .. _apply-imports: The `apply-imports` Statement @@ -290,6 +300,8 @@ allowing the script to invoke any imported templates. +.. index:: templates; mode +.. index:: statements; mode .. _mode: The `mode` Statement @@ -358,6 +370,7 @@ In this example, template processing is invoked twice, first for mode +.. index:: statements; priority .. _priority: The `priority` Statement @@ -391,6 +404,7 @@ In this example, the template is given a high priority::
+.. index:: statements; param .. _param: The `param` Statement @@ -431,6 +445,7 @@ template name:: $width * $length * $scale; } +.. index:: statements; with .. _with: The `with` Statement @@ -504,6 +519,7 @@ simple shorthand for passing parameters if common names are used. +.. index:: statements; main .. _main-template: The `main` Template From a0431edd3c76d2b5a91da8b9b28d9b6931955abb Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sun, 17 Dec 2017 04:04:01 -0500 Subject: [PATCH 055/104] fix index entry --- doc/distribution.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/distribution.rst b/doc/distribution.rst index b906d3ca..58053131 100644 --- a/doc/distribution.rst +++ b/doc/distribution.rst @@ -438,7 +438,7 @@ Behavioral Options Write log data to the given file, rather than the default of the standard error stream. -.. index:: mini-templates; option +.. index:: mini-templates .. option:: --mini-template or -m Allows a simple script to be passed in via the command line using one From 736fcd99204151f0fe137d3fab83e95ffc3286e5 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Sun, 17 Dec 2017 04:19:29 -0500 Subject: [PATCH 056/104] Fix wrapped line --- doc/distribution.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/distribution.rst b/doc/distribution.rst index 58053131..2c4bea3e 100644 --- a/doc/distribution.rst +++ b/doc/distribution.rst @@ -333,8 +333,8 @@ Behavioral Options .. option:: --debug .. option:: -d - Enable the SLAX/XSLT debugger. See :ref:`sdb` for complete details on the - operation of the debugger. + Enable the SLAX/XSLT debugger. See :ref:`sdb` for complete details + on the operation of the debugger. .. option:: --empty .. option:: -E From 64aa9479e251ed0cee2879d44c3c94f1bfacfaa4 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 11:34:14 -0500 Subject: [PATCH 057/104] Add label for "what's new" --- doc/concepts.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/concepts.rst b/doc/concepts.rst index 89fab54d..ac91b88f 100644 --- a/doc/concepts.rst +++ b/doc/concepts.rst @@ -1,3 +1,4 @@ +.. _concepts: =============== SLAX (Overview) From 23b9ebdf01950641e52ce18fc156e2195cc071ea Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 11:34:46 -0500 Subject: [PATCH 058/104] switch to "index.rst" as base; there's just no use fighting against it --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index aaf8d714..1fc5f094 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -43,7 +43,7 @@ source_suffix = '.rst' # The master toctree document. -master_doc = 'slax' +master_doc = 'index' # General information about the project. project = 'libslax' From 4b7a0d12176695dadc1b6cdb18d193acd6ace591 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 11:34:59 -0500 Subject: [PATCH 059/104] Add label --- doc/content.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/content.rst b/doc/content.rst index 0fd3db3b..6a641da2 100644 --- a/doc/content.rst +++ b/doc/content.rst @@ -1,3 +1,4 @@ +.. _SLAX language: ========================== Building Content with SLAX From 612d3a94bb9040726e4d594a0c9be381f88e83e0 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 11:35:01 -0500 Subject: [PATCH 060/104] Add label --- doc/distribution.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/distribution.rst b/doc/distribution.rst index 2c4bea3e..8668354c 100644 --- a/doc/distribution.rst +++ b/doc/distribution.rst @@ -1,3 +1,4 @@ +.. _libslax software: ======================== The libslax Distribution From 6aa26cf8b3eeeb6279c554e9c966b80ce5f1ba82 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 11:35:44 -0500 Subject: [PATCH 061/104] Add example; fix examples to use "main"; add links to libxslt equivalents --- doc/examples.rst | 96 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 68 insertions(+), 28 deletions(-) diff --git a/doc/examples.rst b/doc/examples.rst index 26bd7542..39938efb 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -1,18 +1,48 @@ +.. _example scripts: =================== Example Stylesheets =================== -This section contains a few examples, converted from the libxslt test/ -directory. The XSLT form can be found in the libxslt source code. -They were converted using the "slaxproc" tool. +A simple example script:: + + version 1.2; /* All scripts start with "version" */ + + param $name = "Poe"; /* Script parameters with default values */ + + var $favorites := { /* ":=" avoids RTFs */ +
+.. _elements-as-arguments: + Using Elements as Function Arguments ++++++++++++++++++++++++++++++++++++ @@ -193,6 +195,7 @@ SLAX code, placed inside braces. }); .. index:: statements; expr +.. _expr: The `expr` Statement ++++++++++++++++++++ @@ -205,6 +208,7 @@ expression is the argument to the statement:: expr status; .. index:: statements; uexpr +.. _uexpr: The `uexpr` Statement +++++++++++++++++++++ @@ -222,6 +226,8 @@ respectively), but uexpr avoids this escaping mechanism. https://www.w3.org/TR/1999/REC-xslt-19991116#disable-output-escaping +.. _elements: + Elements -------- From 9d8af1902f557ebb3f83b6d8941ac4cd5ca6e42e Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 12:39:22 -0500 Subject: [PATCH 071/104] fix links --- doc/notes.rst | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/doc/notes.rst b/doc/notes.rst index d09eaeec..2555a845 100644 --- a/doc/notes.rst +++ b/doc/notes.rst @@ -490,20 +490,21 @@ New Features in SLAX-1.2 SLAX-1.2 adds the following new features: -- :ref:`json-elements allows code like:: +- :ref:`JSON-style data ` allows code like:: var $x = { "this": "that", "one": 1 } -- Elements can be passed directly as arguments:: +- Elements can be passed :ref:`directly as arguments + ` :: call my-template($rpc = ); -- The "main" statement that allows a more obvious entry point to the - script (as opposed to "match / { ... }". It also defines the - top-level tag:: +- The :ref:`main ` statement that allows a more obvious + entry point to the script (as opposed to "match / { ... }". It also + defines the top-level tag:: main { call emit-my-output(); @@ -569,7 +570,7 @@ SLAX-1.1 includes complete support for all XSLT elements. - The :ref:`decimal-format ` statement defines details about the formatting of numbers. -- The :ref:`element ` statement creates an element, giving a +- The :ref:`element ` statement creates an element, giving a name and contents for that element. This is used when the element name is not static:: @@ -685,7 +686,7 @@ functionality for SLAX scripts. New SLAX Operators ~~~~~~~~~~~~~~~~~~ -- The :ref:`sequence-operator ` ("...") creates a +- The :ref:`sequence operator ` ("...") creates a sequence of elements between two integer values. Two values are used, with the "..." operator between them. The values are both included in the range. If the first value is less than the second one, the values @@ -698,10 +699,10 @@ New SLAX Operators } } -- The :ref:`colon-equals ` (":=") - assigns a node-set while avoiding the evils of RTFs. This allows the - assigned value to be used directly without the need for the node-set() - function:: +- The :ref:`colon-equals ` node-set assignment operator + (":=") assigns a node-set while avoiding the evils of RTFs. This + allows the assigned value to be used directly without the need for + the node-set() function:: var $data := { 1; @@ -712,7 +713,7 @@ New SLAX Operators var $name = $data/*[. == $count]; -- The :ref:`ternary-operator ` ("?:") makes a simple +- The :ref:`ternary operator ` ("?:") makes a simple inline if/else test, in the pattern of C/Perl. Two formats are supported. The first format gives a condition, the value if the condition is true, and the value if the condition is false. The From 0b66daddc233c7833904bdd00758f7c4b04bc0e3 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 13:05:19 -0500 Subject: [PATCH 072/104] Notice botched admonitions --- doc/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/Makefile.am b/doc/Makefile.am index af8bc6e0..00f8dd62 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -115,6 +115,7 @@ uninstall-hook: SPHINX = python3.4 -msphinx html sphinx sphinx-html: + ${GREP} '.. admonition: ' ${srcdir}/*rst; true ${SPHINX} -M html ${srcdir} sphinx clean-local: sphinx-clean From 8ed34f43c3459783386b1adc6dd3540cc95e5631 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 13:05:33 -0500 Subject: [PATCH 073/104] Fix lists and admonitions --- doc/building.rst | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/doc/building.rst b/doc/building.rst index 7ce56ec5..3d31d850 100644 --- a/doc/building.rst +++ b/doc/building.rst @@ -1,8 +1,8 @@ .. _building: -==================== -How to build libslax -==================== +====================== +How to Build `libslax` +====================== Building libslax invokes four steps: - installing prerequisite software @@ -71,28 +71,28 @@ URLs for DIY libslax depends on the following software packages: - libxml2 + - home: http://www.xmlsoft.org/index.html - download information: http://www.xmlsoft.org/downloads.html - libxslt + - home: http://xmlsoft.org/XSLT/ - download information: http://xmlsoft.org/XSLT/downloads.html - libcurl (optional) + - home: http://curl.haxx.se/libcurl/ - download information: http://curl.haxx.se/download.html - libedit (optional) + - note: libreadline can also be used optionally - home: http://www.thrysoee.dk/editline/ Retrieving the source code -------------------------- -[Note: for Solaris users, the "tar" command lacks the "-z" flag, -so you'll need to substitute "gzip -dc `file` | tar xf -" instead of -"tar -zxf `file`".] - You can retrieve the source for libslax in two ways: A) Use a "distfile" for a specific release. We use @@ -114,7 +114,14 @@ build libslax from the git repo:: git clone https://github.com/Juniper/libslax.git cd libslax -.. admonition: Be Aware +.. admonition:: Solaris Users + + The Solaris "tar" command lacks the "-z" flag, so you'll need to + substitute "gzip -dc `file` | tar xf -" instead of "tar -zxf + `file`". + +.. admonition:: Be Aware + The github repository does _not_ contain the files generated by "autoreconf", with the notable exception of the "m4" directory. Since these files (depcomp, configure, missing, install-sh, etc) are From 6f28591eb76d77ffc5ce73b6ad3f40e1d83ef8a0 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 13:05:41 -0500 Subject: [PATCH 074/104] fix admonitions --- doc/examples.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/examples.rst b/doc/examples.rst index 39938efb..a844a520 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -75,7 +75,7 @@ general/itemschoose.xsl } } -.. admonition: XSLT Equivalent +.. admonition:: XSLT Equivalent https://raw.githubusercontent.com/GNOME/libxslt/master/tests/general/itemschoose.xsl @@ -123,7 +123,7 @@ REC2/svg.xsl } } -.. admonition: XSLT Equivalent +.. admonition:: XSLT Equivalent https://raw.githubusercontent.com/GNOME/libxslt/master/tests/REC2/svg.xsl @@ -169,6 +169,6 @@ XSLTMark/metric.xsl } } -.. admonition: XSLT Equivalent +.. admonition:: XSLT Equivalent https://raw.githubusercontent.com/GNOME/libxslt/master/tests/XSLTMark/metric.xsl From 6b60cf605bcb822c63a253112a1690b5274589a9 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 13:05:48 -0500 Subject: [PATCH 075/104] add link for #! --- doc/notes.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/notes.rst b/doc/notes.rst index 2555a845..1c15f44f 100644 --- a/doc/notes.rst +++ b/doc/notes.rst @@ -723,9 +723,9 @@ New SLAX Operators var $class = (count(items) < 10) ? "small" : "large"; var $title = data/title ?: "unknown"; -- SLAX supports the use of "#!/path/to/slaxproc" as the first - line of a SLAX script. This allows scripts to be directly - executable from the unix shell. +- SLAX supports the use of :ref:`"#!/path/to/slaxproc" ` + as the first line of a SLAX script. This allows scripts to be + directly executable from the unix shell. Additional Documentation ------------------------ From 74958afe7091aeca12dca8274bc1669ffa2b61db Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 13:06:08 -0500 Subject: [PATCH 076/104] add label --- doc/more-statements.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/more-statements.rst b/doc/more-statements.rst index 3e2cb094..66e691ed 100644 --- a/doc/more-statements.rst +++ b/doc/more-statements.rst @@ -6,6 +6,8 @@ Additional SLAX Statements This section contains statements and constructs that don't easily fit into other categories. +.. _pound-bang: + The "#!" Line ------------- From cf3339022846741957a2111335119dbbf4c71b84 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 13:10:50 -0500 Subject: [PATCH 077/104] fix pound-bang label --- doc/distribution.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/distribution.rst b/doc/distribution.rst index 8668354c..4df7ab25 100644 --- a/doc/distribution.rst +++ b/doc/distribution.rst @@ -136,7 +136,7 @@ but the input and output file names are positional:: slaxproc -i input.xml -o output.xml -g -v script.slax -.. _pound-bang: +.. _slaxproc-pound-bang: "#!" Support ~~~~~~~~~~~~ From 555d9e252a0b484790090e09993d731b4350ec5a Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 13:10:51 -0500 Subject: [PATCH 078/104] fix pound-bang label --- doc/index.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/index.rst b/doc/index.rst index 1daae039..b799a569 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -8,13 +8,13 @@ that implements version 1.2 of the SLAX language. This documentation includes: -- an :ref:`overview ` of SLAX and the problem is addresses -- instructions for :ref:`building ` libslax -- background information on the :ref:`concepts ` on which SLAX is based -- documentation for the :ref:`SLAX language ` itself -- documentation on the :ref:`libslax software ` -- documentation on the :ref:`libslax extension library ` -- and some :ref:`example scripts ` +- An :ref:`overview ` of SLAX and the problem is addresses +- Instructions for :ref:`building ` libslax +- Background information on the :ref:`concepts ` on which SLAX is based +- Documentation for the :ref:`SLAX language ` itself +- Documentation on the :ref:`libslax software ` +- Documentation on the :ref:`libslax extension library ` +- Some :ref:`example scripts ` .. toctree:: :maxdepth: 3 From 7c8f258fb0ffa395d8bd1f8851f7dd3e6bfebc9e Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Mon, 18 Dec 2017 13:10:56 -0500 Subject: [PATCH 079/104] fix pound-bang label --- doc/more-statements.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/more-statements.rst b/doc/more-statements.rst index 66e691ed..23f6538a 100644 --- a/doc/more-statements.rst +++ b/doc/more-statements.rst @@ -15,8 +15,9 @@ If the first line of a SLAX script begins with the characters "#!", the rest of that line is ignored. This allows scripts to be invoked directly by name on a unix command line. -See :ref:`slaxproc-arguments` for details about the slaxproc utility -argument handling and the "#!" line. +See :ref:`slaxproc-pound-bang` under :ref:`slaxproc-arguments` for +details about the slaxproc utility argument handling and the "#!" +line. Additional details are available at the following site: From db2ff44ef56555eab094cf8f8ee280ec6a9a8623 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Tue, 19 Dec 2017 02:22:45 -0500 Subject: [PATCH 080/104] add labels --- doc/concepts.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/concepts.rst b/doc/concepts.rst index ac91b88f..223af65c 100644 --- a/doc/concepts.rst +++ b/doc/concepts.rst @@ -63,6 +63,7 @@ We'll examine each of these technologies in more detail in the following sections. .. index:: XML +.. _xml-concepts: XML Concepts ++++++++++++ @@ -163,6 +164,7 @@ such as the following JUNOS configuration file:: See also https://www.w3.org/TR/1998/REC-xml-19980210. .. index:: XPath +.. _xpath-concepts: XPath Concepts ++++++++++++++ @@ -281,6 +283,7 @@ XPath is fully described in the W3C's specification, http://w3c.org/TR/xpath. .. index:: XSLT +.. _xslt-concepts: XSLT Concepts +++++++++++++ From 0acf465206d2540c586869ea8b0bd46467d25d40 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Tue, 19 Dec 2017 02:22:52 -0500 Subject: [PATCH 081/104] fix labels --- doc/index.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/index.rst b/doc/index.rst index b799a569..5f581742 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -10,7 +10,9 @@ This documentation includes: - An :ref:`overview ` of SLAX and the problem is addresses - Instructions for :ref:`building ` libslax -- Background information on the :ref:`concepts ` on which SLAX is based +- Background information on the :ref:`concepts ` on which + SLAX is based (:ref:`XML `, :ref:`XPath + `, and :ref:`XSLT `) - Documentation for the :ref:`SLAX language ` itself - Documentation on the :ref:`libslax software ` - Documentation on the :ref:`libslax extension library ` From 69ada079122f44ccfe93f35c220beecf16346222 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:56:18 -0400 Subject: [PATCH 082/104] add checks for xsw_usage.xsu_total and dev_t --- configure.ac | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/configure.ac b/configure.ac index b53aed09..b2857e63 100644 --- a/configure.ac +++ b/configure.ac @@ -424,6 +424,96 @@ AC_COMPILE_IFELSE( ] ) +# Look for "struct clockinfo" for sysctl printing +AC_MSG_CHECKING([for struct clockinfo]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[ +#include +#include +]], + [[struct clockinfo ci; ci.hz = 0;]])], + [ + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED([HAVE_CLOCKINFO], 1, + [Define to 1 if you have the `clockinfo' struct.]) + ], + [ + AC_MSG_RESULT([no]) + ] +) + +# Look for "struct clockinfo" tickadj for sysctl printing +AC_MSG_CHECKING([for struct clockinfo.tickadj]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[ +#include +#include +]], + [[struct clockinfo ci; ci.tickadj = 0;]])], + [ + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED([HAVE_CLOCKINFO_TICKADJ], 1, + [Define to 1 if you have the `clockinfo.tickadj' fiel.]) + ], + [ + AC_MSG_RESULT([no]) + ] +) + +# Look for "struct loadavg" for sysctl printing +AC_MSG_CHECKING([for struct loadavg]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[ +#include +#include +#include +]], + [[struct loadavg la; la.fscale = 0;]])], + [ + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED([HAVE_LOADAVG], 1, + [Define to 1 if you have the `loadavg' struct.]) + ], + [ + AC_MSG_RESULT([no]) + ] +) + +# Look for "struct xsw_usage" for sysctl printing +AC_MSG_CHECKING([for struct xsw_usage]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[ +#include +#include +]], + [[struct xsw_usage xsu; xsu.xsu_total = 0;]])], + [ + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED([HAVE_XSW_USAGE], 1, + [Define to 1 if you have the `xsw_usage' struct.]) + ], + [ + AC_MSG_RESULT([no]) + ] +) + +# Look for "dev_t" for sysctl printing +AC_MSG_CHECKING([for struct dev_t]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[ +#include +]], + [[dev_t dev; dev = 0;]])], + [ + AC_MSG_RESULT([yes]) + AC_DEFINE_UNQUOTED([HAVE_DEV_T], 1, + [Define to 1 if you have the `dev_t' type.]) + ], + [ + AC_MSG_RESULT([no]) + ] +) + case $host_os in darwin-13*) # LIBTOOL=libtool From e28c3cea23e5a409fb394645e94e148798ce14f5 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:56:35 -0400 Subject: [PATCH 083/104] Add #include of --- libpsu/psucpu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libpsu/psucpu.c b/libpsu/psucpu.c index 5c80c68b..9707fd57 100644 --- a/libpsu/psucpu.c +++ b/libpsu/psucpu.c @@ -11,6 +11,7 @@ #include #include +#include #include #include From 96b1e808ee36e93d47553b1202155fa7e439f876 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:56:39 -0400 Subject: [PATCH 084/104] Add #include of --- libpsu/psulog.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libpsu/psulog.c b/libpsu/psulog.c index a02615a1..24e90f9d 100644 --- a/libpsu/psulog.c +++ b/libpsu/psulog.c @@ -10,6 +10,7 @@ */ #include +#include #include #include From ae9b7ad792ccd6ac034fba6c08dd02483a105703 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:56:41 -0400 Subject: [PATCH 085/104] Add #include of --- libpsu/psulog.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libpsu/psulog.h b/libpsu/psulog.h index 73e7b41e..19b4ac94 100644 --- a/libpsu/psulog.h +++ b/libpsu/psulog.h @@ -12,6 +12,7 @@ #ifndef LIBPSU_PSULOG_H #define LIBPSU_PSULOG_H +#include #include /** From 8f0079f4380247fa9c87ed02d2ec52fc42a45f09 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:56:43 -0400 Subject: [PATCH 086/104] Add #include of --- libpsu/psumemdump.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libpsu/psumemdump.c b/libpsu/psumemdump.c index 45f6e127..91a1a89a 100644 --- a/libpsu/psumemdump.c +++ b/libpsu/psumemdump.c @@ -10,6 +10,7 @@ */ #include +#include #include #include From 3212718fd27ea8ad5b421fcfa72bb06d1e66ea87 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:57:59 -0400 Subject: [PATCH 087/104] Teach sysctl code to handle arrays and use kernel's type information; the kernel mechanism to do this (BSD) is not pretty, but I attempt to be as safe as possible --- libslax/slaxext.c | 430 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 414 insertions(+), 16 deletions(-) diff --git a/libslax/slaxext.c b/libslax/slaxext.c index 6ac11a6a..506c753e 100644 --- a/libslax/slaxext.c +++ b/libslax/slaxext.c @@ -38,6 +38,7 @@ #include #include #include +#include #ifdef HAVE_STDTIME_TZFILE_H #include @@ -523,6 +524,13 @@ slaxWhileElement (xsltTransformContextPtr ctxt, || ctxt->debugStatus == XSLT_DEBUG_RUN_RESTART) break; + /* + * If a "terminate" statement has been executed, the context + * state show us as stopped. We need to notice this. + */ + if (ctxt->state == XSLT_STATE_STOPPED) + break; + if (ctxt->debugStatus != XSLT_DEBUG_NONE) xslHandleDebugger(inst, node, ctxt->templ, ctxt); @@ -1504,6 +1512,202 @@ slaxExtEmpty (xmlXPathParserContext *ctxt, int nargs) } #if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME) + +/* + * This is essentially unportable code, but I've tried to make it as + * portable as possible. Anyone following the style of BSD will have + * some level of functionality, hopefully. Anyone willout it will have + * sane behavior and the ability to specify their own format, hopefully. + */ + +/* If these aren't already defined, make our own */ +#ifndef CTLTYPE +#define CTLTYPE 0x1F /* Suitable max */ +#endif + +#ifdef CTLTYPE_INT +#define HAS_CTLTYPE_INT /* Remember that we made this */ +#else +#undef HAS_CTLTYPE_INT /* Remember that we didn't make this */ +#define CTLTYPE_INT CTLTYPE + 0 +#endif /* CTLTYPE_INT */ + +#ifndef CTLTYPE_UINT +#define CTLTYPE_UINT (CTLTYPE + 1) +#endif /* CTLTYPE_UINT */ +#ifndef CTLTYPE_LONG +#define CTLTYPE_LONG (CTLTYPE + 2) +#endif /* CTLTYPE_LONG */ +#ifndef CTLTYPE_ULONG +#define CTLTYPE_ULONG (CTLTYPE + 3) +#endif /* CTLTYPE_ULONG */ +#ifndef CTLTYPE_S8 +#define CTLTYPE_S8 (CTLTYPE + 4) +#endif /* CTLTYPE_S8 */ +#ifndef CTLTYPE_S16 +#define CTLTYPE_S16 (CTLTYPE + 5) +#endif /* CTLTYPE_S16 */ +#ifndef CTLTYPE_S32 +#define CTLTYPE_S32 (CTLTYPE + 6) +#endif /* CTLTYPE_S32 */ +#ifndef CTLTYPE_S64 +#define CTLTYPE_S64 (CTLTYPE + 7) +#endif /* CTLTYPE_S64 */ +#ifndef CTLTYPE_U8 +#define CTLTYPE_U8 (CTLTYPE + 8) +#endif /* CTLTYPE_U8 */ +#ifndef CTLTYPE_U16 +#define CTLTYPE_U16 (CTLTYPE + 9) +#endif /* CTLTYPE_U16 */ +#ifndef CTLTYPE_U32 +#define CTLTYPE_U32 (CTLTYPE + 10) +#endif /* CTLTYPE_U32 */ +#ifndef CTLTYPE_U64 +#define CTLTYPE_U64 (CTLTYPE + 11) +#endif /* CTLTYPE_U64 */ +#ifndef CTLTYPE_STRING +#define CTLTYPE_STRING (CTLTYPE + 12) +#endif /* CTLTYPE_STRING */ +#ifndef CTLTYPE_POINTER +#define CTLTYPE_POINTER (CTLTYPE + 13) +#endif /* CTLTYPE_POINTER */ +#ifndef CTLTYPE_HEXDUMP +#define CTLTYPE_HEXDUMP (CTLTYPE + 14) +#endif /* CTLTYPE_HEXDUMP */ +#ifndef CTLTYPE_STRUCT +#define CTLTYPE_STRUCT (CTLTYPE + 15) +#endif /* CTLTYPE_STRUCT */ + +#define SLAX_SC_MAX_TYPE (CTLTYPE + 16) /* Max of real plus our fake */ + +typedef struct slax_sc_type_map_s { + size_t stm_size; /* sizeof(type) */ + int stm_signed; /* Signed or unsigned */ + const char *stm_name; /* More format name */ + const char *stm_fmt; /* printf-style format */ + const char *stm_short; /* Short name */ + const char *stm_code; /* Kernel format code */ +} slax_sc_type_map_t; + +/* + * The following table is full of our type information, which might + * be "real" types mixed in with possibly "fake" types. Either way, + * it gives us a means of finding type information. + */ +static slax_sc_type_map_t slax_sc_type_map[SLAX_SC_MAX_TYPE] = { + [CTLTYPE_INT] = { sizeof(int), TRUE, "integer", "%d", "d", "I" }, + [CTLTYPE_UINT] = { sizeof(u_int), FALSE, "unsigned", "%u", "u", "IU" }, + [CTLTYPE_LONG] = { sizeof(long), TRUE, "long", "%ld", "ld", "L" }, + [CTLTYPE_ULONG] = { sizeof(u_long), FALSE, "u_long", "%lu", "lu", "LU" }, + [CTLTYPE_S8] = { sizeof(int8_t), TRUE, "int8_t", "%hhd", "i8", NULL }, + [CTLTYPE_S16] = { sizeof(int16_t), TRUE, "int16_t", "%hd", "i16", NULL }, + [CTLTYPE_S32] = { sizeof(int32_t), TRUE, "int32_t", "%d", "i32", NULL }, + [CTLTYPE_S64] = { sizeof(int64_t), TRUE, "int64_t", "%ld", "i64", "Q" }, + [CTLTYPE_U8] = { sizeof(uint8_t), FALSE, "uint8_t", "%hhu", "u8", NULL }, + [CTLTYPE_U16] = { sizeof(uint16_t), FALSE, "uint16_t", "%hu", "u16", NULL }, + [CTLTYPE_U32] = { sizeof(uint32_t), FALSE, "uint32_t", "%u", "u32", NULL }, + [CTLTYPE_U64] = { sizeof(uint64_t), FALSE, "uint64_t", "%lu", "u64", "QU" }, + [CTLTYPE_STRING] = { 0, FALSE, "char *", "%s", "s", "A" }, + [CTLTYPE_POINTER] = { sizeof(void *), FALSE, "void *", "%p", "p", "X" }, + [CTLTYPE_HEXDUMP] = { sizeof(char), FALSE, "char", "%02x", "x", "P" }, + [CTLTYPE_STRUCT] = { sizeof(char), FALSE, "struct", "%02x", "st", "S" }, +}; + +/* + * Fetch the type information associated with a sysctl variable. + */ +static int +slaxExtSysctlType (/*const*/ char *name UNUSED, const char *tname UNUSED, + char *fmt UNUSED, size_t fmt_size UNUSED) +{ + slax_sc_type_map_t *stmp; + int i; + + if (tname && *tname) { + /* Trust the explicit type name */ + stmp = slax_sc_type_map; + for (i = 0; i < SLAX_SC_MAX_TYPE; i++, stmp++) { + if (stmp->stm_short && streq(stmp->stm_short, tname)) { + /* Found a match */ + return i; + } + } + } + +#if defined(HAS_CTLTYPE_INT) +#define SC_SIZE 2 + int sc_name2oid[SC_SIZE] = { 0, 3 }; /* oid to convert name to oid */ + int sc_oid2type[SC_SIZE] = { 0, 4 }; /* oid to convert oid to type */ + + int oid[CTL_MAXNAME + SC_SIZE]; + size_t size = CTL_MAXNAME * sizeof(oid[0]); + int rc; + + rc = sysctl(sc_name2oid, NUM_ARRAY(sc_name2oid), + &oid[SC_SIZE], &size, name, strlen(name)); + if (rc < 0) + return rc; + + int oid_size = size / sizeof(oid[0]); + + oid[0] = sc_oid2type[0]; /* Copy sysctl oid */ + oid[1] = sc_oid2type[1]; + + rc = sysctl(oid, oid_size + SC_SIZE, fmt, &fmt_size, 0, 0); + if (rc < 0) + return rc; + + /* + * The results of the sc_oid2type sysctl is as follows: + * - first word is the type information (CTLTYPE_*) + * - printf-style format string for the type + */ + int type; + + memmove(&type, fmt, sizeof(type)); + type &= CTLTYPE; + memmove(fmt, fmt + sizeof(type), fmt_size - sizeof(type)); + + /* + * The "struct" formats start with "S," and then add a + * suffix, based in the type of the struct. + */ + if (fmt[0] == 'S' && fmt[1] == ',') + return CTLTYPE_STRUCT; + + stmp = slax_sc_type_map; + for (i = 0; i < SLAX_SC_MAX_TYPE; i++, stmp++) { + if (stmp->stm_short && streq(stmp->stm_code, fmt)) { + /* Found a match */ + return i; + } + } + + if (type > SLAX_SC_MAX_TYPE) + return -1; + + /* Make sure we ended up with a valid type */ + stmp = &slax_sc_type_map[type]; + return stmp->stm_name ? type : -1; + +#else /* HAS_CTLTYPE_INT */ + return -1; +#endif /* HAS_CTLTYPE_INT */ +} + +/* + * Copy some memory if there's enough to copy + */ +static int +slaxExtSysctlMemcpy (void *dst, void *src, size_t size, size_t avail) +{ + if (avail < size) + return 0; + + memcpy(dst, src, size); + return size; +} + /* * Return the value of the given sysctl as a string or integer * @@ -1514,7 +1718,7 @@ slaxExtEmpty (xmlXPathParserContext *ctxt, int nargs) static void slaxExtSysctl (xmlXPathParserContext *ctxt, int nargs) { - xmlChar *name, *type = NULL; + char *name, *type_name = NULL; if (nargs == 0 || nargs > 2) { xmlXPathSetArityError(ctxt); @@ -1522,33 +1726,227 @@ slaxExtSysctl (xmlXPathParserContext *ctxt, int nargs) } if (nargs == 2) - type = xmlXPathPopString(ctxt); - name = xmlXPathPopString(ctxt); + type_name = (char *) xmlXPathPopString(ctxt); + name = (char *) xmlXPathPopString(ctxt); size_t size = 0; + char fmt[BUFSIZ]; + fmt[0] = '\0'; + + slax_sc_type_map_t *stmp; + int type = slaxExtSysctlType(name, type_name, fmt, sizeof(fmt)); + if (type < 0) /* Default to string */ + type = CTLTYPE_STRING; + stmp = &slax_sc_type_map[type]; + + slaxLog("sysctl: var '%s' type %s/%d/'%s' fmt '%s'", + name, type_name ?: "", type, stmp->stm_name, fmt); + + /* The "-" format means deprecated */ + if (fmt[0] == '-') + return; + if (sysctlbyname((char *) name, NULL, &size, NULL, 0) || size == 0) { done: - xsltGenericError(xsltGenericErrorContext, - "sysctl error: %s\n", strerror(errno)); + switch (errno) { + case ENOTDIR: + case EISDIR: + case ENOENT: + /* Do nothing; no value returned */ + slaxLog("sysctl: var '%s' error %d/%s", + name, errno, strerror(errno)); + + xmlXPathReturnEmptyString(ctxt); + break; + + default: + xsltGenericError(xsltGenericErrorContext, + "sysctl error: %s\n", strerror(errno)); + } + + xmlFreeAndEasy(name); + xmlFreeAndEasy(type_name); return; } - char *buf = alloca(size); + char *buf = alloca(size + 1); + + /* + * Crazy as it seems, we need to zero out the buffer. Some kernel + * variable-fetching code fails to zero out the buffer for us. + * For example, kern.threadname under macosx. So we have to be + * paranoid. I'm fine with being paranoid, as long as I don't + * have to think that _everyone_ is out to get me. + */ + bzero(buf, size + 1); + + /* Finally, we can fetch the actual contents */ if (sysctlbyname((char *) name, buf, &size, NULL, 0)) goto done; - if (type && *type == 'i') { - int value; - memcpy(&value, buf, sizeof(value)); - const int int_width = 16; - buf = alloca(int_width); - snprintf(buf, int_width, "%d", value); + if (type == CTLTYPE_STRING || stmp->stm_size == 0) { /* String */ + buf[size] = '\0'; /* Ensure NUL termination */ + + } else if (type == CTLTYPE_STRUCT) { + char *sname = fmt + 2; + char *sdata = buf; + + buf = alloca(BUFSIZ); /* New formatted data buffer */ + char *cp = buf, *ep = buf + BUFSIZ; + buf[0] = '\0'; + + + if (streq(sname, "timeval")) { + struct timeval tv; + + if (slaxExtSysctlMemcpy(&tv, sdata, sizeof(tv), size)) { + snprintf(cp, ep - cp, "{ sec = %ld, usec = %ld } ", + (long) tv.tv_sec, (long) tv.tv_usec); + cp += strlen(cp); + +#ifdef HAVE_CTIME + time_t t = tv.tv_sec; + strlcpy(cp, ctime(&t), ep - cp); + cp += strlen(cp); + + /* Nuke ctime's trailing newline */ + if (cp > buf && cp[-1] == '\n') + cp[-1] = '\0'; +#endif /* HAVE_CTIME */ + } + + } else if (streq(sname, "clockinfo")) { +#ifdef HAVE_CLOCKINFO + struct clockinfo ci; + + if (slaxExtSysctlMemcpy(&ci, sdata, sizeof(ci), size)) { +#ifdef HAVE_CLOCKINFO_TICKADJ + snprintf(cp, ep - cp, + "{ hz = %d, tick = %d, tickadj = %d, " + "profhz = %d, stathz = %d }", + ci.hz, ci.tick, ci.tickadj, ci.profhz, ci.stathz); +#else /* HAVE_CLOCKINFO_TICKADJ */ + snprintf(cp, ep - cp, + "{ hz = %d, tick = %d, profhz = %d, stathz = %d }", + ci.hz, ci.tick, ci.profhz, ci.stathz); +#endif /* HAVE_CLOCKINFO_TICKADJ */ + } +#endif /* HAVE_CLOCKINFO */ + + } else if (streq(sname, "loadavg")) { +#ifdef HAVE_LOADAVG + struct loadavg la; + + if (slaxExtSysctlMemcpy(&la, sdata, sizeof(la), size)) { + snprintf(cp, ep - cp, "{ %.2f %.2f %.2f }", + (double) la.ldavg[0] / (double) la.fscale, + (double) la.ldavg[1] / (double) la.fscale, + (double) la.ldavg[2] / (double) la.fscale); + } +#endif /* HAVE_LOADAVG */ + + } else if (streq(sname, "xsw_usage")) { +#ifdef HAVE_XSW_USAGE + struct xsw_usage xsu; + + if (slaxExtSysctlMemcpy(&xsu, sdata, sizeof(xsu), size)) { + double scale = 1024.0 * 1024.0; + + snprintf(cp, ep - cp, + "total = %.2fM used = %.2fM free = %.2fM %s", + ((double) xsu.xsu_total) / scale, + ((double) xsu.xsu_used) / scale, + ((double) xsu.xsu_avail) / scale, + xsu.xsu_encrypted ? "(encrypted)" : ""); + } +#endif /* HAVE_XSW_USAGE */ + + } else if (streq(sname, "dev_t")) { +#ifdef HAVE_DEV_T + dev_t dev; + + if (slaxExtSysctlMemcpy(&dev, sdata, sizeof(dev), size)) { + if ((int) dev != -1) { + if (minor(dev) > 255 || minor(dev) < 0) + snprintf(cp, ep - cp, "{ major = %d, minor = 0x%x }", + major(dev), minor(dev)); + else + snprintf(cp, ep - cp, "{ major = %d, minor = %d }", + major(dev), minor(dev)); + } + } +#endif /* HAVE_DEV_T */ + } + + } else { + /* We have an array of integer values */ + const int per_width = 24; /* Formatted space per value */ + int i, used; + int count = size / stmp->stm_size; + size_t newsize = count * per_width; + char *newbuf = alloca(newsize), *cp = newbuf, *ep = newbuf + newsize; + intmax_t val; + uintmax_t uval; + char *bp = buf; + intmax_t ibuf64; + void *ibuf = (char *) &ibuf64; + const char *ctlfmt; + + for (i = 0; i < count; i++, bp += stmp->stm_size) { + memcpy(ibuf, bp, stmp->stm_size); + + ctlfmt = stmp->stm_signed ? "%jd" : "%ju"; + val = 0; + uval = 0; + + switch (type) { + case CTLTYPE_INT: val = * (int *) ibuf; break; + case CTLTYPE_UINT: uval = * (u_int *) ibuf; break; + case CTLTYPE_LONG: val = * (long *) ibuf; break; + case CTLTYPE_ULONG: uval = * (u_long *) ibuf; break; + case CTLTYPE_S8: val = * (int8_t *) ibuf; break; + case CTLTYPE_S16: val = * (int16_t *) ibuf; break; + case CTLTYPE_S32: val = * (int32_t *) ibuf; break; + case CTLTYPE_S64: val = * (int64_t *) ibuf; break; + case CTLTYPE_U8: uval = * (uint8_t *) ibuf; break; + case CTLTYPE_U16: uval = * (uint16_t *) ibuf; break; + case CTLTYPE_U32: uval = * (uint32_t *) ibuf; break; + case CTLTYPE_U64: uval = * (uint64_t *) ibuf; break; + + case CTLTYPE_POINTER: + uval = * (uintptr_t *) ibuf; + ctlfmt = "%02jp"; + break; + + case CTLTYPE_HEXDUMP: + uval = * (char *) ibuf; + ctlfmt = "%02jx"; + break; + + default: + continue; + } + + if (stmp->stm_signed) + used = snprintf(cp, ep - cp, ctlfmt, val); + else used = snprintf(cp, ep - cp, ctlfmt, uval); + + if (used > per_width) /* Should not occur */ + break; + cp += used; + *cp++ = ' '; + } + + if (cp > newbuf) /* Back off the last trailing space */ + cp -= 1; + *cp = '\0'; /* Ensure NUL termination */ + buf = newbuf; /* Use our newly formatted data */ } xmlFree(name); - if (type) - xmlFree(type); + if (type_name) + xmlFree(type_name); xmlXPathReturnString(ctxt, xmlStrdup((xmlChar *) buf)); } @@ -1676,9 +2074,9 @@ slaxExtSplit (xmlXPathParserContext *ctxt, int nargs) * */ static int -slaxExtDecode (const char *name, CODE *codetab) +slaxExtDecode (const char *name, const CODE *codetab) { - CODE *c; + const CODE *c; for (c = codetab; c->c_name; c++) if (!strcasecmp(name, c->c_name)) From ac106c081d0dcfe7a035c04bb36683e18cddc87d Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:58:33 -0400 Subject: [PATCH 088/104] fix #44 by calling ALL_KEYWORDS_ON at appropriate places --- libslax/slaxparser.y | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/libslax/slaxparser.y b/libslax/slaxparser.y index e1511d79..77142e61 100644 --- a/libslax/slaxparser.y +++ b/libslax/slaxparser.y @@ -1415,7 +1415,10 @@ apply_template_sub_stmt_list_optional : apply_template_sub_stmt_list : apply_template_sub_stmt - { $$ = NULL; } + { + ALL_KEYWORDS_ON(); + $$ = NULL; + } | apply_template_sub_stmt_list apply_template_sub_stmt { @@ -1519,10 +1522,16 @@ call_argument_braces_list_optional : call_argument_braces_list : call_argument_braces_member - { $$ = NULL; } + { + ALL_KEYWORDS_ON(); + $$ = NULL; + } | call_argument_braces_list call_argument_braces_member - { $$ = STACK_CLEAR($1); } + { + ALL_KEYWORDS_ON(); + $$ = STACK_CLEAR($1); + } ; call_argument_braces_member : @@ -1530,7 +1539,6 @@ call_argument_braces_member : { xmlNodePtr nodep; - ALL_KEYWORDS_ON(); nodep = slaxElementAdd(slax_data, ELT_WITH_PARAM, ATT_NAME, $2->ss_token + 1); if (nodep) { @@ -1556,7 +1564,6 @@ call_argument_braces_member : } initial_value { - ALL_KEYWORDS_ON(); nodePop(slax_data->sd_ctxt); $$ = STACK_CLEAR($1); From 906c3796d85913dcd0026f92735c6d9908fabdb8 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:58:45 -0400 Subject: [PATCH 089/104] add include for stdarg.h --- parrotdb/paarb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/parrotdb/paarb.c b/parrotdb/paarb.c index 47a8f212..38d9a184 100644 --- a/parrotdb/paarb.c +++ b/parrotdb/paarb.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include From 3bb1f46f2f8a881460fe2c7054e2122460336628 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:58:47 -0400 Subject: [PATCH 090/104] add include for stdarg.h --- parrotdb/paistr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/parrotdb/paistr.c b/parrotdb/paistr.c index 631d1bec..a2faf056 100644 --- a/parrotdb/paistr.c +++ b/parrotdb/paistr.c @@ -11,6 +11,7 @@ #include #include +#include #include #include #include From a89d25ca5c3c90807b138ac8216414fe15c63ac8 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:58:48 -0400 Subject: [PATCH 091/104] add include for stdarg.h --- parrotdb/pammap.c | 1 + 1 file changed, 1 insertion(+) diff --git a/parrotdb/pammap.c b/parrotdb/pammap.c index e3d4f6f9..fc343436 100644 --- a/parrotdb/pammap.c +++ b/parrotdb/pammap.c @@ -11,6 +11,7 @@ #include #include +#include #include #include #include From 948e4197d8a177a99db27b8c749dbb6ca2c59005 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:59:15 -0400 Subject: [PATCH 092/104] update tests for fixes in libxslt-1.1.29 --- tests/core/saved/test-empty-32.err | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/core/saved/test-empty-32.err b/tests/core/saved/test-empty-32.err index 84bd99cd..0c7f2b49 100644 --- a/tests/core/saved/test-empty-32.err +++ b/tests/core/saved/test-empty-32.err @@ -90,6 +90,6 @@ bit:from-int(4.2e60) -> 11111111111111111111111111111111111111111111111111111111 bit:to-int(32767999) -> 32767999 bit:to-int(32768001) -> 32768001 bit:to-int(327680012) -> 327680012 -bit:to-int(3276800123) -> 3.276800123e+09 -bit:to-int(32768001234) -> 3.2768001234e+10 -bit:to-int(-1) -> 1.84467440737096e+19 +bit:to-int(3276800123) -> 3.276800123e+09 +bit:to-int(32768001234) -> 3.2768001234e+10 +bit:to-int(-1) -> 1.84467440737096e+19 From e8377449112633f664a5b44216aaa06146ddfe2c Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:59:18 -0400 Subject: [PATCH 093/104] update tests for fixes in libxslt-1.1.29 --- tests/core/saved/test-simple-01.err | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/core/saved/test-simple-01.err b/tests/core/saved/test-simple-01.err index 4138f533..02dd4b8f 100644 --- a/tests/core/saved/test-simple-01.err +++ b/tests/core/saved/test-simple-01.err @@ -1,5 +1,5 @@ compilation error: file ../../../tests/core/test-simple-01.slax line 65 element number xsl:number : letter-value 'alphabetic' not implemented -Unimplemented block at ../../libxslt/preproc.c:1476 +Unimplemented block at ../../libxslt/preproc.c:1481 before This is 'one' is good From ad09d9fcd9ff9a5518b73364f7612a74b3f55884 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:59:20 -0400 Subject: [PATCH 094/104] update tests for fixes in libxslt-1.1.29 --- tests/core/saved/test-units-01.out | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/core/saved/test-units-01.out b/tests/core/saved/test-units-01.out index 3fb89c7e..342e06b7 100644 --- a/tests/core/saved/test-units-01.out +++ b/tests/core/saved/test-units-01.out @@ -1,10 +1,10 @@ 16,404 - 11 - 6,213 + 12 + 6,214 40,000 144 1,609,347 - 548 + 549 From cd83093e09f86a605c8bdd95bca3d24b5267756e Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:59:45 -0400 Subject: [PATCH 095/104] add test case for #44 --- tests/core/saved/test-empty-37.err | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/core/saved/test-empty-37.err diff --git a/tests/core/saved/test-empty-37.err b/tests/core/saved/test-empty-37.err new file mode 100644 index 00000000..e69de29b From b502769b98b12c4d9396405035ffe2dd232f5a31 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:59:47 -0400 Subject: [PATCH 096/104] add test case for #44 --- tests/core/saved/test-empty-37.out | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 tests/core/saved/test-empty-37.out diff --git a/tests/core/saved/test-empty-37.out b/tests/core/saved/test-empty-37.out new file mode 100644 index 00000000..db22bcf5 --- /dev/null +++ b/tests/core/saved/test-empty-37.out @@ -0,0 +1,2 @@ + + From 7e473f7e0eabdc2bfcf1aba0c3b09b755b36fbef Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:59:50 -0400 Subject: [PATCH 097/104] add test case for #44 --- tests/core/saved/test-empty-37.slax2 | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tests/core/saved/test-empty-37.slax2 diff --git a/tests/core/saved/test-empty-37.slax2 b/tests/core/saved/test-empty-37.slax2 new file mode 100644 index 00000000..16f40426 --- /dev/null +++ b/tests/core/saved/test-empty-37.slax2 @@ -0,0 +1,15 @@ +version 1.2; + +main { + var $tag = "tag"; + var $indent = "indent"; + + apply-templates { + mode "line"; + with $tag; + with $x = @x; + sort @order; + with $y = @y; + with $indent; + } +} From 0a6aaf2c2f4394c9ad91e7f08497e179e20a74b0 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:59:52 -0400 Subject: [PATCH 098/104] add test case for #44 --- tests/core/saved/test-empty-37.xsl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 tests/core/saved/test-empty-37.xsl diff --git a/tests/core/saved/test-empty-37.xsl b/tests/core/saved/test-empty-37.xsl new file mode 100644 index 00000000..1425dfa4 --- /dev/null +++ b/tests/core/saved/test-empty-37.xsl @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + From 9e45b9538d8ae09b0f7b516415d8dffd983653b9 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 13:59:54 -0400 Subject: [PATCH 099/104] add test case for #44 --- tests/core/test-empty-37.slax | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tests/core/test-empty-37.slax diff --git a/tests/core/test-empty-37.slax b/tests/core/test-empty-37.slax new file mode 100644 index 00000000..c093cf78 --- /dev/null +++ b/tests/core/test-empty-37.slax @@ -0,0 +1,15 @@ +version 1.2; + +main { + var $tag = "tag"; + var $indent = "indent"; + + apply-templates { + mode "line"; + with $tag = $tag; + with $x = @x; + sort @order; + with $y = @y; + with $indent = $indent; + } +} From 7ccdc3d6b9e9d9d17736a7c2263f2c566c54d6d7 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 9 Aug 2018 14:06:43 -0400 Subject: [PATCH 100/104] avoid using "asm" for GCC < 5 (#42) --- libpsu/psucpu.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libpsu/psucpu.c b/libpsu/psucpu.c index 9707fd57..87c524b1 100644 --- a/libpsu/psucpu.c +++ b/libpsu/psucpu.c @@ -105,12 +105,14 @@ psu_cpu_get_info (uint32_t which, psu_cpuid_t *pcp) { bzero(pcp, sizeof(*pcp)); +#if !defined(__GCC__) || __GCC__ >= 5 /* Limited gcc support */ #if defined(__x86_64__) || defined(__i386__) asm volatile ("cpuid" : "=a" (pcp->pc_ax), "=b" (pcp->pc_bx), "=c" (pcp->pc_cx), "=d" (pcp->pc_dx) : "a" (which), "c" (0)); #endif /* _X86_ */ +#endif /* !__GCC__ */ psu_log("cpu info(%u): %#x, %#x, %#x, %#x\n", which, pcp->pc_ax, pcp->pc_bx, pcp->pc_cx, pcp->pc_dx); From 4afda1450ddb5bc3daca62fd980b196f5123d28a Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 1 Nov 2018 23:38:36 -0400 Subject: [PATCH 101/104] use python3 --- doc/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Makefile.am b/doc/Makefile.am index 00f8dd62..583c1b53 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -112,7 +112,7 @@ uninstall-hook: done ${RM} -f ${DESTDIR}${bindir}/oxtradoc -SPHINX = python3.4 -msphinx +SPHINX = python3 -msphinx html sphinx sphinx-html: ${GREP} '.. admonition: ' ${srcdir}/*rst; true From cca2fcfe1b07577e5a36f0014fc824466f0f5871 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 1 Nov 2018 23:38:43 -0400 Subject: [PATCH 102/104] add stdarg.h --- libpsu/psulog.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libpsu/psulog.h b/libpsu/psulog.h index 73e7b41e..707c71ad 100644 --- a/libpsu/psulog.h +++ b/libpsu/psulog.h @@ -13,6 +13,7 @@ #define LIBPSU_PSULOG_H #include +#include /** * Enable logging. From e89965c02a219c13ee13ac690da3bba1813989d7 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 1 Nov 2018 23:38:59 -0400 Subject: [PATCH 103/104] slaxExtDecode needed a "const" --- libslax/slaxext.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libslax/slaxext.c b/libslax/slaxext.c index 6ac11a6a..6bcde0d2 100644 --- a/libslax/slaxext.c +++ b/libslax/slaxext.c @@ -1676,9 +1676,9 @@ slaxExtSplit (xmlXPathParserContext *ctxt, int nargs) * */ static int -slaxExtDecode (const char *name, CODE *codetab) +slaxExtDecode (const char *name, const CODE *codetab) { - CODE *c; + const CODE *c; for (c = codetab; c->c_name; c++) if (!strcasecmp(name, c->c_name)) From 2d69c2546f858cbebaf8fd5ae18eb2aaf1a57c68 Mon Sep 17 00:00:00 2001 From: Phil Shafer Date: Thu, 26 Sep 2019 16:17:34 -0400 Subject: [PATCH 104/104] Add missing check when moving sd_cur --- libslax/slaxlexer.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libslax/slaxlexer.c b/libslax/slaxlexer.c index fc330990..b90efcba 100644 --- a/libslax/slaxlexer.c +++ b/libslax/slaxlexer.c @@ -1099,6 +1099,11 @@ slaxLexer (slax_data_t *sdp) * need to read some more, if the string is long. */ sdp->sd_cur += 1; /* Move past the first quote */ + if (sdp->sd_cur == sdp->sd_len) { + if (slaxGetInput(sdp, 0)) + return -1; + } + while (((unsigned char *) sdp->sd_buf)[sdp->sd_cur] != ch1) { int bump = (sdp->sd_buf[sdp->sd_cur] == '\\') ? 1 : 0;

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¥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%0A~TgTLz} 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