ffi-hydrogen 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +30 -0
  5. data/.travis.yml +10 -0
  6. data/Gemfile +6 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +72 -0
  9. data/Rakefile +46 -0
  10. data/bench/both.rb +86 -0
  11. data/bench/encode.rb +57 -0
  12. data/bench/encrypt.rb +80 -0
  13. data/bench/init.rb +5 -0
  14. data/bin/console +14 -0
  15. data/bin/setup +8 -0
  16. data/ffi-hydrogen.gemspec +31 -0
  17. data/lib/ffi/hydrogen.rb +216 -0
  18. data/vendor/.clang-format +2 -0
  19. data/vendor/.gitignore +3 -0
  20. data/vendor/README.md +2 -0
  21. data/vendor/libhydrogen/.clang-format +95 -0
  22. data/vendor/libhydrogen/.gitignore +32 -0
  23. data/vendor/libhydrogen/.travis.yml +22 -0
  24. data/vendor/libhydrogen/LICENSE +18 -0
  25. data/vendor/libhydrogen/Makefile +61 -0
  26. data/vendor/libhydrogen/Makefile.arduino +51 -0
  27. data/vendor/libhydrogen/README.md +29 -0
  28. data/vendor/libhydrogen/hydrogen.c +18 -0
  29. data/vendor/libhydrogen/hydrogen.h +317 -0
  30. data/vendor/libhydrogen/impl/common.h +316 -0
  31. data/vendor/libhydrogen/impl/core.h +220 -0
  32. data/vendor/libhydrogen/impl/gimli-core/portable.h +39 -0
  33. data/vendor/libhydrogen/impl/gimli-core/sse2.h +97 -0
  34. data/vendor/libhydrogen/impl/gimli-core.h +25 -0
  35. data/vendor/libhydrogen/impl/hash.h +138 -0
  36. data/vendor/libhydrogen/impl/hydrogen_p.h +83 -0
  37. data/vendor/libhydrogen/impl/kdf.h +20 -0
  38. data/vendor/libhydrogen/impl/kx.h +441 -0
  39. data/vendor/libhydrogen/impl/pwhash.h +281 -0
  40. data/vendor/libhydrogen/impl/random.h +376 -0
  41. data/vendor/libhydrogen/impl/secretbox.h +236 -0
  42. data/vendor/libhydrogen/impl/sign.h +207 -0
  43. data/vendor/libhydrogen/impl/x25519.h +383 -0
  44. data/vendor/libhydrogen/library.properties +10 -0
  45. data/vendor/libhydrogen/logo.png +0 -0
  46. data/vendor/libhydrogen/tests/tests.c +431 -0
  47. data/vendor/main.c +140 -0
  48. data/vendor/stringencoders/.gitignore +25 -0
  49. data/vendor/stringencoders/.travis.yml +13 -0
  50. data/vendor/stringencoders/AUTHORS +1 -0
  51. data/vendor/stringencoders/COPYING +2 -0
  52. data/vendor/stringencoders/ChangeLog +170 -0
  53. data/vendor/stringencoders/Doxyfile +276 -0
  54. data/vendor/stringencoders/INSTALL +119 -0
  55. data/vendor/stringencoders/LICENSE +22 -0
  56. data/vendor/stringencoders/Makefile.am +3 -0
  57. data/vendor/stringencoders/NEWS +3 -0
  58. data/vendor/stringencoders/README +2 -0
  59. data/vendor/stringencoders/README.md +32 -0
  60. data/vendor/stringencoders/bootstrap.sh +3 -0
  61. data/vendor/stringencoders/configure-gcc-hardened.sh +16 -0
  62. data/vendor/stringencoders/configure.ac +44 -0
  63. data/vendor/stringencoders/doxy/footer.html +34 -0
  64. data/vendor/stringencoders/doxy/header.html +85 -0
  65. data/vendor/stringencoders/indent.sh +9 -0
  66. data/vendor/stringencoders/javascript/base64-speed.html +43 -0
  67. data/vendor/stringencoders/javascript/base64-test.html +209 -0
  68. data/vendor/stringencoders/javascript/base64.html +18 -0
  69. data/vendor/stringencoders/javascript/base64.js +176 -0
  70. data/vendor/stringencoders/javascript/qunit.css +119 -0
  71. data/vendor/stringencoders/javascript/qunit.js +1062 -0
  72. data/vendor/stringencoders/javascript/urlparse-test.html +367 -0
  73. data/vendor/stringencoders/javascript/urlparse.js +328 -0
  74. data/vendor/stringencoders/make-ci.sh +13 -0
  75. data/vendor/stringencoders/makerelease.sh +16 -0
  76. data/vendor/stringencoders/python/b85.py +176 -0
  77. data/vendor/stringencoders/src/Makefile.am +134 -0
  78. data/vendor/stringencoders/src/arraytoc.c +85 -0
  79. data/vendor/stringencoders/src/arraytoc.h +43 -0
  80. data/vendor/stringencoders/src/extern_c_begin.h +3 -0
  81. data/vendor/stringencoders/src/extern_c_end.h +3 -0
  82. data/vendor/stringencoders/src/html_named_entities_generator.py +203 -0
  83. data/vendor/stringencoders/src/modp_ascii.c +159 -0
  84. data/vendor/stringencoders/src/modp_ascii.h +162 -0
  85. data/vendor/stringencoders/src/modp_ascii_data.h +84 -0
  86. data/vendor/stringencoders/src/modp_ascii_gen.c +55 -0
  87. data/vendor/stringencoders/src/modp_b16.c +125 -0
  88. data/vendor/stringencoders/src/modp_b16.h +148 -0
  89. data/vendor/stringencoders/src/modp_b16_data.h +104 -0
  90. data/vendor/stringencoders/src/modp_b16_gen.c +65 -0
  91. data/vendor/stringencoders/src/modp_b2.c +69 -0
  92. data/vendor/stringencoders/src/modp_b2.h +130 -0
  93. data/vendor/stringencoders/src/modp_b2_data.h +44 -0
  94. data/vendor/stringencoders/src/modp_b2_gen.c +36 -0
  95. data/vendor/stringencoders/src/modp_b36.c +108 -0
  96. data/vendor/stringencoders/src/modp_b36.h +170 -0
  97. data/vendor/stringencoders/src/modp_b64.c +254 -0
  98. data/vendor/stringencoders/src/modp_b64.h +236 -0
  99. data/vendor/stringencoders/src/modp_b64_data.h +477 -0
  100. data/vendor/stringencoders/src/modp_b64_gen.c +168 -0
  101. data/vendor/stringencoders/src/modp_b64r.c +254 -0
  102. data/vendor/stringencoders/src/modp_b64r.h +242 -0
  103. data/vendor/stringencoders/src/modp_b64r_data.h +477 -0
  104. data/vendor/stringencoders/src/modp_b64w.c +254 -0
  105. data/vendor/stringencoders/src/modp_b64w.h +231 -0
  106. data/vendor/stringencoders/src/modp_b64w_data.h +477 -0
  107. data/vendor/stringencoders/src/modp_b85.c +109 -0
  108. data/vendor/stringencoders/src/modp_b85.h +171 -0
  109. data/vendor/stringencoders/src/modp_b85_data.h +36 -0
  110. data/vendor/stringencoders/src/modp_b85_gen.c +65 -0
  111. data/vendor/stringencoders/src/modp_bjavascript.c +65 -0
  112. data/vendor/stringencoders/src/modp_bjavascript.h +105 -0
  113. data/vendor/stringencoders/src/modp_bjavascript_data.h +84 -0
  114. data/vendor/stringencoders/src/modp_bjavascript_gen.c +58 -0
  115. data/vendor/stringencoders/src/modp_burl.c +228 -0
  116. data/vendor/stringencoders/src/modp_burl.h +259 -0
  117. data/vendor/stringencoders/src/modp_burl_data.h +136 -0
  118. data/vendor/stringencoders/src/modp_burl_gen.c +121 -0
  119. data/vendor/stringencoders/src/modp_html.c +128 -0
  120. data/vendor/stringencoders/src/modp_html.h +53 -0
  121. data/vendor/stringencoders/src/modp_html_named_entities.h +9910 -0
  122. data/vendor/stringencoders/src/modp_json.c +315 -0
  123. data/vendor/stringencoders/src/modp_json.h +103 -0
  124. data/vendor/stringencoders/src/modp_json_data.h +57 -0
  125. data/vendor/stringencoders/src/modp_json_gen.py +60 -0
  126. data/vendor/stringencoders/src/modp_mainpage.h +120 -0
  127. data/vendor/stringencoders/src/modp_numtoa.c +350 -0
  128. data/vendor/stringencoders/src/modp_numtoa.h +100 -0
  129. data/vendor/stringencoders/src/modp_qsiter.c +76 -0
  130. data/vendor/stringencoders/src/modp_qsiter.h +71 -0
  131. data/vendor/stringencoders/src/modp_stdint.h +43 -0
  132. data/vendor/stringencoders/src/modp_utf8.c +88 -0
  133. data/vendor/stringencoders/src/modp_utf8.h +38 -0
  134. data/vendor/stringencoders/src/modp_xml.c +311 -0
  135. data/vendor/stringencoders/src/modp_xml.h +166 -0
  136. data/vendor/stringencoders/src/stringencoders.pc +10 -0
  137. data/vendor/stringencoders/src/stringencoders.pc.in +10 -0
  138. data/vendor/stringencoders/test/Makefile.am +113 -0
  139. data/vendor/stringencoders/test/apr_base64.c +262 -0
  140. data/vendor/stringencoders/test/apr_base64.h +120 -0
  141. data/vendor/stringencoders/test/cxx_test.cc +482 -0
  142. data/vendor/stringencoders/test/minunit.h +82 -0
  143. data/vendor/stringencoders/test/modp_ascii_test.c +281 -0
  144. data/vendor/stringencoders/test/modp_b16_test.c +288 -0
  145. data/vendor/stringencoders/test/modp_b2_test.c +250 -0
  146. data/vendor/stringencoders/test/modp_b64_test.c +266 -0
  147. data/vendor/stringencoders/test/modp_b85_test.c +130 -0
  148. data/vendor/stringencoders/test/modp_bjavascript_test.c +137 -0
  149. data/vendor/stringencoders/test/modp_burl_test.c +423 -0
  150. data/vendor/stringencoders/test/modp_html_test.c +296 -0
  151. data/vendor/stringencoders/test/modp_json_test.c +336 -0
  152. data/vendor/stringencoders/test/modp_numtoa_test.c +545 -0
  153. data/vendor/stringencoders/test/modp_qsiter_test.c +280 -0
  154. data/vendor/stringencoders/test/modp_utf8_test.c +188 -0
  155. data/vendor/stringencoders/test/modp_xml_test.c +339 -0
  156. data/vendor/stringencoders/test/speedtest.c +241 -0
  157. data/vendor/stringencoders/test/speedtest_ascii.c +345 -0
  158. data/vendor/stringencoders/test/speedtest_msg.c +78 -0
  159. data/vendor/stringencoders/test/speedtest_numtoa.c +276 -0
  160. metadata +314 -0
@@ -0,0 +1,88 @@
1
+ #include <stdio.h>
2
+ /**
3
+ * \file modp_utf8.c
4
+ * <PRE>
5
+ * MODP_UTF8 - UTF8 string utilities
6
+ * https://github.com/client9/stringencoders/
7
+ *
8
+ * Copyright 2013-2016 Nick Galbreath -- nickg [at] client9 [dot] com
9
+ * All rights reserved.
10
+ * Released under MIT license. See LICENSE for details.
11
+ * </PRE>
12
+ */
13
+
14
+ #include "config.h"
15
+ #include "modp_utf8.h"
16
+ #include <string.h>
17
+
18
+ int modp_utf8_validate(const char* src_orig, size_t len)
19
+ {
20
+ const uint8_t* src = (const uint8_t*)src_orig;
21
+ const uint8_t* srcend = src + len;
22
+ uint8_t c, c1, c2, c3;
23
+ int d;
24
+ while (src < srcend) {
25
+ c = *src;
26
+ if (c < 0x80) {
27
+ src += 1;
28
+ } else if (c < 0xE0) {
29
+ /* c starts with 110 */
30
+ if (srcend - src < 2) {
31
+ return MODP_UTF8_SHORT;
32
+ }
33
+ c1 = *(src + 1);
34
+ if ((c1 & 0xC0) != 0x80) {
35
+ return MODP_UTF8_INVALID;
36
+ }
37
+ d = ((c & 0x1F) << 6) | (c1 & 0x3F);
38
+ if (d < 0x80) {
39
+ return MODP_UTF8_OVERLONG;
40
+ }
41
+ src += 2;
42
+ } else if (c < 0xF0) {
43
+ if (srcend - src < 3) {
44
+ return MODP_UTF8_SHORT;
45
+ }
46
+ c1 = *(src + 1);
47
+ c2 = *(src + 2);
48
+ if ((c1 & 0xC0) != 0x80) {
49
+ return MODP_UTF8_INVALID;
50
+ }
51
+ if ((c2 & 0xC0) != 0x80) {
52
+ return MODP_UTF8_INVALID;
53
+ }
54
+ d = ((c & 0x0F) << 12) | ((c1 & 0x3F) << 6) | (c2 & 0x3F);
55
+ if (d < 0x0800) {
56
+ return MODP_UTF8_OVERLONG;
57
+ }
58
+ if (d >= 0xD800 && d <= 0xDFFF) {
59
+ return MODP_UTF8_CODEPOINT;
60
+ }
61
+ src += 3;
62
+ } else if (c < 0xF8) {
63
+ if (srcend - src < 4) {
64
+ return MODP_UTF8_SHORT;
65
+ }
66
+ c1 = *(src + 1);
67
+ c2 = *(src + 2);
68
+ c3 = *(src + 3);
69
+ if ((c1 & 0xC0) != 0x80) {
70
+ return MODP_UTF8_INVALID;
71
+ }
72
+ if ((c2 & 0xC0) != 0x80) {
73
+ return MODP_UTF8_INVALID;
74
+ }
75
+ if ((c3 & 0xC0) != 0x80) {
76
+ return MODP_UTF8_INVALID;
77
+ }
78
+ d = ((c & 0x07) << 18) | ((c1 & 0x3F) << 12) | ((c2 & 0x3F) < 6) | (c3 & 0x3F);
79
+ if (d < 0x010000) {
80
+ return MODP_UTF8_OVERLONG;
81
+ }
82
+ src += 4;
83
+ } else {
84
+ return MODP_UTF8_CODEPOINT;
85
+ }
86
+ }
87
+ return MODP_UTF8_OK;
88
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * \file modp_utf.h
3
+ * \brief Various UTF8 utilities
4
+ *
5
+ */
6
+
7
+ /*
8
+ * <PRE>
9
+ * MODP_UTF8 -- UTF-8 utilities
10
+ * https://github.com/client9/stringencoders
11
+ *
12
+ * Copyright &copy; 2013-2016, Nick Galbreath
13
+ * All rights reserved.
14
+ *
15
+ * Released under MIT license. See LICENSE for details.
16
+ * </PRE>
17
+ *
18
+ */
19
+
20
+ #ifndef COM_MODP_UTF8
21
+ #define COM_MODP_UTF8
22
+
23
+ #include "extern_c_begin.h"
24
+ #include "modp_stdint.h"
25
+
26
+ #define MODP_UTF8_OK 0
27
+ #define MODP_UTF8_SHORT 1
28
+ #define MODP_UTF8_INVALID 2
29
+ #define MODP_UTF8_OVERLONG 3
30
+ #define MODP_UTF8_CODEPOINT 4
31
+ /**
32
+ * Validate a UTF-8 string.
33
+ * checks for blah blah blah
34
+ */
35
+ int modp_utf8_validate(const char* src, size_t len);
36
+
37
+ #include "extern_c_end.h"
38
+ #endif /* ifndef modp_utf8 */
@@ -0,0 +1,311 @@
1
+ /*
2
+ * <pre>
3
+ * modp_xml xml decoders
4
+ * https://github.com/client9/stringencoders
5
+ *
6
+ * Copyright &copy; 2012-2016 Nick Galbreath
7
+ * All rights reserved.
8
+ * Released under MIT license. See LICENSE for details.
9
+ * </pre>
10
+ */
11
+ #include "modp_xml.h"
12
+
13
+ static const int gsHexDecodeMap[256] = {
14
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
15
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
16
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
17
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
18
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 256, 256,
19
+ 256, 256, 256, 256, 256, 10, 11, 12, 13, 14, 15, 256,
20
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
21
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
22
+ 256, 10, 11, 12, 13, 14, 15, 256, 256, 256, 256, 256,
23
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
24
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
25
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
26
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
27
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
28
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
29
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
30
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
31
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
32
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
33
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
34
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
35
+ 256, 256, 256, 256
36
+ };
37
+
38
+ size_t modp_xml_unicode_char_to_utf8(char* dest, int uval)
39
+ {
40
+ if (uval <= 0x7F) {
41
+ dest[0] = (char)uval;
42
+ return 1;
43
+ }
44
+ if (uval <= 0x7FF) {
45
+ dest[0] = (char)((uval >> 6) + 0xC0);
46
+ dest[1] = (char)((uval & 63) + 0x80);
47
+ return 2;
48
+ }
49
+ if (uval <= 0xFFFF) {
50
+ dest[0] = (char)((uval >> 12) + 224);
51
+ dest[1] = (char)(((uval >> 6) & 63) + 128);
52
+ dest[2] = (char)((uval & 63) + 128);
53
+ return 3;
54
+ }
55
+ if (uval <= 0x1FFFFF) {
56
+ dest[0] = (char)((uval >> 18) + 240);
57
+ dest[1] = (char)(((uval >> 12) & 63) + 128);
58
+ dest[2] = (char)(((uval >> 6) & 63) + 128);
59
+ dest[3] = (char)((uval & 63) + 128);
60
+ return 4;
61
+ }
62
+ return 0;
63
+ }
64
+
65
+ /**
66
+ * Returns -1 if unicode code point is invalid for HTML (undefined or a
67
+ * non-whitespace control char).
68
+ *
69
+ * Exposed for testing
70
+ *
71
+ * http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#character-references
72
+ * Retrieved 20120811:
73
+
74
+ * The numeric character reference forms described above are allowed
75
+ * to reference any Unicode code point other than U+0000, U+000D,
76
+ * permanently undefined Unicode characters (noncharacters), and
77
+ * control characters other than space characters.
78
+ */
79
+ int modp_xml_validate_unicode(int val)
80
+ {
81
+ static const int ranges[] = {
82
+ 0x0000, 0x0008, /* control characters */
83
+ 0x000B, 0x000B, /* Vertical Tab is forbidden, ?? */
84
+ 0x000E, 0x001F, /* control characters */
85
+ 0x0080, 0x009F, /* control characters */
86
+ 0x0750, 0x077D, /* the rest are undefined */
87
+ 0x07C0, 0x08FF,
88
+ 0x1380, 0x139F,
89
+ 0x18B0, 0x18FF,
90
+ 0x1980, 0x19DF,
91
+ 0x1A00, 0x1CFF,
92
+ 0x1D80, 0x1DFF,
93
+ 0x2C00, 0x2E7F,
94
+ 0x2FE0, 0x2FEF,
95
+ 0x31C0, 0x31EF,
96
+ 0x9FB0, 0x9FFF,
97
+ 0xA4D0, 0xABFF,
98
+ 0xD7B0, 0xD7FF,
99
+ 0xFE10, 0xFE1F,
100
+ 0x10140, 0x102FF,
101
+ 0x104B0, 0x107FF,
102
+ 0x1D200, 0x1D2FF,
103
+ 0x1D360, 0x1D3FF,
104
+ 0x1D800, 0x1FFFF,
105
+ 0x2A6E0, 0x2F7FF,
106
+ 0x2FAB0, 0xDFFFF,
107
+ 0xE0080, 0xE00FF,
108
+ 0xE01F0, 0xEFFFF,
109
+ 0xFFFFE, 0xFFFFF
110
+ };
111
+
112
+ static const int imax = sizeof(ranges) / sizeof(uint32_t);
113
+
114
+ int i;
115
+ for (i = 0; i < imax; i += 2) {
116
+ if (val >= ranges[i]) {
117
+ if (val <= ranges[i + 1]) {
118
+ return -1;
119
+ }
120
+ } else {
121
+ return val;
122
+ }
123
+ }
124
+ return -1;
125
+ }
126
+
127
+ /**
128
+ * Exposed for testing
129
+ */
130
+
131
+ int modp_xml_parse_dec_entity(const char* s, size_t len)
132
+ {
133
+ int val = 0;
134
+ size_t i;
135
+ for (i = 0; i < len; ++i) {
136
+ int d = gsHexDecodeMap[(uint32_t)s[i]];
137
+ if (d > 9) {
138
+ return -1;
139
+ }
140
+ val = (val * 10) + d;
141
+ if (val > 0x1000FF) {
142
+ return -1;
143
+ }
144
+ }
145
+ return modp_xml_validate_unicode(val);
146
+ }
147
+
148
+ /**
149
+ * parses
150
+ * Exposed for testing
151
+ */
152
+ int modp_xml_parse_hex_entity(const char* s, size_t len)
153
+ {
154
+ int val = 0;
155
+ size_t i;
156
+ for (i = 0; i < len; ++i) {
157
+ int d = gsHexDecodeMap[(uint32_t)s[i]];
158
+ if (d == 256) {
159
+ return -1;
160
+ }
161
+ val = (val * 16) + d;
162
+ if (val > 0x1000FF) {
163
+ return -1;
164
+ }
165
+ }
166
+ return modp_xml_validate_unicode(val);
167
+ }
168
+
169
+ size_t modp_xml_decode(char* dest, const char* s, size_t len)
170
+ {
171
+ const uint8_t* src = (const uint8_t*)s;
172
+ const char* deststart = dest;
173
+ const uint8_t* srcend = (const uint8_t*)(src + len);
174
+ int unichar;
175
+
176
+ while (src < srcend) {
177
+ if (*src != '&') {
178
+ *dest++ = (char)*src++;
179
+ continue;
180
+ }
181
+
182
+ const uint8_t* pos = (const uint8_t*)memchr(src + 1, ';',
183
+ (size_t)(srcend - src - 1));
184
+ if (pos == NULL) {
185
+ /* if not found, just copy */
186
+ *dest++ = (char)*src++;
187
+ continue;
188
+ }
189
+ size_t elen = (size_t)(pos - src);
190
+ if (*(src + 1) == '#') {
191
+ if (*(src + 2) == 'x' || *(src + 2) == 'X') {
192
+ unichar = modp_xml_parse_hex_entity((const char*)(src + 3), elen - 3);
193
+ } else {
194
+
195
+ unichar = modp_xml_parse_dec_entity((const char*)(src + 2), elen - 2);
196
+ }
197
+ if (unichar == 0) {
198
+ *dest++ = (char)*src++;
199
+ } else {
200
+ dest += modp_xml_unicode_char_to_utf8(dest, unichar);
201
+ src = pos + 1;
202
+ }
203
+ } else if (elen == 5 && src[1] == 'q' && src[2] == 'u' && src[3] == 'o' && src[4] == 't') {
204
+ *dest++ = '"';
205
+ src = pos + 1;
206
+ } else if (elen == 5 && src[1] == 'a' && src[2] == 'p' && src[3] == 'o' && src[4] == 's') {
207
+ *dest++ = '\'';
208
+ src = pos + 1;
209
+ } else if (elen == 4 && src[1] == 'a' && src[2] == 'm' && src[3] == 'p') {
210
+ *dest++ = '&';
211
+ src = pos + 1;
212
+ } else if (elen == 3 && src[1] == 'l' && src[2] == 't') {
213
+ *dest++ = '<';
214
+ src = pos + 1;
215
+ } else if (elen == 3 && src[1] == 'g' && src[2] == 't') {
216
+ *dest++ = '>';
217
+ src = pos + 1;
218
+ } else {
219
+ /* if not found, just copy */
220
+ *dest++ = (char)*src++;
221
+ }
222
+ }
223
+
224
+ *dest = '\0';
225
+ return (size_t)(dest - deststart); /* compute "strlen" of dest. */
226
+ }
227
+
228
+ size_t modp_xml_encode(char* dest, const char* src, size_t len)
229
+ {
230
+ size_t count = 0;
231
+ const char* srcend = src + len;
232
+ char ch;
233
+ while (src < srcend) {
234
+ ch = *src++;
235
+ switch (ch) {
236
+ case '&':
237
+ *dest++ = '&';
238
+ *dest++ = 'a';
239
+ *dest++ = 'm';
240
+ *dest++ = 'p';
241
+ *dest++ = ';';
242
+ count += 5; /* &amp; */
243
+ break;
244
+ case '<':
245
+ *dest++ = '&';
246
+ *dest++ = 'l';
247
+ *dest++ = 't';
248
+ *dest++ = ';';
249
+ count += 4; /* &lt; */
250
+ break;
251
+ case '>':
252
+ *dest++ = '&';
253
+ *dest++ = 'g';
254
+ *dest++ = 't';
255
+ *dest++ = ';';
256
+ count += 4; /* &gt; */
257
+ break;
258
+ case '\'':
259
+ *dest++ = '&';
260
+ *dest++ = 'q';
261
+ *dest++ = 'u';
262
+ *dest++ = 'o';
263
+ *dest++ = 't';
264
+ *dest++ = ';';
265
+ count += 6; /* &quot; */
266
+ break;
267
+ case '\"':
268
+ *dest++ = '&';
269
+ *dest++ = 'a';
270
+ *dest++ = 'p';
271
+ *dest++ = 'o';
272
+ *dest++ = 's';
273
+ *dest++ = ';';
274
+ count += 6; /* &apos; */
275
+ break;
276
+ default:
277
+ *dest++ = ch;
278
+ count += 1;
279
+ }
280
+ }
281
+ *dest = '\0';
282
+ return count;
283
+ }
284
+
285
+ size_t modp_xml_min_encode_strlen(const char* src, const size_t len)
286
+ {
287
+ size_t count = 0;
288
+ const char* srcend = src + len;
289
+ while (src < srcend) {
290
+ switch (*src++) {
291
+ case '&':
292
+ count += 5; /* &amp; */
293
+ break;
294
+ case '<':
295
+ count += 4; /* &lt; */
296
+ break;
297
+ case '>':
298
+ count += 4; /* &gt; */
299
+ break;
300
+ case '\'':
301
+ count += 6; /* &quot; */
302
+ break;
303
+ case '\"':
304
+ count += 6; /* &apos; */
305
+ break;
306
+ default:
307
+ count += 1;
308
+ }
309
+ }
310
+ return count;
311
+ }
@@ -0,0 +1,166 @@
1
+ /**
2
+ * \file modp_xml.h
3
+ * \brief Experimental XML/HTML decoder
4
+ *
5
+ * This is mostly experimental.
6
+ */
7
+
8
+ /*
9
+ * <PRE>
10
+ * High Performance XML Decoder (for now)
11
+ *
12
+ * Copyright &copy; 2012-2016 Nick Galbreath
13
+ * All rights reserved.
14
+ *
15
+ * Released under MIT license. See LICENSE fro details.
16
+ *
17
+ * https://github.com/client9/stringencoders
18
+ *
19
+ * </PRE>
20
+ */
21
+
22
+ #ifndef COM_MODP_STRINGENCODERS_XML
23
+ #define COM_MODP_STRINGENCODERS_XML
24
+
25
+ #include "modp_stdint.h"
26
+
27
+ #ifdef __cplusplus
28
+ #define BEGIN_C extern "C" {
29
+ #define END_C }
30
+ #else
31
+ #define BEGIN_C
32
+ #define END_C
33
+ #endif
34
+
35
+ BEGIN_C
36
+
37
+ /**
38
+ * \brief Validates a unicode code point is valid for HTML (undefined
39
+ * or non-white-space control char)
40
+ *
41
+ * \param[in] val a unicode char expressed as a uint32_t
42
+ * \return 0 if invalid, else returns passes back the input value.
43
+ *
44
+ * See http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#character-references for more details
45
+ *
46
+ * This is only exposed for testing. It is not designed for public use.
47
+ */
48
+ int modp_xml_validate_unicode(int val);
49
+
50
+ /**
51
+ * \brief converts a unicode char expressed as uint32_t into a UTF-8 byte sequence.
52
+ * \param[out] dest assumed to have at least 4 chars available in buffer.
53
+ * \param[in] uval A unicode character expressed as a uint32_t type
54
+ * \return 0 if input value is invalid or not a unicode character, else
55
+ * returns number of bytes written to dest.
56
+ *
57
+ * This is only exposed for testing. It is not designed for public use.
58
+ */
59
+ size_t modp_xml_unicode_char_to_utf8(char* dest, int uval);
60
+
61
+ /**
62
+ * \brief parse a hex encoded entity between "&#x" and ";"
63
+ * \param[in] s a buffer pointing at the first char after "&$x"
64
+ * \param[in] len the length of string between "&#x" and ";"
65
+ * \return -1 if invalid, otherwise the unicode character value
66
+ *
67
+ * This is only exposed for testing. It is not designed for public use.
68
+ */
69
+ int modp_xml_parse_hex_entity(const char* s, size_t len);
70
+
71
+ /**
72
+ * \brief parse a numerical decimal XML entity, eg. &x39;
73
+ *
74
+ * \param[in] s the buffer pointing to first char after '&#'.
75
+ * \param[in] len the length between '&#' and ';'. It is expected
76
+ * that all chars between are to be decimal digits.
77
+ * \return -1 if invalid, else the unicode numeric value
78
+ *
79
+ * Exposed for testing. Not designed to be useful for public consumption.
80
+ */
81
+ int modp_xml_parse_dec_entity(const char* s, size_t len);
82
+
83
+ /**
84
+ * \brief XML decode a string
85
+ * \param[out] dest output string. Must
86
+ * \param[in] str The input string
87
+ * \param[in] len The length of the input string, excluding any
88
+ * final null byte.
89
+ * \return the final size of the output, excluding any ending null byte.
90
+ *
91
+ * Decode numerical entities (decimal or hexadecimal), and following named
92
+ * entities:
93
+ * * &apos;
94
+ * * &quot;
95
+ * * &amp;
96
+ * * &lt;
97
+ * * &gt;
98
+ *
99
+ */
100
+ size_t modp_xml_decode(char* dest, const char* str, size_t len);
101
+
102
+ /**
103
+ * \brief XML encode a UTF-8 string
104
+ * \param[out] dest output string.
105
+ * \param[in] str The input string
106
+ * \param[in] len The length of the input string, excluding any
107
+ * final null byte.
108
+ * \return the final size of the output, excluding any ending null byte.
109
+ * Encodes an assumed valid UTF-8 input and escapes
110
+ * * &apos;
111
+ * * &quot;
112
+ * * &amp;
113
+ * * &lt;
114
+ * * &gt;
115
+ */
116
+ size_t modp_xml_encode(char* dest, const char* str, size_t len);
117
+
118
+ size_t modp_xml_min_encode_strlen(const char* str, size_t len);
119
+
120
+ END_C
121
+
122
+ #ifdef __cplusplus
123
+ #include <cstring>
124
+ #include <string>
125
+
126
+ namespace modp {
127
+
128
+ /**
129
+ * Url decode a string.
130
+ * This function does not allocate memory.
131
+ *
132
+ * \param[in,out] s the string to be decoded
133
+ * \return a reference to the input string.
134
+ * There is no error case, bad characters are passed through
135
+ */
136
+ inline std::string& xml_decode(std::string& s)
137
+ {
138
+ size_t d = modp_xml_decode(const_cast<char*>(s.data()), s.data(), s.size());
139
+ s.erase(d, std::string::npos);
140
+ return s;
141
+ }
142
+
143
+ inline std::string xml_decode(const char* str)
144
+ {
145
+ std::string s(str);
146
+ xml_decode(s);
147
+ return s;
148
+ }
149
+
150
+ inline std::string xml_decode(const char* str, size_t len)
151
+ {
152
+ std::string s(str, len);
153
+ xml_decode(s);
154
+ return s;
155
+ }
156
+
157
+ inline std::string xml_decode(const std::string& s)
158
+ {
159
+ std::string x(s);
160
+ xml_decode(x);
161
+ return x;
162
+ }
163
+ }
164
+ #endif
165
+
166
+ #endif
@@ -0,0 +1,10 @@
1
+ prefix=/usr/local
2
+ exec_prefix=${prefix}
3
+ libdir=${exec_prefix}/lib
4
+ includedir=${prefix}/include
5
+
6
+ Name: stringencoders
7
+ Description: collection of high performance c-string transformations
8
+ Version: v3.10.3
9
+ Libs: -L${libdir} -lmodpbase64
10
+ Cflags: -I${includedir}
@@ -0,0 +1,10 @@
1
+ prefix=@prefix@
2
+ exec_prefix=@exec_prefix@
3
+ libdir=@libdir@
4
+ includedir=@includedir@
5
+
6
+ Name: stringencoders
7
+ Description: collection of high performance c-string transformations
8
+ Version: @PACKAGE_VERSION@
9
+ Libs: -L${libdir} -lmodpbase64
10
+ Cflags: -I${includedir}