1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- #include "loader.h"
-
- #include <stdint.h>
-
- int l2_bc_serialize(FILE *outf, unsigned char *data, size_t len) {
- char header[4] = { 0x1b, 0x6c, 0x32, 0x63 };
- if (fwrite(header, 1, 4, outf) < 4) {
- fprintf(stderr, "Write error\n");
- return -1;
- }
-
- uint32_t version = l2_bytecode_version;
-
- unsigned char version_buf[4] = {
- (version >> 0) & 0xff,
- (version >> 8) & 0xff,
- (version >> 16) & 0xff,
- (version >> 24) & 0xff,
- };
- if (fwrite(version_buf, 1, 4, outf) < 4) {
- fprintf(stderr, "Write error\n");
- return -1;
- }
-
- if (fwrite(data, 1, len, outf) < len) {
- fprintf(stderr, "Write error\n");
- return -1;
- }
-
- return 0;
- }
-
- int l2_bc_load(FILE *inf, struct l2_io_writer *w) {
- // Header is already read by main
-
- unsigned char version_buf[4];
- if (fread(version_buf, 1, 4, inf) < 4) {
- fprintf(stderr, "Read error\n");
- return -1;
- }
-
- uint32_t version = 0 |
- ((uint32_t)version_buf[0]) << 0 |
- ((uint32_t)version_buf[1]) << 8 |
- ((uint32_t)version_buf[2]) << 16 |
- ((uint32_t)version_buf[3]) << 24;
- if (version != l2_bytecode_version) {
- fprintf(stderr,
- "Version mismatch! Bytecode file uses bytecode version %i"
- ", but your build of lang2 uses bytecode version %i\n",
- version, l2_bytecode_version);
- return -1;
- }
-
- unsigned char buffer[4096];
-
- while (1) {
- size_t n = fread(buffer, 1, sizeof(buffer), inf);
- if (n == 0) {
- return 0;
- }
-
- w->write(w, buffer, n);
- }
- }
|