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,212 @@
1
+ #pragma once
2
+ /**
3
+ @file
4
+ @brief measure exec time of function
5
+ @author MITSUNARI Shigeo
6
+ */
7
+ #if defined(_MSC_VER) && (MSC_VER <= 1500)
8
+ #include <cybozu/inttype.hpp>
9
+ #else
10
+ #include <stdint.h>
11
+ #endif
12
+ #include <stdio.h>
13
+
14
+ #ifdef __EMSCRIPTEN__
15
+ #define CYBOZU_BENCH_USE_GETTIMEOFDAY
16
+ #endif
17
+
18
+ #ifdef CYBOZU_BENCH_USE_GETTIMEOFDAY
19
+ #include <sys/time.h>
20
+ #elif !defined(CYBOZU_BENCH_DONT_USE_RDTSC)
21
+ #if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__x86_64__)
22
+ #define CYBOZU_BENCH_USE_RDTSC
23
+ #define CYBOZU_BENCH_USE_CPU_TIMER
24
+ #endif
25
+ #if defined(__GNUC__) && defined(__ARM_ARCH_7A__)
26
+ // #define CYBOZU_BENCH_USE_MRC
27
+ // #define CYBOZU_BENCH_USE_CPU_TIMER
28
+ #endif
29
+ #endif
30
+
31
+
32
+ #include <assert.h>
33
+ #include <time.h>
34
+ #ifdef _MSC_VER
35
+ #include <intrin.h>
36
+ #include <sys/timeb.h>
37
+ #else
38
+ #endif
39
+
40
+ #ifndef CYBOZU_UNUSED
41
+ #ifdef __GNUC__
42
+ #define CYBOZU_UNUSED __attribute__((unused))
43
+ #else
44
+ #define CYBOZU_UNUSED
45
+ #endif
46
+ #endif
47
+
48
+ namespace cybozu {
49
+
50
+ namespace bench {
51
+
52
+ static void (*g_putCallback)(double);
53
+
54
+ static inline void setPutCallback(void (*f)(double))
55
+ {
56
+ g_putCallback = f;
57
+ }
58
+
59
+ } // cybozu::bench
60
+
61
+ class CpuClock {
62
+ public:
63
+ static inline uint64_t getCpuClk()
64
+ {
65
+ #ifdef CYBOZU_BENCH_USE_RDTSC
66
+ #ifdef _MSC_VER
67
+ return __rdtsc();
68
+ #else
69
+ unsigned int eax, edx;
70
+ __asm__ volatile("rdtsc" : "=a"(eax), "=d"(edx));
71
+ return ((uint64_t)edx << 32) | eax;
72
+ #endif
73
+ #elif defined(CYBOZU_BENCH_USE_MRC)
74
+ uint32_t clk;
75
+ __asm__ volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(clk));
76
+ return clk;
77
+ #else
78
+ #ifdef _MSC_VER
79
+ struct _timeb timeb;
80
+ _ftime_s(&timeb);
81
+ return uint64_t(timeb.time) * 1000000000 + timeb.millitm * 1000000;
82
+ #elif defined(CYBOZU_BENCH_USE_GETTIMEOFDAY)
83
+ struct timeval tv;
84
+ int ret CYBOZU_UNUSED = gettimeofday(&tv, 0);
85
+ assert(ret == 0);
86
+ return uint64_t(tv.tv_sec) * 1000000000 + tv.tv_usec * 1000;
87
+ #else
88
+ struct timespec tp;
89
+ int ret CYBOZU_UNUSED = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp);
90
+ assert(ret == 0);
91
+ return uint64_t(tp.tv_sec) * 1000000000 + tp.tv_nsec;
92
+ #endif
93
+ #endif
94
+ }
95
+ CpuClock()
96
+ : clock_(0)
97
+ , count_(0)
98
+ {
99
+ }
100
+ void begin()
101
+ {
102
+ clock_ -= getCpuClk();
103
+ }
104
+ void end()
105
+ {
106
+ clock_ += getCpuClk();
107
+ count_++;
108
+ }
109
+ int getCount() const { return count_; }
110
+ uint64_t getClock() const { return clock_; }
111
+ void clear() { count_ = 0; clock_ = 0; }
112
+ void put(const char *msg = 0, int N = 1) const
113
+ {
114
+ double t = getClock() / double(getCount()) / N;
115
+ if (msg && *msg) printf("%s ", msg);
116
+ if (bench::g_putCallback) {
117
+ bench::g_putCallback(t);
118
+ return;
119
+ }
120
+ #ifdef CYBOZU_BENCH_USE_CPU_TIMER
121
+ if (t > 1e6) {
122
+ printf("%7.3fMclk", t * 1e-6);
123
+ } else if (t > 1e3) {
124
+ printf("%7.3fKclk", t * 1e-3);
125
+ } else {
126
+ printf("%6.2f clk", t);
127
+ }
128
+ #else
129
+ if (t > 1e6) {
130
+ printf("%7.3fmsec", t * 1e-6);
131
+ } else if (t > 1e3) {
132
+ printf("%7.3fusec", t * 1e-3);
133
+ } else {
134
+ printf("%6.2fnsec", t);
135
+ }
136
+ #endif
137
+ if (msg && *msg) printf("\n");
138
+ }
139
+ // adhoc constatns for CYBOZU_BENCH
140
+ #ifdef CYBOZU_BENCH_USE_CPU_TIMER
141
+ static const int loopN1 = 1000;
142
+ static const int loopN2 = 100;
143
+ static const uint64_t maxClk = (uint64_t)1e8;
144
+ #else
145
+ static const int loopN1 = 100;
146
+ static const int loopN2 = 100;
147
+ static const uint64_t maxClk = (uint64_t)1e8;
148
+ #endif
149
+ private:
150
+ uint64_t clock_;
151
+ int count_;
152
+ };
153
+
154
+ namespace bench {
155
+
156
+ static CpuClock g_clk;
157
+ static int CYBOZU_UNUSED g_loopNum;
158
+
159
+ } // cybozu::bench
160
+ /*
161
+ loop counter is automatically determined
162
+ CYBOZU_BENCH(<msg>, <func>, <param1>, <param2>, ...);
163
+ if msg == "" then only set g_clk, g_loopNum
164
+ */
165
+ #define CYBOZU_BENCH(msg, func, ...) \
166
+ { \
167
+ const uint64_t _cybozu_maxClk = cybozu::CpuClock::maxClk; \
168
+ cybozu::CpuClock _cybozu_clk; \
169
+ for (int _cybozu_i = 0; _cybozu_i < cybozu::CpuClock::loopN2; _cybozu_i++) { \
170
+ _cybozu_clk.begin(); \
171
+ for (int _cybozu_j = 0; _cybozu_j < cybozu::CpuClock::loopN1; _cybozu_j++) { func(__VA_ARGS__); } \
172
+ _cybozu_clk.end(); \
173
+ if (_cybozu_clk.getClock() > _cybozu_maxClk) break; \
174
+ } \
175
+ if (msg && *msg) _cybozu_clk.put(msg, cybozu::CpuClock::loopN1); \
176
+ cybozu::bench::g_clk = _cybozu_clk; cybozu::bench::g_loopNum = cybozu::CpuClock::loopN1; \
177
+ }
178
+
179
+ /*
180
+ double clk;
181
+ CYBOZU_BENCH_T(clk, <func>, <param1>, <param2>, ...);
182
+ clk is set by CYBOZU_BENCH_T
183
+ */
184
+ #define CYBOZU_BENCH_T(clk, func, ...) \
185
+ { \
186
+ const uint64_t _cybozu_maxClk = cybozu::CpuClock::maxClk; \
187
+ cybozu::CpuClock _cybozu_clk; \
188
+ for (int _cybozu_i = 0; _cybozu_i < cybozu::CpuClock::loopN2; _cybozu_i++) { \
189
+ _cybozu_clk.begin(); \
190
+ for (int _cybozu_j = 0; _cybozu_j < cybozu::CpuClock::loopN1; _cybozu_j++) { func(__VA_ARGS__); } \
191
+ _cybozu_clk.end(); \
192
+ if (_cybozu_clk.getClock() > _cybozu_maxClk) break; \
193
+ } \
194
+ clk = _cybozu_clk.getClock() / (double)_cybozu_clk.getCount() / cybozu::CpuClock::loopN1; \
195
+ }
196
+
197
+ /*
198
+ loop counter N is given
199
+ CYBOZU_BENCH_C(<msg>, <counter>, <func>, <param1>, <param2>, ...);
200
+ if msg == "" then only set g_clk, g_loopNum
201
+ */
202
+ #define CYBOZU_BENCH_C(msg, _N, func, ...) \
203
+ { \
204
+ cybozu::CpuClock _cybozu_clk; \
205
+ _cybozu_clk.begin(); \
206
+ for (int _cybozu_j = 0; _cybozu_j < _N; _cybozu_j++) { func(__VA_ARGS__); } \
207
+ _cybozu_clk.end(); \
208
+ if (msg && *msg) _cybozu_clk.put(msg, _N); \
209
+ cybozu::bench::g_clk = _cybozu_clk; cybozu::bench::g_loopNum = _N; \
210
+ }
211
+
212
+ } // cybozu
@@ -0,0 +1,105 @@
1
+ #pragma once
2
+ /**
3
+ @file
4
+ @brief libbfd class
5
+ @note bfd is GPL
6
+ with -lbfd ; libbfd.a is in binutils-dev
7
+ */
8
+ #ifdef _MSC_VER
9
+ #error "not supported"
10
+ #endif
11
+ #include <unistd.h>
12
+ #include <bfd.h>
13
+ #include <string>
14
+
15
+ namespace cybozu {
16
+
17
+ struct Bfd {
18
+ struct bfd *bfd;
19
+ explicit Bfd(const std::string& fileName = "")
20
+ : bfd(0)
21
+ {
22
+ bfd_init();
23
+
24
+ const char *file = fileName.c_str();
25
+ #if 0
26
+ if (*file == '\0') {
27
+ file = "/proc/self/exe";
28
+ }
29
+ #else
30
+ /*
31
+ /proc/self/exe does not point to self-binary on valgrind,
32
+ so use readlink to get correct self-binary
33
+ */
34
+ std::string path;
35
+ if (*file == '\0') {
36
+ path.resize(4096);
37
+ int ret = readlink("/proc/self/exe", &path[0], path.size() - 2);
38
+ if (ret <= 0) {
39
+ perror("ERR:cybozu:StackTrace:Bfd:readlink");
40
+ return;
41
+ }
42
+ path.resize(ret);
43
+ file = path.c_str();
44
+ }
45
+ #endif
46
+ bfd = bfd_openr(file, 0);
47
+ if (bfd == 0) {
48
+ perror("ERR:cybozu:StackTrace:Bfd:bfd_opener");
49
+ return;
50
+ }
51
+ if (!bfd_check_format(bfd, bfd_object)) {
52
+ perror("ERR:cybozu:StackTrace:Bfd:bfd_check_format");
53
+ return;
54
+ }
55
+ }
56
+ ~Bfd()
57
+ {
58
+ if (bfd == 0) return;
59
+ if (!bfd_close(bfd)) {
60
+ fprintf(stderr, "ERR:cybozu:StackTrace:Bfd:bfd_close\n");
61
+ }
62
+ }
63
+ bool getInfo(std::string* pFile, std::string* pFunc, int *pLine, const void *addr)
64
+ {
65
+ if (bfd == 0) return false;
66
+ Data data(addr, pFile, pFunc);
67
+ bfd_map_over_sections(bfd, findAddress, &data);
68
+ *pLine = data.line;
69
+ return data.found;
70
+ }
71
+ private:
72
+ struct Data {
73
+ bfd_vma pc;
74
+ std::string *pFile;
75
+ std::string *pFunc;
76
+ unsigned int line;
77
+ bool found;
78
+ Data(const void *addr, std::string *pFile, std::string *pFunc)
79
+ : pc(bfd_vma(addr))
80
+ , pFile(pFile)
81
+ , pFunc(pFunc)
82
+ , line(0)
83
+ , found(false)
84
+ {
85
+ }
86
+ };
87
+ static inline void findAddress(struct bfd *bfd, asection *section, void *self)
88
+ {
89
+ Data *data = (Data*)self;
90
+ if (data->found) return;
91
+ if (section == 0) return;
92
+ bfd_vma vma = bfd_section_vma(bfd, section);
93
+ if (data->pc < vma) return;
94
+ bfd_size_type size = bfd_section_size(section);
95
+ if (data->pc >= vma + size) return;
96
+ const char *file;
97
+ const char *func;
98
+ data->found = bfd_find_nearest_line(bfd, section, NULL, data->pc - vma, &file, &func, &data->line);
99
+ if (!data->found) return;
100
+ if (file) *data->pFile = file;
101
+ if (func) *data->pFunc = func;
102
+ }
103
+ };
104
+
105
+ } // cybozu
@@ -0,0 +1,139 @@
1
+ #pragma once
2
+ /**
3
+ @file
4
+ @brief bit operation
5
+ */
6
+ #include <assert.h>
7
+ #include <cybozu/inttype.hpp>
8
+
9
+ #if (CYBOZU_HOST == CYBOZU_HOST_INTEL)
10
+ #if defined(_WIN32)
11
+ #include <intrin.h>
12
+ #elif defined(__linux__) || defined(__CYGWIN__) || defined(__clang__)
13
+ #include <x86intrin.h>
14
+ #elif defined(__GNUC__)
15
+ #include <emmintrin.h>
16
+ #endif
17
+ #endif
18
+
19
+ namespace cybozu {
20
+
21
+ namespace bit_op_local {
22
+
23
+ template<bool equalTo8>
24
+ struct Tag {};
25
+
26
+ // sizeof(T) < 8
27
+ template<>
28
+ struct Tag<false> {
29
+ template<class T>
30
+ static inline int bsf(T x)
31
+ {
32
+ #if defined(_MSC_VER)
33
+ unsigned long out;
34
+ _BitScanForward(&out, x);
35
+ #pragma warning(suppress: 6102)
36
+ return out;
37
+ #else
38
+ return __builtin_ctz(x);
39
+ #endif
40
+ }
41
+ template<class T>
42
+ static inline int bsr(T x)
43
+ {
44
+ #if defined(_MSC_VER)
45
+ unsigned long out;
46
+ _BitScanReverse(&out, x);
47
+ #pragma warning(suppress: 6102)
48
+ return out;
49
+ #else
50
+ return __builtin_clz(x) ^ 0x1f;
51
+ #endif
52
+ }
53
+ };
54
+
55
+ // sizeof(T) == 8
56
+ template<>
57
+ struct Tag<true> {
58
+ template<class T>
59
+ static inline int bsf(T x)
60
+ {
61
+ #if defined(_MSC_VER) && defined(_WIN64)
62
+ unsigned long out;
63
+ _BitScanForward64(&out, x);
64
+ #pragma warning(suppress: 6102)
65
+ return out;
66
+ #elif defined(__x86_64__)
67
+ return __builtin_ctzll(x);
68
+ #else
69
+ const uint32_t L = uint32_t(x);
70
+ if (L) return Tag<false>::bsf(L);
71
+ const uint32_t H = uint32_t(x >> 32);
72
+ return Tag<false>::bsf(H) + 32;
73
+ #endif
74
+ }
75
+ template<class T>
76
+ static inline int bsr(T x)
77
+ {
78
+ #if defined(_MSC_VER) && defined(_WIN64)
79
+ unsigned long out;
80
+ _BitScanReverse64(&out, x);
81
+ #pragma warning(suppress: 6102)
82
+ return out;
83
+ #elif defined(__x86_64__)
84
+ return __builtin_clzll(x) ^ 0x3f;
85
+ #else
86
+ const uint32_t H = uint32_t(x >> 32);
87
+ if (H) return Tag<false>::bsr(H) + 32;
88
+ const uint32_t L = uint32_t(x);
89
+ return Tag<false>::bsr(L);
90
+ #endif
91
+ }
92
+ };
93
+
94
+ } // bit_op_local
95
+
96
+ template<class T>
97
+ int bsf(T x)
98
+ {
99
+ return bit_op_local::Tag<sizeof(T) == 8>::bsf(x);
100
+ }
101
+ template<class T>
102
+ int bsr(T x)
103
+ {
104
+ return bit_op_local::Tag<sizeof(T) == 8>::bsr(x);
105
+ }
106
+
107
+ template<class T>
108
+ uint64_t makeBitMask64(T x)
109
+ {
110
+ assert(x < 64);
111
+ return (uint64_t(1) << x) - 1;
112
+ }
113
+
114
+ template<class T>
115
+ uint32_t popcnt(T x);
116
+
117
+ template<>
118
+ inline uint32_t popcnt<uint32_t>(uint32_t x)
119
+ {
120
+ #if defined(_MSC_VER)
121
+ return static_cast<uint32_t>(_mm_popcnt_u32(x));
122
+ #else
123
+ return static_cast<uint32_t>(__builtin_popcount(x));
124
+ #endif
125
+ }
126
+
127
+ template<>
128
+ inline uint32_t popcnt<uint64_t>(uint64_t x)
129
+ {
130
+ #if defined(__x86_64__)
131
+ return static_cast<uint32_t>(__builtin_popcountll(x));
132
+ #elif defined(_WIN64)
133
+ return static_cast<uint32_t>(_mm_popcnt_u64(x));
134
+ #else
135
+ return popcnt<uint32_t>(static_cast<uint32_t>(x)) + popcnt<uint32_t>(static_cast<uint32_t>(x >> 32));
136
+ #endif
137
+ }
138
+
139
+ } // cybozu