Import.sml 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. structure Import =
  2. struct
  3. open SMLUnit.Test SMLUnit.Assert
  4. fun testImportAtoi() =
  5. let
  6. val atoi = _import "atoi" : __attribute__((pure, fast)) string -> int
  7. val a = "123"
  8. val _ = assertEqualInt 123 (atoi a)
  9. val a = "124"
  10. val _ = assertEqualInt 124 (atoi a)
  11. val _ = assertEqualInt 0 (atoi "A")
  12. in
  13. ()
  14. end
  15. fun testImportStrtod() =
  16. let
  17. val strtod = _import "strtod" : (string, char ptr ref) -> real
  18. val endptr = ref (Pointer.NULL ())
  19. val r = strtod("1.23abc", endptr)
  20. val _ = assertEqualReal 1.23 r
  21. val _ = assertEqualString "abc" (Pointer.importString (!endptr))
  22. in
  23. ()
  24. end
  25. fun testImportSprintf() =
  26. let
  27. val malloc = _import "malloc" : int -> char ptr
  28. val free = _import "free" : char ptr -> ()
  29. val sprintf = _import "sprintf"
  30. : (char ptr, string, ... (string, int)) -> int
  31. val ret = malloc(100)
  32. val _ = sprintf (ret, "%s %d", "abc", 1)
  33. val _ = assertEqualString "abc 1" (Pointer.importString ret)
  34. val _ = free ret
  35. in
  36. ()
  37. end
  38. fun testImportQsortUnboxed() =
  39. let
  40. val 'a#unboxed qsort =
  41. _import "qsort"
  42. : ('a array, int, word, ('a ptr, 'a ptr) -> int) -> ()
  43. val ary = Array.fromList [1,6,4,0,7,3,2,9,5,8]
  44. fun compare (xPtr, yPtr) =
  45. case Int.compare (Pointer.load xPtr, Pointer.load yPtr) of
  46. EQUAL => 0
  47. | GREATER => 1
  48. | LESS => ~1
  49. val width = ReifiedTy.sizeOf ReifiedTy.INT32ty
  50. val _ = qsort (ary, Array.length ary, width, compare)
  51. val sortedAry = Array.fromList [0,1,2,3,4,5,6,7,8,9]
  52. val _ = assertEqualArray assertEqualInt sortedAry ary
  53. in
  54. ()
  55. end
  56. fun testImportQsortBoxed() =
  57. let
  58. val 'a#boxed qsort =
  59. _import "qsort"
  60. : ('a array, int, word, ('a ptr, 'a ptr) -> int) -> ()
  61. val ary = Array.fromList ["b","d","a","c"]
  62. fun compare (xPtr, yPtr) =
  63. case String.compare (Pointer.load xPtr, Pointer.load yPtr) of
  64. EQUAL => 0
  65. | GREATER => 1
  66. | LESS => ~1
  67. val width = ReifiedTy.sizeOf ReifiedTy.STRINGty
  68. val _ = qsort (ary, Array.length ary, width, compare)
  69. val sortedAry = Array.fromList ["a","b","c","d"]
  70. val _ = assertEqualArray assertEqualString sortedAry ary
  71. in
  72. ()
  73. end
  74. val tests = TestList [
  75. Test ("testImportAtoi", testImportAtoi),
  76. Test ("testImportStrtod", testImportStrtod),
  77. Test ("testImportFprintf", testImportSprintf),
  78. Test ("testImportQsortUnboxed", testImportQsortUnboxed),
  79. Test ("testImportQsortBoxed", testImportQsortBoxed)
  80. ]
  81. end