Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

130 linhas
3.7 KiB

  1. // This file is part of Jiffy released under the MIT license.
  2. // See the LICENSE file for more information.
  3. static const char hexvals[256] = {
  4. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  5. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  6. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  7. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
  8. -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  9. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  10. -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  11. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
  12. };
  13. static const char hexdigits[16] = {
  14. '0', '1', '2', '3',
  15. '4', '5', '6', '7',
  16. '8', '9', 'A', 'B',
  17. 'C', 'D', 'E', 'F'
  18. };
  19. int
  20. int_from_hex(const unsigned char* p)
  21. {
  22. unsigned char* h = (unsigned char*) p;
  23. int ret;
  24. if(hexvals[*(h+0)] < 0) return -1;
  25. if(hexvals[*(h+1)] < 0) return -1;
  26. if(hexvals[*(h+2)] < 0) return -1;
  27. if(hexvals[*(h+3)] < 0) return -1;
  28. ret = (hexvals[*(h+0)] << 12)
  29. + (hexvals[*(h+1)] << 8)
  30. + (hexvals[*(h+2)] << 4)
  31. + (hexvals[*(h+3)] << 0);
  32. return ret;
  33. }
  34. int
  35. int_to_hex(int val, char* p)
  36. {
  37. if(val < 0 || val > 65535)
  38. return 0;
  39. p[0] = hexdigits[(val >> 12) & 0xF];
  40. p[1] = hexdigits[(val >> 8) & 0xF];
  41. p[2] = hexdigits[(val >> 4) & 0xF];
  42. p[3] = hexdigits[val & 0xF];
  43. return 1;
  44. }
  45. int
  46. utf8_len(int c)
  47. {
  48. if(c < 128) {
  49. return 1;
  50. } else if(c < 0x800) {
  51. return 2;
  52. } else if(c < 0x10000) {
  53. if(c < 0xD800 || (c > 0xDFFF && c < 0xFFFE)) {
  54. return 3;
  55. } else {
  56. return -1;
  57. }
  58. } else if(c < 0x200000) {
  59. return 4;
  60. } else if(c < 0x4000000) {
  61. return 5;
  62. } else if(c < 0x80000000) {
  63. return 6;
  64. } else {
  65. return -1;
  66. }
  67. }
  68. int
  69. utf8_from_pair(int hi, int lo)
  70. {
  71. if(hi < 0xD800 || hi >= 0xDC00) return -1;
  72. if(lo < 0xDC00 || lo > 0xDFFF) return -1;
  73. return ((hi & 0x3FF) << 10) + (lo & 0x3FF) + 0x10000;
  74. }
  75. int
  76. utf8_to_binary(int c, unsigned char* buf)
  77. {
  78. if(c < 0x80) {
  79. buf[0] = (unsigned char) c;
  80. return 1;
  81. } else if(c < 0x800) {
  82. buf[0] = (unsigned char) 0xC0 + (c >> 6);
  83. buf[1] = (unsigned char) 0x80 + (c & 0x3F);
  84. return 2;
  85. } else if(c < 0x10000) {
  86. if(c < 0xD800 || (c > 0xDFFF && c < 0xFFFE)) {
  87. buf[0] = (unsigned char) 0xE0 + (c >> 12);
  88. buf[1] = (unsigned char) 0x80 + ((c >> 6) & 0x3F);
  89. buf[2] = (unsigned char) 0x80 + (c & 0x3F);
  90. return 3;
  91. } else {
  92. return -1;
  93. }
  94. } else if(c < 0x200000) {
  95. buf[0] = (unsigned char) 0xF0 + (c >> 18);
  96. buf[1] = (unsigned char) 0x80 + ((c >> 12) & 0x3F);
  97. buf[2] = (unsigned char) 0x80 + ((c >> 6) & 0x3F);
  98. buf[3] = (unsigned char) 0x80 + (c & 0x3F);
  99. return 4;
  100. } else if(c < 0x4000000) {
  101. buf[0] = (unsigned char) 0xF8 + (c >> 24);
  102. buf[1] = (unsigned char) 0x80 + ((c >> 18) & 0x3F);
  103. buf[2] = (unsigned char) 0x80 + ((c >> 12) & 0x3F);
  104. buf[3] = (unsigned char) 0x80 + ((c >> 6) & 0x3F);
  105. buf[4] = (unsigned char) 0x80 + (c & 0x3F);
  106. return 5;
  107. } else if(c < 0x80000000) {
  108. buf[0] = (unsigned char) 0xFC + (c >> 30);
  109. buf[1] = (unsigned char) 0x80 + ((c >> 24) & 0x3F);
  110. buf[2] = (unsigned char) 0x80 + ((c >> 18) & 0x3F);
  111. buf[3] = (unsigned char) 0x80 + ((c >> 12) & 0x3F);
  112. buf[4] = (unsigned char) 0x80 + ((c >> 6) & 0x3F);
  113. buf[5] = (unsigned char) 0x80 + (c & 0x3F);
  114. return 6;
  115. }
  116. return -1;
  117. }