aboutsummaryrefslogtreecommitdiff
path: root/kscurses/utils.jai
blob: 2b88e853c827f71a0471812faadeeaab8645ec4f (plain)
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
// array_slice :: (array : []$T, left : int, right : int) -> []T {
// 	assert(left <= right && left >= 0 && right <= array.count);
// 	result : []T;
// 	result.data, result.count = array.data + left, right - left;
// 	return result;
// }

length_code :: inline (c : u64) -> u8 {
	for 0..7 {
		if !c return xx it;
		c >>= 8;
	}
	return 8;
}
utf8 :: (str : string) -> u32 {
	code : u32;
	assert(str.count <= 4);
	memcpy(*code, str.data, str.count);
	return code;
}
byteswap_64 :: (c : u64) -> u64 {
	c = ((0xFFFFFFFF00000000 & c) >> 32) | ((0x00000000FFFFFFFF & c) << 32);
	c = ((0xFFFF0000FFFF0000 & c) >> 16) | ((0x0000FFFF0000FFFF & c) << 16);
	c = ((0xFF00FF00FF00FF00 & c) >>  8) | ((0x00FF00FF00FF00FF & c) <<  8);
	return c;
}
byteswap_32 :: (c : u32) -> u32 {
	c = ((0xFFFF0000 & c) >> 16) | ((0x0000FFFF & c) << 16);
	c = ((0xFF00FF00 & c) >>  8) | ((0x00FF00FF & c) <<  8);
	return c;
}
char_bs :: (code : u32) -> u32 {
	l := length_code(code);
	return byteswap_32(code) >> ((8 - l) * 8);
}
utf8_bs :: (str : string) -> u32 {
	return char_bs(utf8(str));
}
arrow_code_to_ivec2 :: (key : Key, $swap_y := true) -> ivec2 {
	#if swap_y {
		return	 ifx key == .UP		ivec2.{ 0, -1}
			else ifx key == .RIGHT	ivec2.{ 1,  0}
			else ifx key == .DOWN	ivec2.{ 0,  1}
			else ifx key == .LEFT	ivec2.{-1,  0}
			else ivec2.{};		
	} else {
		return	 ifx key == .UP		ivec2.{ 0,  1}
			else ifx key == .RIGHT	ivec2.{ 1,  0}
			else ifx key == .DOWN	ivec2.{ 0, -1}
			else ifx key == .LEFT	ivec2.{-1,  0}
			else ivec2.{};		
	}
}