serialize.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "pocketpy/common/serialize.h"
  2. // >>> ord('🥕')
  3. // 129365
  4. // >>> ord('🍋')
  5. // 127819
  6. static uint32_t c11__checksum_32bit(const void* data, int size){
  7. const uint8_t* p = (const uint8_t*)data;
  8. uint32_t res = 0;
  9. for(int i = 0; i < size; i++){
  10. res = res * 31 + p[i];
  11. }
  12. return res;
  13. }
  14. void c11_serializer__ctor(c11_serializer* self, int16_t magic, int8_t major_ver, int8_t minor_ver){
  15. c11_vector__ctor(&self->data, 1);
  16. c11_serializer__write_i16(self, magic);
  17. c11_serializer__write_i8(self, major_ver);
  18. c11_serializer__write_i8(self, minor_ver);
  19. }
  20. void c11_serializer__dtor(c11_serializer* self){
  21. c11_vector__dtor(&self->data);
  22. }
  23. void c11_serializer__write_cstr(c11_serializer *self, const char* cstr) {
  24. int len = (int)strlen(cstr);
  25. c11_serializer__write_bytes(self, cstr, len + 1);
  26. }
  27. void c11_serializer__write_bytes(c11_serializer* self, const void* data, int size){
  28. c11_vector__extend(&self->data, data, size);
  29. }
  30. void* c11_serializer__submit(c11_serializer* self, int* size){
  31. uint32_t checksum = c11__checksum_32bit(self->data.data, self->data.length);
  32. c11_serializer__write_bytes(self, &checksum, sizeof(uint32_t));
  33. return c11_vector__submit(&self->data, size);
  34. }
  35. void c11_deserializer__ctor(c11_deserializer* self, const void* data, int size){
  36. self->data = (const uint8_t*)data;
  37. self->size = size;
  38. self->index = 0;
  39. self->error_msg[0] = '\0';
  40. }
  41. void c11_deserializer__dtor(c11_deserializer* self){
  42. // nothing to do
  43. }
  44. bool c11_deserializer__error(c11_deserializer* self, const char* msg){
  45. snprintf(self->error_msg, sizeof(self->error_msg), "%s", msg);
  46. return false;
  47. }
  48. bool c11_deserializer__check_header(c11_deserializer* self, int16_t magic, int8_t major_ver, int8_t minor_ver_min){
  49. if(self->size < 8){
  50. return c11_deserializer__error(self, "bad header: size < 8");
  51. }
  52. // read 16bit magic
  53. int16_t file_magic = c11_deserializer__read_i16(self);
  54. if(file_magic != magic){
  55. return c11_deserializer__error(self, "bad header: magic mismatch");
  56. }
  57. // read 16bit version
  58. self->major_ver = c11_deserializer__read_i8(self);
  59. self->minor_ver = c11_deserializer__read_i8(self);
  60. // check checksum
  61. uint32_t checksum;
  62. memcpy(&checksum, self->data + self->size - 4, sizeof(uint32_t));
  63. uint32_t actual_checksum = c11__checksum_32bit(self->data, self->size - 4);
  64. if(checksum != actual_checksum){
  65. return c11_deserializer__error(self, "bad header: checksum mismatch");
  66. }
  67. // check version
  68. if(self->major_ver != major_ver){
  69. return c11_deserializer__error(self, "bad header: major version mismatch");
  70. }
  71. if(self->minor_ver < minor_ver_min){
  72. // file_ver: 1.1, require_ver: 1.0 => ok
  73. // file_ver: 1.1, require_ver: 1.1 => ok
  74. // file_ver: 1.1, require_ver: 1.2 => error
  75. return c11_deserializer__error(self, "bad header: minor version mismatch");
  76. }
  77. return true;
  78. }
  79. const char* c11_deserializer__read_cstr(c11_deserializer* self){
  80. const char* p = (const char*)(self->data + self->index);
  81. self->index += (strlen(p) + 1);
  82. return p;
  83. }
  84. void* c11_deserializer__read_bytes(c11_deserializer* self, int size){
  85. void* p = (void*)(self->data + self->index);
  86. self->index += size;
  87. return p;
  88. }