summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aux/flashfs/utils.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/aux/flashfs/utils.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aux/flashfs/utils.c')
-rwxr-xr-xsys/src/cmd/aux/flashfs/utils.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/sys/src/cmd/aux/flashfs/utils.c b/sys/src/cmd/aux/flashfs/utils.c
new file mode 100755
index 000000000..965bd5218
--- /dev/null
+++ b/sys/src/cmd/aux/flashfs/utils.c
@@ -0,0 +1,80 @@
+#include <u.h>
+#include <libc.h>
+#include "flashfs.h"
+
+char* prog;
+ulong sectsize;
+ulong nsects;
+uchar* sectbuff;
+int readonly;
+ulong delta;
+int eparity;
+
+uchar magic[] = { MAGIC0, MAGIC1, MAGIC2, FFSVERS };
+
+int
+putc3(uchar *buff, ulong v)
+{
+ if(v < (1 << 7)) {
+ buff[0] = v;
+ return 1;
+ }
+
+ if(v < (1 << 13)) {
+ buff[0] = 0x80 | (v >> 7);
+ buff[1] = v & ((1 << 7) - 1);
+ return 2;
+ }
+
+ if(v < (1 << 21)) {
+ buff[0] = 0x80 | (v >> 15);
+ buff[1] = 0x80 | ((v >> 8) & ((1 << 7) - 1));
+ buff[2] = v;
+ return 3;
+ }
+
+ fprint(2, "%s: putc3 fail 0x%lux, called from %#p\n", prog, v, getcallerpc(&buff));
+ abort();
+ return -1;
+}
+
+int
+getc3(uchar *buff, ulong *p)
+{
+ int c, d;
+
+ c = buff[0];
+ if((c & 0x80) == 0) {
+ *p = c;
+ return 1;
+ }
+
+ c &= ~0x80;
+ d = buff[1];
+ if((d & 0x80) == 0) {
+ *p = (c << 7) | d;
+ return 2;
+ }
+
+ d &= ~0x80;
+ *p = (c << 15) | (d << 8) | buff[2];
+ return 3;
+}
+
+ulong
+get4(uchar *b)
+{
+ return (b[0] << 0) |
+ (b[1] << 8) |
+ (b[2] << 16) |
+ (b[3] << 24);
+}
+
+void
+put4(uchar *b, ulong v)
+{
+ b[0] = v >> 0;
+ b[1] = v >> 8;
+ b[2] = v >> 16;
+ b[3] = v >> 24;
+}