xref: /plan9/sys/src/cmd/aux/flashfs/utils.c (revision 74f16c8187aab477889167f2422d0597b1b7d0ff)
19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include "flashfs.h"
49a747e4fSDavid du Colombier 
59a747e4fSDavid du Colombier char*	prog;
69a747e4fSDavid du Colombier ulong	sectsize;
79a747e4fSDavid du Colombier ulong	nsects;
89a747e4fSDavid du Colombier uchar*	sectbuff;
99a747e4fSDavid du Colombier int	readonly;
109a747e4fSDavid du Colombier ulong	delta;
119a747e4fSDavid du Colombier int	eparity;
129a747e4fSDavid du Colombier 
139a747e4fSDavid du Colombier uchar	magic[]	= { MAGIC0, MAGIC1, MAGIC2, FFSVERS };
149a747e4fSDavid du Colombier 
159a747e4fSDavid du Colombier int
putc3(uchar * buff,ulong v)169a747e4fSDavid du Colombier putc3(uchar *buff, ulong v)
179a747e4fSDavid du Colombier {
189a747e4fSDavid du Colombier 	if(v < (1 << 7)) {
199a747e4fSDavid du Colombier 		buff[0] = v;
209a747e4fSDavid du Colombier 		return 1;
219a747e4fSDavid du Colombier 	}
229a747e4fSDavid du Colombier 
239a747e4fSDavid du Colombier 	if(v < (1 << 13)) {
249a747e4fSDavid du Colombier 		buff[0] = 0x80 | (v >> 7);
259a747e4fSDavid du Colombier 		buff[1] = v & ((1 << 7) - 1);
269a747e4fSDavid du Colombier 		return 2;
279a747e4fSDavid du Colombier 	}
289a747e4fSDavid du Colombier 
299a747e4fSDavid du Colombier 	if(v < (1 << 21)) {
309a747e4fSDavid du Colombier 		buff[0] = 0x80 | (v >> 15);
319a747e4fSDavid du Colombier 		buff[1] = 0x80 | ((v >> 8) & ((1 << 7) - 1));
329a747e4fSDavid du Colombier 		buff[2] = v;
339a747e4fSDavid du Colombier 		return 3;
349a747e4fSDavid du Colombier 	}
359a747e4fSDavid du Colombier 
36*74f16c81SDavid du Colombier 	fprint(2, "%s: putc3 fail 0x%lux, called from %#p\n", prog, v, getcallerpc(&buff));
379a747e4fSDavid du Colombier 	abort();
389a747e4fSDavid du Colombier 	return -1;
399a747e4fSDavid du Colombier }
409a747e4fSDavid du Colombier 
419a747e4fSDavid du Colombier int
getc3(uchar * buff,ulong * p)429a747e4fSDavid du Colombier getc3(uchar *buff, ulong *p)
439a747e4fSDavid du Colombier {
449a747e4fSDavid du Colombier 	int c, d;
459a747e4fSDavid du Colombier 
469a747e4fSDavid du Colombier 	c = buff[0];
479a747e4fSDavid du Colombier 	if((c & 0x80) == 0) {
489a747e4fSDavid du Colombier 		*p = c;
499a747e4fSDavid du Colombier 		return 1;
509a747e4fSDavid du Colombier 	}
519a747e4fSDavid du Colombier 
529a747e4fSDavid du Colombier 	c &= ~0x80;
539a747e4fSDavid du Colombier 	d = buff[1];
549a747e4fSDavid du Colombier 	if((d & 0x80) == 0) {
559a747e4fSDavid du Colombier 		*p = (c << 7) | d;
569a747e4fSDavid du Colombier 		return 2;
579a747e4fSDavid du Colombier 	}
589a747e4fSDavid du Colombier 
599a747e4fSDavid du Colombier 	d &= ~0x80;
609a747e4fSDavid du Colombier 	*p = (c << 15) | (d << 8) | buff[2];
619a747e4fSDavid du Colombier 	return 3;
629a747e4fSDavid du Colombier }
639a747e4fSDavid du Colombier 
649a747e4fSDavid du Colombier ulong
get4(uchar * b)659a747e4fSDavid du Colombier get4(uchar *b)
669a747e4fSDavid du Colombier {
679a747e4fSDavid du Colombier 	return	(b[0] <<  0) |
689a747e4fSDavid du Colombier 		(b[1] <<  8) |
699a747e4fSDavid du Colombier 		(b[2] << 16) |
709a747e4fSDavid du Colombier 		(b[3] << 24);
719a747e4fSDavid du Colombier }
729a747e4fSDavid du Colombier 
739a747e4fSDavid du Colombier void
put4(uchar * b,ulong v)749a747e4fSDavid du Colombier put4(uchar *b, ulong v)
759a747e4fSDavid du Colombier {
769a747e4fSDavid du Colombier 	b[0] = v >>  0;
779a747e4fSDavid du Colombier 	b[1] = v >>  8;
789a747e4fSDavid du Colombier 	b[2] = v >> 16;
799a747e4fSDavid du Colombier 	b[3] = v >> 24;
809a747e4fSDavid du Colombier }
81