///|
fn clean_gcode_line(raw : String) -> String {
  let mut output = ""
  let mut in_parentheses = false
  for character in raw {
    let code = character.to_int()
    if code == 40 {
      in_parentheses = true
    } else if code == 41 {
      in_parentheses = false
    } else if code == 59 && !in_parentheses {
      break
    } else if !in_parentheses {
      output = output + character.to_string()
    }
  }
  output.trim().to_owned()
}

///|
fn tokenize_gcode_line(line : String) -> Array[String] {
  let words : Array[String] = []
  let mut current = ""
  for character in line {
    let code = character.to_int()
    let is_letter = (code >= 65 && code <= 90) || (code >= 97 && code <= 122)
    if is_letter {
      if current != "" {
        words.push(current)
      }
      current = character.to_string()
    } else if code == 32 || code == 9 || code == 13 {
      if current != "" {
        words.push(current)
        current = ""
      }
    } else {
      current = current + character.to_string()
    }
  }
  if current != "" {
    words.push(current)
  }
  words
}