File: Import.sml

package info (click to toggle)
smlsharp 4.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 123,732 kB
  • sloc: ansic: 16,725; sh: 4,347; makefile: 2,191; java: 742; haskell: 493; ruby: 305; cpp: 284; pascal: 256; ml: 255; lisp: 141; asm: 97; sql: 74
file content (88 lines) | stat: -rw-r--r-- 2,845 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
structure Import =
struct
open SMLUnit.Test SMLUnit.Assert

  fun testImportAtoi() =
      let
        val atoi = _import "atoi" : __attribute__((pure, fast)) string -> int
        val a = "123"
        val _ = assertEqualInt 123 (atoi a)
        val a = "124"
        val _ = assertEqualInt 124 (atoi a)
        val _ = assertEqualInt 0 (atoi "A")
      in
        ()
      end

  fun testImportStrtod() =
      let
        val strtod = _import "strtod" : (string, char ptr ref) -> real
        val endptr = ref (Pointer.NULL ())
        val r = strtod("1.23abc", endptr)
        val _ = assertEqualReal 1.23 r
        val _ = assertEqualString "abc" (Pointer.importString (!endptr))
      in
        ()
      end

  fun testImportSprintf() =
      let
        val malloc = _import "malloc" : int -> char ptr
        val free = _import "free" : char ptr -> ()
        val sprintf = _import "sprintf" 
                      : (char ptr, string, ... (string, int)) -> int 
        val ret = malloc(100)
        val _ = sprintf (ret, "%s %d", "abc", 1)
        val _ = assertEqualString "abc 1" (Pointer.importString ret)
        val _ = free ret
      in
        ()
      end

  fun testImportQsortUnboxed() =
      let
        val 'a#unboxed qsort =
            _import "qsort" 
            : ('a array, int, word, ('a ptr, 'a ptr) -> int) -> ()
        val ary = Array.fromList [1,6,4,0,7,3,2,9,5,8]
        fun compare (xPtr, yPtr) = 
            case Int.compare (Pointer.load xPtr, Pointer.load yPtr) of
                 EQUAL => 0
               | GREATER => 1
               | LESS => ~1
        val width = ReifiedTy.sizeOf ReifiedTy.INT32ty
        val _ = qsort (ary, Array.length ary, width, compare)
        val sortedAry = Array.fromList [0,1,2,3,4,5,6,7,8,9]
        val _ = assertEqualArray assertEqualInt sortedAry ary
      in
        ()
      end

  fun testImportQsortBoxed() =
      let
        val 'a#boxed qsort =
            _import "qsort" 
            : ('a array, int, word, ('a ptr, 'a ptr) -> int) -> ()
        val ary = Array.fromList ["b","d","a","c"]
        fun compare (xPtr, yPtr) = 
            case String.compare (Pointer.load xPtr, Pointer.load yPtr) of
                 EQUAL => 0
               | GREATER => 1
               | LESS => ~1
        val width = ReifiedTy.sizeOf ReifiedTy.STRINGty
        val _ = qsort (ary, Array.length ary, width, compare)
        val sortedAry = Array.fromList ["a","b","c","d"]
        val _ = assertEqualArray assertEqualString sortedAry ary
      in
        ()
      end

  val tests = TestList [
    Test ("testImportAtoi", testImportAtoi),
    Test ("testImportStrtod", testImportStrtod),
    Test ("testImportFprintf", testImportSprintf),
    Test ("testImportQsortUnboxed", testImportQsortUnboxed),
    Test ("testImportQsortBoxed", testImportQsortBoxed)
  ]

end