1    type String @c =
2        val ptr : Ptr<Char>
3        val length : u32
4    
5        fun get (i : u32) = ptr[i]
6        fun get (i : i32) =
7            assert i >= 0
8            ptr[i]
9    
10       def (==) "kd_eq_string" (rhs : String) : bool
11       def (+) "kd_add_string" (rhs : String) : String
12   
13   fun hash "kd_hash_string" (s : String) state
14   
15   object Kd
16       def to_string<T> @decl (x : T) : String
17   
18   type String
19       fun to_string = self
20       def substring (start : u32) (end : u32) =
21           String (ptr + start) (end - start)
22   
23   object String =
24       val bytes_per_char = 1
25   
26       def from (chars : Ptr<CChar>) (length : u32) =
27           let ptr = alloc<Char> length
28           for i = 0 until length do
29               ptr[i] = chars[i] as Char
30   
31           String ptr length
32   
33   let kd_println (s : String)
34   let kd_print (s : String)
35   let kd_error_println (s : String)
36   let kd_error_print (s : String)
37   
38   def println<T> (x : T) =
39       let s = Kd.to_string x
40       kd_println s
41   
42   def print<T> (x : T) =
43       let s = Kd.to_string x
44       kd_print s
45   
46   def concat (slice : Slice<String> @vararg) =
47       let mut size : u32 = 0
48       for i = 0 until slice.size do
49           size += slice[i].length
50   
51       let ptr = alloc<Char> size
52       let mut index = 0
53       for i = 0 until slice.size do
54           let s = slice[i]
55           for j = 0 until s.length do
56               ptr[index + j] = s.ptr[j]
57   
58           index += slice[i].length
59   
60       String ptr size
61