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,238 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief converter between integer and string
|
|
5
|
+
|
|
6
|
+
@author MITSUNARI Shigeo(@herumi)
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#include <memory.h>
|
|
10
|
+
#include <limits>
|
|
11
|
+
#include <cybozu/exception.hpp>
|
|
12
|
+
|
|
13
|
+
namespace cybozu {
|
|
14
|
+
|
|
15
|
+
namespace atoi_local {
|
|
16
|
+
|
|
17
|
+
template<typename T, size_t n>
|
|
18
|
+
T convertToInt(bool *b, const char *p, size_t size, const char (&max)[n], T min, T overflow1, char overflow2)
|
|
19
|
+
{
|
|
20
|
+
if (size > 0 && *p) {
|
|
21
|
+
bool isMinus = false;
|
|
22
|
+
size_t i = 0;
|
|
23
|
+
if (*p == '-') {
|
|
24
|
+
isMinus = true;
|
|
25
|
+
i++;
|
|
26
|
+
}
|
|
27
|
+
if (i < size && p[i]) {
|
|
28
|
+
// skip leading zero
|
|
29
|
+
while (i < size && p[i] == '0') i++;
|
|
30
|
+
// check minimum
|
|
31
|
+
if (isMinus && size - i >= n - 1 && memcmp(max, &p[i], n - 1) == 0) {
|
|
32
|
+
if (b) *b = true;
|
|
33
|
+
return min;
|
|
34
|
+
}
|
|
35
|
+
T x = 0;
|
|
36
|
+
for (;;) {
|
|
37
|
+
unsigned char c;
|
|
38
|
+
if (i == size || (c = static_cast<unsigned char>(p[i])) == '\0') {
|
|
39
|
+
if (b) *b = true;
|
|
40
|
+
return isMinus ? -x : x;
|
|
41
|
+
}
|
|
42
|
+
unsigned int y = c - '0';
|
|
43
|
+
if (y > 9 || x > overflow1 || (x == overflow1 && c >= overflow2)) {
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
x = x * 10 + T(y);
|
|
47
|
+
i++;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (b) {
|
|
52
|
+
*b = false;
|
|
53
|
+
return 0;
|
|
54
|
+
} else {
|
|
55
|
+
throw cybozu::Exception("atoi::convertToInt") << cybozu::exception::makeString(p, size);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
template<typename T>
|
|
60
|
+
T convertToUint(bool *b, const char *p, size_t size, T overflow1, char overflow2)
|
|
61
|
+
{
|
|
62
|
+
if (size > 0 && *p) {
|
|
63
|
+
size_t i = 0;
|
|
64
|
+
// skip leading zero
|
|
65
|
+
while (i < size && p[i] == '0') i++;
|
|
66
|
+
T x = 0;
|
|
67
|
+
for (;;) {
|
|
68
|
+
unsigned char c;
|
|
69
|
+
if (i == size || (c = static_cast<unsigned char>(p[i])) == '\0') {
|
|
70
|
+
if (b) *b = true;
|
|
71
|
+
return x;
|
|
72
|
+
}
|
|
73
|
+
unsigned int y = c - '0';
|
|
74
|
+
if (y > 9 || x > overflow1 || (x == overflow1 && c >= overflow2)) {
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
x = x * 10 + T(y);
|
|
78
|
+
i++;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (b) {
|
|
82
|
+
*b = false;
|
|
83
|
+
return 0;
|
|
84
|
+
} else {
|
|
85
|
+
throw cybozu::Exception("atoi::convertToUint") << cybozu::exception::makeString(p, size);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
template<typename T>
|
|
90
|
+
T convertHexToInt(bool *b, const char *p, size_t size)
|
|
91
|
+
{
|
|
92
|
+
if (size > 0 && *p) {
|
|
93
|
+
size_t i = 0;
|
|
94
|
+
T x = 0;
|
|
95
|
+
for (;;) {
|
|
96
|
+
unsigned int c;
|
|
97
|
+
if (i == size || (c = static_cast<unsigned char>(p[i])) == '\0') {
|
|
98
|
+
if (b) *b = true;
|
|
99
|
+
return x;
|
|
100
|
+
}
|
|
101
|
+
if (c - 'A' <= 'F' - 'A') {
|
|
102
|
+
c = (c - 'A') + 10;
|
|
103
|
+
} else if (c - 'a' <= 'f' - 'a') {
|
|
104
|
+
c = (c - 'a') + 10;
|
|
105
|
+
} else if (c - '0' <= '9' - '0') {
|
|
106
|
+
c = c - '0';
|
|
107
|
+
} else {
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
// avoid overflow
|
|
111
|
+
if (x > (std::numeric_limits<T>::max)() / 16) break;
|
|
112
|
+
x = x * 16 + T(c);
|
|
113
|
+
i++;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (b) {
|
|
117
|
+
*b = false;
|
|
118
|
+
return 0;
|
|
119
|
+
} else {
|
|
120
|
+
throw cybozu::Exception("atoi::convertHexToInt") << cybozu::exception::makeString(p, size);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
} // atoi_local
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
auto detect return value class
|
|
128
|
+
@note if you set bool pointer p then throw nothing and set *p = false if bad string
|
|
129
|
+
*/
|
|
130
|
+
class atoi {
|
|
131
|
+
const char *p_;
|
|
132
|
+
size_t size_;
|
|
133
|
+
bool *b_;
|
|
134
|
+
void set(bool *b, const char *p, size_t size)
|
|
135
|
+
{
|
|
136
|
+
b_ = b;
|
|
137
|
+
p_ = p;
|
|
138
|
+
size_ = size;
|
|
139
|
+
}
|
|
140
|
+
public:
|
|
141
|
+
atoi(const char *p, size_t size = -1)
|
|
142
|
+
{
|
|
143
|
+
set(0, p, size);
|
|
144
|
+
}
|
|
145
|
+
atoi(bool *b, const char *p, size_t size = -1)
|
|
146
|
+
{
|
|
147
|
+
set(b, p, size);
|
|
148
|
+
}
|
|
149
|
+
atoi(const std::string& str)
|
|
150
|
+
{
|
|
151
|
+
set(0, str.c_str(), str.size());
|
|
152
|
+
}
|
|
153
|
+
atoi(bool *b, const std::string& str)
|
|
154
|
+
{
|
|
155
|
+
set(b, str.c_str(), str.size());
|
|
156
|
+
}
|
|
157
|
+
inline operator signed char() const
|
|
158
|
+
{
|
|
159
|
+
return atoi_local::convertToInt<signed char>(b_, p_, size_, "128", -128, 12, '8');
|
|
160
|
+
}
|
|
161
|
+
inline operator unsigned char() const
|
|
162
|
+
{
|
|
163
|
+
return atoi_local::convertToUint<unsigned char>(b_, p_, size_, 25, '6');
|
|
164
|
+
}
|
|
165
|
+
inline operator short() const
|
|
166
|
+
{
|
|
167
|
+
return atoi_local::convertToInt<short>(b_, p_, size_, "32768", -32768, 3276, '8');
|
|
168
|
+
}
|
|
169
|
+
inline operator unsigned short() const
|
|
170
|
+
{
|
|
171
|
+
return atoi_local::convertToUint<unsigned short>(b_, p_, size_, 6553, '6');
|
|
172
|
+
}
|
|
173
|
+
inline operator int() const
|
|
174
|
+
{
|
|
175
|
+
return atoi_local::convertToInt<int>(b_, p_, size_, "2147483648", (std::numeric_limits<int>::min)() /* -2147483648 */, 214748364, '8');
|
|
176
|
+
}
|
|
177
|
+
inline operator unsigned int() const
|
|
178
|
+
{
|
|
179
|
+
return atoi_local::convertToUint<unsigned int>(b_, p_, size_, 429496729, '6');
|
|
180
|
+
}
|
|
181
|
+
inline operator long long() const
|
|
182
|
+
{
|
|
183
|
+
return atoi_local::convertToInt<long long>(b_, p_, size_, "9223372036854775808", CYBOZU_LLONG_MIN, 922337203685477580LL, '8');
|
|
184
|
+
}
|
|
185
|
+
inline operator unsigned long long() const
|
|
186
|
+
{
|
|
187
|
+
return atoi_local::convertToUint<unsigned long long>(b_, p_, size_, 1844674407370955161ULL, '6');
|
|
188
|
+
}
|
|
189
|
+
#if defined(__SIZEOF_LONG__) && (__SIZEOF_LONG__ == 8)
|
|
190
|
+
inline operator long() const { return static_cast<long>(static_cast<long long>(*this)); }
|
|
191
|
+
inline operator unsigned long() const { return static_cast<unsigned long>(static_cast<unsigned long long>(*this)); }
|
|
192
|
+
#else
|
|
193
|
+
inline operator long() const { return static_cast<long>(static_cast<int>(*this)); }
|
|
194
|
+
inline operator unsigned long() const { return static_cast<unsigned long>(static_cast<unsigned int>(*this)); }
|
|
195
|
+
#endif
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
class hextoi {
|
|
199
|
+
const char *p_;
|
|
200
|
+
size_t size_;
|
|
201
|
+
bool *b_;
|
|
202
|
+
void set(bool *b, const char *p, size_t size)
|
|
203
|
+
{
|
|
204
|
+
b_ = b;
|
|
205
|
+
p_ = p;
|
|
206
|
+
size_ = size;
|
|
207
|
+
}
|
|
208
|
+
public:
|
|
209
|
+
hextoi(const char *p, size_t size = -1)
|
|
210
|
+
{
|
|
211
|
+
set(0, p, size);
|
|
212
|
+
}
|
|
213
|
+
hextoi(bool *b, const char *p, size_t size = -1)
|
|
214
|
+
{
|
|
215
|
+
set(b, p, size);
|
|
216
|
+
}
|
|
217
|
+
hextoi(const std::string& str)
|
|
218
|
+
{
|
|
219
|
+
set(0, str.c_str(), str.size());
|
|
220
|
+
}
|
|
221
|
+
hextoi(bool *b, const std::string& str)
|
|
222
|
+
{
|
|
223
|
+
set(b, str.c_str(), str.size());
|
|
224
|
+
}
|
|
225
|
+
operator unsigned char() const { return atoi_local::convertHexToInt<unsigned char>(b_, p_, size_); }
|
|
226
|
+
operator unsigned short() const { return atoi_local::convertHexToInt<unsigned short>(b_, p_, size_); }
|
|
227
|
+
operator unsigned int() const { return atoi_local::convertHexToInt<unsigned int>(b_, p_, size_); }
|
|
228
|
+
operator unsigned long() const { return atoi_local::convertHexToInt<unsigned long>(b_, p_, size_); }
|
|
229
|
+
operator unsigned long long() const { return atoi_local::convertHexToInt<unsigned long long>(b_, p_, size_); }
|
|
230
|
+
operator char() const { return atoi_local::convertHexToInt<char>(b_, p_, size_); }
|
|
231
|
+
operator signed char() const { return atoi_local::convertHexToInt<signed char>(b_, p_, size_); }
|
|
232
|
+
operator short() const { return atoi_local::convertHexToInt<short>(b_, p_, size_); }
|
|
233
|
+
operator int() const { return atoi_local::convertHexToInt<int>(b_, p_, size_); }
|
|
234
|
+
operator long() const { return atoi_local::convertHexToInt<long>(b_, p_, size_); }
|
|
235
|
+
operator long long() const { return atoi_local::convertHexToInt<long long>(b_, p_, size_); }
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
} // cybozu
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief atomic operation
|
|
5
|
+
|
|
6
|
+
@author MITSUNARI Shigeo(@herumi)
|
|
7
|
+
@author MITSUNARI Shigeo
|
|
8
|
+
*/
|
|
9
|
+
#include <cybozu/inttype.hpp>
|
|
10
|
+
#ifdef _WIN32
|
|
11
|
+
#ifndef WIN32_LEAN_AND_MEAN
|
|
12
|
+
#define WIN32_LEAN_AND_MEAN
|
|
13
|
+
#endif
|
|
14
|
+
#include <windows.h>
|
|
15
|
+
#include <intrin.h>
|
|
16
|
+
#else
|
|
17
|
+
#include <emmintrin.h>
|
|
18
|
+
#endif
|
|
19
|
+
|
|
20
|
+
namespace cybozu {
|
|
21
|
+
|
|
22
|
+
namespace atomic_local {
|
|
23
|
+
|
|
24
|
+
template<size_t S>
|
|
25
|
+
struct Tag {};
|
|
26
|
+
|
|
27
|
+
template<>
|
|
28
|
+
struct Tag<4> {
|
|
29
|
+
template<class T>
|
|
30
|
+
static inline T AtomicAddSub(T *p, T y)
|
|
31
|
+
{
|
|
32
|
+
#ifdef _WIN32
|
|
33
|
+
return (T)_InterlockedExchangeAdd((long*)p, (long)y);
|
|
34
|
+
#else
|
|
35
|
+
return static_cast<T>(__sync_fetch_and_add(p, y));
|
|
36
|
+
#endif
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
template<class T>
|
|
40
|
+
static inline T AtomicCompareExchangeSub(T *p, T newValue, T oldValue)
|
|
41
|
+
{
|
|
42
|
+
#ifdef _WIN32
|
|
43
|
+
return (T)_InterlockedCompareExchange((long*)p, (long)newValue, (long)oldValue);
|
|
44
|
+
#else
|
|
45
|
+
return static_cast<T>(__sync_val_compare_and_swap(p, oldValue, newValue));
|
|
46
|
+
#endif
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
template<class T>
|
|
50
|
+
static inline T AtomicExchangeSub(T *p, T newValue)
|
|
51
|
+
{
|
|
52
|
+
#ifdef _WIN32
|
|
53
|
+
return (T)_InterlockedExchange((long*)p, (long)newValue);
|
|
54
|
+
#else
|
|
55
|
+
return static_cast<T>(__sync_lock_test_and_set(p, newValue));
|
|
56
|
+
#endif
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
template<>
|
|
61
|
+
struct Tag<8> {
|
|
62
|
+
#if (CYBOZU_OS_BIT == 64)
|
|
63
|
+
template<class T>
|
|
64
|
+
static inline T AtomicAddSub(T *p, T y)
|
|
65
|
+
{
|
|
66
|
+
#ifdef _WIN32
|
|
67
|
+
return (T)_InterlockedExchangeAdd64((int64_t*)p, (int64_t)y);
|
|
68
|
+
#else
|
|
69
|
+
return static_cast<T>(__sync_fetch_and_add(p, y));
|
|
70
|
+
#endif
|
|
71
|
+
}
|
|
72
|
+
#endif
|
|
73
|
+
|
|
74
|
+
template<class T>
|
|
75
|
+
static inline T AtomicCompareExchangeSub(T *p, T newValue, T oldValue)
|
|
76
|
+
{
|
|
77
|
+
#ifdef _WIN32
|
|
78
|
+
return (T)_InterlockedCompareExchange64((int64_t*)p, (int64_t)newValue, (int64_t)oldValue);
|
|
79
|
+
#else
|
|
80
|
+
return static_cast<T>(__sync_val_compare_and_swap(p, oldValue, newValue));
|
|
81
|
+
#endif
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
#if (CYBOZU_OS_BIT == 64)
|
|
85
|
+
template<class T>
|
|
86
|
+
static inline T AtomicExchangeSub(T *p, T newValue)
|
|
87
|
+
{
|
|
88
|
+
#ifdef _WIN32
|
|
89
|
+
return (T)_InterlockedExchange64((int64_t*)p, (int64_t)newValue);
|
|
90
|
+
#else
|
|
91
|
+
return static_cast<T>(__sync_lock_test_and_set(p, newValue));
|
|
92
|
+
#endif
|
|
93
|
+
}
|
|
94
|
+
#endif
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
} // atomic_local
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
atomic operation
|
|
101
|
+
see http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html
|
|
102
|
+
http://msdn.microsoft.com/en-us/library/ms683504(VS.85).aspx
|
|
103
|
+
*/
|
|
104
|
+
/**
|
|
105
|
+
tmp = *p;
|
|
106
|
+
*p += y;
|
|
107
|
+
return tmp;
|
|
108
|
+
*/
|
|
109
|
+
template<class T>
|
|
110
|
+
T AtomicAdd(T *p, T y)
|
|
111
|
+
{
|
|
112
|
+
return atomic_local::Tag<sizeof(T)>::AtomicAddSub(p, y);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
tmp = *p;
|
|
117
|
+
if (*p == oldValue) *p = newValue;
|
|
118
|
+
return tmp;
|
|
119
|
+
*/
|
|
120
|
+
template<class T>
|
|
121
|
+
T AtomicCompareExchange(T *p, T newValue, T oldValue)
|
|
122
|
+
{
|
|
123
|
+
return atomic_local::Tag<sizeof(T)>::AtomicCompareExchangeSub(p, newValue, oldValue);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
tmp = *p;
|
|
128
|
+
*p = newValue;
|
|
129
|
+
return tmp;
|
|
130
|
+
*/
|
|
131
|
+
template<class T>
|
|
132
|
+
T AtomicExchange(T *p, T newValue)
|
|
133
|
+
{
|
|
134
|
+
return atomic_local::Tag<sizeof(T)>::AtomicExchangeSub(p, newValue);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
inline void mfence()
|
|
138
|
+
{
|
|
139
|
+
#ifdef _MSC_VER
|
|
140
|
+
MemoryBarrier();
|
|
141
|
+
#else
|
|
142
|
+
_mm_mfence();
|
|
143
|
+
#endif
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
} // cybozu
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief base64 encoder and decoder
|
|
5
|
+
|
|
6
|
+
@author MITSUNARI Shigeo(@herumi)
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#include <iostream>
|
|
10
|
+
#include <assert.h>
|
|
11
|
+
#include <cybozu/stream.hpp>
|
|
12
|
+
#include <cybozu/line_stream.hpp>
|
|
13
|
+
|
|
14
|
+
namespace cybozu {
|
|
15
|
+
|
|
16
|
+
namespace base64 {
|
|
17
|
+
|
|
18
|
+
const int useLF = 0;
|
|
19
|
+
const int useCRLF = 1;
|
|
20
|
+
const int noEndLine = 2;
|
|
21
|
+
|
|
22
|
+
} // base64
|
|
23
|
+
|
|
24
|
+
namespace base64_local {
|
|
25
|
+
|
|
26
|
+
static inline void addEndLine(char *outBuf, size_t& outBufSize, int mode)
|
|
27
|
+
{
|
|
28
|
+
if (mode == base64::noEndLine) return;
|
|
29
|
+
if (mode == base64::useCRLF) outBuf[outBufSize++] = cybozu::line_stream::CR;
|
|
30
|
+
outBuf[outBufSize++] = cybozu::line_stream::LF;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
} // base64_local
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
base64 encode
|
|
37
|
+
@param os [in] output stream
|
|
38
|
+
@param is [in] intpu stream
|
|
39
|
+
@param maxLineSize [in] max line size(multiply of 4 or zero(means infinite line))
|
|
40
|
+
@param isCRLF [in] put CRLF if ture, put LF if false
|
|
41
|
+
*/
|
|
42
|
+
template<class OutputStream, class InputStream>
|
|
43
|
+
void EncodeToBase64(OutputStream& os, InputStream& is, size_t maxLineSize = 76, int mode = base64::useCRLF)
|
|
44
|
+
{
|
|
45
|
+
const size_t innerMaxLineSize = 128;
|
|
46
|
+
if (maxLineSize > innerMaxLineSize || ((maxLineSize % 4) != 0)) {
|
|
47
|
+
throw cybozu::Exception("base64::EncodeToBase64:bad line size") << maxLineSize;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const char *tbl = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
51
|
+
|
|
52
|
+
unsigned int remain = 0;
|
|
53
|
+
size_t idx = 0; /* 0, 1, 2 */
|
|
54
|
+
size_t pos = 0; /* line position */
|
|
55
|
+
|
|
56
|
+
char inBuf[1024];
|
|
57
|
+
char outBuf[4096];
|
|
58
|
+
assert(sizeof(outBuf) > (sizeof(inBuf) * 4) / 3 +(sizeof(inBuf) * 2) /* max # of CRLF */ + 16 /* margin */);
|
|
59
|
+
size_t outBufSize = 0;
|
|
60
|
+
for (;;) {
|
|
61
|
+
size_t readSize = cybozu::readSome(inBuf, sizeof(inBuf), is);
|
|
62
|
+
if (readSize == 0) break;
|
|
63
|
+
for (size_t i = 0; i < readSize; i++) {
|
|
64
|
+
unsigned int c = static_cast<unsigned char>(inBuf[i]);
|
|
65
|
+
if (idx == 0) {
|
|
66
|
+
remain = (c & 3) << 4;
|
|
67
|
+
outBuf[outBufSize++] = tbl[c >> 2];
|
|
68
|
+
pos++;
|
|
69
|
+
idx = 1;
|
|
70
|
+
} else if (idx == 1) {
|
|
71
|
+
unsigned int tmp = remain | (c >> 4);
|
|
72
|
+
remain = (c & 0xf) << 2;
|
|
73
|
+
outBuf[outBufSize++] = tbl[tmp];
|
|
74
|
+
pos++;
|
|
75
|
+
idx = 2;
|
|
76
|
+
} else {
|
|
77
|
+
outBuf[outBufSize++] = tbl[remain | (c >> 6)];
|
|
78
|
+
outBuf[outBufSize++] = tbl[c & 0x3f];
|
|
79
|
+
pos += 2;
|
|
80
|
+
idx = 0;
|
|
81
|
+
}
|
|
82
|
+
if (maxLineSize && pos == maxLineSize) {
|
|
83
|
+
base64_local::addEndLine(outBuf, outBufSize, mode);
|
|
84
|
+
pos = 0;
|
|
85
|
+
}
|
|
86
|
+
assert(outBufSize <= sizeof(outBuf));
|
|
87
|
+
}
|
|
88
|
+
cybozu::write(os, outBuf, outBufSize);
|
|
89
|
+
outBufSize = 0;
|
|
90
|
+
}
|
|
91
|
+
if (idx > 0) {
|
|
92
|
+
outBuf[outBufSize++] = tbl[remain];
|
|
93
|
+
outBuf[outBufSize++] = '=';
|
|
94
|
+
pos += 2;
|
|
95
|
+
if (idx == 1) {
|
|
96
|
+
outBuf[outBufSize++] = '=';
|
|
97
|
+
pos++;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (maxLineSize && pos > 0) {
|
|
101
|
+
base64_local::addEndLine(outBuf, outBufSize, mode);
|
|
102
|
+
}
|
|
103
|
+
if (outBufSize > 0) {
|
|
104
|
+
cybozu::write(os, outBuf, outBufSize);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/*
|
|
109
|
+
base64 decoder class
|
|
110
|
+
@param os [in] output stream
|
|
111
|
+
*/
|
|
112
|
+
template<class OutputStream>
|
|
113
|
+
class Base64Decoder {
|
|
114
|
+
OutputStream& os_;
|
|
115
|
+
char outBuf_[1024];
|
|
116
|
+
size_t outBufSize_;
|
|
117
|
+
size_t idx_;
|
|
118
|
+
unsigned int cur_;
|
|
119
|
+
Base64Decoder(const Base64Decoder&);
|
|
120
|
+
void operator=(const Base64Decoder&);
|
|
121
|
+
public:
|
|
122
|
+
Base64Decoder(OutputStream& os)
|
|
123
|
+
: os_(os)
|
|
124
|
+
, outBufSize_(0)
|
|
125
|
+
, idx_(0)
|
|
126
|
+
, cur_(0)
|
|
127
|
+
{
|
|
128
|
+
}
|
|
129
|
+
/*
|
|
130
|
+
@param buf [in] input buffer
|
|
131
|
+
@param size [in] input buffer size
|
|
132
|
+
@return same size(always)
|
|
133
|
+
*/
|
|
134
|
+
ssize_t write(const char *buf, size_t size)
|
|
135
|
+
{
|
|
136
|
+
const unsigned int S = 255; /* skip character */
|
|
137
|
+
static const unsigned int tbl[256] = {
|
|
138
|
+
S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
|
|
139
|
+
S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
|
|
140
|
+
S, S, S, S, S, S, S, S, S, S, S, 62, S, S, S, 63,
|
|
141
|
+
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, S, S, S, S, S, S,
|
|
142
|
+
S, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
|
143
|
+
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, S, S, S, S, S,
|
|
144
|
+
S, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
|
145
|
+
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, S, S, S, S, S,
|
|
146
|
+
S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
|
|
147
|
+
S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
|
|
148
|
+
S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
|
|
149
|
+
S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
|
|
150
|
+
S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
|
|
151
|
+
S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
|
|
152
|
+
S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
|
|
153
|
+
S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
|
|
154
|
+
};
|
|
155
|
+
for (size_t i = 0; i < size; i++) {
|
|
156
|
+
unsigned int t = tbl[static_cast<unsigned char>(buf[i])];
|
|
157
|
+
if (t == S) continue;
|
|
158
|
+
if (idx_ == 0) {
|
|
159
|
+
cur_ = t << 2;
|
|
160
|
+
idx_ = 1;
|
|
161
|
+
} else if (idx_ == 1) {
|
|
162
|
+
outBuf_[outBufSize_++] = static_cast<char>(cur_ | (t >> 4));
|
|
163
|
+
cur_ = (t & 0xf) << 4;
|
|
164
|
+
idx_ = 2;
|
|
165
|
+
} else if (idx_ == 2) {
|
|
166
|
+
outBuf_[outBufSize_++] = static_cast<char>(cur_ | (t >> 2));
|
|
167
|
+
cur_ = (t & 3) << 6;
|
|
168
|
+
idx_ = 3;
|
|
169
|
+
} else {
|
|
170
|
+
outBuf_[outBufSize_++] = static_cast<char>(cur_ | t);
|
|
171
|
+
idx_ = 0;
|
|
172
|
+
}
|
|
173
|
+
if (outBufSize_ == sizeof(outBuf_)) {
|
|
174
|
+
cybozu::write(os_, outBuf_, outBufSize_);
|
|
175
|
+
outBufSize_ = 0;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return static_cast<ssize_t>(size);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
flush data
|
|
182
|
+
*/
|
|
183
|
+
void flush()
|
|
184
|
+
{
|
|
185
|
+
if (outBufSize_ > 0) {
|
|
186
|
+
cybozu::write(os_, outBuf_, outBufSize_);
|
|
187
|
+
outBufSize_ = 0;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
base64 decode
|
|
194
|
+
@param os [in] output stream
|
|
195
|
+
@param is [in] intpu stream
|
|
196
|
+
*/
|
|
197
|
+
template<class OutputStream, class InputStream>
|
|
198
|
+
void DecodeFromBase64(OutputStream& os, InputStream& is)
|
|
199
|
+
{
|
|
200
|
+
cybozu::Base64Decoder<OutputStream> dec(os);
|
|
201
|
+
for (;;) {
|
|
202
|
+
char buf[1024];
|
|
203
|
+
size_t readSize = cybozu::readSome(buf, sizeof(buf), is);
|
|
204
|
+
if (readSize <= 0) break;
|
|
205
|
+
dec.write(buf, readSize);
|
|
206
|
+
}
|
|
207
|
+
dec.flush();
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
} // cybozu
|