stb_image_write_rust/
c_runtime.rs

1use 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}