Ori BernsteinStyle(9)-ify.506eaa59 years agoHistory
232 lines · 3.1 KB · C
RawDownload
#include <stdlib.h>#include <stdio.h>#include <inttypes.h>#include <stdarg.h>#include <ctype.h>#include <string.h>#include <assert.h> #include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h> #include "util.h" /* endian packing */voidbe64(vlong v, byte buf[8]){	buf[0] = (v >> 56) & 0xff;	buf[1] = (v >> 48) & 0xff;	buf[2] = (v >> 40) & 0xff;	buf[3] = (v >> 32) & 0xff;	buf[4] = (v >> 24) & 0xff;	buf[5] = (v >> 16) & 0xff;	buf[6] = (v >> 8) & 0xff;	buf[7] = (v >> 0) & 0xff;} vlonghost64(byte buf[8]){	vlong v = 0; 	v |= ((vlong)buf[0] << 56LL);	v |= ((vlong)buf[1] << 48LL);	v |= ((vlong)buf[2] << 40LL);	v |= ((vlong)buf[3] << 32LL);	v |= ((vlong)buf[4] << 24LL);	v |= ((vlong)buf[5] << 16LL);	v |= ((vlong)buf[6] << 8LL);	v |= ((vlong)buf[7] << 0LL);	return v;} voidbe32(long v, byte buf[4]){	buf[0] = (v >> 24) & 0xff;	buf[1] = (v >> 16) & 0xff;	buf[2] = (v >> 8) & 0xff;	buf[3] = (v >> 0) & 0xff;} longhost32(byte buf[4]){	int32_t v = 0;	v |= ((long)buf[0] << 24);	v |= ((long)buf[1] << 16);	v |= ((long)buf[2] << 8);	v |= ((long)buf[3] << 0);	return v;} voidwrbuf(FILE *fd, void *p, size_t sz){	size_t n;	char *buf; 	n = 0;	buf = p;	while (n < sz) {		n += fwrite(buf + n, 1, sz - n, fd);		if (feof(fd))			die("Unexpected EOF");		if (ferror(fd))			die("Error writing");	}} voidrdbuf(FILE *fd, void *buf, size_t sz){	size_t n; 	n = sz;	while (n > 0) {		n -= fread(buf, 1, n, fd);		if (feof(fd))			die("Unexpected EOF");		if (ferror(fd))			die("Error writing");	}} voidwrbyte(FILE *fd, char val){	if (fputc(val, fd) == EOF)		die("Unexpected EOF");} charrdbyte(FILE *fd){	int c;	c = fgetc(fd);	if (c == EOF)		die("Unexpected EOF");	return c;} voidwrint(FILE *fd, long val){	byte buf[4];	be32(val, buf);	wrbuf(fd, buf, 4);} longrdint(FILE *fd){	byte buf[4];	rdbuf(fd, buf, 4);	return host32(buf);} voidwrstr(FILE *fd, char *val){	size_t len; 	if (!val) {		wrint(fd, -1);	} else {		wrint(fd, strlen(val));		len = strlen(val);		wrbuf(fd, val, len);	}} char *rdstr(FILE *fd){	ssize_t len;	char *s; 	len = rdint(fd);	if (len == -1) {		return NULL;	} else {		s = xalloc(len + 1);		rdbuf(fd, s, len);		s[len] = '\0';		return s;	}} voidwrlenstr(FILE *fd, Str str){	wrint(fd, str.len);	wrbuf(fd, str.buf, str.len);} voidrdlenstr(FILE *fd, Str *str){	str->len = rdint(fd);	str->buf = xalloc(str->len + 1);	rdbuf(fd, str->buf, str->len);	str->buf[str->len] = '\0';} voidwrflt(FILE *fd, double val){	byte buf[8];	/* Assumption: We have 'val' in 64 bit IEEE format */	union {		uvlong ival;		double fval;	} u; 	u.fval = val;	be64(u.ival, buf);	wrbuf(fd, buf, 8);} doublerdflt(FILE *fd){	byte buf[8];	union {		uvlong ival;		double fval;	} u; 	rdbuf(fd, buf, 8);	u.ival = host64(buf);	return u.fval;} size_tbprintf(char *buf, size_t sz, char *fmt, ...){	va_list ap;	size_t n; 	va_start(ap, fmt);	n = vsnprintf(buf, sz, fmt, ap);	if (n >= sz)		n = sz;	va_end(ap); 	return n;} voidwrbool(FILE *fd, int val){	wrbyte(fd, val);} intrdbool(FILE *fd){	return rdbyte(fd);}