--- /n/sources/plan9/sys/include/libc.h Wed Sep 18 22:45:28 2013 +++ /sys/include/libc.h Mon Mar 14 00:00:00 2016 @@ -336,6 +336,26 @@ extern void cycles(uvlong*); /* 64-bit value of the cycle counter if there is one, 0 if there isn't */ /* + * endian conversion + */ +extern u16int le16get(uchar *t, uchar **r); +extern u32int le24get(uchar *t, uchar **r); +extern u32int le32get(uchar *t, uchar **r); +extern u64int le64get(uchar *t, uchar **r); +extern uchar* le16put(uchar *t, u16int r); +extern uchar* le24put(uchar *t, u32int r); +extern uchar* le32put(uchar *t, u32int r); +extern uchar* le64put(uchar *t, u64int r); +extern u16int be16get(uchar *t, uchar **r); +extern u32int be24get(uchar *t, uchar **r); +extern u32int be32get(uchar *t, uchar **r); +extern u64int be64get(uchar *t, uchar **r); +extern uchar* be16put(uchar *t, u16int r); +extern uchar* be24put(uchar *t, u32int r); +extern uchar* be32put(uchar *t, u32int r); +extern uchar* be64put(uchar *t, u64int r); + +/* * one-of-a-kind */ enum --- /n/sources/plan9/sys/src/libc/port/mkfile Wed Apr 24 22:51:53 2013 +++ /sys/src/libc/port/mkfile Mon Mar 14 00:00:00 2016 @@ -12,6 +12,7 @@ atof.c\ atol.c\ atoll.c\ + beget.c\ cistrcmp.c\ cistrncmp.c\ cistrstr.c\ @@ -32,6 +33,7 @@ getuser.c\ hangup.c\ hypot.c\ + leget.c\ lnrand.c\ lock.c\ log.c\ --- /sys/src/libc/port/leget.c Mon Mar 14 17:39:31 2016 +++ /sys/src/libc/port/leget.c Mon Mar 14 00:00:00 2016 @@ -0,0 +1,76 @@ +#include +#include + +u16int +le16get(uchar *t, uchar **r) +{ + if(r != nil) + *r = t+2; + return (u16int)t[0] | (u16int)t[1]<<8; +} + +u32int +le24get(uchar *t, uchar **r) +{ + if(r != nil) + *r = t+3; + return (u32int)t[0] | (u32int)t[1]<<8 | (u32int)t[2]<<16; +} + +u32int +le32get(uchar *t, uchar **r) +{ + if(r != nil) + *r = t+4; + return (u32int)t[0] | (u32int)t[1]<<8 | (u32int)t[2]<<16 | (u32int)t[3]<<24; +} + +u64int +le64get(uchar *t, uchar **r) +{ + if(r != nil) + *r = t+8; + return (u64int)t[0] | (u64int)t[1]<<8 | (u64int)t[2]<<16 | (u64int)t[3]<<24 | + (u64int)t[4]<<32 | (u64int)t[5]<<40 | (u64int)t[6]<<48 | (u64int)t[7]<<56; +} + +uchar* +le16put(uchar *t, u16int r) +{ + *t++ = r; + *t++ = r>>8; + return t; +} + +uchar* +le24put(uchar *t, u32int r) +{ + *t++ = r; + *t++ = r>>8; + *t++ = r>>16; + return t; +} + +uchar* +le32put(uchar *t, u32int r) +{ + *t++ = r; + *t++ = r>>8; + *t++ = r>>16; + *t++ = r>>24; + return t; +} + +uchar* +le64put(uchar *t, u64int r) +{ + *t++ = r; + *t++ = r>>8; + *t++ = r>>16; + *t++ = r>>24; + *t++ = r>>32; + *t++ = r>>40; + *t++ = r>>48; + *t++ = r>>56; + return t; +} --- /sys/src/libc/port/beget.c Mon Mar 14 17:39:31 2016 +++ /sys/src/libc/port/beget.c Mon Mar 14 00:00:00 2016 @@ -0,0 +1,77 @@ +#include +#include + +u16int +be16get(uchar *t, uchar **r) +{ + if(r != nil) + *r = t+2; + return (u16int)t[0]<<8 | (u16int)t[1]; +} + +u32int +be24get(uchar *t, uchar **r) +{ + if(r != nil) + *r = t+3; + return (u32int)t[1]<<16 | (u32int)t[2]<<8 | (u32int)t[3]; +} + +u32int +be32get(uchar *t, uchar **r) +{ + if(r != nil) + *r = t+4; + return (u32int)t[0]<<24 | (u32int)t[1]<<16 | (u32int)t[2]<<8 | (u32int)t[3]; +} + +u64int +be64get(uchar *t, uchar **r) +{ + if(r != nil) + *r = t+8; + return (u64int)t[0]<<56 | (u64int)t[1]<<48 | (u64int)t[2]<<40 | (u64int)t[3]<<32 | + (u64int)t[4]<<24 | (u64int)t[5]<<16 | (u64int)t[6]<<8 | (u64int)t[7]; +} + +uchar* +be16put(uchar *t, u16int r) +{ + *t++ = r>>8; + *t++ = r; + return t; +} + +uchar* +be32put(uchar *t, u32int r) +{ + *t++ = r>>24; + *t++ = r>>16; + *t++ = r>>8; + *t++ = r; + return t; +} + +uchar* +be24put(uchar *t, u32int r) +{ + *t++ = r>>16; + *t++ = r>>8; + *t++ = r; + return t; +} + +uchar* +be64put(uchar *t, u64int r) +{ + *t++ = r>>56; + *t++ = r>>48; + *t++ = r>>40; + *t++ = r>>32; + *t++ = r>>24; + *t++ = r>>16; + *t++ = r>>8; + *t++ = r; + return t; +} + --- /sys/man/2/leget Mon Mar 14 17:39:31 2016 +++ /sys/man/2/leget Mon Mar 14 00:00:00 2016 @@ -0,0 +1,104 @@ +.TH LEGET 2 +le16get, le24get, le32get, le64get, le16put, le24put, le32put, le64put, be16get, be24get, be32get, be64get, be16put, be24put, be32put, be64put\- integer marshalling +.SH SYNOPSIS +.ta +\w'\fLuvlong 'u +.PP +.nf +.B +u16int le16get(uchar *t, uchar **r) +.PP +.nf +.B +u32int le24get(uchar *t, uchar **r) +.PP +.nf +.B +u32int le32get(uchar *t, uchar **r) +.PP +.nf +.B +u64int le64get(uchar *t, uchar **r) +.PP +.nf +.B +uchar* le16put(uchar *t, u16int i) +.PP +.nf +.B +uchar* le24put(uchar *t, u32int i) +.PP +.nf +.B +uchar* le32put(uchar *t, u32int i) +.PP +.nf +.B +uchar* le64put(uchar *t, u64int i) +.PP +.nf +.B +u16int be16get(uchar *t, uchar **r) +.PP +.nf +.B +u32int be24get(uchar *t, uchar **r) +.PP +.nf +.B +u32int be32get(uchar *t, uchar **r) +.PP +.nf +.B +u64int be64get(uchar *t, uchar **r) +.PP +.nf +.B +uchar* be16put(uchar *t, u16int i) +.PP +.nf +.B +uchar* be24put(uchar *t, u32int i) +.PP +.nf +.B +uchar* be32put(uchar *t, u32int i) +.PP +.nf +.B +uchar* be64put(uchar *t, u64int i) +.PP +.SH DESCRIPTION +These functions marshal a 2- to 8-byte integer to +or from little- or big-endian formats. The +.I put +functions return the +pointer to the first byte after the integer. The +.I get +functions return the value, and if +.B r +is not +.I nil +they set +.B *r +to point at the first byte after the integer. +.SH SOURCE +.B /sys/src/libc/port/beget.c +.br +.B /sys/src/libc/port/leget.c +.SH "SEE ALSO" +.IR fcall (2), +.IR ip (2) +.SH BUGS +.IR GBIT * +and +.IR PBIT * +(from +.IR fcall (2)) +provide similar functionality for little-endian integers. +The +.IR nhget * +and +.IR nhput * +functions from +.IR ip (2) +provide similar functionality for big-endian integers.