byte-vector.scm 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. ; Copyright (c) 1993-2008 by Richard Kelsey. See file COPYING.
  2. (define (byte-vector-endianess)
  3. (if (eq? byte-vector-word-ref high-byte-vector-word-ref)
  4. 'high
  5. 'low))
  6. (define (set-byte-vector-endianess! high-or-low)
  7. (case high-or-low
  8. ((high)
  9. (set! byte-vector-word-ref high-byte-vector-word-ref)
  10. (set! byte-vector-half-word-ref high-byte-vector-half-word-ref)
  11. (set! byte-vector-word-set! high-byte-vector-word-set!)
  12. (set! byte-vector-half-word-set! high-byte-vector-half-word-set!))
  13. ((low)
  14. (set! byte-vector-word-ref low-byte-vector-word-ref)
  15. (set! byte-vector-half-word-ref low-byte-vector-half-word-ref)
  16. (set! byte-vector-word-set! low-byte-vector-word-set!)
  17. (set! byte-vector-half-word-set! low-byte-vector-half-word-set!))
  18. (else
  19. (error "endianess specifier is neither HIGH nor LOW" high-or-low))))
  20. (define (high-byte-vector-word-ref vector index)
  21. (+ (byte-vector-ref vector (+ index 3))
  22. (arithmetic-shift
  23. (+ (byte-vector-ref vector (+ index 2))
  24. (arithmetic-shift
  25. (+ (byte-vector-ref vector (+ index 1))
  26. (arithmetic-shift
  27. (byte-vector-ref vector index)
  28. 8))
  29. 8))
  30. 8)))
  31. (define (high-byte-vector-word-set! vector index value)
  32. (byte-vector-set! vector index (arithmetic-shift value -24))
  33. (byte-vector-set! vector (+ index 1) (arithmetic-shift value -16))
  34. (byte-vector-set! vector (+ index 2) (arithmetic-shift value -8))
  35. (byte-vector-set! vector (+ index 3) value))
  36. (define (high-byte-vector-half-word-ref vector index)
  37. (+ (byte-vector-ref vector (+ index 1))
  38. (arithmetic-shift
  39. (byte-vector-ref vector index)
  40. 8)))
  41. (define (high-byte-vector-half-word-set! vector index value)
  42. (byte-vector-set! vector index (arithmetic-shift value -8))
  43. (byte-vector-set! vector (+ index 1) value))
  44. (define (low-byte-vector-word-ref vector index)
  45. (+ (byte-vector-ref vector index)
  46. (arithmetic-shift
  47. (+ (byte-vector-ref vector (+ index 1))
  48. (arithmetic-shift
  49. (+ (byte-vector-ref vector (+ index 2))
  50. (arithmetic-shift
  51. (byte-vector-ref vector (+ index 3))
  52. 8))
  53. 8))
  54. 8)))
  55. (define (low-byte-vector-word-set! vector index value)
  56. (byte-vector-set! vector index value)
  57. (byte-vector-set! vector (+ index 1) (arithmetic-shift value -8))
  58. (byte-vector-set! vector (+ index 2) (arithmetic-shift value -16))
  59. (byte-vector-set! vector (+ index 3) (arithmetic-shift value -24)))
  60. (define (low-byte-vector-half-word-ref vector index)
  61. (+ (byte-vector-ref vector index)
  62. (arithmetic-shift
  63. (byte-vector-ref vector (+ index 1))
  64. 8)))
  65. (define (low-byte-vector-half-word-set! vector index value)
  66. (byte-vector-set! vector index value)
  67. (byte-vector-set! vector (+ index 1) (arithmetic-shift value -8)))
  68. ; Start high-endian
  69. (define byte-vector-word-ref high-byte-vector-word-ref)
  70. (define byte-vector-half-word-ref high-byte-vector-half-word-ref)
  71. (define byte-vector-word-set! high-byte-vector-word-set!)
  72. (define byte-vector-half-word-set! high-byte-vector-half-word-set!)