ooxml_crypt 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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