aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/DBCS.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/DBCS.cxx')
-rw-r--r--src/DBCS.cxx37
1 files changed, 24 insertions, 13 deletions
diff --git a/src/DBCS.cxx b/src/DBCS.cxx
index f53b8e9ed..062c30a51 100644
--- a/src/DBCS.cxx
+++ b/src/DBCS.cxx
@@ -7,8 +7,10 @@
#include <cstdint>
+#include <vector>
#include <array>
#include <map>
+#include <algorithm>
#include "DBCS.h"
@@ -88,10 +90,13 @@ bool DBCSIsTrailByte(int codePage, char ch) noexcept {
bool IsDBCSValidSingleByte(int codePage, int ch) noexcept {
switch (codePage) {
case cp932:
+ // Shift_jis
return ch == 0x80
|| (ch >= 0xA0 && ch <= 0xDF)
|| (ch >= 0xFD);
-
+ case cp936:
+ // GBK
+ return ch == 0x80;
default:
return false;
}
@@ -99,25 +104,31 @@ bool IsDBCSValidSingleByte(int codePage, int ch) noexcept {
// NOLINTEND(*-magic-numbers)
-using CodePageToFoldMap = std::map<int, FoldMap>;
-CodePageToFoldMap cpToFoldMap;
+namespace {
-bool DBCSHasFoldMap(int codePage) {
- const CodePageToFoldMap::const_iterator it = cpToFoldMap.find(codePage);
- return it != cpToFoldMap.end();
-}
+struct CodePageFoldMap {
+ int codePage = 0;
+ FoldMap foldMap;
+ explicit CodePageFoldMap(int codePage_) noexcept : codePage {codePage_} {}
+};
+
+using CodePageToFoldMap = std::vector<CodePageFoldMap>;
+CodePageToFoldMap cpToFoldMap;
-void DBCSSetFoldMap(int codePage, const FoldMap &foldMap) {
- cpToFoldMap[codePage] = foldMap;
}
-FoldMap *DBCSGetMutableFoldMap(int codePage) {
- // Constructs if needed
- return &cpToFoldMap[codePage];
+FoldMap *DBCSCreateFoldMap(int codePage) {
+ cpToFoldMap.emplace_back(codePage);
+ return &(cpToFoldMap.back().foldMap);
}
const FoldMap *DBCSGetFoldMap(int codePage) {
- return &cpToFoldMap[codePage];
+ const CodePageToFoldMap::iterator it = std::find_if(cpToFoldMap.begin(), cpToFoldMap.end(),
+ [codePage](const CodePageFoldMap &cpfm) -> bool {return cpfm.codePage == codePage; });
+ if (it != cpToFoldMap.end()) {
+ return &(it->foldMap);
+ }
+ return nullptr;
}
}