1 Hex Dump a Byte Array

The following code shows a hex dump-like function used to dump the content of a byte array.

Copy
<xsql-script>

    <body>

        <function name='local_dump_ascii'>
            <args>
                <arg name='buff' />
                <arg name='start' />
                <arg name='end' />
            </args>
            <body>
                <print trim='true'><string.space /></print>
                <for name='pos' start='#start' end-lt='#end'>
                    <do>
                        <set name='chr'><byte.getByteAt><buff/><pos/></byte.getByteAt></set>
                        <if>
                            <expr>
                                <ge><chr/>32</ge>
                                <and/>
                                <lt><chr/>128</lt>
                            </expr>
                            <then>
                                <print trim='true'><character.charValue><chr/></character.charValue></print>
                            </then>
                            <else>
                                <print trim='true'>.</print>
                            </else>
                        </if>
                    </do>
                </for>
            </body>
        </function>

        <function name='local_dump_hexa'>
            <args>
                <arg name='buff' />
            </args>
            <body>
                <set name='size'><byte.length><buff/></byte.length></set>
                <set name='size'><math.min><size/>1024</math.min></set>
                <for name='idx' start='0' end-lt='#size'>
                    <do>
                        <if>
                            <expr>
                                <idx/>
                            </expr>
                            <then>
                                <if>
                                    <expr>
                                        <mod><idx/>16</mod>
                                    </expr>
                                    <then>
                                        <print trim='true'><string.space /></print>
                                    </then>
                                    <else>
                                        <local_dump_ascii>
                                            <buff />
                                            <sub><idx />16</sub>
                                            <idx/>
                                        </local_dump_ascii>
                                        <print trim='true'><string.nl /></print>
                                        <print trim='true'><number.toHexString padd='6'><idx/></number.toHexString><string.space/></print>
                                    </else>
                                </if>
                            </then>
                            <else>
                                <print trim='true'><number.toHexString padd='6'><idx/></number.toHexString><string.space/></print>
                            </else>
                        </if>
                        <print trim='true'>
                            <number.toHexString padd='2'>
                                <math.and>
                                    <byte.getByteAt>
                                        <buff/>
                                        <idx/>
                                    </byte.getByteAt>
                                    <number>
                                        255
                                    </number>
                                </math.and>
                            </number.toHexString>
                        </print>
                    </do>
                </for>
        
                <if>
                    <expr>
                        <mod><idx/>16</mod>
                    </expr>
                    <then>
                        <set name='remaining'><sub>15<mod><idx/>16</mod></sub></set>
                        <for name='pos' start='0' end-lt='#remaining'>
                            <do>
                                <print trim='true'><string.space /><string.space /><string.space /></print>
                            </do>
                        </for>
                        <local_dump_ascii>
                            <buff />
                            <sub><idx /><sub>15<remaining /></sub></sub>
                            <add><idx />1</add>
                        </local_dump_ascii>
                    </then>
                </if>
            </body>
        </function>
        
        <!-- call hex dump -->

        <local_dump_hexa>
            <!-- decode what's up icon -->
            <byte.base64.decode>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</byte.base64.decode>
        </local_dump_hexa>

    </body>
</xsql-script>
000000 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 .PNG........IHDR
000010 00 00 00 30 00 00 00 30 08 06 00 00 00 57 02 F9 ...0...0.....W..
000020 87 00 00 0C DB 49 44 41 54 78 DA D5 5A 09 5C 93 .....IDATx..Z.\.
000030 47 16 7F B9 21 E1 46 50 84 05 5B 2E 01 05 04 45 G..!.FP..[....E
000040 A4 50 04 D4 6A D1 BA 62 AD 50 11 51 4A EB C9 6A .P..j..b.P.QJ..j
000050 29 5A 6B 3D F0 A8 55 D9 AD 56 F9 89 DB 7A 20 B5 )Zk=..U..V...z .
000060 AC 67 C5 B5 50 EF 2A 0A 8A 07 87 07 62 AD 80 82 .g..P.*.....b...
000070 51 90 70 06 42 CE 7D F3 49 02 21 09 72 B8 BB ED Q.p.B.}.I.!.r...
000080 CB 8F 5F 66 E6 9B CC BC FF 9B 77 CE 07 0D FE E4 .._f......w.....
000090 44 FB 7F 33 F0 87 03 70 F7 EE 5D 7A 63 63 23 53 D.3...p..]zcc#S
0000A0 A1 50 B0 CB CB CB 59 D6 D6 D6 BC 8A 8A 8A 66 53 .P....Y.......fS
0000B0 53 53 B1 B1 B1 B1 D8 C4 C4 44 EA E2 E2 22 FF C3 SS.......D..."..
0000C0 00 B8 77 EF 1E 8D CF E7 73 90 BC 0C 0C 0C C6 59 ..w.....s......Y
0000D0 58 58 F8 20 93 F6 7A 7A 7A 36 74 3A 9D AB 9C 27 XX. ..zzz6t:...'
0000E0 97 CB 9B 45 22 51 65 5D 5D DD C3 EA EA EA EB 42 ...E"Qe]]......B
0000F0 A1 F0 8C 58 2C BE 89 00 45 4E 4E 4E 8A FF 39 80 ...X,...ENNN..9.
000100 AB 57 AF D2 AA AA AA 06 98 9B 9B 7F E2 E9 E9 19 .W.............
000110 C9 E5 72 ED 7B BA 46 73 73 F3 A3 A2 A2 A2 1F 04 ..r.{.Fss.......
000120 02 C1 AE 01 03 06 3C F3 F6 F6 EE F1 C9 F4 18 C0 ......<.........
000130 CD 9B 37 69 65 65 65 66 B6 B6 B6 9F 21 E3 73 99 ..7ieeef....!.s.
000140 4C A6 89 AE B9 72 85 1C 5A 65 AD C0 61 70 80 4E L....r..Ze..ap.N
000150 A3 EB 5C 53 2A 95 D6 23 90 5D 95 95 95 5B EC EC ..\S*..#.]...[..
000160 EC 6A 3C 3C 3C BA 7D 22 3D 02 70 E6 CC 19 06 4A .j<<<.}"=.p....J
000170 6B 5C 68 68 68 32 8F C7 7B A3 E3 B3 26 49 13 E4 k\hhh2..{...&I..
000180 F1 AF 43 C1 8B 22 A8 68 AA 84 E7 C2 E7 20 92 8A ..C..".h..... ..
000190 54 CF F5 18 7A D0 9F 6B 09 36 86 D6 E0 6E E1 0E T...z..k.6...n..
0001A0 BE 03 7C C0 80 6D A0 B6 3E AA 55 79 56 56 D6 42 ..|..m..>.UyVV.B
0001B0 3C D5 AC E0 E0 60 D9 6B 05 70 E8 D0 21 0E 1E F3 <....`.k.p..!...
0001C0 E7 FE FE FE 5F D2 68 34 A6 72 9C 2F 7C 06 C7 1F ...._.h4.r./|...
0001D0 66 C0 C5 CA 6C 90 C8 25 2F 07 5F 21 3F 05 7E 98 f...l..%/._!?.~.
0001E0 74 26 04 5A BF 0D 93 1D 26 81 8D 81 75 FB 33 85 t&.Z....&...u.3.
0001F0 42 96 93 93 F3 D5 C3 87 0F 37 44 47 47 B7 BE 16 B........7DGG...
000200 00 29 29 29 DC A1 43 87 6E F5 F3 F3 8B 55 8E 35 .)))..C.n....U.5
000210 4B 9A 21 B5 38 0D CE 3F F9 95 52 95 0E DC 75 C9 K.!.8..?..R...u.
000220 78 67 A2 E3 27 E8 2F 81 10 E5 1A 09 86 6C 43 D5 xg..'./......lC.
000230 78 5E 5E DE 5E 54 AB 45 B1 B1 B1 C2 3E 01 48 4A x^^.^T.E....>.HJ
000240 4A D2 0B 08 08 48 F1 F1 F1 99 A5 1C BB 57 53 0C J....H.......WS.
000250 DF E4 7F 0B 02 91 A0 5B 8C EB 62 BE 23 99 E9 99 ......[..b.#...
000260 C1 12 AF 38 70 33 77 55 8D A1 BD 1D B8 7C F9 72 ...8p3wU.....|.r
000270 EC E2 C5 8B 5B 7A 05 60 F7 EE DD 2C D4 C7 55 93 ....[z.`...,..U.
000280 27 4F FE 52 39 96 F3 34 17 B6 E5 EF 00 A9 42 DA 'O.R9..4......B.
000290 6B A9 EB 22 06 8D 01 71 C3 16 42 80 F5 5B AA B1 k.."...q..B..[..
0002A0 93 27 4F 7E 8D AE 77 D5 CC 99 33 25 3D 02 90 9A .'O~..w...3%=...
0002B0 9A 4A AF AD AD 9D 18 17 17 77 0C 75 9E 41 C6 B2 .J.......w.u.A..
0002C0 2B 2F C3 B7 F9 C9 20 07 F9 6B 91 BA B6 B9 34 FC +/.... ..k....4.
0002D0 2C F2 5C 40 A9 15 35 8E 36 B1 69 D3 A6 69 83 06 ,.\@..5.6.i..i..
0002E0 0D CA 88 88 88 D0 70 B3 3A 01 2C 5A B4 C8 72 ED ......p.:.,Z..r.
0002F0 DA B5 79 18 94 EC 48 FF 6E CD 3D 48 BC BA 1E 64 ..y...H.n.=H...d
000300 0A D9 6B 95 BA 6A 6E 87 9F 10 97 BB 66 D4 4A 18 ..k..jn.....f.J.
000310 DA 6F 08 D5 AF AF AF 7F B2 6C D9 32 9F 5D BB 76 .o......l.2.].v
000320 3D EB 16 80 D5 AB 57 33 DD DD DD 37 85 85 85 7D =.....W3...7...}
000330 4A FA 8D E2 26 F8 F4 52 C2 4B 9D D7 C2 1B 31 44 J...&..R.K....1D
000340 45 87 4F 5F 98 57 92 11 DB 08 B6 05 FD 03 4C 38 E.O_.W........L8
000350 C6 54 3F 23 23 63 5B 71 71 71 C2 F2 E5 CB D5 54 .T?##c[qqq.....T
000360 49 2B 80 39 73 E6 38 20 DA 02 0C 52 3C D2 4F 2E I+.9s.8 ...R<.O.
000370 DC 49 79 9B CE 1B 91 E3 9E 6C 3F 09 82 6D 83 40 .Iy......l?..m.@
000380 2A 97 C2 E1 07 47 20 87 7F B5 4F 8C 77 24 A2 46 *....G ..O.w$.F
000390 C4 26 08 C9 64 B2 E6 05 0B 16 78 21 5F 25 5D 02 .&..d.....x!_%].
0003A0 88 8F 8F 67 0E 1F 3E 7C 63 78 78 F8 67 A4 5F 5A ...g..>|cxx.g._Z
0003B0 5F 06 09 D9 9F 13 5D D4 D8 60 BC DD 38 88 75 8F _.....]..`..8.u.
0003C0 51 F5 9F 36 3D 85 B8 0B 4B D0 42 74 73 D6 5D E6 Q..6=...K.Bts.].
0003D0 95 B4 39 60 23 38 9A 3A 50 6D 8C 45 5B 31 59 4C ..9`#8.:Pm.E[1YL
0003E0 40 D5 56 79 10 0D 00 53 A6 4C 31 D9 B3 67 CF 1D @.Vy...S.L1..g..
0003F0 D4 7D 2A BA 24 DD F8 06 72 B5 48 D5 90 65 08 3B .}*.$...r.H..e.;

Precautions for Print Output

If XML code is reformatted with an automatic indenter, output may be affected if print instructions have been written without the precaution of activating the trim attribute. This is due to the fact that the content of the print tag includes the XML CDATA section and, as a result, all internal content.

Copy
<xsql-script>
   <body>
       <set name='x'>Hello</set>
        <!-- suspectible to fail if formatted -->
        <println><x/></println>
        <println>----</println>
        <!-- formatted, the value contains a previous line, subsequent lines, and unwanted indenting -->
        <println>
            <x/>
        </println>
        <println>----</println>
        <!-- formatted correctly, with trim attribute -->
        <println trim='true'>
            <x/>
        </println>
        <println>----</println>
   </body>
</xsql-script>
Hello
----

        Hello
    
----
Hello
----