Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "loader.h"
  2. #include <stdint.h>
  3. int l2_bc_serialize(FILE *outf, l2_word *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 & 0xff000000ull) >> 24,
  12. (version & 0x00ff0000ull) >> 16,
  13. (version & 0x0000ff00ull) >> 8,
  14. (version & 0x000000ffull) >> 0,
  15. };
  16. if (fwrite(version_buf, 1, 4, outf) < 4) {
  17. fprintf(stderr, "Write error\n");
  18. return -1;
  19. }
  20. struct l2_io_file_writer w = {
  21. .w.write = l2_io_file_write,
  22. .f = outf,
  23. };
  24. struct l2_bufio_writer writer;
  25. l2_bufio_writer_init(&writer, &w.w);
  26. unsigned char word_buf[4];
  27. for (size_t i = 0; i < len; ++i) {
  28. uint32_t word = data[i];
  29. word_buf[0] = (word & 0xff000000ull) >> 24;
  30. word_buf[1] = (word & 0x00ff0000ull) >> 16;
  31. word_buf[2] = (word & 0x0000ff00ull) >> 8;
  32. word_buf[3] = (word & 0x000000ffull) >> 0;
  33. l2_bufio_put_n(&writer, word_buf, 4);
  34. }
  35. l2_bufio_flush(&writer);
  36. return 0;
  37. }
  38. int l2_bc_load(FILE *inf, struct l2_io_writer *w) {
  39. // Header is already read by main
  40. unsigned char version_buf[4];
  41. if (fread(version_buf, 1, 4, inf) < 4) {
  42. fprintf(stderr, "Read error\n");
  43. return -1;
  44. }
  45. uint32_t version = 0 |
  46. ((uint32_t)version_buf[0]) << 24 |
  47. ((uint32_t)version_buf[1]) << 16 |
  48. ((uint32_t)version_buf[2]) << 8 |
  49. ((uint32_t)version_buf[3]) << 0;
  50. if (version != l2_bytecode_version) {
  51. fprintf(
  52. stderr, "Version mismatch! Bytecode file uses bytecode version %i"
  53. ", but your build of lang2 uses bytecode version %i\n",
  54. version, l2_bytecode_version);
  55. return -1;
  56. }
  57. struct l2_bufio_writer writer;
  58. l2_bufio_writer_init(&writer, w);
  59. // Must be divisible by 4
  60. unsigned char buffer[4096];
  61. while (1) {
  62. size_t n = fread(buffer, 1, sizeof(buffer), inf);
  63. if (n < 4) {
  64. l2_bufio_flush(&writer);
  65. return 0;
  66. }
  67. for (size_t i = 0; i < n; i += 4) {
  68. l2_word word = 0 |
  69. ((uint32_t)buffer[i + 0]) << 24 |
  70. ((uint32_t)buffer[i + 1]) << 16 |
  71. ((uint32_t)buffer[i + 2]) << 8 |
  72. ((uint32_t)buffer[i + 3]) << 0;
  73. l2_bufio_put_n(&writer, &word, 4);
  74. }
  75. }
  76. }