summaryrefslogtreecommitdiff
path: root/sys/src/cmd/scat/bitinput.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/scat/bitinput.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/scat/bitinput.c')
-rwxr-xr-xsys/src/cmd/scat/bitinput.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/sys/src/cmd/scat/bitinput.c b/sys/src/cmd/scat/bitinput.c
new file mode 100755
index 000000000..b4bd286ba
--- /dev/null
+++ b/sys/src/cmd/scat/bitinput.c
@@ -0,0 +1,76 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "sky.h"
+
+static int hufvals[] = {
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 3, 3, 3, 3, 5, 5, 5, 5,
+ 10, 10, 10, 10, 12, 12, 12, 12,
+ 15, 15, 15, 15, 6, 6, 7, 7,
+ 9, 9, 11, 11, 13, 13, 0, 14,
+};
+
+static int huflens[] = {
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 6, 6,
+};
+
+static int buffer;
+static int bits_to_go; /* Number of bits still in buffer */
+
+void
+start_inputing_bits(void)
+{
+ bits_to_go = 0;
+}
+
+int
+input_huffman(Biobuf *infile)
+{
+ int c;
+
+ if(bits_to_go < 6) {
+ c = Bgetc(infile);
+ if(c < 0) {
+ fprint(2, "input_huffman: unexpected EOF\n");
+ exits("format");
+ }
+ buffer = (buffer<<8) | c;
+ bits_to_go += 8;
+ }
+ c = (buffer >> (bits_to_go-6)) & 0x3f;
+ bits_to_go -= huflens[c];
+ return hufvals[c];
+}
+
+int
+input_nybble(Biobuf *infile)
+{
+ int c;
+
+ if(bits_to_go < 4) {
+ c = Bgetc(infile);
+ if(c < 0){
+ fprint(2, "input_nybble: unexpected EOF\n");
+ exits("format");
+ }
+ buffer = (buffer<<8) | c;
+ bits_to_go += 8;
+ }
+
+ /*
+ * pick off the first 4 bits
+ */
+ bits_to_go -= 4;
+ return (buffer>>bits_to_go) & 0x0f;
+}