189 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			V
		
	
	
module io
 | 
						|
 | 
						|
import net
 | 
						|
import encoding.binary
 | 
						|
 | 
						|
struct NetInputStream {
 | 
						|
mut:
 | 
						|
	sock &net.Socket
 | 
						|
}
 | 
						|
 | 
						|
pub fn new_net_input_stream(sock &net.Socket) &NetInputStream {
 | 
						|
	return &NetInputStream{
 | 
						|
		sock: sock
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_int() int {
 | 
						|
	return int(binary.big_endian_u32(nis.read_bytes(sizeof(int))))
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_ints(l u32) []int {
 | 
						|
	bytes := nis.read_bytes(sizeof(int) * l)
 | 
						|
	mut ints := []int{}
 | 
						|
	for i in 0 .. l {
 | 
						|
		offs := int(u32(i) * sizeof(int))
 | 
						|
		b := bytes[offs..int(u32(offs) + sizeof(int))]
 | 
						|
		ints << int(binary.big_endian_u32(b))
 | 
						|
	}
 | 
						|
	return ints
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_i8() i8 {
 | 
						|
	return i8(nis.read_byte())
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_i8s(l u32) []i8 {
 | 
						|
	bytes := nis.read_bytes(sizeof(i8) * l)
 | 
						|
	mut i8s := []i8{}
 | 
						|
	for i in 0 .. l {
 | 
						|
		i8s << i8(bytes[i])
 | 
						|
	}
 | 
						|
	return i8s
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_i16() i16 {
 | 
						|
	return i16(binary.big_endian_u16(nis.read_bytes(sizeof(i16))))
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_i16s(l u32) []i16 {
 | 
						|
	bytes := nis.read_bytes(sizeof(i16) * l)
 | 
						|
	mut i16s := []i16{}
 | 
						|
	for i in 0 .. l {
 | 
						|
		offs := int(u32(i) * sizeof(i16))
 | 
						|
		b := bytes[offs..int(u32(offs) + sizeof(i16))]
 | 
						|
		i16s << i16(binary.big_endian_u16(b))
 | 
						|
	}
 | 
						|
	return i16s
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_i64() i64 {
 | 
						|
	return i64(binary.big_endian_u64(nis.read_bytes(sizeof(i64))))
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_i64s(l u32) []i64 {
 | 
						|
	bytes := nis.read_bytes(sizeof(i64) * l)
 | 
						|
	mut i64s := []i64{}
 | 
						|
	for i in 0 .. l {
 | 
						|
		offs := int(u32(i) * sizeof(i64))
 | 
						|
		b := bytes[offs..int(u32(offs) + sizeof(i64))]
 | 
						|
		i64s << i64(binary.big_endian_u64(b))
 | 
						|
	}
 | 
						|
	return i64s
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_byte() byte {
 | 
						|
	ptr, _ := nis.sock.recv(int(sizeof(byte)))
 | 
						|
	unsafe {
 | 
						|
		return ptr[0]
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_bytes(l u32) []byte {
 | 
						|
	mut bytes := []byte{len: int(l), cap: int(l)}
 | 
						|
	for i in 0..l {
 | 
						|
		bytes[i] = nis.read_byte()
 | 
						|
	}
 | 
						|
	return bytes
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_u16() u16 {
 | 
						|
	return binary.big_endian_u16(nis.read_bytes(sizeof(u16)))
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_u16s(l u32) []u16 {
 | 
						|
	bytes := nis.read_bytes(sizeof(u16) * l)
 | 
						|
	mut u16s := []u16{}
 | 
						|
	for i in 0 .. l {
 | 
						|
		offs := int(u32(i) * sizeof(u16))
 | 
						|
		b := bytes[offs..int(u32(offs) + sizeof(u16))]
 | 
						|
		u16s << binary.big_endian_u16(b)
 | 
						|
 | 
						|
	}
 | 
						|
	return u16s
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_u32() u32 {
 | 
						|
	return binary.big_endian_u32(nis.read_bytes(sizeof(u32)))
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_u32s(l u32) []u32 {
 | 
						|
	bytes := nis.read_bytes(sizeof(u32) * l)
 | 
						|
	mut u32s := []u32{}
 | 
						|
	for i in 0 .. l {
 | 
						|
		offs := int(u32(i) * sizeof(u32))
 | 
						|
		b := bytes[offs..int(u32(offs) + sizeof(u32))]
 | 
						|
		u32s <<  binary.big_endian_u32(b)
 | 
						|
	}
 | 
						|
	return u32s
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_u64() u64 {
 | 
						|
	return binary.big_endian_u64(nis.read_bytes(sizeof(u64)))
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_u64s(l u32) []u64 {
 | 
						|
	bytes := nis.read_bytes(sizeof(u64) * l)
 | 
						|
	mut u64s := []u64{}
 | 
						|
	for i in 0 .. l {
 | 
						|
		offs := int(u32(i) * sizeof(u64))
 | 
						|
		b := bytes[offs..int(u32(offs) + sizeof(u64))]
 | 
						|
		u64s <<  binary.big_endian_u64(b)
 | 
						|
	}
 | 
						|
	return u64s
 | 
						|
}
 | 
						|
pub fn (mut nis NetInputStream) read_f32() f32 {
 | 
						|
	bytes := nis.read_bytes(sizeof(f32))
 | 
						|
	f := &f32(bytes.data)
 | 
						|
	return *f
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_f32s(l u32) []f32 {
 | 
						|
	bytes := nis.read_bytes(sizeof(f32) * l)
 | 
						|
	mut f32s := []f32{}
 | 
						|
	for i in 0 .. l {
 | 
						|
		offs := int(u32(i) * sizeof(f32))
 | 
						|
		b := bytes[offs..int(u32(offs) + sizeof(f32))]
 | 
						|
		f := &f32(b.data)
 | 
						|
		unsafe {
 | 
						|
			f32s << *f
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return f32s
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_f64() f64 {
 | 
						|
	bytes := nis.read_bytes(sizeof(f64))
 | 
						|
	f := &f64(bytes.data)
 | 
						|
	return *f
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_f64s(l u32) []f64 {
 | 
						|
	bytes := nis.read_bytes(sizeof(f64) * l)
 | 
						|
	mut f64s := []f64{}
 | 
						|
	for i in 0 .. l {
 | 
						|
		offs := int(u32(i) * sizeof(f64))
 | 
						|
		b := bytes[offs..int(u32(offs) + sizeof(f64))]
 | 
						|
		f := &f64(b.data)
 | 
						|
		unsafe {
 | 
						|
			f64s << *f
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return f64s
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) read_string(l u32) string {
 | 
						|
	bytes := nis.read_bytes(l)
 | 
						|
	return tos(bytes.data, bytes.len)
 | 
						|
}
 | 
						|
 | 
						|
pub fn (mut nis NetInputStream) skip(l u32) {
 | 
						|
	nis.read_bytes(l)
 | 
						|
}
 | 
						|
 | 
						|
// TODO make it generic
 | 
						|
pub fn (mut nis NetInputStream) read_struct(l u32) voidptr {
 | 
						|
	return voidptr(nis.read_bytes(l).data)
 | 
						|
}
 |