// Adapted from datamatrix-rs X12 and EDIFACT packing rules (MIT).
///|
fn x12_value(c : Int) -> Int? {
if c == 13 {
Some(0)
} else if c == 42 {
Some(1)
} else if c == 62 {
Some(2)
} else if c == 32 {
Some(3)
} else if c >= 48 && c <= 57 {
Some(c - 44)
} else if c >= 65 && c <= 90 {
Some(c - 51)
} else {
None
}
}
///|
fn append_edifact(out : Array[Int], values : Array[Int]) -> Unit {
for i = 0; i < values.length(); i = i + 4 {
let n = values.length() - i
let a = values[i] & 63
let b = if n > 1 { values[i + 1] & 63 } else { 0 }
let c = if n > 2 { values[i + 2] & 63 } else { 0 }
let d = if n > 3 { values[i + 3] & 63 } else { 0 }
out.push((a << 2) | (b >> 4))
if n > 1 {
out.push(((b << 4) | (c >> 2)) & 255)
}
if n > 2 {
out.push(((c << 6) | d) & 255)
}
}
}