classifyDataModes classifies the raw data into unoptimised segments. e.g. "123ZZ#!#!" => [numeric, 3, "123"] [alphanumeric, 2, "ZZ"] [byte, 4, "#!#!"]. Returns the highest data mode needed to encode the data. e.g. for a mixed numeric/alphanumeric input, the highest is alphanumeric. dataModeNone <
()
| 217 | // |
| 218 | // dataModeNone < dataModeNumeric < dataModeAlphanumeric < dataModeByte |
| 219 | func (d *dataEncoder) classifyDataModes() dataMode { |
| 220 | var start int |
| 221 | mode := dataModeNone |
| 222 | highestRequiredMode := mode |
| 223 | |
| 224 | for i, v := range d.data { |
| 225 | newMode := dataModeNone |
| 226 | switch { |
| 227 | case v >= 0x30 && v <= 0x39: |
| 228 | newMode = dataModeNumeric |
| 229 | case v == 0x20 || v == 0x24 || v == 0x25 || v == 0x2a || v == 0x2b || v == |
| 230 | 0x2d || v == 0x2e || v == 0x2f || v == 0x3a || (v >= 0x41 && v <= 0x5a): |
| 231 | newMode = dataModeAlphanumeric |
| 232 | default: |
| 233 | newMode = dataModeByte |
| 234 | } |
| 235 | |
| 236 | if newMode != mode { |
| 237 | if i > 0 { |
| 238 | d.actual = append(d.actual, segment{dataMode: mode, data: d.data[start:i]}) |
| 239 | |
| 240 | start = i |
| 241 | } |
| 242 | |
| 243 | mode = newMode |
| 244 | } |
| 245 | |
| 246 | if newMode > highestRequiredMode { |
| 247 | highestRequiredMode = newMode |
| 248 | } |
| 249 | } |
| 250 | |
| 251 | d.actual = append(d.actual, segment{dataMode: mode, data: d.data[start:len(d.data)]}) |
| 252 | |
| 253 | return highestRequiredMode |
| 254 | } |
| 255 | |
| 256 | // optimiseDataModes optimises the list of segments to reduce the overall output |
| 257 | // encoded data length. |