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,392 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief config file class
|
|
5
|
+
|
|
6
|
+
@author MITSUNARI Shigeo(@herumi)
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#include <assert.h>
|
|
10
|
+
#include <string>
|
|
11
|
+
#include <map>
|
|
12
|
+
#include <fstream>
|
|
13
|
+
#include <cybozu/exception.hpp>
|
|
14
|
+
#include <cybozu/atoi.hpp>
|
|
15
|
+
|
|
16
|
+
namespace cybozu {
|
|
17
|
+
|
|
18
|
+
namespace config_local {
|
|
19
|
+
|
|
20
|
+
inline bool isName(const std::string& str, char *badChar)
|
|
21
|
+
{
|
|
22
|
+
for (size_t i = 0, n = str.size(); i < n; i++) {
|
|
23
|
+
char c = str[i];
|
|
24
|
+
if (!('0' <= c && c <= '9')
|
|
25
|
+
&& !('a' <= c && c <= 'z')
|
|
26
|
+
&& !('A' <= c && c <= 'Z')
|
|
27
|
+
&& c != '_') {
|
|
28
|
+
*badChar = c;
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
inline void trimEndSpace(std::string& str)
|
|
36
|
+
{
|
|
37
|
+
if (str.empty()) return;
|
|
38
|
+
size_t i = str.size();
|
|
39
|
+
while (i > 0) {
|
|
40
|
+
char c = str[i - 1];
|
|
41
|
+
if (c == ' ' || c == '\t') {
|
|
42
|
+
i--;
|
|
43
|
+
} else {
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return str.resize(i);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
inline void split(std::string& key, std::string& value, const std::string& line)
|
|
51
|
+
{
|
|
52
|
+
const char *p = line.c_str();
|
|
53
|
+
const char *q = strchr(p, '=');
|
|
54
|
+
if (q == 0) {
|
|
55
|
+
throw cybozu::Exception("config:split:no equal") << line;
|
|
56
|
+
}
|
|
57
|
+
key = line.substr(0, q - p);
|
|
58
|
+
trimEndSpace(key);
|
|
59
|
+
char badChar;
|
|
60
|
+
if (!cybozu::config_local::isName(key, &badChar)) {
|
|
61
|
+
throw cybozu::Exception("config:split:bad key") << key << badChar;
|
|
62
|
+
}
|
|
63
|
+
const size_t valueTop = q + 1 - p;
|
|
64
|
+
value = line.substr(valueTop, line.size() - valueTop);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
} // config_local
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
config class
|
|
71
|
+
config format is the following
|
|
72
|
+
<pre>
|
|
73
|
+
CF = "\r\n" | "\n"
|
|
74
|
+
NAME = [0-9a-zA-Z_]+
|
|
75
|
+
VALUE = [^\\r\\n]*
|
|
76
|
+
LINE = (EMPTY | COMMENT | SECTION | KEY_VALUE) CF
|
|
77
|
+
EMPTY = ""
|
|
78
|
+
COMMENT = "[;#]" [^\\r\\n]*
|
|
79
|
+
SECTION = "[" NAME "]"
|
|
80
|
+
SP = [ \t]
|
|
81
|
+
KEY_VALUE = NAME SP* "=" VALUE
|
|
82
|
+
</pre>
|
|
83
|
+
how to use Config
|
|
84
|
+
<pre>
|
|
85
|
+
using namespace cybozu;
|
|
86
|
+
Config config;
|
|
87
|
+
config.load("config.ini");
|
|
88
|
+
Config::Section *section = config.querySection("db");
|
|
89
|
+
if (section) {
|
|
90
|
+
const std::string *value = section->queryValue("name");
|
|
91
|
+
std::cout << "name:" << *value << std::endl;
|
|
92
|
+
}
|
|
93
|
+
</pre>
|
|
94
|
+
*/
|
|
95
|
+
class Config {
|
|
96
|
+
public:
|
|
97
|
+
/**
|
|
98
|
+
section class
|
|
99
|
+
*/
|
|
100
|
+
class Section {
|
|
101
|
+
// auto converter to integer or string
|
|
102
|
+
class ResultType {
|
|
103
|
+
const std::string& str_;
|
|
104
|
+
const std::string& key_;
|
|
105
|
+
void operator=(const ResultType&);
|
|
106
|
+
template<typename T>
|
|
107
|
+
T get() const
|
|
108
|
+
{
|
|
109
|
+
bool b;
|
|
110
|
+
T t = cybozu::atoi(&b, str_);
|
|
111
|
+
if (!b) {
|
|
112
|
+
throw cybozu::Exception("config:get:bad integer") << str_ << key_;
|
|
113
|
+
}
|
|
114
|
+
return t;
|
|
115
|
+
}
|
|
116
|
+
public:
|
|
117
|
+
ResultType(const std::string& str, const std::string& key)
|
|
118
|
+
: str_(str)
|
|
119
|
+
, key_(key)
|
|
120
|
+
{
|
|
121
|
+
}
|
|
122
|
+
operator short() const { return get<short>(); }
|
|
123
|
+
operator unsigned short() const { return get<unsigned short>(); }
|
|
124
|
+
operator int() const { return get<int>(); }
|
|
125
|
+
operator unsigned int() const { return get<unsigned int>(); }
|
|
126
|
+
operator int64_t() const { return get<int64_t>(); }
|
|
127
|
+
operator uint64_t() const { return get<uint64_t>(); }
|
|
128
|
+
operator const std::string&() const { return str_; }
|
|
129
|
+
};
|
|
130
|
+
template<typename T>
|
|
131
|
+
T getValueInteger(const std::string& key, T defaultValue) const
|
|
132
|
+
{
|
|
133
|
+
const std::string *value = queryValue(key);
|
|
134
|
+
if (value) {
|
|
135
|
+
bool b;
|
|
136
|
+
T t = cybozu::atoi(&b, *value);
|
|
137
|
+
if (!b) {
|
|
138
|
+
throw cybozu::Exception("config:getValueInteger:bad integer") << *value << key;
|
|
139
|
+
}
|
|
140
|
+
return t;
|
|
141
|
+
} else {
|
|
142
|
+
return defaultValue;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
public:
|
|
146
|
+
typedef std::map<std::string, std::string> Map;
|
|
147
|
+
/**
|
|
148
|
+
append a pair of (key, value)
|
|
149
|
+
@param key [in] key
|
|
150
|
+
@param value [in] value
|
|
151
|
+
*/
|
|
152
|
+
void append(const std::string& key, const std::string& value)
|
|
153
|
+
{
|
|
154
|
+
char badChar;
|
|
155
|
+
if (!config_local::isName(key, &badChar)) {
|
|
156
|
+
throw cybozu::Exception("config:append:bad key") << key << badChar;
|
|
157
|
+
}
|
|
158
|
+
std::pair<Map::iterator, bool> ret = map_.insert(Map::value_type(key, value));
|
|
159
|
+
if (!ret.second) {
|
|
160
|
+
throw cybozu::Exception("config:append:key already exists") << key;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
query key
|
|
165
|
+
@param key [in] key
|
|
166
|
+
@retval 0 not found
|
|
167
|
+
@retval !0 pointer to value
|
|
168
|
+
*/
|
|
169
|
+
const std::string *queryValue(const std::string& key) const
|
|
170
|
+
{
|
|
171
|
+
Map::const_iterator i = map_.find(key);
|
|
172
|
+
return i != map_.end() ? &(i->second) : 0;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
get key if key exists
|
|
176
|
+
@param key [in] key
|
|
177
|
+
@retval value
|
|
178
|
+
@note throw exception if not found
|
|
179
|
+
*/
|
|
180
|
+
Section::ResultType getValue(const std::string& key) const
|
|
181
|
+
{
|
|
182
|
+
const std::string *value = queryValue(key);
|
|
183
|
+
if (value) {
|
|
184
|
+
return Section::ResultType(*value, key);
|
|
185
|
+
} else {
|
|
186
|
+
throw cybozu::Exception("config:getValue") << key;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
get key if key exists or use default
|
|
191
|
+
@param key [in] key
|
|
192
|
+
@param defaultValue [in] default Value
|
|
193
|
+
@retval value
|
|
194
|
+
@note throw exception if not found
|
|
195
|
+
*/
|
|
196
|
+
short getValue(const std::string& key, short defaultValue) const
|
|
197
|
+
{
|
|
198
|
+
return getValueInteger<short>(key, defaultValue);
|
|
199
|
+
}
|
|
200
|
+
unsigned short getValue(const std::string& key, unsigned short defaultValue) const
|
|
201
|
+
{
|
|
202
|
+
return getValueInteger<unsigned short>(key, defaultValue);
|
|
203
|
+
}
|
|
204
|
+
int getValue(const std::string& key, int defaultValue) const
|
|
205
|
+
{
|
|
206
|
+
return getValueInteger<int>(key, defaultValue);
|
|
207
|
+
}
|
|
208
|
+
unsigned int getValue(const std::string& key, unsigned int defaultValue) const
|
|
209
|
+
{
|
|
210
|
+
return getValueInteger<unsigned int>(key, defaultValue);
|
|
211
|
+
}
|
|
212
|
+
int64_t getValue(const std::string& key, int64_t defaultValue) const
|
|
213
|
+
{
|
|
214
|
+
return getValueInteger<int64_t >(key, defaultValue);
|
|
215
|
+
}
|
|
216
|
+
uint64_t getValue(const std::string& key, uint64_t defaultValue) const
|
|
217
|
+
{
|
|
218
|
+
return getValueInteger<uint64_t >(key, defaultValue);
|
|
219
|
+
}
|
|
220
|
+
const std::string& getValue(const std::string& key, const std::string& defaultValue) const
|
|
221
|
+
{
|
|
222
|
+
const std::string *value = queryValue(key);
|
|
223
|
+
if (value) {
|
|
224
|
+
return *value;
|
|
225
|
+
} else {
|
|
226
|
+
return defaultValue;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
convert section to string
|
|
232
|
+
*/
|
|
233
|
+
std::string toString() const
|
|
234
|
+
{
|
|
235
|
+
std::string ret;
|
|
236
|
+
for (Map::const_iterator i = map_.begin(), ie = map_.end(); i != ie; ++i) {
|
|
237
|
+
ret += i->first + "=" + i->second + "\n";
|
|
238
|
+
}
|
|
239
|
+
return ret;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
get map
|
|
243
|
+
*/
|
|
244
|
+
const Config::Section::Map& getMap() const { return map_; }
|
|
245
|
+
private:
|
|
246
|
+
Map map_;
|
|
247
|
+
};
|
|
248
|
+
typedef std::map<std::string, Section> Map;
|
|
249
|
+
Config()
|
|
250
|
+
{
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
constructor with loading config file
|
|
254
|
+
@param name [in] config file name
|
|
255
|
+
*/
|
|
256
|
+
explicit Config(const std::string& name)
|
|
257
|
+
{
|
|
258
|
+
load(name);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
append empty Section named as name
|
|
262
|
+
@param name [in] section name
|
|
263
|
+
@return pointer to section
|
|
264
|
+
*/
|
|
265
|
+
Config::Section* appendSection(const std::string& name)
|
|
266
|
+
{
|
|
267
|
+
char badChar;
|
|
268
|
+
if (!config_local::isName(name, &badChar)) {
|
|
269
|
+
throw cybozu::Exception("config:appendSection:bad section") << name << badChar;
|
|
270
|
+
}
|
|
271
|
+
std::pair<Map::iterator, bool> ret = map_.insert(Map::value_type(name, Section()));
|
|
272
|
+
return &ret.first->second;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
append section
|
|
276
|
+
@param name [in] section name
|
|
277
|
+
@param section [in] section data
|
|
278
|
+
*/
|
|
279
|
+
cybozu::Config& appendSection(const std::string& name, const cybozu::Config::Section& section)
|
|
280
|
+
{
|
|
281
|
+
*appendSection(name) = section;
|
|
282
|
+
return *this;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
query const section
|
|
286
|
+
@param name [in] section name
|
|
287
|
+
@retval 0 not found
|
|
288
|
+
@retval !0 pointer to section
|
|
289
|
+
*/
|
|
290
|
+
const Config::Section* querySection(const std::string& name) const
|
|
291
|
+
{
|
|
292
|
+
Map::const_iterator i = map_.find(name);
|
|
293
|
+
return (i != map_.end()) ? &(i->second) : 0;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
query section
|
|
297
|
+
@param name [in] section name
|
|
298
|
+
@retval 0 not found
|
|
299
|
+
@retval !0 pointer to section
|
|
300
|
+
*/
|
|
301
|
+
Config::Section* querySection(const std::string& name)
|
|
302
|
+
{
|
|
303
|
+
return const_cast<Config::Section*>(static_cast<const Config*>(this)->querySection(name));
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
get const section
|
|
307
|
+
@param name [in] section name("" means global section)
|
|
308
|
+
@return section
|
|
309
|
+
@note throw exception if not found
|
|
310
|
+
*/
|
|
311
|
+
const Config::Section& getSection(const std::string& name = "") const
|
|
312
|
+
{
|
|
313
|
+
const Config::Section *section = querySection(name);
|
|
314
|
+
if (section) {
|
|
315
|
+
return *section;
|
|
316
|
+
} else {
|
|
317
|
+
throw cybozu::Exception("config:getSection:no section") << name;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
load config file
|
|
322
|
+
@param name [in] config file name
|
|
323
|
+
*/
|
|
324
|
+
void load(const std::string& name)
|
|
325
|
+
{
|
|
326
|
+
std::ifstream ifs(name.c_str());
|
|
327
|
+
if (!ifs) {
|
|
328
|
+
throw cybozu::Exception("config:load") << name;
|
|
329
|
+
}
|
|
330
|
+
load(ifs);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
load config file
|
|
334
|
+
@param is [in] istream
|
|
335
|
+
*/
|
|
336
|
+
void load(std::istream& is)
|
|
337
|
+
{
|
|
338
|
+
Config::Section *section = appendSection(""); // global section
|
|
339
|
+
assert(section);
|
|
340
|
+
|
|
341
|
+
std::string line;
|
|
342
|
+
while (std::getline(is, line)) {
|
|
343
|
+
size_t n = line.size();
|
|
344
|
+
|
|
345
|
+
if (n == 0) continue; // skip if empty
|
|
346
|
+
|
|
347
|
+
// remove '\r' at the end of line
|
|
348
|
+
char c = line[n - 1];
|
|
349
|
+
if (c == '\r') {
|
|
350
|
+
if (n == 1) continue;
|
|
351
|
+
line.resize(n - 1);
|
|
352
|
+
n--;
|
|
353
|
+
}
|
|
354
|
+
// skip if comment
|
|
355
|
+
c = line[0];
|
|
356
|
+
if (c == ';' || c == '#') continue;
|
|
357
|
+
// section
|
|
358
|
+
if (c == '[') {
|
|
359
|
+
if (line[n - 1] != ']') {
|
|
360
|
+
throw cybozu::Exception("config:load:bad section") << line;
|
|
361
|
+
}
|
|
362
|
+
section = appendSection(line.substr(1, n - 2));
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
std::string key, value;
|
|
366
|
+
config_local::split(key, value, line);
|
|
367
|
+
section->append(key, value);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
get map
|
|
372
|
+
*/
|
|
373
|
+
const Config::Map& getMap() const { return map_; }
|
|
374
|
+
/**
|
|
375
|
+
convert section to string
|
|
376
|
+
*/
|
|
377
|
+
std::string toString() const
|
|
378
|
+
{
|
|
379
|
+
std::string ret;
|
|
380
|
+
for (Map::const_iterator i = map_.begin(), ie = map_.end(); i != ie; ++i) {
|
|
381
|
+
if (!i->first.empty()) {
|
|
382
|
+
ret += "[" + i->first + "]\n";
|
|
383
|
+
}
|
|
384
|
+
ret += i->second.toString();
|
|
385
|
+
}
|
|
386
|
+
return ret;
|
|
387
|
+
}
|
|
388
|
+
private:
|
|
389
|
+
Map map_;
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
} // end of cybozu
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief critical section
|
|
5
|
+
|
|
6
|
+
@author MITSUNARI Shigeo(@herumi)
|
|
7
|
+
@author MITSUNARI Shigeo
|
|
8
|
+
*/
|
|
9
|
+
#include <cybozu/mutex.hpp>
|
|
10
|
+
|
|
11
|
+
namespace cybozu {
|
|
12
|
+
|
|
13
|
+
class ConditionVariableCs;
|
|
14
|
+
|
|
15
|
+
namespace thread {
|
|
16
|
+
|
|
17
|
+
#ifdef _WIN32
|
|
18
|
+
typedef CRITICAL_SECTION CsHandle;
|
|
19
|
+
inline void CsInit(CsHandle& cs) { InitializeCriticalSection(&cs); }
|
|
20
|
+
inline void CsLock(CsHandle& cs) { EnterCriticalSection(&cs); }
|
|
21
|
+
inline void CsUnlock(CsHandle& cs) { LeaveCriticalSection(&cs); }
|
|
22
|
+
inline void CsTerm(CsHandle& cs) { DeleteCriticalSection(&cs); }
|
|
23
|
+
#else
|
|
24
|
+
typedef pthread_mutex_t CsHandle;
|
|
25
|
+
inline void CsInit(CsHandle& cs) { pthread_mutex_init(&cs, NULL); }
|
|
26
|
+
inline void CsLock(CsHandle& cs) { pthread_mutex_lock(&cs); }
|
|
27
|
+
inline void CsUnlock(CsHandle& cs) { pthread_mutex_unlock(&cs); }
|
|
28
|
+
inline void CsTerm(CsHandle& cs) { pthread_mutex_destroy(&cs); }
|
|
29
|
+
#endif
|
|
30
|
+
|
|
31
|
+
} // cybozu::thread
|
|
32
|
+
|
|
33
|
+
class CriticalSection {
|
|
34
|
+
friend class cybozu::ConditionVariableCs;
|
|
35
|
+
public:
|
|
36
|
+
CriticalSection()
|
|
37
|
+
{
|
|
38
|
+
thread::CsInit(hdl_);
|
|
39
|
+
}
|
|
40
|
+
~CriticalSection()
|
|
41
|
+
{
|
|
42
|
+
thread::CsTerm(hdl_);
|
|
43
|
+
}
|
|
44
|
+
inline void lock()
|
|
45
|
+
{
|
|
46
|
+
thread::CsLock(hdl_);
|
|
47
|
+
}
|
|
48
|
+
inline void unlock()
|
|
49
|
+
{
|
|
50
|
+
thread::CsUnlock(hdl_);
|
|
51
|
+
}
|
|
52
|
+
private:
|
|
53
|
+
CriticalSection(const CriticalSection&);
|
|
54
|
+
CriticalSection& operator=(const CriticalSection&);
|
|
55
|
+
thread::CsHandle hdl_;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
typedef cybozu::thread::AutoLockT<cybozu::CriticalSection> AutoLockCs; //!< auto lock critical section
|
|
59
|
+
|
|
60
|
+
} // cybozu
|