xref: /plan9/sys/src/cmd/aux/flashfs/utils.c (revision 74f16c8187aab477889167f2422d0597b1b7d0ff)
1 #include <u.h>
2 #include <libc.h>
3 #include "flashfs.h"
4 
5 char*	prog;
6 ulong	sectsize;
7 ulong	nsects;
8 uchar*	sectbuff;
9 int	readonly;
10 ulong	delta;
11 int	eparity;
12 
13 uchar	magic[]	= { MAGIC0, MAGIC1, MAGIC2, FFSVERS };
14 
15 int
putc3(uchar * buff,ulong v)16 putc3(uchar *buff, ulong v)
17 {
18 	if(v < (1 << 7)) {
19 		buff[0] = v;
20 		return 1;
21 	}
22 
23 	if(v < (1 << 13)) {
24 		buff[0] = 0x80 | (v >> 7);
25 		buff[1] = v & ((1 << 7) - 1);
26 		return 2;
27 	}
28 
29 	if(v < (1 << 21)) {
30 		buff[0] = 0x80 | (v >> 15);
31 		buff[1] = 0x80 | ((v >> 8) & ((1 << 7) - 1));
32 		buff[2] = v;
33 		return 3;
34 	}
35 
36 	fprint(2, "%s: putc3 fail 0x%lux, called from %#p\n", prog, v, getcallerpc(&buff));
37 	abort();
38 	return -1;
39 }
40 
41 int
getc3(uchar * buff,ulong * p)42 getc3(uchar *buff, ulong *p)
43 {
44 	int c, d;
45 
46 	c = buff[0];
47 	if((c & 0x80) == 0) {
48 		*p = c;
49 		return 1;
50 	}
51 
52 	c &= ~0x80;
53 	d = buff[1];
54 	if((d & 0x80) == 0) {
55 		*p = (c << 7) | d;
56 		return 2;
57 	}
58 
59 	d &= ~0x80;
60 	*p = (c << 15) | (d << 8) | buff[2];
61 	return 3;
62 }
63 
64 ulong
get4(uchar * b)65 get4(uchar *b)
66 {
67 	return	(b[0] <<  0) |
68 		(b[1] <<  8) |
69 		(b[2] << 16) |
70 		(b[3] << 24);
71 }
72 
73 void
put4(uchar * b,ulong v)74 put4(uchar *b, ulong v)
75 {
76 	b[0] = v >>  0;
77 	b[1] = v >>  8;
78 	b[2] = v >> 16;
79 	b[3] = v >> 24;
80 }
81