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.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +58 -0
- data/Rakefile +12 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/ext/ooxml_crypt/extconf.rb +18 -0
- data/ext/ooxml_crypt/ooxml_crypt.c +27 -0
- data/ext/ooxml_crypt/ooxml_crypt.h +7 -0
- data/lib/ooxml_crypt/version.rb +5 -0
- data/lib/ooxml_crypt.rb +75 -0
- data/vendor/cybozulib/.github/workflows/main.yml +12 -0
- data/vendor/cybozulib/.gitignore +5 -0
- data/vendor/cybozulib/CMakeLists.txt +6 -0
- data/vendor/cybozulib/COPYRIGHT +27 -0
- data/vendor/cybozulib/Makefile +26 -0
- data/vendor/cybozulib/bin/libeay32.dll +0 -0
- data/vendor/cybozulib/bin/libmecab.dll +0 -0
- data/vendor/cybozulib/bin/ssleay32.dll +0 -0
- data/vendor/cybozulib/common.mk +116 -0
- data/vendor/cybozulib/common.props +25 -0
- data/vendor/cybozulib/cybozulib.sln +286 -0
- data/vendor/cybozulib/debug.props +14 -0
- data/vendor/cybozulib/include/cybozu/array.hpp +197 -0
- data/vendor/cybozulib/include/cybozu/atoi.hpp +238 -0
- data/vendor/cybozulib/include/cybozu/atomic.hpp +146 -0
- data/vendor/cybozulib/include/cybozu/base64.hpp +210 -0
- data/vendor/cybozulib/include/cybozu/benchmark.hpp +212 -0
- data/vendor/cybozulib/include/cybozu/bfd.hpp +105 -0
- data/vendor/cybozulib/include/cybozu/bit_operation.hpp +139 -0
- data/vendor/cybozulib/include/cybozu/bitvector.hpp +358 -0
- data/vendor/cybozulib/include/cybozu/condition_variable.hpp +113 -0
- data/vendor/cybozulib/include/cybozu/condition_variable_cs.hpp +74 -0
- data/vendor/cybozulib/include/cybozu/config.hpp +392 -0
- data/vendor/cybozulib/include/cybozu/critical_section.hpp +60 -0
- data/vendor/cybozulib/include/cybozu/crypto.hpp +321 -0
- data/vendor/cybozulib/include/cybozu/csucvector.hpp +624 -0
- data/vendor/cybozulib/include/cybozu/csv.hpp +294 -0
- data/vendor/cybozulib/include/cybozu/data_type.hpp +27 -0
- data/vendor/cybozulib/include/cybozu/endian.hpp +224 -0
- data/vendor/cybozulib/include/cybozu/env.hpp +63 -0
- data/vendor/cybozulib/include/cybozu/event.hpp +122 -0
- data/vendor/cybozulib/include/cybozu/exception.hpp +253 -0
- data/vendor/cybozulib/include/cybozu/file.hpp +626 -0
- data/vendor/cybozulib/include/cybozu/fmindex.hpp +291 -0
- data/vendor/cybozulib/include/cybozu/format.hpp +93 -0
- data/vendor/cybozulib/include/cybozu/frequency.hpp +264 -0
- data/vendor/cybozulib/include/cybozu/hash.hpp +67 -0
- data/vendor/cybozulib/include/cybozu/inttype.hpp +174 -0
- data/vendor/cybozulib/include/cybozu/itoa.hpp +336 -0
- data/vendor/cybozulib/include/cybozu/json.hpp +120 -0
- data/vendor/cybozulib/include/cybozu/line_stream.hpp +149 -0
- data/vendor/cybozulib/include/cybozu/link_libeay32.hpp +21 -0
- data/vendor/cybozulib/include/cybozu/link_mpir.hpp +18 -0
- data/vendor/cybozulib/include/cybozu/link_ssleay32.hpp +19 -0
- data/vendor/cybozulib/include/cybozu/log.hpp +237 -0
- data/vendor/cybozulib/include/cybozu/minixml.hpp +452 -0
- data/vendor/cybozulib/include/cybozu/mmap.hpp +143 -0
- data/vendor/cybozulib/include/cybozu/mutex.hpp +144 -0
- data/vendor/cybozulib/include/cybozu/nlp/mecab.hpp +96 -0
- data/vendor/cybozulib/include/cybozu/nlp/plsi.hpp +315 -0
- data/vendor/cybozulib/include/cybozu/nlp/random.hpp +74 -0
- data/vendor/cybozulib/include/cybozu/nlp/sparse.hpp +529 -0
- data/vendor/cybozulib/include/cybozu/nlp/svd.hpp +486 -0
- data/vendor/cybozulib/include/cybozu/nlp/tfidf.hpp +226 -0
- data/vendor/cybozulib/include/cybozu/nlp/top_score.hpp +75 -0
- data/vendor/cybozulib/include/cybozu/option.hpp +743 -0
- data/vendor/cybozulib/include/cybozu/parallel.hpp +88 -0
- data/vendor/cybozulib/include/cybozu/pcg.hpp +72 -0
- data/vendor/cybozulib/include/cybozu/process.hpp +324 -0
- data/vendor/cybozulib/include/cybozu/quit_signal_handler.hpp +66 -0
- data/vendor/cybozulib/include/cybozu/random_generator.hpp +144 -0
- data/vendor/cybozulib/include/cybozu/regex.hpp +463 -0
- data/vendor/cybozulib/include/cybozu/select8.hpp +279 -0
- data/vendor/cybozulib/include/cybozu/serializer.hpp +363 -0
- data/vendor/cybozulib/include/cybozu/sha1.hpp +209 -0
- data/vendor/cybozulib/include/cybozu/sha2.hpp +506 -0
- data/vendor/cybozulib/include/cybozu/siphash.hpp +105 -0
- data/vendor/cybozulib/include/cybozu/socket.hpp +785 -0
- data/vendor/cybozulib/include/cybozu/ssl.hpp +203 -0
- data/vendor/cybozulib/include/cybozu/stacktrace.hpp +291 -0
- data/vendor/cybozulib/include/cybozu/stream.hpp +269 -0
- data/vendor/cybozulib/include/cybozu/string.hpp +1746 -0
- data/vendor/cybozulib/include/cybozu/string_operation.hpp +365 -0
- data/vendor/cybozulib/include/cybozu/sucvector.hpp +378 -0
- data/vendor/cybozulib/include/cybozu/test.hpp +373 -0
- data/vendor/cybozulib/include/cybozu/thread.hpp +229 -0
- data/vendor/cybozulib/include/cybozu/time.hpp +281 -0
- data/vendor/cybozulib/include/cybozu/tls.hpp +115 -0
- data/vendor/cybozulib/include/cybozu/unordered_map.hpp +13 -0
- data/vendor/cybozulib/include/cybozu/unordered_set.hpp +13 -0
- data/vendor/cybozulib/include/cybozu/v128.hpp +376 -0
- data/vendor/cybozulib/include/cybozu/wavelet_matrix.hpp +345 -0
- data/vendor/cybozulib/include/cybozu/xorshift.hpp +189 -0
- data/vendor/cybozulib/include/cybozu/zlib.hpp +325 -0
- data/vendor/cybozulib/include/sais.hxx +364 -0
- data/vendor/cybozulib/misc/make_select8tbl.cpp +26 -0
- data/vendor/cybozulib/mk.bat +37 -0
- data/vendor/cybozulib/readme.md +29 -0
- data/vendor/cybozulib/release.props +12 -0
- data/vendor/cybozulib/sample/Makefile +30 -0
- data/vendor/cybozulib/sample/csucvector_smpl.cpp +42 -0
- data/vendor/cybozulib/sample/data/svd/org/test1.S +4 -0
- data/vendor/cybozulib/sample/data/svd/org/test1.U +4 -0
- data/vendor/cybozulib/sample/data/svd/org/test1.V +6 -0
- data/vendor/cybozulib/sample/data/svd/test1 +4 -0
- data/vendor/cybozulib/sample/data/svd/test2 +4 -0
- data/vendor/cybozulib/sample/desymbol.cpp +127 -0
- data/vendor/cybozulib/sample/exception_smpl.cpp +46 -0
- data/vendor/cybozulib/sample/fmindex_smpl.cpp +231 -0
- data/vendor/cybozulib/sample/log_smpl.cpp +19 -0
- data/vendor/cybozulib/sample/mecab_smpl.cpp +37 -0
- data/vendor/cybozulib/sample/option2_smpl.cpp +68 -0
- data/vendor/cybozulib/sample/option_smpl.cpp +42 -0
- data/vendor/cybozulib/sample/plsi_smpl.cpp +207 -0
- data/vendor/cybozulib/sample/proj/exception_smpl.vcproj +184 -0
- data/vendor/cybozulib/sample/proj/mecab_smpl.vcproj +184 -0
- data/vendor/cybozulib/sample/proj/ssl_smpl/ssl_smpl.vcxproj +85 -0
- data/vendor/cybozulib/sample/proj/ssl_smpl.vcproj +347 -0
- data/vendor/cybozulib/sample/proj/stacktrace_smpl/stacktrace_smpl.vcxproj +85 -0
- data/vendor/cybozulib/sample/proj/svd_smpl.vcproj +184 -0
- data/vendor/cybozulib/sample/quit_signal_handler.cpp +30 -0
- data/vendor/cybozulib/sample/serializer_smpl.cpp +196 -0
- data/vendor/cybozulib/sample/socket_smpl.cpp +82 -0
- data/vendor/cybozulib/sample/ssl_smpl.cpp +39 -0
- data/vendor/cybozulib/sample/stacktrace_smpl.cpp +52 -0
- data/vendor/cybozulib/sample/svd_bench_smpl.cpp +143 -0
- data/vendor/cybozulib/sample/svd_smpl.cpp +94 -0
- data/vendor/cybozulib/sample/wm_bench_smpl.cpp +182 -0
- data/vendor/cybozulib/sample/zlib_smpl.cpp +41 -0
- data/vendor/cybozulib/src/Makefile +8 -0
- data/vendor/cybozulib/src/base/Makefile +19 -0
- data/vendor/cybozulib/test/Makefile +12 -0
- data/vendor/cybozulib/test/base/Makefile +37 -0
- data/vendor/cybozulib/test/base/array_test.cpp +173 -0
- data/vendor/cybozulib/test/base/atoi_test.cpp +774 -0
- data/vendor/cybozulib/test/base/atomic_test.cpp +49 -0
- data/vendor/cybozulib/test/base/base64_test.cpp +113 -0
- data/vendor/cybozulib/test/base/bit_operation_test.cpp +134 -0
- data/vendor/cybozulib/test/base/bitvector_test.cpp +204 -0
- data/vendor/cybozulib/test/base/condition_variable_cs_test.cpp +92 -0
- data/vendor/cybozulib/test/base/condition_variable_test.cpp +88 -0
- data/vendor/cybozulib/test/base/config_test.cpp +236 -0
- data/vendor/cybozulib/test/base/crypto_test.cpp +122 -0
- data/vendor/cybozulib/test/base/csucvector_test.cpp +63 -0
- data/vendor/cybozulib/test/base/csv_test.cpp +182 -0
- data/vendor/cybozulib/test/base/data/a.xml +26 -0
- data/vendor/cybozulib/test/base/endian_test.cpp +56 -0
- data/vendor/cybozulib/test/base/env_test.cpp +22 -0
- data/vendor/cybozulib/test/base/event_test.cpp +41 -0
- data/vendor/cybozulib/test/base/file_test.cpp +233 -0
- data/vendor/cybozulib/test/base/fmindex_test.cpp +118 -0
- data/vendor/cybozulib/test/base/format_test.cpp +12 -0
- data/vendor/cybozulib/test/base/frequency_test.cpp +104 -0
- data/vendor/cybozulib/test/base/itoa_test.cpp +522 -0
- data/vendor/cybozulib/test/base/line_stream_test.cpp +208 -0
- data/vendor/cybozulib/test/base/mecab_test.cpp +41 -0
- data/vendor/cybozulib/test/base/minixml_test.cpp +103 -0
- data/vendor/cybozulib/test/base/mmap_test.cpp +15 -0
- data/vendor/cybozulib/test/base/option_test.cpp +487 -0
- data/vendor/cybozulib/test/base/parallel_test.cpp +48 -0
- data/vendor/cybozulib/test/base/proj/array_test/array_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/atoi_test/atoi_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/atomic_test/atomic_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/base64_test/base64_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/condition_variable_cs_test/condition_variable_cs_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/condition_variable_test/condition_variable_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/config_test/config_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/csv_test/csv_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/endian_test/endian_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/env_test/env_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/event_test/event_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/file_test/file_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/itoa_test/itoa_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/mecab_test/mecab_test.vcxproj +88 -0
- data/vendor/cybozulib/test/base/proj/minixml_test/minixml_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/mmap_test/mmap_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/serializer_test/serializer_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/sha1_test/sha1_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/stream_test/stream_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/string_operation_test/string_operation_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/string_test/string_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/thread_test/thread_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/time_test/time_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/tls_test/tls_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/zlib_test/zlib_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/random_generator_test.cpp +28 -0
- data/vendor/cybozulib/test/base/regex_test.cpp +74 -0
- data/vendor/cybozulib/test/base/serializer_test.cpp +483 -0
- data/vendor/cybozulib/test/base/sha1_test.cpp +61 -0
- data/vendor/cybozulib/test/base/sha2_test.cpp +191 -0
- data/vendor/cybozulib/test/base/siphash_test.cpp +33 -0
- data/vendor/cybozulib/test/base/socket_test.cpp +76 -0
- data/vendor/cybozulib/test/base/stream_test.cpp +101 -0
- data/vendor/cybozulib/test/base/string_operation_test.cpp +340 -0
- data/vendor/cybozulib/test/base/string_test.cpp +1705 -0
- data/vendor/cybozulib/test/base/sucvector_test.cpp +312 -0
- data/vendor/cybozulib/test/base/thread_test.cpp +62 -0
- data/vendor/cybozulib/test/base/time_test.cpp +164 -0
- data/vendor/cybozulib/test/base/tls_test.cpp +50 -0
- data/vendor/cybozulib/test/base/wavelet_matrix_test.cpp +145 -0
- data/vendor/cybozulib/test/base/zlib_test.cpp +371 -0
- data/vendor/cybozulib/test/nlp/Makefile +27 -0
- data/vendor/cybozulib/test/nlp/proj/random_test.vcproj +184 -0
- data/vendor/cybozulib/test/nlp/proj/sparse_test.vcproj +184 -0
- data/vendor/cybozulib/test/nlp/proj/svd_test.vcproj +184 -0
- data/vendor/cybozulib/test/nlp/random_test.cpp +62 -0
- data/vendor/cybozulib/test/nlp/sparse_test.cpp +347 -0
- data/vendor/cybozulib/test/nlp/svd_test.cpp +234 -0
- data/vendor/cybozulib/test/nlp/top_score_test.cpp +40 -0
- data/vendor/cybozulib/tool/create_vcproj.py +186 -0
- data/vendor/cybozulib/tool/vcproj_tmpl.py +185 -0
- data/vendor/msoffice/COPYRIGHT +27 -0
- data/vendor/msoffice/Makefile +29 -0
- data/vendor/msoffice/bin/64/msoc.dll +0 -0
- data/vendor/msoffice/bin/64/msocsample.exe +0 -0
- data/vendor/msoffice/bin/64/msoffice-crypt.exe +0 -0
- data/vendor/msoffice/bin/msoc.dll +0 -0
- data/vendor/msoffice/bin/msocsample.exe +0 -0
- data/vendor/msoffice/bin/msoffice-crypt.exe +0 -0
- data/vendor/msoffice/common.mk +71 -0
- data/vendor/msoffice/common.props +26 -0
- data/vendor/msoffice/debug.props +14 -0
- data/vendor/msoffice/include/attack.hpp +211 -0
- data/vendor/msoffice/include/cfb.hpp +777 -0
- data/vendor/msoffice/include/crypto_util.hpp +450 -0
- data/vendor/msoffice/include/custom_sha1.hpp +342 -0
- data/vendor/msoffice/include/decode.hpp +240 -0
- data/vendor/msoffice/include/encode.hpp +221 -0
- data/vendor/msoffice/include/make_dataspace.hpp +316 -0
- data/vendor/msoffice/include/msoc.h +129 -0
- data/vendor/msoffice/include/resource.hpp +7 -0
- data/vendor/msoffice/include/standard_encryption.hpp +145 -0
- data/vendor/msoffice/include/uint32vec.hpp +179 -0
- data/vendor/msoffice/include/util.hpp +212 -0
- data/vendor/msoffice/lib/.emptydir +0 -0
- data/vendor/msoffice/misc/decrypt-xls.vbs +46 -0
- data/vendor/msoffice/mk.bat +1 -0
- data/vendor/msoffice/mkdll.bat +3 -0
- data/vendor/msoffice/msoc.def +13 -0
- data/vendor/msoffice/msocsample.py +178 -0
- data/vendor/msoffice/msoffice12.sln +31 -0
- data/vendor/msoffice/readme.md +110 -0
- data/vendor/msoffice/release.props +28 -0
- data/vendor/msoffice/src/Makefile +19 -0
- data/vendor/msoffice/src/attack.cpp +124 -0
- data/vendor/msoffice/src/cfb_test.cpp +77 -0
- data/vendor/msoffice/src/minisample.c +54 -0
- data/vendor/msoffice/src/msocdll.cpp +276 -0
- data/vendor/msoffice/src/msocsample.c +136 -0
- data/vendor/msoffice/src/msoffice-crypt.cpp +219 -0
- data/vendor/msoffice/src/proj/attack/attack.vcxproj +88 -0
- data/vendor/msoffice/src/proj/main/msoffice-crypt.vcxproj +88 -0
- data/vendor/msoffice/src/sha1.cpp +234 -0
- data/vendor/msoffice/test/Makefile +20 -0
- data/vendor/msoffice/test/cfb_test.cpp +74 -0
- data/vendor/msoffice/test/hash_test.cpp +59 -0
- data/vendor/msoffice/test/proj/cfb/cfb_test.vcxproj +90 -0
- data/vendor/msoffice/test/proj/hash/hash_test.vcxproj +90 -0
- data/vendor/msoffice/test/sampl.bat +8 -0
- data/vendor/msoffice/test_all.py +46 -0
- data/vendor/update +4 -0
- metadata +351 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief parallel for
|
|
5
|
+
@author MITSUNARI Shigeo(@herumi)
|
|
6
|
+
@license modified new BSD license
|
|
7
|
+
http://opensource.org/licenses/BSD-3-Clause
|
|
8
|
+
*/
|
|
9
|
+
#include <cybozu/exception.hpp>
|
|
10
|
+
#include <cybozu/thread.hpp>
|
|
11
|
+
#include <cybozu/array.hpp>
|
|
12
|
+
|
|
13
|
+
namespace cybozu {
|
|
14
|
+
|
|
15
|
+
namespace parallel_util {
|
|
16
|
+
|
|
17
|
+
template<class T, class N>
|
|
18
|
+
struct Thread : public cybozu::ThreadBase {
|
|
19
|
+
T *t_;
|
|
20
|
+
N begin_;
|
|
21
|
+
N end_;
|
|
22
|
+
N threadIdx_;
|
|
23
|
+
std::string err_;
|
|
24
|
+
Thread()
|
|
25
|
+
: t_(0)
|
|
26
|
+
, begin_(0)
|
|
27
|
+
, end_(0)
|
|
28
|
+
, threadIdx_(0)
|
|
29
|
+
{
|
|
30
|
+
}
|
|
31
|
+
void init(T& t, N begin, N end, N threadIdx)
|
|
32
|
+
{
|
|
33
|
+
t_ = &t;
|
|
34
|
+
begin_ = begin;
|
|
35
|
+
end_ = end;
|
|
36
|
+
threadIdx_ = threadIdx;
|
|
37
|
+
err_.clear();
|
|
38
|
+
}
|
|
39
|
+
void threadEntry()
|
|
40
|
+
{
|
|
41
|
+
for (N i = begin_; i < end_; i++) {
|
|
42
|
+
try {
|
|
43
|
+
if (!(*t_)(i, threadIdx_)) break;
|
|
44
|
+
} catch (std::exception& e) {
|
|
45
|
+
err_ = e.what();
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const std::string& getErr() const { return err_; }
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
} // parallel_util
|
|
54
|
+
/*
|
|
55
|
+
void T::f(N i, size_t threadIdx);
|
|
56
|
+
*/
|
|
57
|
+
template<class T, class N>
|
|
58
|
+
void parallel_for(T& target, N n, N threadNum)
|
|
59
|
+
{
|
|
60
|
+
if (n == 0) return;
|
|
61
|
+
if (threadNum == 0) throw cybozu::Exception("cybozu:parallel_for:threadNum is zero");
|
|
62
|
+
if ((N)threadNum > n) threadNum = (size_t)n;
|
|
63
|
+
typedef parallel_util::Thread<T, N> Thread;
|
|
64
|
+
{
|
|
65
|
+
cybozu::ScopedArray<Thread> thread(threadNum);
|
|
66
|
+
const N q = N(n / threadNum);
|
|
67
|
+
const N r = N(n % threadNum);
|
|
68
|
+
N begin = 0;
|
|
69
|
+
for (N i = 0; i < threadNum; i++) {
|
|
70
|
+
N end = begin + q;
|
|
71
|
+
if (i < r) end++;
|
|
72
|
+
thread[i].init(target, begin, end, i);
|
|
73
|
+
begin = end;
|
|
74
|
+
}
|
|
75
|
+
for (N i = 0; i < threadNum; i++) {
|
|
76
|
+
if (!thread[i].beginThread()) throw cybozu::Exception("cybozu:parallel_for:can't beginThread") << i;
|
|
77
|
+
}
|
|
78
|
+
for (N i = 0; i < threadNum; i++) {
|
|
79
|
+
if (!thread[i].joinThread()) throw cybozu::Exception("cybozu:parallel_for:can't joinThread") << i;
|
|
80
|
+
}
|
|
81
|
+
for (N i = 0; i < threadNum; i++) {
|
|
82
|
+
const std::string& err = thread[i].getErr();
|
|
83
|
+
if (!err.empty()) throw cybozu::Exception("cybozu:paralell_for") << i << err;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
} // cybozu
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief PCG
|
|
5
|
+
@see http://www.pcg-random.org/
|
|
6
|
+
|
|
7
|
+
@author MITSUNARI Shigeo(@herumi)
|
|
8
|
+
@author MITSUNARI Shigeo
|
|
9
|
+
*/
|
|
10
|
+
#include <cybozu/inttype.hpp>
|
|
11
|
+
#include <stdlib.h> // for _rotr
|
|
12
|
+
|
|
13
|
+
namespace cybozu {
|
|
14
|
+
|
|
15
|
+
class Pcg32 {
|
|
16
|
+
public:
|
|
17
|
+
uint64_t state;
|
|
18
|
+
uint32_t rotr(uint32_t x, uint32_t r) const
|
|
19
|
+
{
|
|
20
|
+
#if defined(__GNUC__) && (CYBOZU_HOST == CYBOZU_HOST_INTEL)
|
|
21
|
+
__asm__ volatile("rorl %%cl, %0" : "=r"(x) : "0"(x), "c"(r));
|
|
22
|
+
return x;
|
|
23
|
+
#elif defined(_MSC_VER)
|
|
24
|
+
return _rotr(x, r);
|
|
25
|
+
#else
|
|
26
|
+
return (x >> r) | (x << ((-r) & 31));
|
|
27
|
+
#endif
|
|
28
|
+
}
|
|
29
|
+
public:
|
|
30
|
+
explicit Pcg32(uint64_t state = uint64_t(0x185706b82c2e03f8ULL))
|
|
31
|
+
: state(state)
|
|
32
|
+
{
|
|
33
|
+
}
|
|
34
|
+
uint32_t get32()
|
|
35
|
+
{
|
|
36
|
+
uint64_t old = state;
|
|
37
|
+
state = old * 6364136223846793005ULL + 0x6d;
|
|
38
|
+
uint32_t x = uint32_t(((old >> 18u) ^ old) >> 27u);
|
|
39
|
+
uint32_t r = uint32_t(old >> 59u);
|
|
40
|
+
return rotr(x, r);
|
|
41
|
+
}
|
|
42
|
+
uint32_t operator()() { return get32(); }
|
|
43
|
+
uint64_t get64()
|
|
44
|
+
{
|
|
45
|
+
uint32_t a = get32();
|
|
46
|
+
uint32_t b = get32();
|
|
47
|
+
return (uint64_t(a) << 32) | b;
|
|
48
|
+
}
|
|
49
|
+
template<class T>
|
|
50
|
+
void read(T *x, size_t n)
|
|
51
|
+
{
|
|
52
|
+
const size_t size = sizeof(T) * n;
|
|
53
|
+
uint8_t *p8 = static_cast<uint8_t*>(x);
|
|
54
|
+
for (size_t i = 0; i < size; i++) {
|
|
55
|
+
p8[i] = static_cast<uint8_t>(get32());
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
void read(uint32_t *x, size_t n)
|
|
59
|
+
{
|
|
60
|
+
for (size_t i = 0; i < n; i++) {
|
|
61
|
+
x[i] = get32();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
void read(uint64_t *x, size_t n)
|
|
65
|
+
{
|
|
66
|
+
for (size_t i = 0; i < n; i++) {
|
|
67
|
+
x[i] = get64();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
} // cybozu
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
@file
|
|
5
|
+
@brief process class
|
|
6
|
+
|
|
7
|
+
@author MITSUNARI Shigeo(@herumi)
|
|
8
|
+
@author MITSUNARI Shigeo
|
|
9
|
+
*/
|
|
10
|
+
#include <vector>
|
|
11
|
+
#include <string>
|
|
12
|
+
#include <assert.h>
|
|
13
|
+
#include <cybozu/exception.hpp>
|
|
14
|
+
|
|
15
|
+
#ifdef _WIN32
|
|
16
|
+
#ifndef WIN32_LEAN_AND_MEAN
|
|
17
|
+
#define WIN32_LEAN_AND_MEAN
|
|
18
|
+
#endif
|
|
19
|
+
#include <windows.h>
|
|
20
|
+
#else
|
|
21
|
+
#include <unistd.h>
|
|
22
|
+
#include <fcntl.h>
|
|
23
|
+
#include <sys/types.h>
|
|
24
|
+
#include <sys/wait.h>
|
|
25
|
+
#include <stdlib.h>
|
|
26
|
+
#endif
|
|
27
|
+
|
|
28
|
+
namespace cybozu {
|
|
29
|
+
|
|
30
|
+
namespace process {
|
|
31
|
+
|
|
32
|
+
#ifdef _WIN32
|
|
33
|
+
typedef HANDLE Handle;
|
|
34
|
+
const Handle InvalidHandle = (Handle)0;
|
|
35
|
+
#else
|
|
36
|
+
typedef pid_t Handle;
|
|
37
|
+
const Handle InvalidHandle = (Handle)-1;
|
|
38
|
+
#endif
|
|
39
|
+
|
|
40
|
+
#ifndef _WIN32
|
|
41
|
+
class Pipe {
|
|
42
|
+
int fd_[2];
|
|
43
|
+
public:
|
|
44
|
+
enum Mode {
|
|
45
|
+
Read = 0,
|
|
46
|
+
Write = 1
|
|
47
|
+
};
|
|
48
|
+
Pipe()
|
|
49
|
+
{
|
|
50
|
+
fd_[0] = fd_[1] = -1;
|
|
51
|
+
}
|
|
52
|
+
bool init()
|
|
53
|
+
{
|
|
54
|
+
if (::pipe (fd_) < 0) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
if (::fcntl (fd_[Write], F_SETFD, FD_CLOEXEC) < 0) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
void close(Mode mode)
|
|
63
|
+
{
|
|
64
|
+
if (fd_[mode] != -1) {
|
|
65
|
+
::close(fd_[mode]);
|
|
66
|
+
fd_[mode] = -1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
int write(const char* buf, size_t size)
|
|
70
|
+
{
|
|
71
|
+
return ::write(fd_[Write], buf, size);
|
|
72
|
+
}
|
|
73
|
+
int read(char* buf, size_t size)
|
|
74
|
+
{
|
|
75
|
+
return ::read(fd_[Read], buf, size);
|
|
76
|
+
}
|
|
77
|
+
~Pipe()
|
|
78
|
+
{
|
|
79
|
+
close(Read);
|
|
80
|
+
close(Write);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
bool toDevNull(int fd, int flags)
|
|
85
|
+
{
|
|
86
|
+
int newFd = open("/dev/null", flags);
|
|
87
|
+
|
|
88
|
+
if (newFd < 0) return false;
|
|
89
|
+
|
|
90
|
+
int ret = dup2(newFd, fd);
|
|
91
|
+
close(newFd);
|
|
92
|
+
return ret >= 0;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
#endif
|
|
96
|
+
|
|
97
|
+
inline std::string escape(const std::string& in)
|
|
98
|
+
{
|
|
99
|
+
std::string out;
|
|
100
|
+
for (size_t i = 0, n = in.size(); i < n; i++) {
|
|
101
|
+
char c = in[i];
|
|
102
|
+
if (c == '"') {
|
|
103
|
+
out += "\\\"";
|
|
104
|
+
} else {
|
|
105
|
+
out += c;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
start process and return the handle of it
|
|
113
|
+
argv[0] = exe
|
|
114
|
+
*/
|
|
115
|
+
static inline bool Start(Handle* hdl, const std::string& exe, const std::vector<std::string>& arg, bool closeStdio = true)
|
|
116
|
+
{
|
|
117
|
+
#ifdef _WIN32
|
|
118
|
+
cybozu::disable_warning_unused_variable(closeStdio);
|
|
119
|
+
PROCESS_INFORMATION pi;
|
|
120
|
+
STARTUPINFO si;
|
|
121
|
+
memset(&si, 0, sizeof(si));
|
|
122
|
+
si.cb = sizeof(si);
|
|
123
|
+
std::string cmdLine = "\"" + exe + '"';
|
|
124
|
+
|
|
125
|
+
for (size_t i = 0, n = arg.size(); i < n; i++) {
|
|
126
|
+
cmdLine += " \"" + escape(arg[i]) + '"';
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
cmdLine += '\0';
|
|
130
|
+
|
|
131
|
+
if (!CreateProcess(exe.c_str(), &cmdLine[0], NULL, NULL, FALSE
|
|
132
|
+
/* Advanced Windows p.123 */
|
|
133
|
+
, CREATE_NO_WINDOW | CREATE_NEW_PROCESS_GROUP | CREATE_DEFAULT_ERROR_MODE, NULL, 0, &si, &pi)) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (pi.hThread) CloseHandle(pi.hThread);
|
|
138
|
+
|
|
139
|
+
// if (pi.hProcess) CloseHandle(pi.hProcess);
|
|
140
|
+
*hdl = pi.hProcess;
|
|
141
|
+
return true;
|
|
142
|
+
#else
|
|
143
|
+
Pipe pipe;
|
|
144
|
+
|
|
145
|
+
if (!pipe.init()) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
pid_t pid = fork();
|
|
150
|
+
|
|
151
|
+
if (pid < 0) {
|
|
152
|
+
return false;
|
|
153
|
+
|
|
154
|
+
} else if (pid == 0) {
|
|
155
|
+
pipe.close(Pipe::Read);
|
|
156
|
+
std::vector<char*> argv;
|
|
157
|
+
argv.push_back(const_cast<char*>(exe.c_str()));
|
|
158
|
+
|
|
159
|
+
for (size_t i = 0, n = arg.size(); i < n; i++) {
|
|
160
|
+
argv.push_back(const_cast<char*>(arg[i].c_str()));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
argv.push_back(0);
|
|
164
|
+
|
|
165
|
+
if (closeStdio) {
|
|
166
|
+
if (!toDevNull(0, O_RDONLY)) goto ERR_EXIT;
|
|
167
|
+
if (!toDevNull(1, O_RDWR)) goto ERR_EXIT;
|
|
168
|
+
if (!toDevNull(2, O_RDWR)) goto ERR_EXIT;
|
|
169
|
+
}
|
|
170
|
+
{
|
|
171
|
+
const int ret = static_cast<int>(sysconf(_SC_OPEN_MAX));
|
|
172
|
+
const int maxFd = ret < 0 ? 1024 : maxFd;
|
|
173
|
+
for (int i = 3; i < maxFd; i++) {
|
|
174
|
+
close(i);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
execv(exe.c_str(), &argv[0]);
|
|
179
|
+
ERR_EXIT:
|
|
180
|
+
/*
|
|
181
|
+
write pipe if execv fails
|
|
182
|
+
*/
|
|
183
|
+
pipe.write("x", 1);
|
|
184
|
+
pipe.close(Pipe::Write);
|
|
185
|
+
::exit(1);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
pipe.close(Pipe::Write);
|
|
189
|
+
char buf[1];
|
|
190
|
+
|
|
191
|
+
/*
|
|
192
|
+
if execv succeeds then Pipe::Read is closed and returns error
|
|
193
|
+
otherwise gets 'x' from child
|
|
194
|
+
*/
|
|
195
|
+
if (pipe.read(buf, 1) == 1) {
|
|
196
|
+
waitpid(pid, 0, WNOHANG);
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
*hdl = pid;
|
|
201
|
+
return true;
|
|
202
|
+
#endif
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
#ifdef _WIN32
|
|
206
|
+
inline bool Close(Handle hdl)
|
|
207
|
+
{
|
|
208
|
+
return CloseHandle(hdl) != 0;
|
|
209
|
+
}
|
|
210
|
+
#else
|
|
211
|
+
inline bool Close(Handle)
|
|
212
|
+
{
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
#endif
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
whether process is alive or not
|
|
219
|
+
@param hdl [in] handle of process
|
|
220
|
+
@param exitCode [out] return exitCode if !IsAlive()
|
|
221
|
+
*/
|
|
222
|
+
inline bool IsAlive(Handle hdl, int* exitCode = 0)
|
|
223
|
+
{
|
|
224
|
+
#ifdef _WIN32
|
|
225
|
+
// int ret = WaitForSingleObject(hdl, 0);
|
|
226
|
+
// return ret == WAIT_TIMEOUT;
|
|
227
|
+
DWORD code;
|
|
228
|
+
if (GetExitCodeProcess(hdl, &code)) {
|
|
229
|
+
if (code == STILL_ACTIVE) {
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
if (exitCode) {
|
|
233
|
+
*exitCode = (int)code;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return false;
|
|
237
|
+
#else
|
|
238
|
+
int status;
|
|
239
|
+
pid_t p = waitpid(hdl, &status, WNOHANG);
|
|
240
|
+
if (p == 0) return true;
|
|
241
|
+
if (p == hdl) {
|
|
242
|
+
if (exitCode) {
|
|
243
|
+
if (WIFEXITED(status)) {
|
|
244
|
+
*exitCode = WEXITSTATUS(status);
|
|
245
|
+
} else {
|
|
246
|
+
*exitCode = -1;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return false;
|
|
251
|
+
#endif
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
} // process
|
|
255
|
+
|
|
256
|
+
class Process {
|
|
257
|
+
mutable process::Handle hdl_;
|
|
258
|
+
void move(const Process& rhs) const
|
|
259
|
+
{
|
|
260
|
+
assert(!isValid());
|
|
261
|
+
hdl_ = rhs.hdl_;
|
|
262
|
+
rhs.hdl_ = process::InvalidHandle;
|
|
263
|
+
}
|
|
264
|
+
void close()
|
|
265
|
+
{
|
|
266
|
+
if (!isValid()) return;
|
|
267
|
+
|
|
268
|
+
process::Close(hdl_);
|
|
269
|
+
hdl_ = process::InvalidHandle;
|
|
270
|
+
}
|
|
271
|
+
public:
|
|
272
|
+
Process()
|
|
273
|
+
: hdl_(process::InvalidHandle)
|
|
274
|
+
{
|
|
275
|
+
}
|
|
276
|
+
~Process()
|
|
277
|
+
{
|
|
278
|
+
close();
|
|
279
|
+
}
|
|
280
|
+
Process(const Process& rhs)
|
|
281
|
+
: hdl_(process::InvalidHandle)
|
|
282
|
+
{
|
|
283
|
+
move(rhs);
|
|
284
|
+
}
|
|
285
|
+
Process& operator=(const Process& rhs)
|
|
286
|
+
{
|
|
287
|
+
if (this != &rhs) {
|
|
288
|
+
move (rhs);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
return *this;
|
|
292
|
+
}
|
|
293
|
+
bool run(const std::string& exe, const std::vector<std::string>& arg = std::vector<std::string>(), bool closeStdio = true)
|
|
294
|
+
{
|
|
295
|
+
close();
|
|
296
|
+
return process::Start(&hdl_, exe, arg, closeStdio);
|
|
297
|
+
}
|
|
298
|
+
bool run(const std::string& exe, const std::string& p1 = "", const std::string& p2 = "", const std::string& p3 = "", const std::string& p4 = "", const std::string& p5 = "", const std::string& p6 = "", const std::string& p7 = "", const std::string& p8 = "", const std::string& p9 = "")
|
|
299
|
+
{
|
|
300
|
+
std::vector<std::string> arg;
|
|
301
|
+
if (!p1.empty()) arg.push_back(p1);
|
|
302
|
+
if (!p2.empty()) arg.push_back(p2);
|
|
303
|
+
if (!p3.empty()) arg.push_back(p3);
|
|
304
|
+
if (!p4.empty()) arg.push_back(p4);
|
|
305
|
+
if (!p5.empty()) arg.push_back(p5);
|
|
306
|
+
if (!p6.empty()) arg.push_back(p6);
|
|
307
|
+
if (!p7.empty()) arg.push_back(p7);
|
|
308
|
+
if (!p8.empty()) arg.push_back(p8);
|
|
309
|
+
if (!p9.empty()) arg.push_back(p9);
|
|
310
|
+
return run(exe, arg, false);
|
|
311
|
+
}
|
|
312
|
+
bool isValid() const
|
|
313
|
+
{
|
|
314
|
+
return hdl_ != process::InvalidHandle;
|
|
315
|
+
}
|
|
316
|
+
bool isAlive(int* exitCode = 0) const
|
|
317
|
+
{
|
|
318
|
+
if (exitCode) *exitCode = 0;
|
|
319
|
+
return isValid() && process::IsAlive(hdl_, exitCode);
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
} // cybozu
|
|
324
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief quit signal handler
|
|
5
|
+
|
|
6
|
+
@author MITSUNARI Shigeo(@herumi)
|
|
7
|
+
*/
|
|
8
|
+
#ifdef _WIN32
|
|
9
|
+
#ifndef WIN32_LEAN_AND_MEAN
|
|
10
|
+
#define WIN32_LEAN_AND_MEAN
|
|
11
|
+
#endif
|
|
12
|
+
#include <windows.h>
|
|
13
|
+
#else
|
|
14
|
+
#include <signal.h>
|
|
15
|
+
#endif
|
|
16
|
+
#include <stdio.h>
|
|
17
|
+
#include <stdlib.h>
|
|
18
|
+
|
|
19
|
+
namespace cybozu {
|
|
20
|
+
|
|
21
|
+
/*
|
|
22
|
+
class App must have quit() method
|
|
23
|
+
*/
|
|
24
|
+
template<class App>
|
|
25
|
+
class QuitSignalHandler {
|
|
26
|
+
static App *app_;
|
|
27
|
+
#ifdef _WIN32
|
|
28
|
+
static inline BOOL WINAPI ctrlHandler(DWORD) CYBOZU_NOEXCEPT
|
|
29
|
+
{
|
|
30
|
+
if (app_) app_->quit();
|
|
31
|
+
return TRUE;
|
|
32
|
+
}
|
|
33
|
+
#else
|
|
34
|
+
static void ctrlHandler(int) CYBOZU_NOEXCEPT
|
|
35
|
+
{
|
|
36
|
+
app_->quit();
|
|
37
|
+
// signal(SIGINT, SIG_IGN);
|
|
38
|
+
}
|
|
39
|
+
#endif
|
|
40
|
+
public:
|
|
41
|
+
explicit QuitSignalHandler(App& app)
|
|
42
|
+
{
|
|
43
|
+
app_ = &app;
|
|
44
|
+
#ifdef _WIN32
|
|
45
|
+
bool isOK = SetConsoleCtrlHandler(ctrlHandler, TRUE) != 0;
|
|
46
|
+
#else
|
|
47
|
+
struct sigaction sa;
|
|
48
|
+
sa.sa_handler = ctrlHandler;
|
|
49
|
+
sigfillset(&sa.sa_mask);
|
|
50
|
+
sa.sa_flags = 0;
|
|
51
|
+
bool isOK = (sigaction(SIGINT, &sa, NULL) == 0)
|
|
52
|
+
&& (sigaction(SIGQUIT, &sa, NULL) == 0)
|
|
53
|
+
&& (sigaction(SIGABRT, &sa, NULL) == 0)
|
|
54
|
+
&& (sigaction(SIGTERM, &sa, NULL) == 0);
|
|
55
|
+
#endif
|
|
56
|
+
if (!isOK) {
|
|
57
|
+
fprintf(stderr, "can't setup ctrl handler\n");
|
|
58
|
+
exit(1);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
template<class App>
|
|
64
|
+
App *QuitSignalHandler<App>::app_;
|
|
65
|
+
|
|
66
|
+
} // cybozu
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief pseudrandom generator
|
|
5
|
+
@author MITSUNARI Shigeo(@herumi)
|
|
6
|
+
@license modified new BSD license
|
|
7
|
+
http://opensource.org/licenses/BSD-3-Clause
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#ifndef CYBOZU_DONT_USE_EXCEPTION
|
|
11
|
+
#include <cybozu/exception.hpp>
|
|
12
|
+
#endif
|
|
13
|
+
#ifdef _WIN32
|
|
14
|
+
#ifndef WIN32_LEAN_AND_MEAN
|
|
15
|
+
#define WIN32_LEAN_AND_MEAN
|
|
16
|
+
#endif
|
|
17
|
+
#include <windows.h>
|
|
18
|
+
#include <wincrypt.h>
|
|
19
|
+
#ifdef _MSC_VER
|
|
20
|
+
#pragma comment (lib, "advapi32.lib")
|
|
21
|
+
#endif
|
|
22
|
+
#else
|
|
23
|
+
#include <sys/types.h>
|
|
24
|
+
#include <fcntl.h>
|
|
25
|
+
#endif
|
|
26
|
+
|
|
27
|
+
namespace cybozu {
|
|
28
|
+
|
|
29
|
+
class RandomGenerator {
|
|
30
|
+
RandomGenerator(const RandomGenerator&);
|
|
31
|
+
void operator=(const RandomGenerator&);
|
|
32
|
+
public:
|
|
33
|
+
#ifdef _WIN32
|
|
34
|
+
RandomGenerator()
|
|
35
|
+
: prov_(0)
|
|
36
|
+
{
|
|
37
|
+
DWORD flagTbl[] = { CRYPT_VERIFYCONTEXT | CRYPT_SILENT, 0, CRYPT_MACHINE_KEYSET };
|
|
38
|
+
for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(flagTbl); i++) {
|
|
39
|
+
if (CryptAcquireContext(&prov_, NULL, NULL, PROV_RSA_FULL, flagTbl[i]) != 0) return;
|
|
40
|
+
}
|
|
41
|
+
#ifdef CYBOZU_DONT_USE_EXCEPTION
|
|
42
|
+
prov_ = 0;
|
|
43
|
+
#else
|
|
44
|
+
throw cybozu::Exception("randomgenerator");
|
|
45
|
+
#endif
|
|
46
|
+
}
|
|
47
|
+
bool read_inner(void *buf, size_t byteSize)
|
|
48
|
+
{
|
|
49
|
+
if (prov_ == 0) return false;
|
|
50
|
+
return CryptGenRandom(prov_, static_cast<DWORD>(byteSize), static_cast<BYTE*>(buf)) != 0;
|
|
51
|
+
}
|
|
52
|
+
~RandomGenerator()
|
|
53
|
+
{
|
|
54
|
+
if (prov_) {
|
|
55
|
+
CryptReleaseContext(prov_, 0);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/*
|
|
59
|
+
fill buf[0..bufNum-1] with random data
|
|
60
|
+
@note bufNum is not byte size
|
|
61
|
+
*/
|
|
62
|
+
template<class T>
|
|
63
|
+
void read(bool *pb, T *buf, size_t bufNum)
|
|
64
|
+
{
|
|
65
|
+
const size_t byteSize = sizeof(T) * bufNum;
|
|
66
|
+
*pb = read_inner(buf, byteSize);
|
|
67
|
+
}
|
|
68
|
+
private:
|
|
69
|
+
HCRYPTPROV prov_;
|
|
70
|
+
#else
|
|
71
|
+
RandomGenerator()
|
|
72
|
+
: fp_(::fopen("/dev/urandom", "rb"))
|
|
73
|
+
{
|
|
74
|
+
#ifndef CYBOZU_DONT_USE_EXCEPTION
|
|
75
|
+
if (!fp_) throw cybozu::Exception("randomgenerator");
|
|
76
|
+
#endif
|
|
77
|
+
}
|
|
78
|
+
~RandomGenerator()
|
|
79
|
+
{
|
|
80
|
+
if (fp_) ::fclose(fp_);
|
|
81
|
+
}
|
|
82
|
+
/*
|
|
83
|
+
fill buf[0..bufNum-1] with random data
|
|
84
|
+
@note bufNum is not byte size
|
|
85
|
+
*/
|
|
86
|
+
template<class T>
|
|
87
|
+
void read(bool *pb, T *buf, size_t bufNum)
|
|
88
|
+
{
|
|
89
|
+
if (fp_ == 0) {
|
|
90
|
+
*pb = false;
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const size_t byteSize = sizeof(T) * bufNum;
|
|
94
|
+
*pb = ::fread(buf, 1, (int)byteSize, fp_) == byteSize;
|
|
95
|
+
}
|
|
96
|
+
private:
|
|
97
|
+
FILE *fp_;
|
|
98
|
+
#endif
|
|
99
|
+
#ifndef CYBOZU_DONT_USE_EXCEPTION
|
|
100
|
+
public:
|
|
101
|
+
template<class T>
|
|
102
|
+
void read(T *buf, size_t bufNum)
|
|
103
|
+
{
|
|
104
|
+
bool b;
|
|
105
|
+
read(&b, buf, bufNum);
|
|
106
|
+
if (!b) throw cybozu::Exception("RandomGenerator:read") << bufNum;
|
|
107
|
+
}
|
|
108
|
+
uint32_t get32()
|
|
109
|
+
{
|
|
110
|
+
uint32_t ret;
|
|
111
|
+
read(&ret, 1);
|
|
112
|
+
return ret;
|
|
113
|
+
}
|
|
114
|
+
uint64_t get64()
|
|
115
|
+
{
|
|
116
|
+
uint64_t ret;
|
|
117
|
+
read(&ret, 1);
|
|
118
|
+
return ret;
|
|
119
|
+
}
|
|
120
|
+
uint32_t operator()()
|
|
121
|
+
{
|
|
122
|
+
return get32();
|
|
123
|
+
}
|
|
124
|
+
#endif
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
template<class T, class RG>
|
|
128
|
+
void shuffle(T* v, size_t n, RG& rg)
|
|
129
|
+
{
|
|
130
|
+
if (n <= 1) return;
|
|
131
|
+
for (size_t i = 0; i < n - 1; i++) {
|
|
132
|
+
size_t r = i + size_t(rg.get64() % (n - i));
|
|
133
|
+
using namespace std;
|
|
134
|
+
swap(v[i], v[r]);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
template<class V, class RG>
|
|
139
|
+
void shuffle(V& v, RG& rg)
|
|
140
|
+
{
|
|
141
|
+
shuffle(v.data(), v.size(), rg);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
} // cybozu
|