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 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 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 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 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