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