stb_image_write_rust/
c_runtime.rs1use std;
2use std::alloc;
3use std::mem;
4
5pub trait One {
6 fn one() -> Self;
7}
8
9impl One for i32 {
10 fn one() -> Self {
11 1
12 }
13}
14
15impl One for u32 {
16 fn one() -> Self {
17 1
18 }
19}
20
21impl One for u8 {
22 fn one() -> Self {
23 1
24 }
25}
26
27impl One for u16 {
28 fn one() -> Self {
29 1
30 }
31}
32
33pub unsafe fn postInc<T: std::ops::AddAssign + One + Copy>(mut a: *mut T) -> T {
34 let mut result: T = *a;
35 *a += One::one();
36 return result;
37}
38
39pub unsafe fn preInc<T: std::ops::AddAssign + One + Copy>(mut a: *mut T) -> T {
40 *a += One::one();
41 return *a;
42}
43
44pub unsafe fn postDec<T: std::ops::SubAssign + One + Copy>(mut a: *mut T) -> T {
45 let mut result: T = *a;
46 *a -= One::one();
47 return result;
48}
49
50pub unsafe fn preDec<T: std::ops::SubAssign + One + Copy>(mut a: *mut T) -> T {
51 *a -= One::one();
52 return *a;
53}
54
55pub unsafe fn preIncPtr<T>(mut a: *mut *mut T) -> *mut T {
56 *a = (*a).offset(1);
57 return *a;
58}
59
60pub unsafe fn preDecPtr<T>(mut a: *mut *mut T) -> *mut T {
61 *a = (*a).offset(-1);
62 return *a;
63}
64
65pub unsafe fn postIncPtr<T>(mut a: *mut *mut T) -> *mut T {
66 let mut result: *mut T = *a;
67 *a = (*a).offset(1);
68 return result;
69}
70
71pub unsafe fn postDecPtr<T>(mut a: *mut *mut T) -> *mut T {
72 let mut result: *mut T = *a;
73 *a = (*a).offset(-1);
74 return result;
75}
76
77pub unsafe fn memcpy(src: *mut u8, dest: *const u8, count: u64) {
78 std::ptr::copy_nonoverlapping(dest, src, count as usize);
79}
80
81pub unsafe fn memset(src: *mut u8, value: i32, count: u64) {
82 std::ptr::write_bytes(src, value as u8, count as usize);
83}
84
85pub unsafe fn malloc(count: u64) -> *mut u8 {
86 let layout = std::alloc::Layout::from_size_align(count as usize, 1).expect("Bad layout");
87
88 return std::alloc::alloc(layout);
89}
90
91pub unsafe fn realloc<T>(data: *mut T, count: u64) -> *mut u8 {
92 if (data == std::ptr::null_mut()) {
93 return malloc(count);
94 }
95
96 let layout = std::alloc::Layout::from_size_align(count as usize, 1).expect("Bad layout");
97
98 return std::alloc::realloc(data as *mut u8, layout, count as usize);
99}
100
101pub unsafe fn free<T>(data: *mut T) {
102 let layout = std::alloc::Layout::from_size_align(1, 1).expect("Bad layout");
103
104 std::alloc::dealloc(data as *mut u8, layout);
105}
106
107pub fn _lrotl(x: u32, y: i32) -> u32 {
108 return (x << y) | (x >> (32 - y));
109}
110
111pub fn abs(x: i32) -> i32 {
112 return i32::abs(x);
113}
114
115pub fn pow(x: f32, p: f32) -> f32 {
116 return x.powf(p);
117}
118
119pub fn fabs(x: f32) -> f32 {
120 return f32::abs(x);
121}
122
123pub fn fmod(x: f32, y: f32) -> f32 {
124 return x % y;
125}
126
127pub unsafe fn strlen(str: *mut u8) -> i32 {
128 let mut ptr = str;
129 let mut result = 0;
130
131 while *ptr != 0 {
132 ptr = ptr.offset(1);
133 result += 1;
134 }
135
136 return result;
137}
138
139pub fn sqrt(x: f32) -> f32 {
140 return f32::sqrt(x);
141}
142
143pub fn acos(x: f32) -> f32 {
144 return f32::acos(x);
145}
146
147pub fn cos(x: f32) -> f32 {
148 return f32::cos(x);
149}
150
151pub fn floor(x: f32) -> f32 {
152 return f32::floor(x);
153}
154
155pub fn ceil(x: f32) -> f32 {
156 return f32::ceil(x);
157}
158
159pub unsafe fn memmove(a: *mut u8, b: *mut u8, size: u64) {
160 let temp = malloc(size);
161 memcpy(temp, b, size);
162 memcpy(a, temp, size);
163}
164
165pub unsafe fn memcmp(a: *const u8, b: *const u8, size: u64) -> i32 {
166 let mut result = 0;
167 let mut ap = a;
168 let mut bp = b;
169 for i in 0..size - 1 {
170 if *ap != *bp {
171 result += 1;
172 }
173
174 ap = ap.offset(1);
175 bp = bp.offset(1);
176 }
177
178 return result;
179}