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,13 @@
1
+ #!/bin/bash
2
+ set -x
3
+ set -e
4
+
5
+ INDENT=clang-format-3.8 ./indent.sh
6
+ git status --porcelain | wc -l
7
+
8
+ autoreconf --install --force
9
+ automake --add-missing >/dev/null 2>&1
10
+ ./configure
11
+ make
12
+ make check
13
+
@@ -0,0 +1,16 @@
1
+ #!/bin/sh
2
+
3
+ FILE=stringencoders-v3.11.0
4
+ rm -rf ${FILE}
5
+ git clone --depth=1 git@github.com:client9/stringencoders.git ${FILE}
6
+ (cd ${FILE} && ./bootstrap.sh)
7
+ find $FILE -name ".git" | xargs rm -rf
8
+
9
+ rm -f ${FILE}/Doxyfile
10
+ rm -f ${FILE}/makerelease.sh
11
+ rm -rf ${FILE}/doxy
12
+
13
+ tar -czvf ${FILE}.tar.gz ${FILE}
14
+ rm -rf ${FILE}
15
+ echo "DONE"
16
+ ls -lh ${FILE}.tar.gz
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env python
2
+
3
+ #
4
+ # This is the MIT License
5
+ # http://www.opensource.org/licenses/mit-license.php
6
+ #
7
+ # Copyright (c) 2008 Nick Galbreath
8
+ #
9
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ # of this software and associated documentation files (the "Software"), to deal
11
+ # in the Software without restriction, including without limitation the rights
12
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ # copies of the Software, and to permit persons to whom the Software is
14
+ # furnished to do so, subject to the following conditions:
15
+ #
16
+ # The above copyright notice and this permission notice shall be included in
17
+ # all copies or substantial portions of the Software.
18
+ #
19
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25
+ # THE SOFTWARE.
26
+ #
27
+
28
+ gsCharToInt = [
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, 0, 256, 1,
32
+ 2, 3, 256, 4, 5, 6, 7, 8, 256, 9, 10, 11,
33
+ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 256,
34
+ 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
35
+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
36
+ 47, 48, 49, 50, 51, 52, 53, 54, 256, 55, 56, 57,
37
+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
38
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
39
+ 82, 83, 84, 256, 256, 256, 256, 256, 256, 256, 256, 256,
40
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
41
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
42
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
43
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
44
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
45
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
46
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
47
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
48
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
49
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
50
+ 256, 256, 256, 256]
51
+
52
+ gsIntToChar = [
53
+ '!', '#', '$', '%', '\'', '(', ')', '*', '+', '-',
54
+ '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
55
+ '8', '9', ':', '<', '=', '>', '?', '@', 'A', 'B',
56
+ 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
57
+ 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
58
+ 'W', 'X', 'Y', 'Z', '[', ']', '^', '_', '`', 'a',
59
+ 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
60
+ 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
61
+ 'v', 'w', 'x', 'y', 'z'
62
+ ]
63
+
64
+ from struct import unpack, pack
65
+ # covert 4 characters into 5
66
+ def b85_encode(s):
67
+ parts = []
68
+ numchunks = len(s) // 4
69
+ format = '!' + str(numchunks) + 'I'
70
+ for x in unpack(format, s):
71
+ # network order (big endian), 32-bit unsigned integer
72
+ # note: x86 is little endian
73
+ parts.append(gsIntToChar[x // 52200625])
74
+ parts.append(gsIntToChar[(x // 614125) % 85])
75
+ parts.append(gsIntToChar[(x // 7225) % 85])
76
+ parts.append(gsIntToChar[(x // 85) % 85])
77
+ parts.append(gsIntToChar[x % 85])
78
+ return ''.join(parts)
79
+
80
+ #
81
+ # also does not use the 'struct' module which may be desirable
82
+ # to some
83
+ #
84
+ def b85_encode2(s):
85
+ parts = []
86
+ for i in xrange(0,len(s), 4):
87
+ chunk = s[i:i+4]
88
+ x = ord(chunk[3]) + 256*(ord(chunk[2]) + 256*(ord(chunk[1]) + 256*ord(chunk[0])))
89
+
90
+ # network order (big endian), 32-bit unsigned integer
91
+ # note: x86 is little endian
92
+ parts.append(gsIntToChar[x // 52200625])
93
+ parts.append(gsIntToChar[(x // 614125) % 85])
94
+ parts.append(gsIntToChar[(x // 7225) % 85])
95
+ parts.append(gsIntToChar[(x // 85) % 85])
96
+ parts.append(gsIntToChar[x % 85])
97
+ return ''.join(parts)
98
+
99
+ # convert 5 characters to 4
100
+ def b85_decode(s):
101
+ parts = []
102
+ for i in xrange(0, len(s), 5):
103
+ bsum = 0;
104
+ for j in xrange(0,5):
105
+ val = gsCharToInt[ord(s[i+j])]
106
+ bsum = 85*bsum + val
107
+ tmp = pack('!I', bsum)
108
+ parts.append(tmp)
109
+ #parts += tmp
110
+ #parts += unpack('cccc', tmp)
111
+ return ''.join(parts)
112
+
113
+ # convert 5 characters to 4
114
+ def b85_decode2(s):
115
+ parts = []
116
+ for i in xrange(0, len(s), 5):
117
+ bsum = 0;
118
+ for j in xrange(0,5):
119
+ val = gsCharToInt[ord(s[i+j])]
120
+ bsum = 85*bsum + val
121
+ parts.append(chr((bsum >> 24) & 0xff))
122
+ parts.append(chr((bsum >> 16) & 0xff))
123
+ parts.append(chr((bsum >> 8) & 0xff))
124
+ parts.append(chr(bsum & 0xff))
125
+
126
+ return ''.join(parts)
127
+
128
+ import unittest
129
+ class B85Test(unittest.TestCase):
130
+
131
+ def testDecode1(self):
132
+ s = b85_decode('!!!!#')
133
+ self.assertEquals(4, len(s))
134
+ self.assertEquals(0, ord(s[0]))
135
+ self.assertEquals(0, ord(s[1]))
136
+ self.assertEquals(0, ord(s[2]))
137
+ self.assertEquals(1, ord(s[3]))
138
+
139
+ e = b85_encode(s)
140
+ self.assertEquals('!!!!#', e)
141
+
142
+
143
+ if __name__ == '__main__':
144
+ from time import clock
145
+ #unittest.main()
146
+
147
+ s = '!!!!#' * 10
148
+
149
+ t0 = clock()
150
+ for i in xrange(1000000):
151
+ b85_decode(s)
152
+ t1 = clock()
153
+ print "decode v1", t1-t0
154
+
155
+ t0 = clock()
156
+ for i in xrange(1000000):
157
+ b85_decode2(s)
158
+ t1 = clock()
159
+ print "decode v2", t1-t0
160
+
161
+
162
+ s = b85_decode('!!!!#' * 10)
163
+
164
+ t0 = clock()
165
+ for i in xrange(1000000):
166
+ b85_encode(s)
167
+ t1 = clock()
168
+ print "encode v1", t1-t0
169
+
170
+ t0 = clock()
171
+ for i in xrange(1000000):
172
+ b85_encode2(s)
173
+ t1 = clock()
174
+ print "encode v2", t1-t0
175
+
176
+
@@ -0,0 +1,134 @@
1
+
2
+ include_HEADERS = \
3
+ extern_c_begin.h extern_c_end.h \
4
+ modp_b16.h modp_b64.h modp_b64w.h modp_b64r.h \
5
+ modp_b85.h modp_burl.h modp_bjavascript.h \
6
+ modp_numtoa.h modp_ascii.h modp_b2.h \
7
+ modp_qsiter.h modp_xml.h modp_html.h modp_json.h
8
+
9
+ lib_LTLIBRARIES = libmodpbase64.la
10
+ libmodpbase64_la_SOURCES = \
11
+ modp_b2.c modp_b2.h modp_b2_data.h \
12
+ modp_b16.c modp_b16.h modp_b16_data.h \
13
+ modp_b64.c modp_b64.h modp_b64_data.h \
14
+ modp_b64w.c modp_b64w.h modp_b64w_data.h \
15
+ modp_b64r.c modp_b64r.h modp_b64r_data.h \
16
+ modp_b85.h modp_b85.c modp_b85_data.h \
17
+ modp_burl.h modp_burl.c modp_burl_data.h \
18
+ modp_bjavascript.h modp_bjavascript.c modp_bjavascript_data.h \
19
+ modp_numtoa.h modp_numtoa.c \
20
+ modp_qsiter.h modp_qsiter.c \
21
+ modp_xml.h modp_xml.c \
22
+ modp_ascii.h modp_ascii.c modp_ascii_data.h \
23
+ modp_utf8.h modp_utf8.c \
24
+ modp_html.h modp_html.c \
25
+ modp_json.h modp_json.c
26
+
27
+ pkgconfigdir = $(libdir)/pkgconfig
28
+ pkgconfig_DATA = stringencoders.pc
29
+
30
+ #libmodpbase64_la_DEPENDENCIES = \
31
+ # modp_b2_data.h modp_b2_gen \
32
+ # modp_b16_data.h modp_b16_gen \
33
+ # modp_b64_data.h modp_b64w_data.h modp_b64r_data.h modp_b64_gen \
34
+ # modp_b85_data.h modp_b85_gen \
35
+ # modp_ascii_data.h modp_ascii_gen
36
+
37
+ CLEANFILES = *.log \
38
+ *~ src/*~ test/*~ \
39
+ *.tmp src/*.tmp test/*.tmp \
40
+ doxy/html/* \
41
+ doxy/*.tmp \
42
+ m4 \
43
+ *.loT \
44
+ *.ll *.ll.out \
45
+ *.gcda *.gcno *.gcov stringencoders.info \
46
+ modp_b16_data.h modp_b64_data.h modp_b85_data.h \
47
+ modp_b64w_data.h modp_b64w.c test/modp_b64w_test.c \
48
+ modp_b64r_data.h modp_b64r.c test/modp_b64r_test.c \
49
+ modp_ascii_data.h modp_b2_data.h \
50
+ modp_xml_test modp_qsiter_test modp_html_test modp_json_test \
51
+ cxx_test
52
+
53
+ modp_b2.c: modp_b2.h modp_b2_data.h
54
+
55
+ modp_b16.c: modp_b16.h modp_b16_data.h
56
+
57
+ modp_b64.c: modp_b64.h modp_b64_data.h
58
+
59
+ modp_b64r.c: modp_b64.c modp_b64r.h modp_b64r_data.h
60
+ perl -p -i -e 's/b64/b64r/g' < modp_b64.c > modp_b64r.c
61
+
62
+ modp_b64w.c: modp_b64.c modp_b64w.h modp_b64w_data.h
63
+ perl -p -i -e 's/b64/b64w/g' < modp_b64.c > modp_b64w.c
64
+
65
+ modp_b85.c: modp_b85.h modp_b85_data.h
66
+
67
+ modp_burl.c: modp_burl.h modp_burl_data.h
68
+
69
+ modp_bjavascript.c: modp_bjavascript.h modp_bjavascript_data.h
70
+
71
+ modp_json.c: modp_json.h modp_json_data.h
72
+
73
+ modp_ascii.c: modp_ascii.h modp_ascii_data.h
74
+
75
+ modp_qsiter.c: modp_qsiter.h
76
+
77
+ modp_xml.c: modp_xml.h
78
+
79
+ modp_b2_data.h: modp_b2_gen
80
+ ./modp_b2_gen > modp_b2_data.h
81
+
82
+ modp_b16_data.h: modp_b16_gen
83
+ ./modp_b16_gen > modp_b16_data.h
84
+
85
+ modp_b64_data.h: modp_b64_gen
86
+ ./modp_b64_gen > modp_b64_data.h
87
+
88
+ modp_ascii_data.h: modp_ascii_gen
89
+ ./modp_ascii_gen > modp_ascii_data.h
90
+
91
+ #
92
+ # Recall B64WCHARS by default is "-_."
93
+ #
94
+ modp_b64w_data.h: modp_b64_gen
95
+ ./modp_b64_gen $(B64WCHARS) > modp_b64w_data.h
96
+
97
+ #
98
+ # RFC 4648 alphabet is -_=
99
+ # http://www.ietf.org/rfc/rfc4648.txt
100
+ modp_b64r_data.h: modp_b64_gen
101
+ ./modp_b64_gen "-_=" > modp_b64r_data.h
102
+
103
+ modp_b85_data.h: modp_b85_gen
104
+ ./modp_b85_gen > modp_b85_data.h
105
+
106
+ modp_burl_data.h: modp_burl_gen
107
+ ./modp_burl_gen > modp_burl_data.h
108
+
109
+ modp_bjavascript_data.h: modp_bjavascript_gen
110
+ ./modp_bjavascript_gen > modp_bjavascript_data.h
111
+
112
+ modp_json_data.h: modp_json_gen.py
113
+ ./modp_json_gen.py
114
+
115
+ noinst_PROGRAMS = \
116
+ modp_b2_gen modp_b16_gen modp_b64_gen modp_b85_gen \
117
+ modp_burl_gen modp_ascii_gen modp_bjavascript_gen
118
+
119
+ modp_b2_gen_SOURCES = arraytoc.c modp_b2_gen.c
120
+
121
+ modp_b16_gen_SOURCES = arraytoc.c modp_b16_gen.c
122
+
123
+ modp_b64_gen_SOURCES = arraytoc.c modp_b64_gen.c
124
+
125
+ modp_b85_gen_SOURCES = arraytoc.c modp_b85_gen.c
126
+
127
+ modp_burl_gen_SOURCES = arraytoc.c modp_burl_gen.c
128
+
129
+ modp_ascii_gen_SOURCES = arraytoc.c modp_ascii_gen.c
130
+
131
+ modp_bjavascript_gen_SOURCES = arraytoc.c modp_bjavascript_gen.c
132
+
133
+
134
+
@@ -0,0 +1,85 @@
1
+ #include "arraytoc.h"
2
+ #include <stdio.h>
3
+
4
+ /* dump uint32_t as hex digits */
5
+ void uint32_array_to_c_hex(const uint32_t* ary, size_t sz, const char* name)
6
+ {
7
+ size_t i = 0;
8
+
9
+ printf("static const uint32_t %s[%d] = {\n ", name, (int)sz);
10
+ for (;;) {
11
+ printf("0x%08x", ary[i]);
12
+ ++i;
13
+ if (i == sz)
14
+ break;
15
+ if (i % 6 == 0) {
16
+ printf(",\n ");
17
+ } else {
18
+ printf(", ");
19
+ }
20
+ }
21
+ printf("\n};\n");
22
+ }
23
+
24
+ /**
25
+ * prints char array as a c program snippet
26
+ */
27
+ void char_array_to_c(const char* ary, size_t sz, const char* name)
28
+ {
29
+ uint8_t tmp;
30
+ size_t i = 0;
31
+
32
+ printf("static const uint8_t %s[%d] = {\n ", name, (int)sz);
33
+
34
+ for (;;) {
35
+ if (ary[i] == 0) {
36
+ printf("'\\0'");
37
+ } else if (ary[i] == '\n') {
38
+ printf("'\\n'");
39
+ } else if (ary[i] == '\t') {
40
+ printf("'\\t'");
41
+ } else if (ary[i] == '\r') {
42
+ printf("'\\r'");
43
+ } else if (ary[i] == '\'') {
44
+ printf("'\\''");
45
+ } else if (ary[i] == '\\') {
46
+ printf("'\\\\'");
47
+ } else if (ary[i] < 32 || ary[i] > 126) {
48
+ tmp = (uint8_t)ary[i];
49
+ printf("0x%02x", tmp);
50
+ } else {
51
+ printf("'%c'", (char)ary[i]);
52
+ }
53
+ ++i;
54
+ if (i == sz)
55
+ break;
56
+ if (i % 10 == 0) {
57
+ printf(",\n ");
58
+ } else {
59
+ printf(", ");
60
+ }
61
+ }
62
+ printf("\n};\n");
63
+ }
64
+
65
+ /**
66
+ * prints an uint array as a c program snippet
67
+ */
68
+ void uint32_array_to_c(const uint32_t* ary, size_t sz, const char* name)
69
+ {
70
+ size_t i = 0;
71
+
72
+ printf("static const uint32_t %s[%d] = {\n ", name, (int)sz);
73
+ for (;;) {
74
+ printf("%u", ary[i]);
75
+ ++i;
76
+ if (i == sz)
77
+ break;
78
+ if (i % 12 == 0) {
79
+ printf(",\n ");
80
+ } else {
81
+ printf(", ");
82
+ }
83
+ }
84
+ printf("\n};\n");
85
+ }
@@ -0,0 +1,43 @@
1
+ #ifndef COM_MODP_STRINGENCODERS_ARRAYTOC
2
+ #define COM_MODP_STRINGENCODERS_ARRAYTOC
3
+
4
+ #include "modp_stdint.h"
5
+
6
+ #ifdef __cplusplus
7
+ #define BEGIN_C extern "C" {
8
+ #define END_C }
9
+ #else
10
+ #define BEGIN_C
11
+ #define END_C
12
+ #endif
13
+
14
+ BEGIN_C
15
+
16
+ /** \brief output a uint32_t array into source code
17
+ *
18
+ *
19
+ * \param[in] ary the input array
20
+ * \param[in] size number of elements in array
21
+ * \param[in] name the name of the struct for the source code
22
+ *
23
+ */
24
+ void uint32_array_to_c(const uint32_t* ary, size_t size, const char* name);
25
+
26
+ /** \brief output an uint32_t array into source code as hex values
27
+ *
28
+ * \param[in] ary the input array
29
+ * \param[in] size number of elements in array
30
+ * \param[in] name the name of the struct for source code
31
+ *
32
+ */
33
+ void uint32_array_to_c_hex(const uint32_t* ary, size_t size, const char* name);
34
+
35
+ /** \brief output a char array into source code
36
+ *
37
+ * \param[in] ary the input array
38
+ * \param[in] size number of elements in array
39
+ * \param[in] name the name of the struct for source code
40
+ */
41
+ void char_array_to_c(const char* ary, size_t size, const char* name);
42
+
43
+ #endif
@@ -0,0 +1,3 @@
1
+ #ifdef __cplusplus
2
+ extern "C" {
3
+ #endif
@@ -0,0 +1,3 @@
1
+ #ifdef __cplusplus
2
+ }
3
+ #endif
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env python
2
+
3
+
4
+ class Trie(object):
5
+ def __init__(self):
6
+ self.struct = [
7
+ [ ]
8
+ ]
9
+
10
+ def dump(self):
11
+ count = 0
12
+ for i in self.struct:
13
+ count += len(i)
14
+ print i
15
+ print len(self.struct)
16
+ print count
17
+
18
+ def longest_match(self, s):
19
+ """
20
+ sample code
21
+ """
22
+ leaf = self.struct[0]
23
+ matches = []
24
+ for ch in s:
25
+ newleaf = None
26
+ for node in leaf:
27
+ if ch == node['value']:
28
+ found = True
29
+ if node['userdata'] is not None:
30
+ matches.append(node['userdata'])
31
+ if node['next'] == 0:
32
+ return matches
33
+ newleaf = self.struct[node['next']]
34
+ break
35
+ if newleaf:
36
+ leaf = newleaf
37
+ else:
38
+ break
39
+ return matches
40
+
41
+ def compile(self):
42
+ """
43
+ The current data struct is a a ragged array
44
+ 0 - [ ]
45
+ 1 - [ ]
46
+ 2 - [ ]
47
+ 3 - [ ]
48
+ i.e. an array of vectors which are ugly to
49
+ statically allocate in C
50
+ http://stackoverflow.com/questions/1083658/jagged-array-in-c
51
+
52
+ value, more, next, [userdata or 0]
53
+ """
54
+ offsets = [ 0 ]
55
+ count = 0
56
+ for leaf in self.struct:
57
+ count += len(leaf)
58
+ offsets.append(count)
59
+ print """
60
+ #ifndef _MODP_HTML_NAMED_ENTITIES_H
61
+ #define _MODP_HTML_NAMED_ENTITIES_H
62
+ #include <string.h>
63
+
64
+ typedef struct trienode {
65
+ char value; /* 1 byte -- char value - we deal only in pure ASCII */
66
+ char more; /* 1 byte -- should be read next value in array (boundary marker) */
67
+ short next; /* 2 byte -- position of next leaf */
68
+ int codepoint; /* 4 byte -- codepoint or 0 if none */
69
+ } trienode_t;
70
+
71
+ static const trienode_t entities[];
72
+ static int html_named_entity_decode(const char* s, size_t len, size_t* consumed);
73
+
74
+ static int html_named_entity_decode(const char* s, size_t len, size_t* consumed)
75
+ {
76
+ int codepoint = 0;
77
+ size_t pos = 0;
78
+ int i = 0;
79
+
80
+ *consumed = 0;
81
+
82
+ while (pos < len) {
83
+ if (s[pos] == entities[i].value) {
84
+ if (entities[i].codepoint) {
85
+ codepoint = entities[i].codepoint;
86
+ *consumed = pos + 1;
87
+ }
88
+ if (entities[i].next != 0) {
89
+ i = entities[i].next;
90
+ pos += 1;
91
+ continue;
92
+ } else {
93
+ break;
94
+ }
95
+ }
96
+ if (entities[i].more == 0) {
97
+ break;
98
+ }
99
+ ++i;
100
+ }
101
+ return codepoint;
102
+ }
103
+ /*
104
+ #include <stdio.h>
105
+ int main(int argc, char* argv[]) {
106
+ size_t consumed;
107
+ int codepoint;
108
+ codepoint = html_named_entity_decode(argv[1], strlen(argv[1]), &consumed);
109
+ printf("cp = %d, consumed = %d\\n", codepoint, consumed);
110
+ return 0;
111
+ }
112
+ */
113
+ static const trienode_t entities[] = {
114
+ """
115
+ for leaf in self.struct:
116
+ nodelen = 0
117
+ for node in leaf:
118
+ nodelen += 1
119
+ if node['full'] != None:
120
+ comment = ' /* &' + node['full'] + ' */'
121
+ else:
122
+ comment = ''
123
+
124
+ print "{{ {0}, {1}, {2}, {3} }},{4}".format(ord(node['value']),
125
+ int(nodelen != len(leaf)),
126
+ offsets[node['next']],
127
+ node['userdata'],
128
+ comment
129
+ )
130
+ print "};"
131
+ print "#endif"
132
+
133
+ def add(self, s, userdata):
134
+ idx = 0
135
+ leaf = self.struct[0]
136
+ count = 0
137
+ for ch in s[0:-1]:
138
+ #print "CHAR " + i
139
+ key = None
140
+ for node in leaf:
141
+ if ch == node['value']:
142
+ key = node
143
+ break
144
+ if key is None:
145
+ #print "key is none"
146
+ newleaf = [ ]
147
+ self.struct.append(newleaf)
148
+ idx = len(self.struct) -1
149
+ leaf.append( {
150
+ "full": None,
151
+ "value": ch,
152
+ "userdata": 0,
153
+ "next": idx
154
+ } )
155
+ leaf = newleaf
156
+ elif key['next'] != 0:
157
+ # just follow
158
+ #print "got key index of " + str(key[1])
159
+ leaf = self.struct[key['next']]
160
+ else:
161
+ newleaf = [ ]
162
+ self.struct.append(newleaf)
163
+ idx = len(self.struct) -1
164
+ key['next'] = idx
165
+ leaf = newleaf
166
+
167
+ key = None
168
+ ch = s[-1]
169
+ for node in leaf:
170
+ if ch == node['value']:
171
+ key = node
172
+ break
173
+ if key is None:
174
+ leaf.append( {
175
+ 'full': s,
176
+ 'userdata': userdata,
177
+ 'next': 0,
178
+ 'value': s[-1]
179
+ })
180
+ else:
181
+ key['full'] = s
182
+ key['userdata'] = userdata
183
+
184
+
185
+
186
+ import json
187
+ with open('entities.json', 'r') as fd:
188
+ obj = json.load(fd)
189
+
190
+ t = Trie()
191
+ total = 0
192
+ for name, data in obj.iteritems():
193
+ total += len(name) -1
194
+ t.add(name[1:], data['codepoints'][0])
195
+
196
+ #for i in ["fo", "fa", "foo"]:
197
+ # t.add(i)
198
+
199
+ #t.dump()
200
+ #print t.longest_match("amp;")
201
+
202
+ t.compile()
203
+