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