bytevector-ieee.scm 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. ; Copyright (c) 1993-2008 by Richard Kelsey and Jonathan Rees. See file COPYING.
  2. (define (bytevector:nan? x)
  3. (and (real? x)
  4. (not (= x x))))
  5. (define (bytevector:infinite? x)
  6. (and (real? x)
  7. (not (bytevector:nan? x))
  8. (bytevector:nan? (- x x))))
  9. ;exported stuff
  10. (define (bytevector-ieee-single-native-ref bytevector k)
  11. (r6rs-bytevect->float bytevector k))
  12. (define (bytevector-ieee-double-native-ref bytevector k)
  13. (r6rs-bytevect->double bytevector k))
  14. (define (bytevector-ieee-single-ref bytevector k endness)
  15. (if (eq? endness (native-endianness))
  16. (if (= 0 (remainder k 4))
  17. (bytevector-ieee-single-native-ref bytevector k)
  18. (let ((b (make-bytevector 4)))
  19. (bytevector-copy! bytevector k b 0 4)
  20. (bytevector-ieee-single-native-ref b 0)))
  21. (let ((b (make-bytevector 4)))
  22. (bytevector-u8-set! b 0 (bytevector-u8-ref bytevector (+ k 3)))
  23. (bytevector-u8-set! b 1 (bytevector-u8-ref bytevector (+ k 2)))
  24. (bytevector-u8-set! b 2 (bytevector-u8-ref bytevector (+ k 1)))
  25. (bytevector-u8-set! b 3 (bytevector-u8-ref bytevector k))
  26. (bytevector-ieee-single-native-ref b 0))))
  27. (define (bytevector-ieee-double-ref bytevector k endness)
  28. (if (eq? endness (native-endianness))
  29. (if (= 0 (remainder k 8))
  30. (bytevector-ieee-double-native-ref bytevector k)
  31. (let ((b (make-bytevector 8)))
  32. (bytevector-copy! bytevector k b 0 8)
  33. (bytevector-ieee-double-native-ref b 0)))
  34. (let ((b (make-bytevector 8)))
  35. (bytevector-u8-set! b 0 (bytevector-u8-ref bytevector (+ k 7)))
  36. (bytevector-u8-set! b 1 (bytevector-u8-ref bytevector (+ k 6)))
  37. (bytevector-u8-set! b 2 (bytevector-u8-ref bytevector (+ k 5)))
  38. (bytevector-u8-set! b 3 (bytevector-u8-ref bytevector (+ k 4)))
  39. (bytevector-u8-set! b 4 (bytevector-u8-ref bytevector (+ k 3)))
  40. (bytevector-u8-set! b 5 (bytevector-u8-ref bytevector (+ k 2)))
  41. (bytevector-u8-set! b 6 (bytevector-u8-ref bytevector (+ k 1)))
  42. (bytevector-u8-set! b 7 (bytevector-u8-ref bytevector k))
  43. (bytevector-ieee-double-native-ref b 0))))
  44. (define (bytevector-ieee-single-native-set! bytevector k x)
  45. (r6rs-float->bytevect! x bytevector k))
  46. (define (bytevector-ieee-double-native-set! bytevector k x)
  47. (r6rs-double->bytevect! x bytevector k))
  48. (define (bytevector-ieee-single-set! bytevector k x endness)
  49. (if (eq? endness (native-endianness))
  50. (if (= 0 (remainder k 4))
  51. (bytevector-ieee-single-native-set! bytevector k x)
  52. (let ((b (make-bytevector 4)))
  53. (bytevector-ieee-single-native-set! b 0 x)
  54. (bytevector-copy! b 0 bytevector k 4)))
  55. (let ((b (make-bytevector 4)))
  56. (bytevector-ieee-single-native-set! b 0 x)
  57. (bytevector-u8-set! bytevector k (bytevector-u8-ref b 3))
  58. (bytevector-u8-set! bytevector (+ k 1) (bytevector-u8-ref b 2))
  59. (bytevector-u8-set! bytevector (+ k 2) (bytevector-u8-ref b 1))
  60. (bytevector-u8-set! bytevector (+ k 3) (bytevector-u8-ref b 0)))))
  61. (define (bytevector-ieee-double-set! bytevector k x endness)
  62. (if (eq? endness (native-endianness))
  63. (if (= 0 (remainder k 8))
  64. (bytevector-ieee-double-native-set! bytevector k x)
  65. (let ((b (make-bytevector 8)))
  66. (bytevector-ieee-double-native-set! b 0 x)
  67. (bytevector-copy! b 0 bytevector k 8)))
  68. (let ((b (make-bytevector 8)))
  69. (bytevector-ieee-double-native-set! b 0 x)
  70. (bytevector-u8-set! bytevector k (bytevector-u8-ref b 7))
  71. (bytevector-u8-set! bytevector (+ k 1) (bytevector-u8-ref b 6))
  72. (bytevector-u8-set! bytevector (+ k 2) (bytevector-u8-ref b 5))
  73. (bytevector-u8-set! bytevector (+ k 3) (bytevector-u8-ref b 4))
  74. (bytevector-u8-set! bytevector (+ k 4) (bytevector-u8-ref b 3))
  75. (bytevector-u8-set! bytevector (+ k 5) (bytevector-u8-ref b 2))
  76. (bytevector-u8-set! bytevector (+ k 6) (bytevector-u8-ref b 1))
  77. (bytevector-u8-set! bytevector (+ k 7) (bytevector-u8-ref b 0)))))
  78. (define (r6rs-float->bytevect! float bytevect index)
  79. (external-r6rs-float->bytevect! float bytevect index))
  80. (define (r6rs-bytevect->float bytevect index)
  81. (external-r6rs-bytevect->float bytevect index))
  82. (define (r6rs-double->bytevect! double bytevect index)
  83. (external-r6rs-double->bytevect! double bytevect index))
  84. (define (r6rs-bytevect->double bytevect index)
  85. (external-r6rs-bytevect->double bytevect index))
  86. ;; external fun definition
  87. (import-lambda-definition-2 external-r6rs-float->bytevect!
  88. (double bytevect index)
  89. "r6rs_float_to_bytevect")
  90. (import-lambda-definition-2 external-r6rs-bytevect->float
  91. (bytevect index)
  92. "r6rs_bytevect_to_float")
  93. (import-lambda-definition-2 external-r6rs-double->bytevect!
  94. (double bytevect index)
  95. "r6rs_double_to_bytevect")
  96. (import-lambda-definition-2 external-r6rs-bytevect->double
  97. (bytevect index)
  98. "r6rs_bytevect_to_double")