You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

loader.c 1.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "loader.h"
  2. #include <stdint.h>
  3. int l2_bc_serialize(FILE *outf, unsigned char *data, size_t len) {
  4. char header[4] = { 0x1b, 0x6c, 0x32, 0x63 };
  5. if (fwrite(header, 1, 4, outf) < 4) {
  6. fprintf(stderr, "Write error\n");
  7. return -1;
  8. }
  9. uint32_t version = l2_bytecode_version;
  10. unsigned char version_buf[4] = {
  11. (version >> 0) & 0xff,
  12. (version >> 8) & 0xff,
  13. (version >> 16) & 0xff,
  14. (version >> 24) & 0xff,
  15. };
  16. if (fwrite(version_buf, 1, 4, outf) < 4) {
  17. fprintf(stderr, "Write error\n");
  18. return -1;
  19. }
  20. if (fwrite(data, 1, len, outf) < len) {
  21. fprintf(stderr, "Write error\n");
  22. return -1;
  23. }
  24. return 0;
  25. }
  26. int l2_bc_load(FILE *inf, struct l2_io_writer *w) {
  27. // Header is already read by main
  28. unsigned char version_buf[4];
  29. if (fread(version_buf, 1, 4, inf) < 4) {
  30. fprintf(stderr, "Read error\n");
  31. return -1;
  32. }
  33. uint32_t version = 0 |
  34. ((uint32_t)version_buf[0]) << 0 |
  35. ((uint32_t)version_buf[1]) << 8 |
  36. ((uint32_t)version_buf[2]) << 16 |
  37. ((uint32_t)version_buf[3]) << 24;
  38. if (version != l2_bytecode_version) {
  39. fprintf(stderr,
  40. "Version mismatch! Bytecode file uses bytecode version %i"
  41. ", but your build of lang2 uses bytecode version %i\n",
  42. version, l2_bytecode_version);
  43. return -1;
  44. }
  45. unsigned char buffer[4096];
  46. while (1) {
  47. size_t n = fread(buffer, 1, sizeof(buffer), inf);
  48. if (n == 0) {
  49. return 0;
  50. }
  51. w->write(w, buffer, n);
  52. }
  53. }