ooxml_crypt 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 (264) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +58 -0
  5. data/Rakefile +12 -0
  6. data/bin/console +15 -0
  7. data/bin/setup +8 -0
  8. data/ext/ooxml_crypt/extconf.rb +18 -0
  9. data/ext/ooxml_crypt/ooxml_crypt.c +27 -0
  10. data/ext/ooxml_crypt/ooxml_crypt.h +7 -0
  11. data/lib/ooxml_crypt/version.rb +5 -0
  12. data/lib/ooxml_crypt.rb +75 -0
  13. data/vendor/cybozulib/.github/workflows/main.yml +12 -0
  14. data/vendor/cybozulib/.gitignore +5 -0
  15. data/vendor/cybozulib/CMakeLists.txt +6 -0
  16. data/vendor/cybozulib/COPYRIGHT +27 -0
  17. data/vendor/cybozulib/Makefile +26 -0
  18. data/vendor/cybozulib/bin/libeay32.dll +0 -0
  19. data/vendor/cybozulib/bin/libmecab.dll +0 -0
  20. data/vendor/cybozulib/bin/ssleay32.dll +0 -0
  21. data/vendor/cybozulib/common.mk +116 -0
  22. data/vendor/cybozulib/common.props +25 -0
  23. data/vendor/cybozulib/cybozulib.sln +286 -0
  24. data/vendor/cybozulib/debug.props +14 -0
  25. data/vendor/cybozulib/include/cybozu/array.hpp +197 -0
  26. data/vendor/cybozulib/include/cybozu/atoi.hpp +238 -0
  27. data/vendor/cybozulib/include/cybozu/atomic.hpp +146 -0
  28. data/vendor/cybozulib/include/cybozu/base64.hpp +210 -0
  29. data/vendor/cybozulib/include/cybozu/benchmark.hpp +212 -0
  30. data/vendor/cybozulib/include/cybozu/bfd.hpp +105 -0
  31. data/vendor/cybozulib/include/cybozu/bit_operation.hpp +139 -0
  32. data/vendor/cybozulib/include/cybozu/bitvector.hpp +358 -0
  33. data/vendor/cybozulib/include/cybozu/condition_variable.hpp +113 -0
  34. data/vendor/cybozulib/include/cybozu/condition_variable_cs.hpp +74 -0
  35. data/vendor/cybozulib/include/cybozu/config.hpp +392 -0
  36. data/vendor/cybozulib/include/cybozu/critical_section.hpp +60 -0
  37. data/vendor/cybozulib/include/cybozu/crypto.hpp +321 -0
  38. data/vendor/cybozulib/include/cybozu/csucvector.hpp +624 -0
  39. data/vendor/cybozulib/include/cybozu/csv.hpp +294 -0
  40. data/vendor/cybozulib/include/cybozu/data_type.hpp +27 -0
  41. data/vendor/cybozulib/include/cybozu/endian.hpp +224 -0
  42. data/vendor/cybozulib/include/cybozu/env.hpp +63 -0
  43. data/vendor/cybozulib/include/cybozu/event.hpp +122 -0
  44. data/vendor/cybozulib/include/cybozu/exception.hpp +253 -0
  45. data/vendor/cybozulib/include/cybozu/file.hpp +626 -0
  46. data/vendor/cybozulib/include/cybozu/fmindex.hpp +291 -0
  47. data/vendor/cybozulib/include/cybozu/format.hpp +93 -0
  48. data/vendor/cybozulib/include/cybozu/frequency.hpp +264 -0
  49. data/vendor/cybozulib/include/cybozu/hash.hpp +67 -0
  50. data/vendor/cybozulib/include/cybozu/inttype.hpp +174 -0
  51. data/vendor/cybozulib/include/cybozu/itoa.hpp +336 -0
  52. data/vendor/cybozulib/include/cybozu/json.hpp +120 -0
  53. data/vendor/cybozulib/include/cybozu/line_stream.hpp +149 -0
  54. data/vendor/cybozulib/include/cybozu/link_libeay32.hpp +21 -0
  55. data/vendor/cybozulib/include/cybozu/link_mpir.hpp +18 -0
  56. data/vendor/cybozulib/include/cybozu/link_ssleay32.hpp +19 -0
  57. data/vendor/cybozulib/include/cybozu/log.hpp +237 -0
  58. data/vendor/cybozulib/include/cybozu/minixml.hpp +452 -0
  59. data/vendor/cybozulib/include/cybozu/mmap.hpp +143 -0
  60. data/vendor/cybozulib/include/cybozu/mutex.hpp +144 -0
  61. data/vendor/cybozulib/include/cybozu/nlp/mecab.hpp +96 -0
  62. data/vendor/cybozulib/include/cybozu/nlp/plsi.hpp +315 -0
  63. data/vendor/cybozulib/include/cybozu/nlp/random.hpp +74 -0
  64. data/vendor/cybozulib/include/cybozu/nlp/sparse.hpp +529 -0
  65. data/vendor/cybozulib/include/cybozu/nlp/svd.hpp +486 -0
  66. data/vendor/cybozulib/include/cybozu/nlp/tfidf.hpp +226 -0
  67. data/vendor/cybozulib/include/cybozu/nlp/top_score.hpp +75 -0
  68. data/vendor/cybozulib/include/cybozu/option.hpp +743 -0
  69. data/vendor/cybozulib/include/cybozu/parallel.hpp +88 -0
  70. data/vendor/cybozulib/include/cybozu/pcg.hpp +72 -0
  71. data/vendor/cybozulib/include/cybozu/process.hpp +324 -0
  72. data/vendor/cybozulib/include/cybozu/quit_signal_handler.hpp +66 -0
  73. data/vendor/cybozulib/include/cybozu/random_generator.hpp +144 -0
  74. data/vendor/cybozulib/include/cybozu/regex.hpp +463 -0
  75. data/vendor/cybozulib/include/cybozu/select8.hpp +279 -0
  76. data/vendor/cybozulib/include/cybozu/serializer.hpp +363 -0
  77. data/vendor/cybozulib/include/cybozu/sha1.hpp +209 -0
  78. data/vendor/cybozulib/include/cybozu/sha2.hpp +506 -0
  79. data/vendor/cybozulib/include/cybozu/siphash.hpp +105 -0
  80. data/vendor/cybozulib/include/cybozu/socket.hpp +785 -0
  81. data/vendor/cybozulib/include/cybozu/ssl.hpp +203 -0
  82. data/vendor/cybozulib/include/cybozu/stacktrace.hpp +291 -0
  83. data/vendor/cybozulib/include/cybozu/stream.hpp +269 -0
  84. data/vendor/cybozulib/include/cybozu/string.hpp +1746 -0
  85. data/vendor/cybozulib/include/cybozu/string_operation.hpp +365 -0
  86. data/vendor/cybozulib/include/cybozu/sucvector.hpp +378 -0
  87. data/vendor/cybozulib/include/cybozu/test.hpp +373 -0
  88. data/vendor/cybozulib/include/cybozu/thread.hpp +229 -0
  89. data/vendor/cybozulib/include/cybozu/time.hpp +281 -0
  90. data/vendor/cybozulib/include/cybozu/tls.hpp +115 -0
  91. data/vendor/cybozulib/include/cybozu/unordered_map.hpp +13 -0
  92. data/vendor/cybozulib/include/cybozu/unordered_set.hpp +13 -0
  93. data/vendor/cybozulib/include/cybozu/v128.hpp +376 -0
  94. data/vendor/cybozulib/include/cybozu/wavelet_matrix.hpp +345 -0
  95. data/vendor/cybozulib/include/cybozu/xorshift.hpp +189 -0
  96. data/vendor/cybozulib/include/cybozu/zlib.hpp +325 -0
  97. data/vendor/cybozulib/include/sais.hxx +364 -0
  98. data/vendor/cybozulib/misc/make_select8tbl.cpp +26 -0
  99. data/vendor/cybozulib/mk.bat +37 -0
  100. data/vendor/cybozulib/readme.md +29 -0
  101. data/vendor/cybozulib/release.props +12 -0
  102. data/vendor/cybozulib/sample/Makefile +30 -0
  103. data/vendor/cybozulib/sample/csucvector_smpl.cpp +42 -0
  104. data/vendor/cybozulib/sample/data/svd/org/test1.S +4 -0
  105. data/vendor/cybozulib/sample/data/svd/org/test1.U +4 -0
  106. data/vendor/cybozulib/sample/data/svd/org/test1.V +6 -0
  107. data/vendor/cybozulib/sample/data/svd/test1 +4 -0
  108. data/vendor/cybozulib/sample/data/svd/test2 +4 -0
  109. data/vendor/cybozulib/sample/desymbol.cpp +127 -0
  110. data/vendor/cybozulib/sample/exception_smpl.cpp +46 -0
  111. data/vendor/cybozulib/sample/fmindex_smpl.cpp +231 -0
  112. data/vendor/cybozulib/sample/log_smpl.cpp +19 -0
  113. data/vendor/cybozulib/sample/mecab_smpl.cpp +37 -0
  114. data/vendor/cybozulib/sample/option2_smpl.cpp +68 -0
  115. data/vendor/cybozulib/sample/option_smpl.cpp +42 -0
  116. data/vendor/cybozulib/sample/plsi_smpl.cpp +207 -0
  117. data/vendor/cybozulib/sample/proj/exception_smpl.vcproj +184 -0
  118. data/vendor/cybozulib/sample/proj/mecab_smpl.vcproj +184 -0
  119. data/vendor/cybozulib/sample/proj/ssl_smpl/ssl_smpl.vcxproj +85 -0
  120. data/vendor/cybozulib/sample/proj/ssl_smpl.vcproj +347 -0
  121. data/vendor/cybozulib/sample/proj/stacktrace_smpl/stacktrace_smpl.vcxproj +85 -0
  122. data/vendor/cybozulib/sample/proj/svd_smpl.vcproj +184 -0
  123. data/vendor/cybozulib/sample/quit_signal_handler.cpp +30 -0
  124. data/vendor/cybozulib/sample/serializer_smpl.cpp +196 -0
  125. data/vendor/cybozulib/sample/socket_smpl.cpp +82 -0
  126. data/vendor/cybozulib/sample/ssl_smpl.cpp +39 -0
  127. data/vendor/cybozulib/sample/stacktrace_smpl.cpp +52 -0
  128. data/vendor/cybozulib/sample/svd_bench_smpl.cpp +143 -0
  129. data/vendor/cybozulib/sample/svd_smpl.cpp +94 -0
  130. data/vendor/cybozulib/sample/wm_bench_smpl.cpp +182 -0
  131. data/vendor/cybozulib/sample/zlib_smpl.cpp +41 -0
  132. data/vendor/cybozulib/src/Makefile +8 -0
  133. data/vendor/cybozulib/src/base/Makefile +19 -0
  134. data/vendor/cybozulib/test/Makefile +12 -0
  135. data/vendor/cybozulib/test/base/Makefile +37 -0
  136. data/vendor/cybozulib/test/base/array_test.cpp +173 -0
  137. data/vendor/cybozulib/test/base/atoi_test.cpp +774 -0
  138. data/vendor/cybozulib/test/base/atomic_test.cpp +49 -0
  139. data/vendor/cybozulib/test/base/base64_test.cpp +113 -0
  140. data/vendor/cybozulib/test/base/bit_operation_test.cpp +134 -0
  141. data/vendor/cybozulib/test/base/bitvector_test.cpp +204 -0
  142. data/vendor/cybozulib/test/base/condition_variable_cs_test.cpp +92 -0
  143. data/vendor/cybozulib/test/base/condition_variable_test.cpp +88 -0
  144. data/vendor/cybozulib/test/base/config_test.cpp +236 -0
  145. data/vendor/cybozulib/test/base/crypto_test.cpp +122 -0
  146. data/vendor/cybozulib/test/base/csucvector_test.cpp +63 -0
  147. data/vendor/cybozulib/test/base/csv_test.cpp +182 -0
  148. data/vendor/cybozulib/test/base/data/a.xml +26 -0
  149. data/vendor/cybozulib/test/base/endian_test.cpp +56 -0
  150. data/vendor/cybozulib/test/base/env_test.cpp +22 -0
  151. data/vendor/cybozulib/test/base/event_test.cpp +41 -0
  152. data/vendor/cybozulib/test/base/file_test.cpp +233 -0
  153. data/vendor/cybozulib/test/base/fmindex_test.cpp +118 -0
  154. data/vendor/cybozulib/test/base/format_test.cpp +12 -0
  155. data/vendor/cybozulib/test/base/frequency_test.cpp +104 -0
  156. data/vendor/cybozulib/test/base/itoa_test.cpp +522 -0
  157. data/vendor/cybozulib/test/base/line_stream_test.cpp +208 -0
  158. data/vendor/cybozulib/test/base/mecab_test.cpp +41 -0
  159. data/vendor/cybozulib/test/base/minixml_test.cpp +103 -0
  160. data/vendor/cybozulib/test/base/mmap_test.cpp +15 -0
  161. data/vendor/cybozulib/test/base/option_test.cpp +487 -0
  162. data/vendor/cybozulib/test/base/parallel_test.cpp +48 -0
  163. data/vendor/cybozulib/test/base/proj/array_test/array_test.vcxproj +86 -0
  164. data/vendor/cybozulib/test/base/proj/atoi_test/atoi_test.vcxproj +86 -0
  165. data/vendor/cybozulib/test/base/proj/atomic_test/atomic_test.vcxproj +86 -0
  166. data/vendor/cybozulib/test/base/proj/base64_test/base64_test.vcxproj +86 -0
  167. data/vendor/cybozulib/test/base/proj/condition_variable_cs_test/condition_variable_cs_test.vcxproj +86 -0
  168. data/vendor/cybozulib/test/base/proj/condition_variable_test/condition_variable_test.vcxproj +86 -0
  169. data/vendor/cybozulib/test/base/proj/config_test/config_test.vcxproj +86 -0
  170. data/vendor/cybozulib/test/base/proj/csv_test/csv_test.vcxproj +86 -0
  171. data/vendor/cybozulib/test/base/proj/endian_test/endian_test.vcxproj +86 -0
  172. data/vendor/cybozulib/test/base/proj/env_test/env_test.vcxproj +86 -0
  173. data/vendor/cybozulib/test/base/proj/event_test/event_test.vcxproj +86 -0
  174. data/vendor/cybozulib/test/base/proj/file_test/file_test.vcxproj +86 -0
  175. data/vendor/cybozulib/test/base/proj/itoa_test/itoa_test.vcxproj +86 -0
  176. data/vendor/cybozulib/test/base/proj/mecab_test/mecab_test.vcxproj +88 -0
  177. data/vendor/cybozulib/test/base/proj/minixml_test/minixml_test.vcxproj +86 -0
  178. data/vendor/cybozulib/test/base/proj/mmap_test/mmap_test.vcxproj +86 -0
  179. data/vendor/cybozulib/test/base/proj/serializer_test/serializer_test.vcxproj +86 -0
  180. data/vendor/cybozulib/test/base/proj/sha1_test/sha1_test.vcxproj +86 -0
  181. data/vendor/cybozulib/test/base/proj/stream_test/stream_test.vcxproj +86 -0
  182. data/vendor/cybozulib/test/base/proj/string_operation_test/string_operation_test.vcxproj +86 -0
  183. data/vendor/cybozulib/test/base/proj/string_test/string_test.vcxproj +86 -0
  184. data/vendor/cybozulib/test/base/proj/thread_test/thread_test.vcxproj +86 -0
  185. data/vendor/cybozulib/test/base/proj/time_test/time_test.vcxproj +86 -0
  186. data/vendor/cybozulib/test/base/proj/tls_test/tls_test.vcxproj +86 -0
  187. data/vendor/cybozulib/test/base/proj/zlib_test/zlib_test.vcxproj +86 -0
  188. data/vendor/cybozulib/test/base/random_generator_test.cpp +28 -0
  189. data/vendor/cybozulib/test/base/regex_test.cpp +74 -0
  190. data/vendor/cybozulib/test/base/serializer_test.cpp +483 -0
  191. data/vendor/cybozulib/test/base/sha1_test.cpp +61 -0
  192. data/vendor/cybozulib/test/base/sha2_test.cpp +191 -0
  193. data/vendor/cybozulib/test/base/siphash_test.cpp +33 -0
  194. data/vendor/cybozulib/test/base/socket_test.cpp +76 -0
  195. data/vendor/cybozulib/test/base/stream_test.cpp +101 -0
  196. data/vendor/cybozulib/test/base/string_operation_test.cpp +340 -0
  197. data/vendor/cybozulib/test/base/string_test.cpp +1705 -0
  198. data/vendor/cybozulib/test/base/sucvector_test.cpp +312 -0
  199. data/vendor/cybozulib/test/base/thread_test.cpp +62 -0
  200. data/vendor/cybozulib/test/base/time_test.cpp +164 -0
  201. data/vendor/cybozulib/test/base/tls_test.cpp +50 -0
  202. data/vendor/cybozulib/test/base/wavelet_matrix_test.cpp +145 -0
  203. data/vendor/cybozulib/test/base/zlib_test.cpp +371 -0
  204. data/vendor/cybozulib/test/nlp/Makefile +27 -0
  205. data/vendor/cybozulib/test/nlp/proj/random_test.vcproj +184 -0
  206. data/vendor/cybozulib/test/nlp/proj/sparse_test.vcproj +184 -0
  207. data/vendor/cybozulib/test/nlp/proj/svd_test.vcproj +184 -0
  208. data/vendor/cybozulib/test/nlp/random_test.cpp +62 -0
  209. data/vendor/cybozulib/test/nlp/sparse_test.cpp +347 -0
  210. data/vendor/cybozulib/test/nlp/svd_test.cpp +234 -0
  211. data/vendor/cybozulib/test/nlp/top_score_test.cpp +40 -0
  212. data/vendor/cybozulib/tool/create_vcproj.py +186 -0
  213. data/vendor/cybozulib/tool/vcproj_tmpl.py +185 -0
  214. data/vendor/msoffice/COPYRIGHT +27 -0
  215. data/vendor/msoffice/Makefile +29 -0
  216. data/vendor/msoffice/bin/64/msoc.dll +0 -0
  217. data/vendor/msoffice/bin/64/msocsample.exe +0 -0
  218. data/vendor/msoffice/bin/64/msoffice-crypt.exe +0 -0
  219. data/vendor/msoffice/bin/msoc.dll +0 -0
  220. data/vendor/msoffice/bin/msocsample.exe +0 -0
  221. data/vendor/msoffice/bin/msoffice-crypt.exe +0 -0
  222. data/vendor/msoffice/common.mk +71 -0
  223. data/vendor/msoffice/common.props +26 -0
  224. data/vendor/msoffice/debug.props +14 -0
  225. data/vendor/msoffice/include/attack.hpp +211 -0
  226. data/vendor/msoffice/include/cfb.hpp +777 -0
  227. data/vendor/msoffice/include/crypto_util.hpp +450 -0
  228. data/vendor/msoffice/include/custom_sha1.hpp +342 -0
  229. data/vendor/msoffice/include/decode.hpp +240 -0
  230. data/vendor/msoffice/include/encode.hpp +221 -0
  231. data/vendor/msoffice/include/make_dataspace.hpp +316 -0
  232. data/vendor/msoffice/include/msoc.h +129 -0
  233. data/vendor/msoffice/include/resource.hpp +7 -0
  234. data/vendor/msoffice/include/standard_encryption.hpp +145 -0
  235. data/vendor/msoffice/include/uint32vec.hpp +179 -0
  236. data/vendor/msoffice/include/util.hpp +212 -0
  237. data/vendor/msoffice/lib/.emptydir +0 -0
  238. data/vendor/msoffice/misc/decrypt-xls.vbs +46 -0
  239. data/vendor/msoffice/mk.bat +1 -0
  240. data/vendor/msoffice/mkdll.bat +3 -0
  241. data/vendor/msoffice/msoc.def +13 -0
  242. data/vendor/msoffice/msocsample.py +178 -0
  243. data/vendor/msoffice/msoffice12.sln +31 -0
  244. data/vendor/msoffice/readme.md +110 -0
  245. data/vendor/msoffice/release.props +28 -0
  246. data/vendor/msoffice/src/Makefile +19 -0
  247. data/vendor/msoffice/src/attack.cpp +124 -0
  248. data/vendor/msoffice/src/cfb_test.cpp +77 -0
  249. data/vendor/msoffice/src/minisample.c +54 -0
  250. data/vendor/msoffice/src/msocdll.cpp +276 -0
  251. data/vendor/msoffice/src/msocsample.c +136 -0
  252. data/vendor/msoffice/src/msoffice-crypt.cpp +219 -0
  253. data/vendor/msoffice/src/proj/attack/attack.vcxproj +88 -0
  254. data/vendor/msoffice/src/proj/main/msoffice-crypt.vcxproj +88 -0
  255. data/vendor/msoffice/src/sha1.cpp +234 -0
  256. data/vendor/msoffice/test/Makefile +20 -0
  257. data/vendor/msoffice/test/cfb_test.cpp +74 -0
  258. data/vendor/msoffice/test/hash_test.cpp +59 -0
  259. data/vendor/msoffice/test/proj/cfb/cfb_test.vcxproj +90 -0
  260. data/vendor/msoffice/test/proj/hash/hash_test.vcxproj +90 -0
  261. data/vendor/msoffice/test/sampl.bat +8 -0
  262. data/vendor/msoffice/test_all.py +46 -0
  263. data/vendor/update +4 -0
  264. metadata +351 -0
@@ -0,0 +1,452 @@
1
+ #pragma once
2
+ /**
3
+ @file
4
+ @brief mini XML parser(not strict)
5
+
6
+ @author MITSUNARI Shigeo(@herumi)
7
+ */
8
+
9
+ #include <assert.h>
10
+ #include <cybozu/exception.hpp>
11
+ #include <map>
12
+ #include <istream>
13
+ #include <list>
14
+
15
+ namespace cybozu {
16
+
17
+ namespace minixml {
18
+
19
+ const int indentWidth = 3;
20
+
21
+ inline std::string escape(const std::string& str)
22
+ {
23
+ std::string ret;
24
+ for (size_t i = 0, n = str.size(); i < n; i++) {
25
+ char c = str[i];
26
+ switch (c) {
27
+ case '&':
28
+ ret += "&amp;";
29
+ break;
30
+ case '<':
31
+ ret += "&lt;";
32
+ break;
33
+ case '>':
34
+ ret += "&gt;";
35
+ break;
36
+ case '\'':
37
+ ret += "&apos;";
38
+ break;
39
+ case '"':
40
+ ret += "&quot;";
41
+ break;
42
+ default:
43
+ ret += c;
44
+ break;
45
+ }
46
+ }
47
+ return ret;
48
+ }
49
+
50
+ inline std::string unescape(const std::string& str)
51
+ {
52
+ std::string ret;
53
+ for (size_t i = 0, n = str.size(); i < n; i++) {
54
+ char c = str[i];
55
+ if (c == '&') {
56
+ if (n - i >= 5 && memcmp(&str[i + 1], "amp;", 4) == 0) {
57
+ ret += '&';
58
+ i += 4;
59
+ } else if (n - i >= 4 && memcmp(&str[i + 1], "lt;", 3) == 0) {
60
+ ret += '<';
61
+ i += 3;
62
+ } else if (n - i >= 4 && memcmp(&str[i + 1], "gt;", 3) == 0) {
63
+ ret += '>';
64
+ i += 3;
65
+ } else if (n - i >= 6 && memcmp(&str[i + 1], "apos;", 5) == 0) {
66
+ ret += '\'';
67
+ i += 5;
68
+ } else if (n - i >= 6 && memcmp(&str[i + 1], "quot;", 5) == 0) {
69
+ ret += '"';
70
+ i += 5;
71
+ } else {
72
+ throw cybozu::Exception("xml:unescape") << str.substr(i, 8);
73
+ }
74
+ } else {
75
+ ret += c;
76
+ }
77
+ }
78
+ return ret;
79
+ }
80
+
81
+ class Attributes {
82
+ typedef std::map<std::string, std::string> Map;
83
+ Map m_;
84
+ public:
85
+ const std::string *query(const std::string& key) const
86
+ {
87
+ Map::const_iterator i = m_.find(key);
88
+ if (i != m_.end()) return &(i->second);
89
+ return 0;
90
+ }
91
+ const std::string& operator[](const std::string& key) const
92
+ {
93
+ const std::string *p = query(key);
94
+ if (p) return *p;
95
+ throw cybozu::Exception("xml:Attributes:no key") << key;
96
+ }
97
+ std::string& operator[](const std::string& key)
98
+ {
99
+ return m_[key];
100
+ }
101
+ void put(int level = 0) const
102
+ {
103
+ std::string tabstr(level + indentWidth, ' ');
104
+ const char *tab = tabstr.c_str();
105
+ for (Map::const_iterator i = m_.begin(), ie = m_.end(); i != ie; ++i) {
106
+ printf("%s%s=%s\n", tab, i->first.c_str(), i->second.c_str());
107
+ }
108
+ }
109
+ void swap(Attributes& attr) CYBOZU_NOEXCEPT
110
+ {
111
+ m_.swap(attr.m_);
112
+ }
113
+ friend inline std::ostream& operator<<(std::ostream& os, const Attributes& attr)
114
+ {
115
+ for (Attributes::Map::const_iterator i = attr.m_.begin(), ie = attr.m_.end(); i != ie; ++i) {
116
+ os << " " << i->first << "=\"" << i->second << "\"";
117
+ }
118
+ return os;
119
+ }
120
+ };
121
+
122
+ struct Node;
123
+ typedef std::list<Node*> NodeList;
124
+
125
+ struct Node {
126
+ std::string name;
127
+ Attributes attr;
128
+ std::string content;
129
+ Node *parent;
130
+ NodeList child;
131
+ Node()
132
+ : parent(0)
133
+ {
134
+ }
135
+ ~Node()
136
+ {
137
+ for (NodeList::iterator i = child.begin(); i != child.end(); ++i) {
138
+ delete *i;
139
+ }
140
+ }
141
+ /*
142
+ swap name and attr
143
+ */
144
+ Node *appendChild(std::string& name, Attributes& attr)
145
+ {
146
+ child.push_back(0);
147
+ Node *p = new Node();
148
+ child.back() = p;
149
+ p->parent = this;
150
+ p->name.swap(name);
151
+ p->attr.swap(attr);
152
+ return p;
153
+ }
154
+ const Node *getFirstTagByName(const std::string& v) const
155
+ {
156
+ if (name == v) {
157
+ return this;
158
+ }
159
+ for (NodeList::const_iterator i = child.begin(), ie = child.end(); i != ie; ++i) {
160
+ const Node *p = (*i)->getFirstTagByName(v);
161
+ if (p) return p;
162
+ }
163
+ return 0;
164
+ }
165
+ void put(int level = 0) const
166
+ {
167
+ std::string tabstr(level, ' ');
168
+ const char *tab = tabstr.c_str();
169
+ printf("%s<%s>\n", tab, name.c_str());
170
+ if (!content.empty()) {
171
+ printf("%s[content]\n", tab);
172
+ printf("%s%s\n", tab, content.c_str());
173
+ }
174
+ attr.put(level);
175
+ for (NodeList::const_iterator i = child.begin(), ie = child.end(); i != ie; ++i) {
176
+ (*i)->put(level + indentWidth);
177
+ }
178
+ }
179
+ friend inline std::ostream& operator<<(std::ostream& os, const Node& node)
180
+ {
181
+ os << "<" << node.name << node.attr << ">";
182
+ for (NodeList::const_iterator i = node.child.begin(), ie = node.child.end(); i != ie; ++i) {
183
+ os << **i;
184
+ }
185
+ os << "</" << node.name << ">";
186
+ return os;
187
+ }
188
+ };
189
+
190
+ inline bool isSpace(char c)
191
+ {
192
+ return c == ' ' || c == '\t' || c == '\r' || c == '\n';
193
+ }
194
+
195
+ inline bool isQuote(char c)
196
+ {
197
+ return c == '"' || c == '\'';
198
+ }
199
+
200
+ inline bool isEqual(char c)
201
+ {
202
+ return c == '=';
203
+ }
204
+
205
+ inline bool isName(char c)
206
+ {
207
+ return !isSpace(c) && !isEqual(c) && !isQuote(c);
208
+ }
209
+
210
+ inline bool isName2(char c)
211
+ {
212
+ return !isSpace(c) && !isEqual(c) && !isQuote(c) && c != '>';
213
+ }
214
+
215
+ struct isAttrValue {
216
+ char q_; /* ' or " */
217
+ explicit isAttrValue(char q) : q_(q) { }
218
+ bool operator()(char c) const { return c != q_; }
219
+ };
220
+
221
+ struct isContent {
222
+ bool operator()(char c) const { return c != '<'; }
223
+ };
224
+
225
+ enum TagType {
226
+ BeginTag, // <...>
227
+ EndTag, // </...>
228
+ CompleteTag // <.../>
229
+ };
230
+
231
+ template<class Iter>
232
+ struct InputStream {
233
+ Iter begin_;
234
+ Iter end_;
235
+ InputStream(Iter begin, Iter end)
236
+ : begin_(begin)
237
+ , end_(end)
238
+ {
239
+ }
240
+ bool empty() const { return begin_ == end_; }
241
+ /*
242
+ @note assume not empty
243
+ */
244
+ char query() const
245
+ {
246
+ assert(!empty());
247
+ return *begin_;
248
+ }
249
+ void inc()
250
+ {
251
+ assert(!empty());
252
+ ++begin_;
253
+ }
254
+ char next()
255
+ {
256
+ if (empty()) throw cybozu::Exception("xml:InputStream:empty");
257
+ return *begin_++;
258
+ }
259
+ void skipSpace()
260
+ {
261
+ while (!empty()) {
262
+ if (!isSpace(query())) return;
263
+ inc();
264
+ }
265
+ }
266
+ template<class Cond>
267
+ std::string getWord(Cond f)
268
+ {
269
+ std::string word;
270
+ while (!empty()) {
271
+ char c = query();
272
+ if (!f(c)) break;
273
+ word.push_back(c);
274
+ inc();
275
+ }
276
+ return word;
277
+ }
278
+ /*
279
+ @note assume attributes exists
280
+ */
281
+ void parseAttribute(std::string *key, std::string *val)
282
+ {
283
+ *key = getWord(isName);
284
+ if (key->empty()) throw cybozu::Exception("xml:parseAttribute:bad key");
285
+ skipSpace();
286
+ char c = next();
287
+ if (isEqual(c)) {
288
+ skipSpace();
289
+ char q = next();
290
+ if (isQuote(q)) {
291
+ *val = getWord(isAttrValue(q));
292
+ c = next();
293
+ if (c == q) return;
294
+ }
295
+ }
296
+ throw cybozu::Exception("xml:parseAttribute") << *key;
297
+ }
298
+ /*
299
+ normal : true is last is '/>'
300
+ false if last is '?>'
301
+ @retval true if '/>'
302
+ false if '>'
303
+ */
304
+ bool parseAttributes(Attributes& attr, bool normal = true)
305
+ {
306
+ for (;;) {
307
+ skipSpace();
308
+ if (empty()) throw cybozu::Exception("xml:parseAttributes:tag is not complete");
309
+ char c = query();
310
+ if (normal) {
311
+ if (c == '>') {
312
+ inc();
313
+ return false;
314
+ }
315
+ if (c == '/') goto LAST;
316
+ } else {
317
+ if (c == '?') goto LAST;
318
+ }
319
+ std::string key, val;
320
+ parseAttribute(&key, &val);
321
+ attr[key] = val;
322
+ }
323
+ LAST:
324
+ inc();
325
+ char c = next();
326
+ if (c != '>') throw cybozu::Exception("xml:parseAttributes:bad tag char") << c;
327
+ return true;
328
+ }
329
+ /*
330
+ pointer is next of '<'
331
+ get tag name
332
+ *isEnd = true if </name>
333
+ */
334
+ std::string getTagName(bool *isEnd)
335
+ {
336
+ std::string name = getWord(isName);
337
+ if (name.size() <= 1 || name[name.size() - 1] != '>') throw cybozu::Exception("xml:getTagName:invalid tag");
338
+ name.resize(name.size() - 1);
339
+ if (name[0] == '/') {
340
+ *isEnd = true;
341
+ if (name.size() <= 1) throw cybozu::Exception("xml:getTagName:empty name");
342
+ return name.substr(1);
343
+ }
344
+ return name;
345
+ }
346
+ TagType parseTag(std::string& name, Attributes& attr)
347
+ {
348
+ skipSpace();
349
+ char c = next();
350
+ if (c != '<') throw cybozu::Exception("xml:parseTag:bad begin tag") << c;
351
+ if (empty()) throw cybozu::Exception("xml:parseTag:invalid tag1");
352
+ TagType type = BeginTag;
353
+ c = query();
354
+ if (c == '/') {
355
+ type = EndTag;
356
+ inc();
357
+ }
358
+ name = getWord(isName2);
359
+ if (name.empty()) throw cybozu::Exception("xml:parseTag:invalid tag2");
360
+ if (type == EndTag) {
361
+ char c = next();
362
+ if (c != '>') throw cybozu::Exception("xml:parseTag:invalid tag") << name;
363
+ return EndTag;
364
+ }
365
+ bool ret = parseAttributes(attr);
366
+ return ret ? CompleteTag : BeginTag;
367
+ }
368
+ std::string parseContent()
369
+ {
370
+ return getWord(isContent());
371
+ }
372
+ void parseNode(Node *node)
373
+ {
374
+ for (;;) {
375
+ skipSpace();
376
+ if (empty()) throw cybozu::Exception("xml:parseNode:no end tag1") << node->name;
377
+ if (query() != '<') {
378
+ node->content = parseContent();
379
+ if (empty()) throw cybozu::Exception("xml:parseNode:no end tag2") << node->name;
380
+ }
381
+ std::string name;
382
+ Attributes attr;
383
+ TagType type = parseTag(name, attr);
384
+ if (type == EndTag) {
385
+ if (node->name != name) {
386
+ throw cybozu::Exception("xml:parseNode:") << node->name << name;
387
+ }
388
+ return;
389
+ }
390
+ Node *child = node->appendChild(name, attr);
391
+ if (type == BeginTag) {
392
+ parseNode(child);
393
+ }
394
+ }
395
+ }
396
+ };
397
+
398
+ } // minixml
399
+
400
+ class MiniXml {
401
+ minixml::Attributes xmlAttr_;
402
+ minixml::Node *root_;
403
+ template<class InputStream>
404
+ void readHeader(InputStream& is)
405
+ {
406
+ is.skipSpace();
407
+ std::string w = is.getWord(minixml::isName);
408
+ if (w != "<?xml") throw cybozu::Exception("xml:readHeader:") << w;
409
+ root_ = new minixml::Node();
410
+ is.parseAttributes(xmlAttr_, false);
411
+ }
412
+ MiniXml(const MiniXml&);
413
+ void operator=(const MiniXml&);
414
+ public:
415
+ MiniXml()
416
+ : root_(0)
417
+ {
418
+ }
419
+ MiniXml(const char *begin, const char *end)
420
+ : root_(0)
421
+ {
422
+ parse(begin, end);
423
+ }
424
+ template<class InputStream>
425
+ void parse(InputStream& is)
426
+ {
427
+ readHeader(is);
428
+ minixml::TagType type = is.parseTag(root_->name, root_->attr);
429
+ if (type == minixml::EndTag) throw cybozu::Exception("xml:parse:bad end tag") << root_->name;
430
+ if (type == minixml::BeginTag) {
431
+ is.parseNode(root_);
432
+ }
433
+ }
434
+ void parse(const char *begin, const char *end)
435
+ {
436
+ minixml::InputStream<const char*> is(begin, end);
437
+ parse(is);
438
+ }
439
+ const minixml::Node& get() const { return *root_; }
440
+ ~MiniXml()
441
+ {
442
+ delete root_;
443
+ }
444
+ friend inline std::ostream& operator<<(std::ostream& os, const MiniXml& xml)
445
+ {
446
+ os << "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
447
+ os << *xml.root_;
448
+ return os;
449
+ }
450
+ };
451
+
452
+ } // cybozu
@@ -0,0 +1,143 @@
1
+ #pragma once
2
+ /**
3
+ @file
4
+ @brief mmap class
5
+
6
+ @author MITSUNARI Shigeo(@herumi)
7
+ */
8
+ #include <string>
9
+ #include <cybozu/exception.hpp>
10
+
11
+ #ifdef _WIN32
12
+ #ifndef WIN32_LEAN_AND_MEAN
13
+ #define WIN32_LEAN_AND_MEAN
14
+ #endif
15
+ #include <windows.h>
16
+ #else
17
+ #include <sys/types.h>
18
+ #include <sys/stat.h>
19
+ #include <sys/mman.h>
20
+ #include <unistd.h>
21
+ #include <fcntl.h>
22
+ #endif
23
+
24
+ namespace cybozu {
25
+
26
+ class Mmap {
27
+ const char *map_;
28
+ #ifdef _WIN32
29
+ HANDLE hFile_;
30
+ HANDLE hMap_;
31
+ template<class T>
32
+ void subOpen(const T& fileName)
33
+ {
34
+ const char *errMsg = 0;
35
+ if (hFile_ == INVALID_HANDLE_VALUE) {
36
+ errMsg = "CreateFile"; goto ERR_EXIT;
37
+ }
38
+ {
39
+ LARGE_INTEGER size;
40
+ if (GetFileSizeEx(hFile_, &size) == 0) {
41
+ errMsg = "GetFileSizeEx"; goto ERR_EXIT;
42
+ }
43
+ size_ = size.QuadPart;
44
+ }
45
+ if (size_ == 0) {
46
+ CloseHandle(hFile_); hFile_ = INVALID_HANDLE_VALUE;
47
+ return;
48
+ }
49
+
50
+ hMap_ = CreateFileMapping(hFile_, NULL, PAGE_READONLY, 0, 0, NULL);
51
+ if (hMap_ == NULL) {
52
+ errMsg = "CreateFileMapping"; goto ERR_EXIT;
53
+ }
54
+
55
+ map_ = (const char*)MapViewOfFile(hMap_, FILE_MAP_READ, 0, 0, 0);
56
+ if (map_ == 0) {
57
+ errMsg = "MapViewOfFile"; goto ERR_EXIT;
58
+ }
59
+ return;
60
+ ERR_EXIT:
61
+ std::string reason = cybozu::ErrorNo().toString();
62
+ if (hMap_) CloseHandle(hMap_);
63
+ if (hFile_ != INVALID_HANDLE_VALUE) CloseHandle(hFile_);
64
+ throw cybozu::Exception("mmap") << errMsg << fileName << reason;
65
+ }
66
+ #endif
67
+ uint64_t size_;
68
+ public:
69
+ #ifdef _WIN32
70
+ explicit Mmap(const std::string& fileName)
71
+ : map_(0)
72
+ , hFile_(INVALID_HANDLE_VALUE)
73
+ , hMap_(0)
74
+ , size_(0)
75
+ {
76
+ hFile_ = CreateFileA(fileName.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
77
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
78
+ subOpen(fileName);
79
+ }
80
+ explicit Mmap(const std::wstring& fileName)
81
+ : map_(0)
82
+ , hFile_(INVALID_HANDLE_VALUE)
83
+ , hMap_(0)
84
+ , size_(0)
85
+ {
86
+ hFile_ = CreateFileW(fileName.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
87
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
88
+ subOpen(fileName);
89
+ }
90
+ #else
91
+ explicit Mmap(const std::string& fileName)
92
+ : map_(static_cast<const char*>(MAP_FAILED))
93
+ , size_(0)
94
+ {
95
+ const char *errMsg = 0;
96
+ int fd = ::open(fileName.c_str(), O_RDONLY);
97
+ if (fd == -1) {
98
+ errMsg = "open"; goto ERR_EXIT;
99
+ }
100
+
101
+ {
102
+ struct stat st;
103
+ int ret = ::fstat(fd, &st);
104
+ if (ret != 0) {
105
+ errMsg = "fstat"; goto ERR_EXIT;
106
+ }
107
+ size_ = st.st_size;
108
+ }
109
+ if (size_ == 0) {
110
+ ::close(fd);
111
+ return;
112
+ }
113
+
114
+ map_ = (const char*)::mmap(NULL, size_, PROT_READ, MAP_SHARED, fd, 0);
115
+ if (map_ == MAP_FAILED) {
116
+ errMsg = "mmap"; goto ERR_EXIT;
117
+ }
118
+ ::close(fd);
119
+ return;
120
+ ERR_EXIT:
121
+ std::string reason = cybozu::ErrorNo().toString();
122
+ if (fd != -1) close(fd);
123
+ throw cybozu::Exception("mmap") << errMsg << fileName << reason;
124
+ }
125
+ #endif
126
+ ~Mmap()
127
+ {
128
+ #ifdef _WIN32
129
+ if (map_) UnmapViewOfFile(map_);
130
+ if (hMap_) CloseHandle(hMap_);
131
+ if (hFile_ != INVALID_HANDLE_VALUE) CloseHandle(hFile_);
132
+ #else
133
+ if (map_ != MAP_FAILED) ::munmap(const_cast<char*>(map_), size_);
134
+ #endif
135
+ }
136
+ uint64_t size() const { return size_; }
137
+ const char *get() const { return map_; }
138
+ private:
139
+ Mmap(const Mmap &);
140
+ void operator=(const Mmap &);
141
+ };
142
+
143
+ } // cybozu