/install/xbt/linux/misc/xif_value.cpp

http://torrentpier2.googlecode.com/ · C++ · 151 lines · 140 code · 11 blank · 0 comment · 22 complexity · 6fe3c9454985d6bcafc66ea8da41da8d MD5 · raw file

  1. #include "stdafx.h"
  2. #include "xif_value.h"
  3. #include <zlib.h>
  4. #include "stream_int.h"
  5. static float read_float(const byte*& r)
  6. {
  7. assert(sizeof(float) == 4);
  8. float v;
  9. memcpy(&v, r, 4);
  10. r += 4;
  11. return v;
  12. }
  13. static int read_int(const byte*& r)
  14. {
  15. r += 4;
  16. return read_int_le(4, r - 4);
  17. }
  18. t_vt Cxif_value::get_type() const
  19. {
  20. if (m_type != vt_unknown)
  21. return m_type;
  22. const byte* data = m_data.data();
  23. if (!data)
  24. return vt_binary;
  25. int size = m_data.size();
  26. if (!data[size - 1])
  27. {
  28. const byte* r = data;
  29. int c = size - 1;
  30. while (c--)
  31. {
  32. if (*r != 9 && *r < 0x20)
  33. break;
  34. r++;
  35. }
  36. if (c == -1)
  37. return vt_string;
  38. }
  39. if (size == 4)
  40. return vt_int32;
  41. return vt_binary;
  42. }
  43. void Cxif_value::load_old(const byte*& data)
  44. {
  45. m_data.clear();
  46. int size = read_int(data);
  47. if (size == 4)
  48. memcpy(m_value, data, size);
  49. memcpy(m_data.write_start(size), data, size);
  50. data += size;
  51. m_type = vt_unknown;
  52. m_type = get_type();
  53. }
  54. void Cxif_value::load_new(const byte*& data)
  55. {
  56. m_data.clear();
  57. m_type = static_cast<t_vt>(*data++);
  58. switch (m_type)
  59. {
  60. case vt_bin32:
  61. case vt_int32:
  62. m_value_int = read_int(data);
  63. break;
  64. case vt_float:
  65. m_value_float = read_float(data);
  66. break;
  67. case vt_external_binary:
  68. m_data.write_start(read_int(data));
  69. break;
  70. default:
  71. {
  72. int size = read_int(data);
  73. memcpy(m_data.write_start(size), data, size);
  74. data += size;
  75. }
  76. }
  77. }
  78. void Cxif_value::load_external(const byte*& data)
  79. {
  80. if (!external_data())
  81. return;
  82. memcpy(m_data.data_edit(), data, get_size());
  83. data += get_size();
  84. }
  85. int Cxif_value::skip(const byte* s)
  86. {
  87. const byte* r = s;
  88. t_vt type = static_cast<t_vt>(*r++);
  89. switch (type)
  90. {
  91. case vt_bin32:
  92. case vt_int32:
  93. read_int(r);
  94. break;
  95. case vt_float:
  96. read_float(r);
  97. break;
  98. case vt_external_binary:
  99. read_int(r);
  100. break;
  101. default:
  102. r += read_int(r);
  103. }
  104. return r - s;
  105. }
  106. void Cxif_value::save(byte*& data) const
  107. {
  108. *data++ = external_data() ? vt_external_binary : m_type;
  109. switch (m_type)
  110. {
  111. case vt_bin32:
  112. case vt_int32:
  113. data = write_int_le(4, data, get_int());
  114. break;
  115. case vt_float:
  116. data = write_float(data, get_float());
  117. break;
  118. default:
  119. {
  120. int size = get_size();
  121. data = write_int_le(4, data, size);
  122. if (!external_data())
  123. {
  124. memcpy(data, get_data(), size);
  125. data += size;
  126. }
  127. }
  128. }
  129. }
  130. bool Cxif_value::external_data() const
  131. {
  132. return m_type == vt_external_binary;
  133. }
  134. void Cxif_value::external_save(byte*& data) const
  135. {
  136. if (!external_data())
  137. return;
  138. memcpy(data, get_data(), get_size());
  139. data += get_size();
  140. }