--- /n/sources/plan9/sys/include/libc.h Wed Sep 18 22:45:28 2013 +++ /sys/include/libc.h Sun Jun 21 00:00:00 2026 @@ -48,6 +48,23 @@ Runemax = 0x10FFFF, /* 21-bit rune */ Runemask = 0x1FFFFF, /* bits used by runes (see grep) */ }; + +/* + * byte serialization + */ +extern uint begeth(void *vp); +extern uint begetl(void *vp); +extern uvlong begetvl(void *vp); +extern void* beputh(void *vp, ushort l); +extern void* beputl(void *vp, ulong l); +extern void* beputvl(void *vp, uvlong l); + +extern uint legeth(void *vp); +extern uint legetl(void *vp); +extern uvlong legetvl(void *vp); +extern void* leputh(void *vp, ushort l); +extern void* leputl(void *vp, ulong l); +extern void* leputvl(void *vp, uvlong l); /* * rune routines --- /n/sources/plan9/sys/src/libc/port/mkfile Wed Apr 24 22:51:53 2013 +++ /sys/src/libc/port/mkfile Sun Jun 21 00:00:00 2026 @@ -12,6 +12,7 @@ atof.c\ atol.c\ atoll.c\ + byteserial.c\ cistrcmp.c\ cistrncmp.c\ cistrstr.c\ --- /dev/null Sun Jun 21 20:07:59 2026 +++ /sys/src/libc/port/byteserial.c Sun Jun 21 00:00:00 2026 @@ -0,0 +1,146 @@ +/* + * byte serialization + */ +#include +#include + +/* convert bytes to integers, by byte order and integer length */ + +uint +legeth(void *vp) +{ + uchar *p; + + p = vp; + return p[1]<<8 | p[0]; +} + +uint +begeth(void *vp) +{ + uchar *p; + + p = vp; + return p[0]<<8 | p[1]; +} + +uint +legetl(void *vp) +{ + uchar *p; + + p = vp; + return p[3]<<24 | p[2]<<16 | p[1]<<8 | p[0]; +} + +uint +begetl(void *vp) +{ + uchar *p; + + p = vp; + return p[0]<<24 | p[1]<<16 | p[2]<<8 | p[3]; +} + +uvlong +legetvl(void *vp) +{ + return (uvlong)legetl((uchar *)vp+4) << 32 | legetl(vp); +} + +uvlong +begetvl(void *vp) +{ + return (uvlong)begetl(vp) << 32 | begetl((uchar *)vp+4); +} + + +/* convert integers to bytes, by byte order and integer length */ + +void * +leputh(void *vp, ushort l) +{ + uchar *p; + + p = vp; + *p++ = l; l >>= 8; + *p++ = l; + return p; +} + +void * +beputh(void *vp, ushort l) +{ + uchar *p, *ep; + + p = vp; + p += sizeof l; + ep = p; + *--p = l; l >>= 8; + *--p = l; + return ep; +} + +void * +leputl(void *vp, ulong l) +{ + uchar *p; + + p = vp; + *p++ = l; l >>= 8; + *p++ = l; l >>= 8; + *p++ = l; l >>= 8; + *p++ = l; + return p; +} + +void * +beputl(void *vp, ulong l) +{ + uchar *p, *ep; + + p = vp; + p += sizeof l; + ep = p; + *--p = l; l >>= 8; + *--p = l; l >>= 8; + *--p = l; l >>= 8; + *--p = l; + return ep; +} + +void * +leputvl(void *vp, uvlong l) +{ + uchar *p; + + p = vp; + *p++ = l; l >>= 8; + *p++ = l; l >>= 8; + *p++ = l; l >>= 8; + *p++ = l; l >>= 8; + *p++ = l; l >>= 8; + *p++ = l; l >>= 8; + *p++ = l; l >>= 8; + *p++ = l; + return p; +} + +void * +beputvl(void *vp, uvlong l) +{ + uchar *p, *ep; + + p = vp; + p += sizeof l; + ep = p; + *--p = l; l >>= 8; + *--p = l; l >>= 8; + *--p = l; l >>= 8; + *--p = l; l >>= 8; + *--p = l; l >>= 8; + *--p = l; l >>= 8; + *--p = l; l >>= 8; + *--p = l; + return ep; +} --- /dev/null Sun Jun 21 20:07:59 2026 +++ /sys/man/2/byteserial Sun Jun 21 00:00:00 2026 @@ -0,0 +1,54 @@ +.TH BYTESERIAL 2 +.SH NAME +byteserial: begeth, begetl, begetvl, beputh, beputl, beputvl, legeth, legetl, legetvl, leputh, leputl, leputvl \- converts integers to bytes, and vice versa, in either byte order +.SH SYNOPSIS +.EX +#include +#include +.EE +.PP +.EX +uint begeth(void *vp) +uint begetl(void *vp) +uvlong begetvl(void *vp) +void* beputh(void *vp, ushort l) +void* beputl(void *vp, ulong l) +void* beputvl(void *vp, uvlong l) +.EE +.PP +.EX +uint legeth(void *vp) +uint legetl(void *vp) +uvlong legetvl(void *vp) +void* leputh(void *vp, ushort l) +void* leputl(void *vp, ulong l) +void* leputvl(void *vp, uvlong l) +.EE +.SH DESCRIPTION +The +.I get +functions convert bytes at +.I vp +by shifting bytes and OR-ing them into unsigned integers, which they return. +Host byte order is irrelevant. +The +.B be* +functions assume big-endian (e.g., 68020, MIPS) byte order: +the first byte is the most significant. +The +.B le* +functions assume little-endian (e.g., 386) byte order: +the first byte is the least significant. +.PP +The +.I put +functions do the reverse, converting unsigned integers to bytes at +.I vp +and returning the address of the byte after those generated. +.SH SOURCE +.B /sys/src/libc/port/byteserial.c +.SH SEE ALSO +.IR ip (2) +.SH BUGS +Only the common byte orders are supported. +PDP-11 (a.k.a. middle-endian or German) byte order is not supported.