// Character maps and packing adapted from datamatrix-rs encodation (MIT).

///|
fn c40_values(byte : Int, text : Bool) -> Array[Int] {
  let out = []
  let mut c = byte
  if c >= 128 {
    out.push(1)
    out.push(30)
    c -= 128
  }
  if text {
    if c >= 65 && c <= 90 {
      c += 32
    } else if c >= 97 && c <= 122 {
      c -= 32
    }
  }
  if c == 32 {
    out.push(3)
  } else if c >= 48 && c <= 57 {
    out.push(c - 44)
  } else if c >= 65 && c <= 90 {
    out.push(c - 51)
  } else if c <= 31 {
    out.push(0)
    out.push(c)
  } else if c <= 47 {
    out.push(1)
    out.push(c - 33)
  } else if c <= 64 {
    out.push(1)
    out.push(c - 43)
  } else if c <= 95 {
    out.push(1)
    out.push(c - 69)
  } else {
    out.push(2)
    out.push(c - 96)
  }
  out
}

///|
fn append_triplets(out : Array[Int], values : Array[Int]) -> Unit {
  for i = 0; i < values.length(); i = i + 3 {
    let v = 1600 * values[i] + 40 * values[i + 1] + values[i + 2] + 1
    out.push(v >> 8)
    out.push(v & 255)
  }
}