1use std::mem;
2use byteorder::{ByteOrder, LittleEndian};
3extern crate libc;
4pub type address = *const u8;
5pub type Event = i32;
6type pointer = *mut u8;
7pub type lparray = *mut pointer;
8extern {
9 fn chain_storage_size_get(key: *const u8, length: u8 ) -> usize;
10 fn chain_get_caller(caller: address) ;
11 fn chain_get_creator(creator: address);
12 fn chain_storage_get(key: *const u8, length: u8, value: *const u8) -> *const u8 ;
13 fn chain_storage_set(key: *const u8, key_size: u8, value: *const u8, value_size: u8) ;
14}
15
16unsafe fn set(data: *mut pointer, offset: usize, value: *mut u8) {
17 let ptr = data.offset(offset as isize) as *mut pointer;
18 *ptr = value;
19}
20
21pub fn to_lparray (s: &[u8]) -> lparray {
22 unsafe {
23 let result = libc::malloc(2 * mem::size_of::<*mut pointer>()) as *mut pointer;
24 let len = s.len();
25 set(result,0, len as *mut u8);
26 set(result,1, s.as_ptr() as *mut u8);
27 return result
28 }
29}
30
31pub fn get_caller() -> address {
32 let caller: address = unsafe {
33 libc::malloc((mem::size_of::<u8>() * 35) as libc::size_t ) as address
34 };
35 unsafe {
36 chain_get_caller(caller) ;
37 }
38 return caller;
39}
40pub fn get_creator() -> address {
41 let creator: address = unsafe {
42 libc::malloc((mem::size_of::<u8>() * 35) as libc::size_t ) as address
43 };
44 unsafe {
45 chain_get_creator(creator) ;
46 }
47 return creator;
48}
49pub fn storage_get(key: *const u8, key_size: u8) -> *const u8 {
50 let size : usize = unsafe { chain_storage_size_get(key, key_size ) };
51 if size == 0 {
52 return 0 as *const u8;
53 }
54 unsafe {
55 let ret : *const u8 = libc::malloc((mem::size_of::<u8>() * size) as libc::size_t ) as *const u8;
56 chain_storage_get(key, key_size, ret);
57 return ret ;
58 };
59}
60pub fn storage_set(key: *const u8, key_size: u8 , value: *const u8, value_size: u8 ) {
61 unsafe {
62 chain_storage_set(key, key_size, value, value_size ) ;
63 }
64}
65pub fn from_byte(x: *const u8, length: u8) -> u64 {
66 let key = unsafe { std::slice::from_raw_parts(x, length as usize) };
67
68 return LittleEndian::read_uint(key, length as usize).to_be();
69}