ASCII art diagram converter: Difference between revisions

julia example
(Added Go)
(julia example)
Line 534:
 
Note that this implementation assumes that the ascii diagram represents the native word width on a single line, and assumes well formed data.
 
 
=={{header|Julia}}==
<lang julia>diagram = """
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+"""
 
testhexdata = "78477bbf5496e12e1bf169a4"
 
struct BitField
name::String
bits::Int
fieldstart::Int
fieldend::Int
end
 
function diagramtostruct(txt)
bitfields = Vector{BitField}()
lines = map(strip, split(txt, "\n"))
for row in 1:2:length(lines)-1
nbits = sum(x -> x == '+', lines[row]) - 1
fieldpos = findall(x -> x == '|', lines[row + 1])
bitaccum = div(row, 2) * nbits
for (i, field) in enumerate(fieldpos[1:end-1])
endfield = fieldpos[i + 1]
bitsize = div(endfield - field, 3)
bitlabel = strip(lines[row + 1][field+1:endfield-1])
bitstart = div(field - 1, 3) + bitaccum
bitend = bitstart + bitsize - 1
push!(bitfields, BitField(bitlabel, bitsize, bitstart, bitend))
end
end
bitfields
end
 
binbyte(c) = string(parse(UInt8, c, base=16), base=2, pad=8)
hextobinary(s) = reduce(*, map(binbyte, map(x -> s[x:x+1], 1:2:length(s)-1)))
 
function bitreader(bitfields, hexdata)
println("\nEvaluation of hex data $hexdata as bitfields:")
println("Name Size Bits\n------- ---- ----------------")
b = hextobinary(hexdata)
for bf in bitfields
pat = b[bf.fieldstart+1:bf.fieldend+1]
println(rpad(bf.name, 9), rpad(bf.bits, 6), lpad(pat, 16))
end
end
 
const decoded = diagramtostruct(diagram)
 
println("Diagram as bit fields:\nName Bits Start End\n------ ---- ----- ---")
for bf in decoded
println(rpad(bf.name, 8), rpad(bf.bits, 6), rpad(bf.fieldstart, 6), lpad(bf.fieldend, 6))
end
 
bitreader(decoded, testhexdata)
</lang>{{out}}
<pre>
Diagram as bit fields:
Name Bits Start End
------ ---- ----- ---
ID 16 0 15
QR 1 16 16
Opcode 4 17 20
AA 1 21 21
TC 1 22 22
RD 1 23 23
RA 1 24 24
Z 3 25 27
RCODE 4 28 31
QDCOUNT 16 32 47
ANCOUNT 16 48 63
NSCOUNT 16 64 79
ARCOUNT 16 80 95
 
Evaluation of hex data 78477bbf5496e12e1bf169a4 as bitfields:
Name Size Bits
------- ---- ----------------
ID 16 0111100001000111
QR 1 0
Opcode 4 1111
AA 1 0
TC 1 1
RD 1 1
RA 1 1
Z 3 011
RCODE 4 1111
QDCOUNT 16 0101010010010110
ANCOUNT 16 1110000100101110
NSCOUNT 16 0001101111110001
ARCOUNT 16 0110100110100100
</pre>
 
 
 
 
=={{header|Perl 6}}==
4,106

edits