bitwise.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package lib
  2. func ByteFrom(i interface{}) uint8 {
  3. switch x := i.(type) {
  4. case uint8:
  5. return x
  6. case int8:
  7. return uint8(x)
  8. default:
  9. panic("invalid Byte")
  10. }
  11. }
  12. func WordFrom(i interface{}) uint16 {
  13. switch x := i.(type) {
  14. case uint16:
  15. return x
  16. case int16:
  17. return uint16(x)
  18. default:
  19. panic("invalid Word")
  20. }
  21. }
  22. func DwordFrom(i interface{}) uint32 {
  23. switch x := i.(type) {
  24. case uint32:
  25. return x
  26. case int32:
  27. return uint32(x)
  28. default:
  29. panic("invalid Dword")
  30. }
  31. }
  32. func QwordFrom(i interface{}) uint64 {
  33. switch x := i.(type) {
  34. case uint64:
  35. return x
  36. case int64:
  37. return uint64(x)
  38. default:
  39. panic("invalid Qword")
  40. }
  41. }
  42. var BitwiseFunctions = map[string] interface{} {
  43. "&bit": func(a bool, b bool) bool {
  44. return a && b
  45. },
  46. "|bit": func(a bool, b bool) bool {
  47. return a || b
  48. },
  49. "^bit": func(a bool) bool {
  50. return !a
  51. },
  52. "&byte": func(a interface{}, b interface{}) uint8 {
  53. return ByteFrom(a) & ByteFrom(b)
  54. },
  55. "|byte": func(a interface{}, b interface{}) uint8 {
  56. return ByteFrom(a) | ByteFrom(b)
  57. },
  58. "^byte": func(a interface{}) uint8 {
  59. return ^(ByteFrom(a))
  60. },
  61. "<<byte": func(a interface{}, b interface{}) uint8 {
  62. return ByteFrom(a) << ByteFrom(b)
  63. },
  64. ">>byte": func(a interface{}, b interface{}) uint8 {
  65. return ByteFrom(a) >> ByteFrom(b)
  66. },
  67. "&word": func(a interface{}, b interface{}) uint16 {
  68. return WordFrom(a) & WordFrom(b)
  69. },
  70. "|word": func(a interface{}, b interface{}) uint16 {
  71. return WordFrom(a) | WordFrom(b)
  72. },
  73. "^word": func(a interface{}) uint16 {
  74. return ^(WordFrom(a))
  75. },
  76. "<<word": func(a interface{}, b interface{}) uint16 {
  77. return WordFrom(a) << ByteFrom(b)
  78. },
  79. ">>word": func(a interface{}, b interface{}) uint16 {
  80. return WordFrom(a) >> ByteFrom(b)
  81. },
  82. "&dword": func(a interface{}, b interface{}) uint32 {
  83. return DwordFrom(a) & DwordFrom(b)
  84. },
  85. "|dword": func(a interface{}, b interface{}) uint32 {
  86. return DwordFrom(a) | DwordFrom(b)
  87. },
  88. "^dword": func(a interface{}) uint32 {
  89. return ^(DwordFrom(a))
  90. },
  91. "<<dword": func(a interface{}, b interface{}) uint32 {
  92. return DwordFrom(a) << ByteFrom(b)
  93. },
  94. ">>dword": func(a interface{}, b interface{}) uint32 {
  95. return DwordFrom(a) >> ByteFrom(b)
  96. },
  97. "&qword": func(a interface{}, b interface{}) uint64 {
  98. return QwordFrom(a) & QwordFrom(b)
  99. },
  100. "|qword": func(a interface{}, b interface{}) uint64 {
  101. return QwordFrom(a) | QwordFrom(b)
  102. },
  103. "^qword": func(a interface{}) uint64 {
  104. return ^(QwordFrom(a))
  105. },
  106. "<<qword": func(a interface{}, b interface{}) uint64 {
  107. return QwordFrom(a) << ByteFrom(b)
  108. },
  109. ">>qword": func(a interface{}, b interface{}) uint64 {
  110. return QwordFrom(a) >> ByteFrom(b)
  111. },
  112. }