|
4 | 4 | #include "panic.h"
|
5 | 5 | #include "wasm.h"
|
6 | 6 |
|
7 |
| -#include <zstd.h> |
8 |
| - |
9 | 7 | #include <assert.h>
|
10 | 8 | #include <stdbool.h>
|
11 | 9 | #include <stdint.h>
|
12 | 10 | #include <stdio.h>
|
13 | 11 | #include <stdlib.h>
|
14 | 12 | #include <string.h>
|
| 13 | +#include <stddef.h> |
15 | 14 |
|
16 | 15 | struct InputStream {
|
17 | 16 | FILE *stream;
|
18 |
| - ZSTD_DStream *ds; |
19 |
| - ZSTD_outBuffer out; |
20 |
| - ZSTD_inBuffer in; |
21 |
| - size_t pos; |
22 | 17 | };
|
23 | 18 |
|
24 | 19 | static void InputStream_open(struct InputStream *self, const char *path) {
|
25 | 20 | self->stream = fopen(path, "rb");
|
26 | 21 | if (self->stream == NULL) panic("unable to open input file");
|
27 |
| - self->ds = ZSTD_createDStream(); |
28 |
| - if (self->ds == NULL) panic("unable to create zstd context"); |
29 |
| - size_t in_size = ZSTD_initDStream(self->ds); |
30 |
| - if (ZSTD_isError(in_size)) panic(ZSTD_getErrorName(in_size)); |
31 |
| - self->out.size = ZSTD_DStreamOutSize(); |
32 |
| - self->out.dst = malloc(self->out.size + ZSTD_DStreamInSize()); |
33 |
| - if (self->out.dst == NULL) panic("unable to allocate input buffers"); |
34 |
| - self->out.pos = 0; |
35 |
| - self->in.src = (const char *)self->out.dst + self->out.size; |
36 |
| - self->in.size = fread((void *)self->in.src, 1, in_size, self->stream); |
37 |
| - self->in.pos = 0; |
38 |
| - self->pos = 0; |
39 | 22 | }
|
40 | 23 |
|
41 | 24 | static void InputStream_close(struct InputStream *self) {
|
42 |
| - free(self->out.dst); |
43 |
| - ZSTD_freeDStream(self->ds); |
44 | 25 | fclose(self->stream);
|
45 | 26 | }
|
46 | 27 |
|
47 | 28 | static bool InputStream_atEnd(struct InputStream *self) {
|
48 |
| - while (self->pos >= self->out.pos) { |
49 |
| - self->out.pos = 0; |
50 |
| - self->pos = 0; |
51 |
| - size_t in_size = ZSTD_decompressStream(self->ds, &self->out, &self->in); |
52 |
| - if (ZSTD_isError(in_size)) panic(ZSTD_getErrorName(in_size)); |
53 |
| - if (self->in.pos >= self->in.size) { |
54 |
| - size_t max_in_size = ZSTD_DStreamInSize(); |
55 |
| - if (in_size > max_in_size) in_size = max_in_size; |
56 |
| - self->in.size = fread((void *)self->in.src, 1, in_size, self->stream); |
57 |
| - self->in.pos = 0; |
58 |
| - if (self->in.pos >= self->in.size) return true; |
59 |
| - } |
60 |
| - } |
61 |
| - return false; |
| 29 | + return feof(self->stream) != 0; |
62 | 30 | }
|
63 | 31 |
|
64 | 32 | static uint8_t InputStream_readByte(struct InputStream *self) {
|
65 |
| - if (InputStream_atEnd(self)) panic("unexpected end of input stream"); |
66 |
| - uint8_t value = ((uint8_t *)self->out.dst)[self->pos]; |
67 |
| - self->pos += 1; |
| 33 | + int value; |
| 34 | + value = fgetc(self->stream); |
| 35 | + if (value == EOF) panic("unexpected end of input stream"); |
68 | 36 | return value;
|
69 | 37 | }
|
70 | 38 |
|
@@ -168,26 +136,13 @@ static char *InputStream_readName(struct InputStream *self) {
|
168 | 136 | uint32_t len = InputStream_readLeb128_u32(self);
|
169 | 137 | char *name = malloc(len + 1);
|
170 | 138 | if (name == NULL) panic("out of memory");
|
171 |
| - for (uint32_t i = 0; i < len; ) { |
172 |
| - if (InputStream_atEnd(self)) panic("unexpected end of input stream"); |
173 |
| - size_t remaining = self->out.pos - self->pos; |
174 |
| - if (remaining > len - i) remaining = len - i; |
175 |
| - memcpy(&name[i], &((char *)self->out.dst)[self->pos], remaining); |
176 |
| - i += remaining; |
177 |
| - self->pos += remaining; |
178 |
| - } |
179 |
| - name[len] = '\0'; |
| 139 | + if (fread(name, 1, len, self->stream) != len) panic("unexpected end of input stream"); |
| 140 | + name[len] = 0; |
180 | 141 | return name;
|
181 | 142 | }
|
182 | 143 |
|
183 | 144 | static void InputStream_skipBytes(struct InputStream *self, size_t len) {
|
184 |
| - for (size_t i = 0; i < len; ) { |
185 |
| - if (InputStream_atEnd(self)) panic("unexpected end of input stream"); |
186 |
| - size_t remaining = self->out.pos - self->pos; |
187 |
| - if (remaining > len - i) remaining = len - i; |
188 |
| - i += remaining; |
189 |
| - self->pos += remaining; |
190 |
| - } |
| 145 | + if (fseek(self->stream, len, SEEK_CUR) == -1) panic("unexpected end of input stream"); |
191 | 146 | }
|
192 | 147 |
|
193 | 148 | static uint32_t InputStream_skipToSection(struct InputStream *self, uint8_t expected_id) {
|
|
0 commit comments