token.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package aztec
  2. import (
  3. "fmt"
  4. "github.com/boombuler/barcode/utils"
  5. )
  6. type token interface {
  7. fmt.Stringer
  8. prev() token
  9. appendTo(bits *utils.BitList, text []byte)
  10. }
  11. type simpleToken struct {
  12. token
  13. value int
  14. bitCount byte
  15. }
  16. type binaryShiftToken struct {
  17. token
  18. bShiftStart int
  19. bShiftByteCnt int
  20. }
  21. func newSimpleToken(prev token, value int, bitCount byte) token {
  22. return &simpleToken{prev, value, bitCount}
  23. }
  24. func newShiftToken(prev token, bShiftStart int, bShiftCnt int) token {
  25. return &binaryShiftToken{prev, bShiftStart, bShiftCnt}
  26. }
  27. func (st *simpleToken) prev() token {
  28. return st.token
  29. }
  30. func (st *simpleToken) appendTo(bits *utils.BitList, text []byte) {
  31. bits.AddBits(st.value, st.bitCount)
  32. }
  33. func (st *simpleToken) String() string {
  34. value := st.value & ((1 << st.bitCount) - 1)
  35. value |= 1 << st.bitCount
  36. return "<" + fmt.Sprintf("%b", value)[1:] + ">"
  37. }
  38. func (bst *binaryShiftToken) prev() token {
  39. return bst.token
  40. }
  41. func (bst *binaryShiftToken) appendTo(bits *utils.BitList, text []byte) {
  42. for i := 0; i < bst.bShiftByteCnt; i++ {
  43. if i == 0 || (i == 31 && bst.bShiftByteCnt <= 62) {
  44. // We need a header before the first character, and before
  45. // character 31 when the total byte code is <= 62
  46. bits.AddBits(31, 5) // BINARY_SHIFT
  47. if bst.bShiftByteCnt > 62 {
  48. bits.AddBits(bst.bShiftByteCnt-31, 16)
  49. } else if i == 0 {
  50. // 1 <= binaryShiftByteCode <= 62
  51. if bst.bShiftByteCnt < 31 {
  52. bits.AddBits(bst.bShiftByteCnt, 5)
  53. } else {
  54. bits.AddBits(31, 5)
  55. }
  56. } else {
  57. // 32 <= binaryShiftCount <= 62 and i == 31
  58. bits.AddBits(bst.bShiftByteCnt-31, 5)
  59. }
  60. }
  61. bits.AddByte(text[bst.bShiftStart+i])
  62. }
  63. }
  64. func (bst *binaryShiftToken) String() string {
  65. return fmt.Sprintf("<%d::%d>", bst.bShiftStart, (bst.bShiftStart + bst.bShiftByteCnt - 1))
  66. }