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,364 @@
1
+ /*
2
+ * sais.hxx for sais-lite
3
+ * Copyright (c) 2008-2009 Yuta Mori All Rights Reserved.
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person
6
+ * obtaining a copy of this software and associated documentation
7
+ * files (the "Software"), to deal in the Software without
8
+ * restriction, including without limitation the rights to use,
9
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the
11
+ * Software is furnished to do so, subject to the following
12
+ * conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be
15
+ * included in all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24
+ * OTHER DEALINGS IN THE SOFTWARE.
25
+ */
26
+
27
+ #ifndef _SAIS_HXX
28
+ #define _SAIS_HXX 1
29
+ #ifdef __cplusplus
30
+
31
+ #ifdef __INTEL_COMPILER
32
+ #pragma warning(disable : 383 981 1418)
33
+ // for icc 64-bit
34
+ //#define __builtin_vsnprintf(a, b, c, d) __builtin_vsnprintf(a, b, c, (char *)d)
35
+ #endif
36
+
37
+ #include <iterator>
38
+ #ifdef _OPENMP
39
+ # include <omp.h>
40
+ #endif
41
+
42
+ namespace saisxx_private {
43
+
44
+ /* find the start or end of each bucket */
45
+ template<typename string_type, typename bucket_type, typename index_type>
46
+ void
47
+ getCounts(const string_type T, bucket_type C, index_type n, index_type k) {
48
+ #ifdef _OPENMP
49
+ bucket_type D;
50
+ index_type i, j, p, sum, first, last;
51
+ int thnum, maxthreads = omp_get_max_threads();
52
+ #pragma omp parallel default(shared) private(D, i, thnum, first, last)
53
+ {
54
+ thnum = omp_get_thread_num();
55
+ D = C + thnum * k;
56
+ first = n / maxthreads * thnum;
57
+ last = (thnum < (maxthreads - 1)) ? n / maxthreads * (thnum + 1) : n;
58
+ for(i = 0; i < k; ++i) { D[i] = 0; }
59
+ for(i = first; i < last; ++i) { ++D[T[i]]; }
60
+ }
61
+ if(1 < maxthreads) {
62
+ #pragma omp parallel for default(shared) private(i, j, p, sum)
63
+ for(i = 0; i < k; ++i) {
64
+ for(j = 1, p = i + k, sum = C[i]; j < maxthreads; ++j, p += k) {
65
+ sum += C[p];
66
+ }
67
+ C[i] = sum;
68
+ }
69
+ }
70
+ #else
71
+ index_type i;
72
+ for(i = 0; i < k; ++i) { C[i] = 0; }
73
+ for(i = 0; i < n; ++i) { ++C[T[i]]; }
74
+ #endif
75
+ }
76
+ template<typename bucket_type, typename index_type>
77
+ void
78
+ getBuckets(const bucket_type C, bucket_type B, index_type k, bool end) {
79
+ index_type i, sum = 0;
80
+ if(end) { for(i = 0; i < k; ++i) { sum += C[i]; B[i] = sum; } }
81
+ else { for(i = 0; i < k; ++i) { sum += C[i]; B[i] = sum - C[i]; } }
82
+ }
83
+
84
+ /* compute SA and BWT */
85
+ template<typename string_type, typename sarray_type,
86
+ typename bucket_type, typename index_type>
87
+ void
88
+ induceSA(string_type T, sarray_type SA, bucket_type C, bucket_type B,
89
+ index_type n, index_type k) {
90
+ typedef typename std::iterator_traits<string_type>::value_type char_type;
91
+ sarray_type b;
92
+ index_type i, j;
93
+ char_type c0, c1;
94
+ /* compute SAl */
95
+ if(C == B) { getCounts(T, C, n, k); }
96
+ getBuckets(C, B, k, false); /* find starts of buckets */
97
+ b = SA + B[c1 = T[j = n - 1]];
98
+ *b++ = ((0 < j) && (T[j - 1] < c1)) ? ~j : j;
99
+ for(i = 0; i < n; ++i) {
100
+ j = SA[i], SA[i] = ~j;
101
+ if(0 < j) {
102
+ if((c0 = T[--j]) != c1) { B[c1] = b - SA; b = SA + B[c1 = c0]; }
103
+ *b++ = ((0 < j) && (T[j - 1] < c1)) ? ~j : j;
104
+ }
105
+ }
106
+ /* compute SAs */
107
+ if(C == B) { getCounts(T, C, n, k); }
108
+ getBuckets(C, B, k, true); /* find ends of buckets */
109
+ for(i = n - 1, b = SA + B[c1 = 0]; 0 <= i; --i) {
110
+ if(0 < (j = SA[i])) {
111
+ if((c0 = T[--j]) != c1) { B[c1] = b - SA; b = SA + B[c1 = c0]; }
112
+ *--b = ((j == 0) || (T[j - 1] > c1)) ? ~j : j;
113
+ } else {
114
+ SA[i] = ~j;
115
+ }
116
+ }
117
+ }
118
+ template<typename string_type, typename sarray_type,
119
+ typename bucket_type, typename index_type>
120
+ int
121
+ computeBWT(string_type T, sarray_type SA, bucket_type C, bucket_type B,
122
+ index_type n, index_type k) {
123
+ typedef typename std::iterator_traits<string_type>::value_type char_type;
124
+ sarray_type b;
125
+ index_type i, j, pidx = -1;
126
+ char_type c0, c1;
127
+ /* compute SAl */
128
+ if(C == B) { getCounts(T, C, n, k); }
129
+ getBuckets(C, B, k, false); /* find starts of buckets */
130
+ b = SA + B[c1 = T[j = n - 1]];
131
+ *b++ = ((0 < j) && (T[j - 1] < c1)) ? ~j : j;
132
+ for(i = 0; i < n; ++i) {
133
+ if(0 < (j = SA[i])) {
134
+ SA[i] = ~(c0 = T[--j]);
135
+ if(c0 != c1) { B[c1] = b - SA; b = SA + B[c1 = c0]; }
136
+ *b++ = ((0 < j) && (T[j - 1] < c1)) ? ~j : j;
137
+ } else if(j != 0) {
138
+ SA[i] = ~j;
139
+ }
140
+ }
141
+ /* compute SAs */
142
+ if(C == B) { getCounts(T, C, n, k); }
143
+ getBuckets(C, B, k, true); /* find ends of buckets */
144
+ for(i = n - 1, b = SA + B[c1 = 0]; 0 <= i; --i) {
145
+ if(0 < (j = SA[i])) {
146
+ SA[i] = (c0 = T[--j]);
147
+ if(c0 != c1) { B[c1] = b - SA; b = SA + B[c1 = c0]; }
148
+ *--b = ((0 < j) && (T[j - 1] > c1)) ? ~((index_type)T[j - 1]) : j;
149
+ } else if(j != 0) {
150
+ SA[i] = ~j;
151
+ } else {
152
+ pidx = i;
153
+ }
154
+ }
155
+ return pidx;
156
+ }
157
+
158
+ /* find the suffix array SA of T[0..n-1] in {0..k}^n
159
+ use a working space (excluding s and SA) of at most 2n+O(1) for a constant alphabet */
160
+ template<typename string_type, typename sarray_type, typename index_type>
161
+ int
162
+ suffixsort(string_type T, sarray_type SA,
163
+ index_type fs, index_type n, index_type k,
164
+ bool isbwt) {
165
+ typedef typename std::iterator_traits<string_type>::value_type char_type;
166
+ sarray_type RA;
167
+ index_type i, j, m, p, q, plen, qlen, name, pidx = 0;
168
+ bool diff;
169
+ int c;
170
+ #ifdef _OPENMP
171
+ int maxthreads = omp_get_max_threads();
172
+ #else
173
+ # define maxthreads 1
174
+ #endif
175
+ char_type c0, c1;
176
+
177
+ /* stage 1: reduce the problem by at least 1/2
178
+ sort all the S-substrings */
179
+ if(fs < (maxthreads * k)) {
180
+ index_type *C, *B;
181
+ if((C = new index_type[maxthreads * k]) == 0) { return -2; }
182
+ B = (1 < maxthreads) ? C + k : C;
183
+ getCounts(T, C, n, k); getBuckets(C, B, k, true); /* find ends of buckets */
184
+ #ifdef _OPENMP
185
+ #pragma omp parallel for default(shared) private(i)
186
+ #endif
187
+ for(i = 0; i < n; ++i) { SA[i] = 0; }
188
+ for(i = n - 2, c = 0, c1 = T[n - 1]; 0 <= i; --i, c1 = c0) {
189
+ if((c0 = T[i]) < (c1 + c)) { c = 1; }
190
+ else if(c != 0) { SA[--B[c1]] = i + 1, c = 0; }
191
+ }
192
+ induceSA(T, SA, C, B, n, k);
193
+ delete [] C;
194
+ } else {
195
+ sarray_type C, B;
196
+ C = SA + n;
197
+ B = ((1 < maxthreads) || (k <= (fs - k))) ? C + k : C;
198
+ getCounts(T, C, n, k); getBuckets(C, B, k, true); /* find ends of buckets */
199
+ #ifdef _OPENMP
200
+ #pragma omp parallel for default(shared) private(i)
201
+ #endif
202
+ for(i = 0; i < n; ++i) { SA[i] = 0; }
203
+ for(i = n - 2, c = 0, c1 = T[n - 1]; 0 <= i; --i, c1 = c0) {
204
+ if((c0 = T[i]) < (c1 + c)) { c = 1; }
205
+ else if(c != 0) { SA[--B[c1]] = i + 1, c = 0; }
206
+ }
207
+ induceSA(T, SA, C, B, n, k);
208
+ }
209
+
210
+ /* compact all the sorted substrings into the first m items of SA
211
+ 2*m must be not larger than n (proveable) */
212
+ #ifdef _OPENMP
213
+ #pragma omp parallel for default(shared) private(i, j, p, c0, c1)
214
+ for(i = 0; i < n; ++i) {
215
+ p = SA[i];
216
+ if((0 < p) && (T[p - 1] > (c0 = T[p]))) {
217
+ for(j = p + 1; (j < n) && (c0 == (c1 = T[j])); ++j) { }
218
+ if((j < n) && (c0 < c1)) { SA[i] = ~p; }
219
+ }
220
+ }
221
+ for(i = 0, m = 0; i < n; ++i) { if((p = SA[i]) < 0) { SA[m++] = ~p; } }
222
+ #else
223
+ for(i = 0, m = 0; i < n; ++i) {
224
+ p = SA[i];
225
+ if((0 < p) && (T[p - 1] > (c0 = T[p]))) {
226
+ for(j = p + 1; (j < n) && (c0 == (c1 = T[j])); ++j) { }
227
+ if((j < n) && (c0 < c1)) { SA[m++] = p; }
228
+ }
229
+ }
230
+ #endif
231
+ j = m + (n >> 1);
232
+ #ifdef _OPENMP
233
+ #pragma omp parallel for default(shared) private(i)
234
+ #endif
235
+ for(i = m; i < j; ++i) { SA[i] = 0; } /* init the name array buffer */
236
+ /* store the length of all substrings */
237
+ for(i = n - 2, j = n, c = 0, c1 = T[n - 1]; 0 <= i; --i, c1 = c0) {
238
+ if((c0 = T[i]) < (c1 + c)) { c = 1; }
239
+ else if(c != 0) { SA[m + ((i + 1) >> 1)] = j - i - 1; j = i + 1; c = 0; }
240
+ }
241
+ /* find the lexicographic names of all substrings */
242
+ for(i = 0, name = 0, q = n, qlen = 0; i < m; ++i) {
243
+ p = SA[i], plen = SA[m + (p >> 1)], diff = true;
244
+ if(plen == qlen) {
245
+ for(j = 0; (j < plen) && (T[p + j] == T[q + j]); ++j) { }
246
+ if(j == plen) { diff = false; }
247
+ }
248
+ if(diff != false) { ++name, q = p, qlen = plen; }
249
+ SA[m + (p >> 1)] = name;
250
+ }
251
+
252
+ /* stage 2: solve the reduced problem
253
+ recurse if names are not yet unique */
254
+ if(name < m) {
255
+ RA = SA + n + fs - m;
256
+ for(i = m + (n >> 1) - 1, j = m - 1; m <= i; --i) {
257
+ if(SA[i] != 0) { RA[j--] = SA[i] - 1; }
258
+ }
259
+ if(suffixsort(RA, SA, fs + n - m * 2, m, name, false) != 0) { return -2; }
260
+ for(i = n - 2, j = m - 1, c = 0, c1 = T[n - 1]; 0 <= i; --i, c1 = c0) {
261
+ if((c0 = T[i]) < (c1 + c)) { c = 1; }
262
+ else if(c != 0) { RA[j--] = i + 1, c = 0; } /* get p1 */
263
+ }
264
+ #ifdef _OPENMP
265
+ #pragma omp parallel for default(shared) private(i)
266
+ #endif
267
+ for(i = 0; i < m; ++i) { SA[i] = RA[SA[i]]; } /* get index in s */
268
+ }
269
+
270
+ /* stage 3: induce the result for the original problem */
271
+ if(fs < (maxthreads * k)) {
272
+ index_type *B, *C;
273
+ if((C = new index_type[maxthreads * k]) == 0) { return -2; }
274
+ B = (1 < maxthreads) ? C + k : C;
275
+ /* put all left-most S characters into their buckets */
276
+ getCounts(T, C, n, k); getBuckets(C, B, k, true); /* find ends of buckets */
277
+ #ifdef _OPENMP
278
+ #pragma omp parallel for default(shared) private(i)
279
+ #endif
280
+ for(i = m; i < n; ++i) { SA[i] = 0; } /* init SA[m..n-1] */
281
+ for(i = m - 1; 0 <= i; --i) {
282
+ j = SA[i], SA[i] = 0;
283
+ SA[--B[T[j]]] = j;
284
+ }
285
+ if(isbwt == false) { induceSA(T, SA, C, B, n, k); }
286
+ else { pidx = computeBWT(T, SA, C, B, n, k); }
287
+ delete [] C;
288
+ } else {
289
+ sarray_type C, B;
290
+ C = SA + n;
291
+ B = ((1 < maxthreads) || (k <= (fs - k))) ? C + k : C;
292
+ /* put all left-most S characters into their buckets */
293
+ getCounts(T, C, n, k); getBuckets(C, B, k, true); /* find ends of buckets */
294
+ #ifdef _OPENMP
295
+ #pragma omp parallel for default(shared) private(i)
296
+ #endif
297
+ for(i = m; i < n; ++i) { SA[i] = 0; } /* init SA[m..n-1] */
298
+ for(i = m - 1; 0 <= i; --i) {
299
+ j = SA[i], SA[i] = 0;
300
+ SA[--B[T[j]]] = j;
301
+ }
302
+ if(isbwt == false) { induceSA(T, SA, C, B, n, k); }
303
+ else { pidx = computeBWT(T, SA, C, B, n, k); }
304
+ }
305
+
306
+ return pidx;
307
+ #ifndef _OPENMP
308
+ # undef maxthreads
309
+ #endif
310
+ }
311
+
312
+ } /* namespace saisxx_private */
313
+
314
+
315
+ /**
316
+ * @brief Constructs the suffix array of a given string in linear time.
317
+ * @param T[0..n-1] The input string. (random access iterator)
318
+ * @param SA[0..n-1] The output array of suffixes. (random access iterator)
319
+ * @param n The length of the given string.
320
+ * @param k The alphabet size.
321
+ * @return 0 if no error occurred, -1 or -2 otherwise.
322
+ */
323
+ template<typename string_type, typename sarray_type, typename index_type>
324
+ int
325
+ saisxx(string_type T, sarray_type SA, index_type n, index_type k = 256) {
326
+ int err;
327
+ if((n < 0) || (k <= 0)) { return -1; }
328
+ if(n <= 1) { if(n == 1) { SA[0] = 0; } return 0; }
329
+ try { err = saisxx_private::suffixsort(T, SA, 0, n, k, false); }
330
+ catch(...) { err = -2; }
331
+ return err;
332
+ }
333
+
334
+ /**
335
+ * @brief Constructs the burrows-wheeler transformed string of a given string in linear time.
336
+ * @param T[0..n-1] The input string. (random access iterator)
337
+ * @param U[0..n-1] The output string. (random access iterator)
338
+ * @param A[0..n-1] The temporary array. (random access iterator)
339
+ * @param n The length of the given string.
340
+ * @param k The alphabet size.
341
+ * @return The primary index if no error occurred, -1 or -2 otherwise.
342
+ */
343
+ template<typename string_type, typename sarray_type, typename index_type>
344
+ index_type
345
+ saisxx_bwt(string_type T, string_type U, sarray_type A, index_type n, index_type k = 256) {
346
+ typedef typename std::iterator_traits<string_type>::value_type char_type;
347
+ index_type i, pidx;
348
+ if((n < 0) || (k <= 0)) { return -1; }
349
+ if(n <= 1) { if(n == 1) { U[0] = T[0]; } return n; }
350
+ try {
351
+ pidx = saisxx_private::suffixsort(T, A, 0, n, k, true);
352
+ if(0 <= pidx) {
353
+ U[0] = T[n - 1];
354
+ for(i = 0; i < pidx; ++i) { U[i + 1] = (char_type)A[i]; }
355
+ for(i += 1; i < n; ++i) { U[i] = (char_type)A[i]; }
356
+ pidx += 1;
357
+ }
358
+ } catch(...) { pidx = -2; }
359
+ return pidx;
360
+ }
361
+
362
+
363
+ #endif /* __cplusplus */
364
+ #endif /* _SAIS_HXX */
@@ -0,0 +1,26 @@
1
+ #include <stdio.h>
2
+ #include <stdlib.h>
3
+ #include <cybozu/inttype.hpp>
4
+
5
+ inline uint64_t select8(uint64_t v, size_t r)
6
+ {
7
+ size_t count = 0;
8
+ for (int i = 0; i < 64; i++) {
9
+ if (v & (uint64_t(1) << i))
10
+ count++;
11
+ if (count == r)
12
+ return i;
13
+ }
14
+ return 64;
15
+ }
16
+
17
+ int main()
18
+ {
19
+ for (int x = 0; x < 256; x++) {
20
+ printf("{");
21
+ for (int i = 0; i < 8; i++) {
22
+ printf("%d, ", select8(x, i));
23
+ }
24
+ printf("},\n");
25
+ }
26
+ }
@@ -0,0 +1,37 @@
1
+ @echo off
2
+
3
+ if /i "%1"=="release" (
4
+ set mode=Release
5
+ set suf=
6
+ ) else (
7
+ set mode=Debug
8
+ set suf=d
9
+ )
10
+
11
+ if /i "%PROCESSOR_ARCHITECTURE%" == "AMD64" (
12
+ set mode="%mode%|x64"
13
+ ) else (
14
+ set mode="%mode%|Win32"
15
+ )
16
+
17
+ @echo.
18
+ @echo ******** Building project(%mode%) ********
19
+ @echo.
20
+ mkdir bin lib include
21
+ devenv cybozulib.sln /Build %mode%
22
+ @rem for /F "usebackq" %%p in (`"dir /S /B *.vcproj"`) do devenv %%p /Build %mode%
23
+ @echo.
24
+ @echo ******** Unit test ********
25
+ @echo.
26
+ rm -rf result.txt
27
+ for %%e in (bin\*_test%suf%.exe) do (%%e | grep "ctest:name") >> result.txt
28
+ grep -v "ng=0, exception=0" result.txt
29
+ if %ERRORLEVEL% == 0 goto sample
30
+ echo "all unit tests are ok"
31
+ :sample
32
+ @echo.
33
+ @echo ******** Run sample ********
34
+ @echo.
35
+ bin\exception_smpl%suf%.exe
36
+
37
+ :end
@@ -0,0 +1,29 @@
1
+ [![Build Status](https://github.com/herumi/cybozulib/actions/workflows/main.yml/badge.svg)](https://github.com/herumi/cybozulib/actions/workflows/main.yml)
2
+
3
+ # cybozulib
4
+
5
+ # Abstract
6
+ This is a tiny C++ library for Windows and Linux.
7
+
8
+ # How to use
9
+
10
+ directory position
11
+
12
+ ```
13
+ <work dir>/cybozulib
14
+ /cybozulib_ext ; necessary for Windows if openssl, gmp are used
15
+ ```
16
+
17
+ # License
18
+ [BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause)
19
+
20
+ # Author
21
+
22
+ MITSUNARI Shigeo(herumi@nifty.com)
23
+
24
+ # Disclaimer
25
+ This OSS is my own personal work and does not have any relationship with Cybozu Labs, Inc.,
26
+ Cybozu Inc. or any other organization which I belong to.
27
+
28
+ # sais.hxx
29
+ sais.hxx is written by Yuta Mori.
@@ -0,0 +1,12 @@
1
+ ����<?xml version="1.0" encoding="utf-8"?>
2
+ <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3
+ <ImportGroup Label="PropertySheets" />
4
+ <PropertyGroup Label="UserMacros" />
5
+ <PropertyGroup />
6
+ <ItemDefinitionGroup>
7
+ <ClCompile>
8
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
9
+ </ClCompile>
10
+ </ItemDefinitionGroup>
11
+ <ItemGroup />
12
+ </Project>
@@ -0,0 +1,30 @@
1
+ include ../common.mk
2
+
3
+ TARGET=$(TEST_FILE)
4
+ LIBS=
5
+
6
+ SRC=$(wildcard *smpl.cpp)
7
+ ifneq ($(HAS_EIGEN),1)
8
+ SRC:=$(filter-out svd_bench_smpl.cpp,$(SRC))
9
+ SRC:=$(filter-out svd_smpl.cpp,$(SRC))
10
+ endif
11
+ ifneq ($(HAS_MECAB),1)
12
+ SRC:=$(filter-out mecab_smpl.cpp,$(SRC))
13
+ endif
14
+
15
+ all: $(TARGET)
16
+
17
+ test: $(TARGET)
18
+ @$(SAMPLE_TEST)
19
+
20
+ $(OBJDIR):
21
+ @$(MKDIR) $(OBJDIR)
22
+
23
+ clean:
24
+ $(CLEAN)
25
+
26
+ $(LIBS):
27
+ $(MAKE) -C ../src
28
+
29
+ -include $(DEPEND_FILE)
30
+
@@ -0,0 +1,42 @@
1
+ #include <cybozu/csucvector.hpp>
2
+ #include <cybozu/mmap.hpp>
3
+ #include <sstream>
4
+
5
+ void test(const std::string& inName)
6
+ {
7
+ cybozu::Mmap m(inName);
8
+ const uint64_t *blk = reinterpret_cast<const uint64_t*>(m.get());
9
+ cybozu::CSucVector cv2(blk, m.size() * 8);
10
+ cybozu::CSucVector cv;
11
+ {
12
+ std::stringstream ss;
13
+ cv2.save(ss);
14
+ cv.load(ss);
15
+ const int inSize = (int)m.size();
16
+ const int outSize = (int)ss.str().size();
17
+ printf("rate = %.2f%% %d / %d\n", outSize * 100.0 / inSize, outSize, inSize);
18
+ }
19
+ cybozu::BitVector bv;
20
+ bv.resize(m.size() * 8);
21
+ for (size_t i = 0, n = bv.size(); i < n; i++) {
22
+ if (cv.get(i)) bv.set(i);
23
+ }
24
+ const uint64_t *p = bv.getBlock();
25
+ for (size_t i = 0, n = bv.getBlockSize(); i < n; i++) {
26
+ if (p[i] != blk[i]) {
27
+ printf("err i=%d %llx %llx\n", (int)i, (long long)blk[i], (long long)p[i]);
28
+ exit(1);
29
+ }
30
+ }
31
+ }
32
+
33
+ int main(int argc, char *argv[])
34
+ {
35
+ argc--, argv++;
36
+ if (argc != 1) {
37
+ fprintf(stderr, "csucvector_smp.exe\n");
38
+ return 1;
39
+ }
40
+ const std::string inName(argv[0]);
41
+ test(inName);
42
+ }
@@ -0,0 +1,4 @@
1
+ # V D 3
2
+ 6.7146909
3
+ 2.6076661
4
+ 2.0280541
@@ -0,0 +1,4 @@
1
+ # M D 3 3
2
+ -0.78453644 0.49844637 0.3688547
3
+ -0.039141616 0.55385323 -0.83169377
4
+ -0.61884612 -0.66693164 -0.41500804
@@ -0,0 +1,6 @@
1
+ # M D 5 3
2
+ -0.44267941 0.31768159 0.34099487
3
+ -0.65168122 0.25307007 0.31823742
4
+ -0.0058292506 0.21239423 -0.41009446
5
+ -0.1284973 0.61593502 -0.63831276
6
+ -0.60232963 -0.64073918 -0.45478213
@@ -0,0 +1,4 @@
1
+ # M D 3 5
2
+ 3 4 0 1 2
3
+ 0 0 1 2 0
4
+ 1 2 0 0 4
@@ -0,0 +1,4 @@
1
+ # M S 3 5
2
+ 0:3 1:4 3:1 4:2
3
+ 2:1 3:2
4
+ 0:1 1:2 4:4
@@ -0,0 +1,127 @@
1
+ /*
2
+ convert <addr> to <file:line addr>
3
+ input stdin
4
+ output stdout
5
+ sudo apt-get install libbfd-dev
6
+ build this with -lbfd
7
+ */
8
+ #include <stdio.h>
9
+ #include <stdlib.h>
10
+ #include <iostream>
11
+ #include <fstream>
12
+ #include <cybozu/bfd.hpp>
13
+ #include <cybozu/stacktrace.hpp>
14
+ #include <cybozu/atoi.hpp>
15
+ #include <cybozu/option.hpp>
16
+ #include <cybozu/string_operation.hpp>
17
+
18
+ /*
19
+ find "[0x" ([0-9a-f]+) "]"
20
+ */
21
+ const void* findAddr(const std::string& str)
22
+ {
23
+ size_t p = str.find("[0x");
24
+ if (p == std::string::npos) return 0;
25
+ size_t q = str.find("]", p + 3);
26
+ if (q == std::string::npos) return 0;
27
+ bool b;
28
+ size_t addr = cybozu::hextoi(&b, &str[p + 3], q - p - 3);
29
+ if (!b) return 0;
30
+ return (const void*)addr;
31
+ }
32
+
33
+ void decode(std::string& str, cybozu::Bfd& bfd)
34
+ {
35
+ const void *addr = findAddr(str);
36
+ if (addr == 0) return;
37
+ std::string file;
38
+ std::string func;
39
+ int line;
40
+ if (!bfd.getInfo(&file, &func, &line, addr)) return;
41
+ cybozu::Demangle(func, func);
42
+ str = file + ':' + cybozu::itoa(line) + ' ' + func + ' ' + str;
43
+ }
44
+
45
+ bool tryDecodeOnelineAndPut(const std::string& str, cybozu::Bfd& bfd)
46
+ {
47
+ const std::string oneline = "<<<STACKTRACE>>> ";
48
+ if (str.find(oneline) != 0) return false;
49
+ printf("<<<STACKTRACE\n");
50
+ std::istringstream iss(str.substr(oneline.size()));
51
+ std::string addrStr;
52
+ while (iss >> addrStr) {
53
+ if (addrStr.find("0x") != 0) break;
54
+ bool b;
55
+ size_t addr = cybozu::hextoi(&b, &addrStr[2], addrStr.size() - 2);
56
+ if (!b) break;
57
+ std::string file;
58
+ std::string func;
59
+ int line;
60
+ if (bfd.getInfo(&file, &func, &line, (const void*)addr)) {
61
+ cybozu::Demangle(func, func);
62
+ printf("%s:%d %s ", file.c_str(), line, func.c_str());
63
+ }
64
+ printf("%s\n", addrStr.c_str());
65
+ }
66
+ printf(">>>STACKTRACE\n");
67
+ return true;
68
+ }
69
+
70
+ int main(int argc, char **argv)
71
+ try
72
+ {
73
+ cybozu::Option opt;
74
+ bool doCheckAll = false;
75
+ std::string exeName;
76
+ std::string textName;
77
+ opt.appendBoolOpt(&doCheckAll, "a", ": check all text");
78
+ opt.appendOpt(&textName, "-", "f", ": text file");
79
+ opt.appendParam(&exeName, "exe", ": exec file");
80
+ opt.appendHelp("h", ": put this message");
81
+ if (!opt.parse(argc, argv)) {
82
+ opt.usage();
83
+ return 1;
84
+ }
85
+ const std::string beginStackTrace = "<<<STACKTRACE";
86
+ const std::string endStackTrace = ">>>STACKTRACE";
87
+ bool inStackTrace = false;
88
+ cybozu::Bfd bfd(exeName);
89
+ std::string line;
90
+ std::istream *pis = 0;
91
+ std::ifstream ifs;
92
+ if (textName == "-") {
93
+ pis = &std::cin;
94
+ } else {
95
+ ifs.open(textName.c_str(), std::ios::binary);
96
+ pis = &ifs;
97
+ }
98
+ fprintf(stderr, "textName=%s, exeName=%s\n", textName.c_str(), exeName.c_str());
99
+ while (std::getline(*pis, line)) {
100
+ cybozu::Strip(line);
101
+ if (tryDecodeOnelineAndPut(line, bfd)) {
102
+ continue;
103
+ }
104
+ bool doDecode = false;
105
+ if (doCheckAll) {
106
+ doDecode = true;
107
+ } else {
108
+ if (inStackTrace) {
109
+ if (line.find(endStackTrace) == 0) {
110
+ inStackTrace = false;
111
+ } else {
112
+ doDecode = true;
113
+ }
114
+ } else {
115
+ if (line.find(beginStackTrace) == 0) {
116
+ inStackTrace = true;
117
+ }
118
+ }
119
+ }
120
+ if (doDecode) {
121
+ decode(line, bfd);
122
+ }
123
+ printf("%s\n", line.c_str());
124
+ }
125
+ } catch (std::exception& e) {
126
+ printf("ERR %s\n", e.what());
127
+ }