hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

big.ha (1879B)


      1 // SPDX-License-Identifier: MPL-2.0
      2 // (c) Hare authors <https://harelang.org>
      3 
      4 // Reads a u16 from a buffer in big-endian order.
      5 export fn begetu16(buf: []u8) u16 = {
      6 	return
      7 		(buf[0] << 8u16) |
      8 		(buf[1] << 0);
      9 };
     10 
     11 // Writes a u16 into a buffer in big-endian order.
     12 export fn beputu16(buf: []u8, in: u16) void = {
     13 	buf[1] = (in >> 0): u8;
     14 	buf[0] = (in >> 8): u8;
     15 };
     16 
     17 // Reads a u32 from a buffer in big-endian order.
     18 export fn begetu32(buf: []u8) u32 = {
     19 	return
     20 		(buf[0] << 24u32) |
     21 		(buf[1] << 16u32) |
     22 		(buf[2] << 8u32) |
     23 		(buf[3] << 0);
     24 };
     25 
     26 // Writes a u32 into a buffer in big-endian order.
     27 export fn beputu32(buf: []u8, in: u32) void = {
     28 	buf[3] = (in >> 0): u8;
     29 	buf[2] = (in >> 8): u8;
     30 	buf[1] = (in >> 16): u8;
     31 	buf[0] = (in >> 24): u8;
     32 };
     33 
     34 // Reads a u64 from a buffer in big-endian order.
     35 export fn begetu64(buf: []u8) u64 = {
     36 	return
     37 		(buf[0] << 56u64) |
     38 		(buf[1] << 48u64) |
     39 		(buf[2] << 40u64) |
     40 		(buf[3] << 32u64) |
     41 		(buf[4] << 24u64) |
     42 		(buf[5] << 16u64) |
     43 		(buf[6] << 8u64) |
     44 		(buf[7] << 0);
     45 };
     46 
     47 // Writes a u64 into a buffer in big-endian order.
     48 export fn beputu64(buf: []u8, in: u64) void = {
     49 	buf[7] = (in >> 0): u8;
     50 	buf[6] = (in >> 8): u8;
     51 	buf[5] = (in >> 16): u8;
     52 	buf[4] = (in >> 24): u8;
     53 	buf[3] = (in >> 32): u8;
     54 	buf[2] = (in >> 40): u8;
     55 	buf[1] = (in >> 48): u8;
     56 	buf[0] = (in >> 56): u8;
     57 };
     58 
     59 @test fn big() void = {
     60 	let buf: [8]u8 = [0...];
     61 	beputu16(buf, 0x1234);
     62 	assert(buf[0] == 0x12 && buf[1] == 0x34);
     63 	assert(begetu16(buf) == 0x1234);
     64 
     65 	beputu32(buf, 0x12345678);
     66 	assert(buf[0] == 0x12 && buf[1] == 0x34
     67 		&& buf[2] == 0x56 && buf[3] == 0x78);
     68 	assert(begetu32(buf) == 0x12345678);
     69 
     70 	beputu64(buf, 0x1234567887654321);
     71 	assert(buf[0] == 0x12 && buf[1] == 0x34
     72 		&& buf[2] == 0x56 && buf[3] == 0x78
     73 		&& buf[4] == 0x87 && buf[5] == 0x65
     74 		&& buf[6] == 0x43 && buf[7] == 0x21);
     75 	assert(begetu64(buf) == 0x1234567887654321);
     76 };