ooxml_crypt 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +58 -0
  5. data/Rakefile +12 -0
  6. data/bin/console +15 -0
  7. data/bin/setup +8 -0
  8. data/ext/ooxml_crypt/extconf.rb +18 -0
  9. data/ext/ooxml_crypt/ooxml_crypt.c +27 -0
  10. data/ext/ooxml_crypt/ooxml_crypt.h +7 -0
  11. data/lib/ooxml_crypt/version.rb +5 -0
  12. data/lib/ooxml_crypt.rb +75 -0
  13. data/vendor/cybozulib/.github/workflows/main.yml +12 -0
  14. data/vendor/cybozulib/.gitignore +5 -0
  15. data/vendor/cybozulib/CMakeLists.txt +6 -0
  16. data/vendor/cybozulib/COPYRIGHT +27 -0
  17. data/vendor/cybozulib/Makefile +26 -0
  18. data/vendor/cybozulib/bin/libeay32.dll +0 -0
  19. data/vendor/cybozulib/bin/libmecab.dll +0 -0
  20. data/vendor/cybozulib/bin/ssleay32.dll +0 -0
  21. data/vendor/cybozulib/common.mk +116 -0
  22. data/vendor/cybozulib/common.props +25 -0
  23. data/vendor/cybozulib/cybozulib.sln +286 -0
  24. data/vendor/cybozulib/debug.props +14 -0
  25. data/vendor/cybozulib/include/cybozu/array.hpp +197 -0
  26. data/vendor/cybozulib/include/cybozu/atoi.hpp +238 -0
  27. data/vendor/cybozulib/include/cybozu/atomic.hpp +146 -0
  28. data/vendor/cybozulib/include/cybozu/base64.hpp +210 -0
  29. data/vendor/cybozulib/include/cybozu/benchmark.hpp +212 -0
  30. data/vendor/cybozulib/include/cybozu/bfd.hpp +105 -0
  31. data/vendor/cybozulib/include/cybozu/bit_operation.hpp +139 -0
  32. data/vendor/cybozulib/include/cybozu/bitvector.hpp +358 -0
  33. data/vendor/cybozulib/include/cybozu/condition_variable.hpp +113 -0
  34. data/vendor/cybozulib/include/cybozu/condition_variable_cs.hpp +74 -0
  35. data/vendor/cybozulib/include/cybozu/config.hpp +392 -0
  36. data/vendor/cybozulib/include/cybozu/critical_section.hpp +60 -0
  37. data/vendor/cybozulib/include/cybozu/crypto.hpp +321 -0
  38. data/vendor/cybozulib/include/cybozu/csucvector.hpp +624 -0
  39. data/vendor/cybozulib/include/cybozu/csv.hpp +294 -0
  40. data/vendor/cybozulib/include/cybozu/data_type.hpp +27 -0
  41. data/vendor/cybozulib/include/cybozu/endian.hpp +224 -0
  42. data/vendor/cybozulib/include/cybozu/env.hpp +63 -0
  43. data/vendor/cybozulib/include/cybozu/event.hpp +122 -0
  44. data/vendor/cybozulib/include/cybozu/exception.hpp +253 -0
  45. data/vendor/cybozulib/include/cybozu/file.hpp +626 -0
  46. data/vendor/cybozulib/include/cybozu/fmindex.hpp +291 -0
  47. data/vendor/cybozulib/include/cybozu/format.hpp +93 -0
  48. data/vendor/cybozulib/include/cybozu/frequency.hpp +264 -0
  49. data/vendor/cybozulib/include/cybozu/hash.hpp +67 -0
  50. data/vendor/cybozulib/include/cybozu/inttype.hpp +174 -0
  51. data/vendor/cybozulib/include/cybozu/itoa.hpp +336 -0
  52. data/vendor/cybozulib/include/cybozu/json.hpp +120 -0
  53. data/vendor/cybozulib/include/cybozu/line_stream.hpp +149 -0
  54. data/vendor/cybozulib/include/cybozu/link_libeay32.hpp +21 -0
  55. data/vendor/cybozulib/include/cybozu/link_mpir.hpp +18 -0
  56. data/vendor/cybozulib/include/cybozu/link_ssleay32.hpp +19 -0
  57. data/vendor/cybozulib/include/cybozu/log.hpp +237 -0
  58. data/vendor/cybozulib/include/cybozu/minixml.hpp +452 -0
  59. data/vendor/cybozulib/include/cybozu/mmap.hpp +143 -0
  60. data/vendor/cybozulib/include/cybozu/mutex.hpp +144 -0
  61. data/vendor/cybozulib/include/cybozu/nlp/mecab.hpp +96 -0
  62. data/vendor/cybozulib/include/cybozu/nlp/plsi.hpp +315 -0
  63. data/vendor/cybozulib/include/cybozu/nlp/random.hpp +74 -0
  64. data/vendor/cybozulib/include/cybozu/nlp/sparse.hpp +529 -0
  65. data/vendor/cybozulib/include/cybozu/nlp/svd.hpp +486 -0
  66. data/vendor/cybozulib/include/cybozu/nlp/tfidf.hpp +226 -0
  67. data/vendor/cybozulib/include/cybozu/nlp/top_score.hpp +75 -0
  68. data/vendor/cybozulib/include/cybozu/option.hpp +743 -0
  69. data/vendor/cybozulib/include/cybozu/parallel.hpp +88 -0
  70. data/vendor/cybozulib/include/cybozu/pcg.hpp +72 -0
  71. data/vendor/cybozulib/include/cybozu/process.hpp +324 -0
  72. data/vendor/cybozulib/include/cybozu/quit_signal_handler.hpp +66 -0
  73. data/vendor/cybozulib/include/cybozu/random_generator.hpp +144 -0
  74. data/vendor/cybozulib/include/cybozu/regex.hpp +463 -0
  75. data/vendor/cybozulib/include/cybozu/select8.hpp +279 -0
  76. data/vendor/cybozulib/include/cybozu/serializer.hpp +363 -0
  77. data/vendor/cybozulib/include/cybozu/sha1.hpp +209 -0
  78. data/vendor/cybozulib/include/cybozu/sha2.hpp +506 -0
  79. data/vendor/cybozulib/include/cybozu/siphash.hpp +105 -0
  80. data/vendor/cybozulib/include/cybozu/socket.hpp +785 -0
  81. data/vendor/cybozulib/include/cybozu/ssl.hpp +203 -0
  82. data/vendor/cybozulib/include/cybozu/stacktrace.hpp +291 -0
  83. data/vendor/cybozulib/include/cybozu/stream.hpp +269 -0
  84. data/vendor/cybozulib/include/cybozu/string.hpp +1746 -0
  85. data/vendor/cybozulib/include/cybozu/string_operation.hpp +365 -0
  86. data/vendor/cybozulib/include/cybozu/sucvector.hpp +378 -0
  87. data/vendor/cybozulib/include/cybozu/test.hpp +373 -0
  88. data/vendor/cybozulib/include/cybozu/thread.hpp +229 -0
  89. data/vendor/cybozulib/include/cybozu/time.hpp +281 -0
  90. data/vendor/cybozulib/include/cybozu/tls.hpp +115 -0
  91. data/vendor/cybozulib/include/cybozu/unordered_map.hpp +13 -0
  92. data/vendor/cybozulib/include/cybozu/unordered_set.hpp +13 -0
  93. data/vendor/cybozulib/include/cybozu/v128.hpp +376 -0
  94. data/vendor/cybozulib/include/cybozu/wavelet_matrix.hpp +345 -0
  95. data/vendor/cybozulib/include/cybozu/xorshift.hpp +189 -0
  96. data/vendor/cybozulib/include/cybozu/zlib.hpp +325 -0
  97. data/vendor/cybozulib/include/sais.hxx +364 -0
  98. data/vendor/cybozulib/misc/make_select8tbl.cpp +26 -0
  99. data/vendor/cybozulib/mk.bat +37 -0
  100. data/vendor/cybozulib/readme.md +29 -0
  101. data/vendor/cybozulib/release.props +12 -0
  102. data/vendor/cybozulib/sample/Makefile +30 -0
  103. data/vendor/cybozulib/sample/csucvector_smpl.cpp +42 -0
  104. data/vendor/cybozulib/sample/data/svd/org/test1.S +4 -0
  105. data/vendor/cybozulib/sample/data/svd/org/test1.U +4 -0
  106. data/vendor/cybozulib/sample/data/svd/org/test1.V +6 -0
  107. data/vendor/cybozulib/sample/data/svd/test1 +4 -0
  108. data/vendor/cybozulib/sample/data/svd/test2 +4 -0
  109. data/vendor/cybozulib/sample/desymbol.cpp +127 -0
  110. data/vendor/cybozulib/sample/exception_smpl.cpp +46 -0
  111. data/vendor/cybozulib/sample/fmindex_smpl.cpp +231 -0
  112. data/vendor/cybozulib/sample/log_smpl.cpp +19 -0
  113. data/vendor/cybozulib/sample/mecab_smpl.cpp +37 -0
  114. data/vendor/cybozulib/sample/option2_smpl.cpp +68 -0
  115. data/vendor/cybozulib/sample/option_smpl.cpp +42 -0
  116. data/vendor/cybozulib/sample/plsi_smpl.cpp +207 -0
  117. data/vendor/cybozulib/sample/proj/exception_smpl.vcproj +184 -0
  118. data/vendor/cybozulib/sample/proj/mecab_smpl.vcproj +184 -0
  119. data/vendor/cybozulib/sample/proj/ssl_smpl/ssl_smpl.vcxproj +85 -0
  120. data/vendor/cybozulib/sample/proj/ssl_smpl.vcproj +347 -0
  121. data/vendor/cybozulib/sample/proj/stacktrace_smpl/stacktrace_smpl.vcxproj +85 -0
  122. data/vendor/cybozulib/sample/proj/svd_smpl.vcproj +184 -0
  123. data/vendor/cybozulib/sample/quit_signal_handler.cpp +30 -0
  124. data/vendor/cybozulib/sample/serializer_smpl.cpp +196 -0
  125. data/vendor/cybozulib/sample/socket_smpl.cpp +82 -0
  126. data/vendor/cybozulib/sample/ssl_smpl.cpp +39 -0
  127. data/vendor/cybozulib/sample/stacktrace_smpl.cpp +52 -0
  128. data/vendor/cybozulib/sample/svd_bench_smpl.cpp +143 -0
  129. data/vendor/cybozulib/sample/svd_smpl.cpp +94 -0
  130. data/vendor/cybozulib/sample/wm_bench_smpl.cpp +182 -0
  131. data/vendor/cybozulib/sample/zlib_smpl.cpp +41 -0
  132. data/vendor/cybozulib/src/Makefile +8 -0
  133. data/vendor/cybozulib/src/base/Makefile +19 -0
  134. data/vendor/cybozulib/test/Makefile +12 -0
  135. data/vendor/cybozulib/test/base/Makefile +37 -0
  136. data/vendor/cybozulib/test/base/array_test.cpp +173 -0
  137. data/vendor/cybozulib/test/base/atoi_test.cpp +774 -0
  138. data/vendor/cybozulib/test/base/atomic_test.cpp +49 -0
  139. data/vendor/cybozulib/test/base/base64_test.cpp +113 -0
  140. data/vendor/cybozulib/test/base/bit_operation_test.cpp +134 -0
  141. data/vendor/cybozulib/test/base/bitvector_test.cpp +204 -0
  142. data/vendor/cybozulib/test/base/condition_variable_cs_test.cpp +92 -0
  143. data/vendor/cybozulib/test/base/condition_variable_test.cpp +88 -0
  144. data/vendor/cybozulib/test/base/config_test.cpp +236 -0
  145. data/vendor/cybozulib/test/base/crypto_test.cpp +122 -0
  146. data/vendor/cybozulib/test/base/csucvector_test.cpp +63 -0
  147. data/vendor/cybozulib/test/base/csv_test.cpp +182 -0
  148. data/vendor/cybozulib/test/base/data/a.xml +26 -0
  149. data/vendor/cybozulib/test/base/endian_test.cpp +56 -0
  150. data/vendor/cybozulib/test/base/env_test.cpp +22 -0
  151. data/vendor/cybozulib/test/base/event_test.cpp +41 -0
  152. data/vendor/cybozulib/test/base/file_test.cpp +233 -0
  153. data/vendor/cybozulib/test/base/fmindex_test.cpp +118 -0
  154. data/vendor/cybozulib/test/base/format_test.cpp +12 -0
  155. data/vendor/cybozulib/test/base/frequency_test.cpp +104 -0
  156. data/vendor/cybozulib/test/base/itoa_test.cpp +522 -0
  157. data/vendor/cybozulib/test/base/line_stream_test.cpp +208 -0
  158. data/vendor/cybozulib/test/base/mecab_test.cpp +41 -0
  159. data/vendor/cybozulib/test/base/minixml_test.cpp +103 -0
  160. data/vendor/cybozulib/test/base/mmap_test.cpp +15 -0
  161. data/vendor/cybozulib/test/base/option_test.cpp +487 -0
  162. data/vendor/cybozulib/test/base/parallel_test.cpp +48 -0
  163. data/vendor/cybozulib/test/base/proj/array_test/array_test.vcxproj +86 -0
  164. data/vendor/cybozulib/test/base/proj/atoi_test/atoi_test.vcxproj +86 -0
  165. data/vendor/cybozulib/test/base/proj/atomic_test/atomic_test.vcxproj +86 -0
  166. data/vendor/cybozulib/test/base/proj/base64_test/base64_test.vcxproj +86 -0
  167. data/vendor/cybozulib/test/base/proj/condition_variable_cs_test/condition_variable_cs_test.vcxproj +86 -0
  168. data/vendor/cybozulib/test/base/proj/condition_variable_test/condition_variable_test.vcxproj +86 -0
  169. data/vendor/cybozulib/test/base/proj/config_test/config_test.vcxproj +86 -0
  170. data/vendor/cybozulib/test/base/proj/csv_test/csv_test.vcxproj +86 -0
  171. data/vendor/cybozulib/test/base/proj/endian_test/endian_test.vcxproj +86 -0
  172. data/vendor/cybozulib/test/base/proj/env_test/env_test.vcxproj +86 -0
  173. data/vendor/cybozulib/test/base/proj/event_test/event_test.vcxproj +86 -0
  174. data/vendor/cybozulib/test/base/proj/file_test/file_test.vcxproj +86 -0
  175. data/vendor/cybozulib/test/base/proj/itoa_test/itoa_test.vcxproj +86 -0
  176. data/vendor/cybozulib/test/base/proj/mecab_test/mecab_test.vcxproj +88 -0
  177. data/vendor/cybozulib/test/base/proj/minixml_test/minixml_test.vcxproj +86 -0
  178. data/vendor/cybozulib/test/base/proj/mmap_test/mmap_test.vcxproj +86 -0
  179. data/vendor/cybozulib/test/base/proj/serializer_test/serializer_test.vcxproj +86 -0
  180. data/vendor/cybozulib/test/base/proj/sha1_test/sha1_test.vcxproj +86 -0
  181. data/vendor/cybozulib/test/base/proj/stream_test/stream_test.vcxproj +86 -0
  182. data/vendor/cybozulib/test/base/proj/string_operation_test/string_operation_test.vcxproj +86 -0
  183. data/vendor/cybozulib/test/base/proj/string_test/string_test.vcxproj +86 -0
  184. data/vendor/cybozulib/test/base/proj/thread_test/thread_test.vcxproj +86 -0
  185. data/vendor/cybozulib/test/base/proj/time_test/time_test.vcxproj +86 -0
  186. data/vendor/cybozulib/test/base/proj/tls_test/tls_test.vcxproj +86 -0
  187. data/vendor/cybozulib/test/base/proj/zlib_test/zlib_test.vcxproj +86 -0
  188. data/vendor/cybozulib/test/base/random_generator_test.cpp +28 -0
  189. data/vendor/cybozulib/test/base/regex_test.cpp +74 -0
  190. data/vendor/cybozulib/test/base/serializer_test.cpp +483 -0
  191. data/vendor/cybozulib/test/base/sha1_test.cpp +61 -0
  192. data/vendor/cybozulib/test/base/sha2_test.cpp +191 -0
  193. data/vendor/cybozulib/test/base/siphash_test.cpp +33 -0
  194. data/vendor/cybozulib/test/base/socket_test.cpp +76 -0
  195. data/vendor/cybozulib/test/base/stream_test.cpp +101 -0
  196. data/vendor/cybozulib/test/base/string_operation_test.cpp +340 -0
  197. data/vendor/cybozulib/test/base/string_test.cpp +1705 -0
  198. data/vendor/cybozulib/test/base/sucvector_test.cpp +312 -0
  199. data/vendor/cybozulib/test/base/thread_test.cpp +62 -0
  200. data/vendor/cybozulib/test/base/time_test.cpp +164 -0
  201. data/vendor/cybozulib/test/base/tls_test.cpp +50 -0
  202. data/vendor/cybozulib/test/base/wavelet_matrix_test.cpp +145 -0
  203. data/vendor/cybozulib/test/base/zlib_test.cpp +371 -0
  204. data/vendor/cybozulib/test/nlp/Makefile +27 -0
  205. data/vendor/cybozulib/test/nlp/proj/random_test.vcproj +184 -0
  206. data/vendor/cybozulib/test/nlp/proj/sparse_test.vcproj +184 -0
  207. data/vendor/cybozulib/test/nlp/proj/svd_test.vcproj +184 -0
  208. data/vendor/cybozulib/test/nlp/random_test.cpp +62 -0
  209. data/vendor/cybozulib/test/nlp/sparse_test.cpp +347 -0
  210. data/vendor/cybozulib/test/nlp/svd_test.cpp +234 -0
  211. data/vendor/cybozulib/test/nlp/top_score_test.cpp +40 -0
  212. data/vendor/cybozulib/tool/create_vcproj.py +186 -0
  213. data/vendor/cybozulib/tool/vcproj_tmpl.py +185 -0
  214. data/vendor/msoffice/COPYRIGHT +27 -0
  215. data/vendor/msoffice/Makefile +29 -0
  216. data/vendor/msoffice/bin/64/msoc.dll +0 -0
  217. data/vendor/msoffice/bin/64/msocsample.exe +0 -0
  218. data/vendor/msoffice/bin/64/msoffice-crypt.exe +0 -0
  219. data/vendor/msoffice/bin/msoc.dll +0 -0
  220. data/vendor/msoffice/bin/msocsample.exe +0 -0
  221. data/vendor/msoffice/bin/msoffice-crypt.exe +0 -0
  222. data/vendor/msoffice/common.mk +71 -0
  223. data/vendor/msoffice/common.props +26 -0
  224. data/vendor/msoffice/debug.props +14 -0
  225. data/vendor/msoffice/include/attack.hpp +211 -0
  226. data/vendor/msoffice/include/cfb.hpp +777 -0
  227. data/vendor/msoffice/include/crypto_util.hpp +450 -0
  228. data/vendor/msoffice/include/custom_sha1.hpp +342 -0
  229. data/vendor/msoffice/include/decode.hpp +240 -0
  230. data/vendor/msoffice/include/encode.hpp +221 -0
  231. data/vendor/msoffice/include/make_dataspace.hpp +316 -0
  232. data/vendor/msoffice/include/msoc.h +129 -0
  233. data/vendor/msoffice/include/resource.hpp +7 -0
  234. data/vendor/msoffice/include/standard_encryption.hpp +145 -0
  235. data/vendor/msoffice/include/uint32vec.hpp +179 -0
  236. data/vendor/msoffice/include/util.hpp +212 -0
  237. data/vendor/msoffice/lib/.emptydir +0 -0
  238. data/vendor/msoffice/misc/decrypt-xls.vbs +46 -0
  239. data/vendor/msoffice/mk.bat +1 -0
  240. data/vendor/msoffice/mkdll.bat +3 -0
  241. data/vendor/msoffice/msoc.def +13 -0
  242. data/vendor/msoffice/msocsample.py +178 -0
  243. data/vendor/msoffice/msoffice12.sln +31 -0
  244. data/vendor/msoffice/readme.md +110 -0
  245. data/vendor/msoffice/release.props +28 -0
  246. data/vendor/msoffice/src/Makefile +19 -0
  247. data/vendor/msoffice/src/attack.cpp +124 -0
  248. data/vendor/msoffice/src/cfb_test.cpp +77 -0
  249. data/vendor/msoffice/src/minisample.c +54 -0
  250. data/vendor/msoffice/src/msocdll.cpp +276 -0
  251. data/vendor/msoffice/src/msocsample.c +136 -0
  252. data/vendor/msoffice/src/msoffice-crypt.cpp +219 -0
  253. data/vendor/msoffice/src/proj/attack/attack.vcxproj +88 -0
  254. data/vendor/msoffice/src/proj/main/msoffice-crypt.vcxproj +88 -0
  255. data/vendor/msoffice/src/sha1.cpp +234 -0
  256. data/vendor/msoffice/test/Makefile +20 -0
  257. data/vendor/msoffice/test/cfb_test.cpp +74 -0
  258. data/vendor/msoffice/test/hash_test.cpp +59 -0
  259. data/vendor/msoffice/test/proj/cfb/cfb_test.vcxproj +90 -0
  260. data/vendor/msoffice/test/proj/hash/hash_test.vcxproj +90 -0
  261. data/vendor/msoffice/test/sampl.bat +8 -0
  262. data/vendor/msoffice/test_all.py +46 -0
  263. data/vendor/update +4 -0
  264. metadata +351 -0
@@ -0,0 +1,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