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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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(
  40. stderr, "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. // Must be divisible by 4
  46. unsigned char buffer[4096];
  47. while (1) {
  48. size_t n = fread(buffer, 1, sizeof(buffer), inf);
  49. if (n == 0) {
  50. return 0;
  51. }
  52. w->write(w, buffer, n);
  53. }
  54. }