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.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "loader.h"
  2. int l2_bc_serialize(FILE *outf, l2_word *data, size_t len) {
  3. char header[4] = { 0x1b, 0x6c, 0x32, 0x63 };
  4. if (fwrite(header, 1, 4, outf) < 4) {
  5. fprintf(stderr, "Write error\n");
  6. return -1;
  7. }
  8. char version[4] = {
  9. (l2_bytecode_version & 0xff000000ul) >> 24,
  10. (l2_bytecode_version & 0x00ff0000ul) >> 16,
  11. (l2_bytecode_version & 0x0000ff00ul) >> 8,
  12. (l2_bytecode_version & 0x000000fful) >> 0,
  13. };
  14. if (fwrite(version, 1, 4, outf) < 4) {
  15. fprintf(stderr, "Write error\n");
  16. return -1;
  17. }
  18. for (size_t i = 0; i < len; ++i) {
  19. l2_word word = data[i];
  20. char *dest = (char *)&data[i];
  21. dest[0] = (word & 0xff000000ul) >> 24;
  22. dest[1] = (word & 0x00ff0000ul) >> 16;
  23. dest[2] = (word & 0x0000ff00ul) >> 8;
  24. dest[3] = (word & 0x000000fful) >> 0;
  25. }
  26. if (fwrite(data, 4, len, outf) < len) {
  27. fprintf(stderr, "Write error\n");
  28. return -1;
  29. }
  30. return 0;
  31. }
  32. int l2_bc_load(FILE *inf, struct l2_io_writer *w) {
  33. // Header is already read by main
  34. char version_buf[4];
  35. if (fread(version_buf, 1, 4, inf) < 4) {
  36. fprintf(stderr, "Read error\n");
  37. return -1;
  38. }
  39. int version = 0 |
  40. ((unsigned int)version_buf[0]) << 24 |
  41. ((unsigned int)version_buf[1]) << 16 |
  42. ((unsigned int)version_buf[2]) << 8 |
  43. ((unsigned int)version_buf[3]) << 0;
  44. if (version != l2_bytecode_version) {
  45. fprintf(
  46. stderr, "Version mismatch! Bytecode file uses bytecode version %i"
  47. ", but your build of lang2 uses bytecode version %i\n",
  48. version, l2_bytecode_version);
  49. return -1;
  50. }
  51. struct l2_bufio_writer writer;
  52. l2_bufio_writer_init(&writer, w);
  53. char buffer[4096];
  54. while (1) {
  55. size_t n = fread(buffer, 1, sizeof(buffer), inf);
  56. if (n < 4) {
  57. l2_bufio_flush(&writer);
  58. return 0;
  59. }
  60. for (size_t i = 0; i < n; i += 4) {
  61. l2_word word = 0 |
  62. ((unsigned int)buffer[i + 0]) << 24 |
  63. ((unsigned int)buffer[i + 1]) << 16 |
  64. ((unsigned int)buffer[i + 2]) << 8 |
  65. ((unsigned int)buffer[i + 3]) << 0;
  66. l2_bufio_put_n(&writer, &word, 4);
  67. }
  68. }
  69. }