Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
L
libcifpp
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
open
libcifpp
Commits
e0777e74
Unverified
Commit
e0777e74
authored
Apr 08, 2021
by
Maarten L. Hekkelman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
minor updates
parent
cf465134
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
279 additions
and
203 deletions
+279
-203
include/cif++/Cif++.hpp
+19
-7
include/cif++/Point.hpp
+10
-0
src/Cif++.cpp
+50
-1
src/CifUtils.cpp
+200
-195
No files found.
include/cif++/Cif++.hpp
View file @
e0777e74
...
@@ -686,7 +686,7 @@ class Row
...
@@ -686,7 +686,7 @@ class Row
}
}
template
<
typename
...
Ts
,
size_t
N
>
template
<
typename
...
Ts
,
size_t
N
>
std
::
tuple
<
Ts
...
>
get
(
char
const
*
const
(
&
columns
)[
N
])
std
::
tuple
<
Ts
...
>
get
(
char
const
*
const
(
&
columns
)[
N
])
const
{
{
static_assert
(
sizeof
...(
Ts
)
==
N
,
"Number of columns should be equal to number of types to return"
);
static_assert
(
sizeof
...(
Ts
)
==
N
,
"Number of columns should be equal to number of types to return"
);
...
@@ -1087,7 +1087,7 @@ template<typename T>
...
@@ -1087,7 +1087,7 @@ template<typename T>
Condition
operator
==
(
const
Key
&
key
,
const
T
&
v
)
Condition
operator
==
(
const
Key
&
key
,
const
T
&
v
)
{
{
std
::
ostringstream
s
;
std
::
ostringstream
s
;
s
<<
"== "
<<
v
;
s
<<
"
== "
<<
v
;
return
Condition
(
new
detail
::
KeyCompareConditionImpl
(
key
.
mItemTag
,
[
tag
=
key
.
mItemTag
,
v
](
const
Category
&
c
,
const
Row
&
r
,
bool
icase
)
return
Condition
(
new
detail
::
KeyCompareConditionImpl
(
key
.
mItemTag
,
[
tag
=
key
.
mItemTag
,
v
](
const
Category
&
c
,
const
Row
&
r
,
bool
icase
)
{
return
r
[
tag
].
template
compare
<
T
>
(
v
,
icase
)
==
0
;
},
s
.
str
()));
{
return
r
[
tag
].
template
compare
<
T
>
(
v
,
icase
)
==
0
;
},
s
.
str
()));
...
@@ -1123,7 +1123,7 @@ template<typename T>
...
@@ -1123,7 +1123,7 @@ template<typename T>
Condition
operator
>
(
const
Key
&
key
,
const
T
&
v
)
Condition
operator
>
(
const
Key
&
key
,
const
T
&
v
)
{
{
std
::
ostringstream
s
;
std
::
ostringstream
s
;
s
<<
"
>
"
<<
v
;
s
<<
"
>
"
<<
v
;
return
Condition
(
new
detail
::
KeyCompareConditionImpl
(
key
.
mItemTag
,
[
tag
=
key
.
mItemTag
,
v
](
const
Category
&
c
,
const
Row
&
r
,
bool
icase
)
return
Condition
(
new
detail
::
KeyCompareConditionImpl
(
key
.
mItemTag
,
[
tag
=
key
.
mItemTag
,
v
](
const
Category
&
c
,
const
Row
&
r
,
bool
icase
)
{
return
r
[
tag
].
template
compare
<
T
>
(
v
,
icase
)
>
0
;
},
s
.
str
()));
{
return
r
[
tag
].
template
compare
<
T
>
(
v
,
icase
)
>
0
;
},
s
.
str
()));
...
@@ -1133,7 +1133,7 @@ template<typename T>
...
@@ -1133,7 +1133,7 @@ template<typename T>
Condition
operator
>=
(
const
Key
&
key
,
const
T
&
v
)
Condition
operator
>=
(
const
Key
&
key
,
const
T
&
v
)
{
{
std
::
ostringstream
s
;
std
::
ostringstream
s
;
s
<<
"
>=
"
<<
v
;
s
<<
"
>=
"
<<
v
;
return
Condition
(
new
detail
::
KeyCompareConditionImpl
(
key
.
mItemTag
,
[
tag
=
key
.
mItemTag
,
v
](
const
Category
&
c
,
const
Row
&
r
,
bool
icase
)
return
Condition
(
new
detail
::
KeyCompareConditionImpl
(
key
.
mItemTag
,
[
tag
=
key
.
mItemTag
,
v
](
const
Category
&
c
,
const
Row
&
r
,
bool
icase
)
{
return
r
[
tag
].
template
compare
<
T
>
(
v
,
icase
)
>=
0
;
},
s
.
str
()));
{
return
r
[
tag
].
template
compare
<
T
>
(
v
,
icase
)
>=
0
;
},
s
.
str
()));
...
@@ -1143,7 +1143,7 @@ template<typename T>
...
@@ -1143,7 +1143,7 @@ template<typename T>
Condition
operator
<
(
const
Key
&
key
,
const
T
&
v
)
Condition
operator
<
(
const
Key
&
key
,
const
T
&
v
)
{
{
std
::
ostringstream
s
;
std
::
ostringstream
s
;
s
<<
"
<
"
<<
v
;
s
<<
"
<
"
<<
v
;
return
Condition
(
new
detail
::
KeyCompareConditionImpl
(
key
.
mItemTag
,
[
tag
=
key
.
mItemTag
,
v
](
const
Category
&
c
,
const
Row
&
r
,
bool
icase
)
return
Condition
(
new
detail
::
KeyCompareConditionImpl
(
key
.
mItemTag
,
[
tag
=
key
.
mItemTag
,
v
](
const
Category
&
c
,
const
Row
&
r
,
bool
icase
)
{
return
r
[
tag
].
template
compare
<
T
>
(
v
,
icase
)
<
0
;
},
s
.
str
()));
{
return
r
[
tag
].
template
compare
<
T
>
(
v
,
icase
)
<
0
;
},
s
.
str
()));
...
@@ -1153,7 +1153,7 @@ template<typename T>
...
@@ -1153,7 +1153,7 @@ template<typename T>
Condition
operator
<=
(
const
Key
&
key
,
const
T
&
v
)
Condition
operator
<=
(
const
Key
&
key
,
const
T
&
v
)
{
{
std
::
ostringstream
s
;
std
::
ostringstream
s
;
s
<<
"
<=
"
<<
v
;
s
<<
"
<=
"
<<
v
;
return
Condition
(
new
detail
::
KeyCompareConditionImpl
(
key
.
mItemTag
,
[
tag
=
key
.
mItemTag
,
v
](
const
Category
&
c
,
const
Row
&
r
,
bool
icase
)
return
Condition
(
new
detail
::
KeyCompareConditionImpl
(
key
.
mItemTag
,
[
tag
=
key
.
mItemTag
,
v
](
const
Category
&
c
,
const
Row
&
r
,
bool
icase
)
{
return
r
[
tag
].
template
compare
<
T
>
(
v
,
icase
)
<=
0
;
},
s
.
str
()));
{
return
r
[
tag
].
template
compare
<
T
>
(
v
,
icase
)
<=
0
;
},
s
.
str
()));
...
@@ -1824,6 +1824,12 @@ class Category
...
@@ -1824,6 +1824,12 @@ class Category
RowSet
getChildren
(
Row
r
,
Category
&
childCat
);
RowSet
getChildren
(
Row
r
,
Category
&
childCat
);
RowSet
getChildren
(
Row
r
,
const
char
*
childCat
);
RowSet
getChildren
(
Row
r
,
const
char
*
childCat
);
RowSet
getParents
(
Row
r
,
Category
&
parentCat
);
RowSet
getParents
(
Row
r
,
const
char
*
parentCat
);
RowSet
getLinked
(
Row
r
,
Category
&
cat
);
RowSet
getLinked
(
Row
r
,
const
char
*
cat
);
bool
isValid
();
bool
isValid
();
void
validateLinks
()
const
;
void
validateLinks
()
const
;
...
@@ -1904,7 +1910,13 @@ class File
...
@@ -1904,7 +1910,13 @@ class File
bool
isValid
();
bool
isValid
();
void
validateLinks
()
const
;
void
validateLinks
()
const
;
Datablock
&
firstDatablock
()
{
return
*
mHead
;
}
Datablock
&
firstDatablock
()
{
if
(
mHead
==
nullptr
)
throw
std
::
runtime_error
(
"No datablocks in file"
);
return
*
mHead
;
}
void
append
(
Datablock
*
e
);
void
append
(
Datablock
*
e
);
Datablock
*
get
(
const
std
::
string
&
name
)
const
;
Datablock
*
get
(
const
std
::
string
&
name
)
const
;
...
...
include/cif++/Point.hpp
View file @
e0777e74
...
@@ -340,6 +340,16 @@ double CosinusAngle(const PointF<F>& p1, const PointF<F>& p2, const PointF<F>& p
...
@@ -340,6 +340,16 @@ double CosinusAngle(const PointF<F>& p1, const PointF<F>& p2, const PointF<F>& p
return
result
;
return
result
;
}
}
template
<
typename
F
>
auto
DistancePointToLine
(
const
PointF
<
F
>
&
l1
,
const
PointF
<
F
>
&
l2
,
const
PointF
<
F
>
&
p
)
{
auto
line
=
l2
-
l1
;
auto
p_to_l1
=
p
-
l1
;
auto
p_to_l2
=
p
-
l2
;
auto
cross
=
CrossProduct
(
p_to_l1
,
p_to_l2
);
return
cross
.
length
()
/
line
.
length
();
}
// --------------------------------------------------------------------
// --------------------------------------------------------------------
// For e.g. simulated annealing, returns a new point that is moved in
// For e.g. simulated annealing, returns a new point that is moved in
// a random direction with a distance randomly chosen from a normal
// a random direction with a distance randomly chosen from a normal
...
...
src/Cif++.cpp
View file @
e0777e74
...
@@ -1904,6 +1904,55 @@ RowSet Category::getChildren(Row r, Category& childCat)
...
@@ -1904,6 +1904,55 @@ RowSet Category::getChildren(Row r, Category& childCat)
return
result
;
return
result
;
}
}
RowSet
Category
::
getParents
(
Row
r
,
const
char
*
parentCat
)
{
return
getParents
(
r
,
mDb
[
parentCat
]);
}
RowSet
Category
::
getParents
(
Row
r
,
Category
&
parentCat
)
{
assert
(
mValidator
!=
nullptr
);
assert
(
mCatValidator
!=
nullptr
);
RowSet
result
(
parentCat
);
for
(
auto
&
link
:
mValidator
->
getLinksForChild
(
mName
))
{
if
(
link
->
mParentCategory
!=
parentCat
.
mName
)
continue
;
Condition
cond
;
for
(
size_t
ix
=
0
;
ix
<
link
->
mChildKeys
.
size
();
++
ix
)
{
const
char
*
value
=
r
[
link
->
mChildKeys
[
ix
]].
c_str
();
cond
=
std
::
move
(
cond
)
&&
(
Key
(
link
->
mParentKeys
[
ix
])
==
value
);
}
auto
parents
=
parentCat
.
find
(
std
::
move
(
cond
));
result
.
insert
(
result
.
end
(),
parents
.
begin
(),
parents
.
end
());
}
// remove duplicates
result
.
make_unique
();
return
result
;
}
RowSet
Category
::
getLinked
(
Row
r
,
const
char
*
cat
)
{
return
getLinked
(
r
,
mDb
[
cat
]);
}
RowSet
Category
::
getLinked
(
Row
r
,
Category
&
cat
)
{
RowSet
result
=
getChildren
(
r
,
cat
);
if
(
result
.
empty
())
result
=
getParents
(
r
,
cat
);
return
result
;
}
bool
Category
::
isValid
()
bool
Category
::
isValid
()
{
{
bool
result
=
true
;
bool
result
=
true
;
...
@@ -2582,7 +2631,7 @@ void Row::assign(size_t column, const std::string& value, bool skipUpdateLinked)
...
@@ -2582,7 +2631,7 @@ void Row::assign(size_t column, const std::string& value, bool skipUpdateLinked)
}
}
}
}
if
(
cif
::
VERBOSE
>
=
2
)
if
(
cif
::
VERBOSE
>
2
)
{
{
std
::
cerr
<<
"Parent: "
<<
linked
->
mParentCategory
<<
" Child: "
<<
linked
->
mChildCategory
<<
std
::
endl
std
::
cerr
<<
"Parent: "
<<
linked
->
mParentCategory
<<
" Child: "
<<
linked
->
mChildCategory
<<
std
::
endl
<<
cond
<<
std
::
endl
;
<<
cond
<<
std
::
endl
;
...
...
src/CifUtils.cpp
View file @
e0777e74
...
@@ -28,25 +28,25 @@
...
@@ -28,25 +28,25 @@
#include "Config.hpp"
#include "Config.hpp"
#endif
#endif
#include <tuple>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <atomic>
#include <atomic>
#include <mutex>
#include <chrono>
#include <thread>
#include <cmath>
#include <cstdio>
#include <filesystem>
#include <filesystem>
#include <fstream>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <map>
#include <map>
#include <
chrono
>
#include <
mutex
>
#include <regex>
#include <regex>
#include <iomanip>
#include <thread>
#include <tuple>
#if defined(_MSC_VER)
#if defined(_MSC_VER)
#define TERM_WIDTH 80
#define TERM_WIDTH 80
#else
#else
#include <termios.h>
#include <sys/ioctl.h>
#include <sys/ioctl.h>
#include <termios.h>
#endif
#endif
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string.hpp>
...
@@ -74,13 +74,13 @@ std::string get_version_nr()
...
@@ -74,13 +74,13 @@ std::string get_version_nr()
#if __has_include("revision.hpp")
#if __has_include("revision.hpp")
#include "revision.hpp"
#include "revision.hpp"
#else
#else
const
char
*
kRevision
=
""
;
const
char
*
kRevision
=
""
;
#endif
#endif
struct
membuf
:
public
std
::
streambuf
struct
membuf
:
public
std
::
streambuf
{
{
membuf
(
char
*
data
,
size_t
length
)
{
this
->
setg
(
data
,
data
,
data
+
length
);
}
membuf
(
char
*
data
,
size_t
length
)
{
this
->
setg
(
data
,
data
,
data
+
length
);
}
}
buffer
(
const_cast
<
char
*>
(
kRevision
),
sizeof
(
kRevision
));
}
buffer
(
const_cast
<
char
*>
(
kRevision
),
sizeof
(
kRevision
));
std
::
istream
is
(
&
buffer
);
std
::
istream
is
(
&
buffer
);
...
@@ -110,7 +110,7 @@ const char* kRevision = "";
...
@@ -110,7 +110,7 @@ const char* kRevision = "";
// This really makes a difference, having our own tolower routines
// This really makes a difference, having our own tolower routines
const
uint8_t
kCharToLowerMap
[
256
]
=
const
uint8_t
kCharToLowerMap
[
256
]
=
{
{
0x00
,
0x01
,
0x02
,
0x03
,
0x04
,
0x05
,
0x06
,
0x07
,
0x08
,
0x09
,
0x0a
,
0x0b
,
0x0c
,
0x0d
,
0x0e
,
0x0f
,
0x00
,
0x01
,
0x02
,
0x03
,
0x04
,
0x05
,
0x06
,
0x07
,
0x08
,
0x09
,
0x0a
,
0x0b
,
0x0c
,
0x0d
,
0x0e
,
0x0f
,
0x10
,
0x11
,
0x12
,
0x13
,
0x14
,
0x15
,
0x16
,
0x17
,
0x18
,
0x19
,
0x1a
,
0x1b
,
0x1c
,
0x1d
,
0x1e
,
0x1f
,
0x10
,
0x11
,
0x12
,
0x13
,
0x14
,
0x15
,
0x16
,
0x17
,
0x18
,
0x19
,
0x1a
,
0x1b
,
0x1c
,
0x1d
,
0x1e
,
0x1f
,
0x20
,
0x21
,
0x22
,
0x23
,
0x24
,
0x25
,
0x26
,
0x27
,
0x28
,
0x29
,
0x2a
,
0x2b
,
0x2c
,
0x2d
,
0x2e
,
0x2f
,
0x20
,
0x21
,
0x22
,
0x23
,
0x24
,
0x25
,
0x26
,
0x27
,
0x28
,
0x29
,
0x2a
,
0x2b
,
0x2c
,
0x2d
,
0x2e
,
0x2f
,
...
@@ -126,12 +126,11 @@ const uint8_t kCharToLowerMap[256] =
...
@@ -126,12 +126,11 @@ const uint8_t kCharToLowerMap[256] =
0xc0
,
0xc1
,
0xc2
,
0xc3
,
0xc4
,
0xc5
,
0xc6
,
0xc7
,
0xc8
,
0xc9
,
0xca
,
0xcb
,
0xcc
,
0xcd
,
0xce
,
0xcf
,
0xc0
,
0xc1
,
0xc2
,
0xc3
,
0xc4
,
0xc5
,
0xc6
,
0xc7
,
0xc8
,
0xc9
,
0xca
,
0xcb
,
0xcc
,
0xcd
,
0xce
,
0xcf
,
0xd0
,
0xd1
,
0xd2
,
0xd3
,
0xd4
,
0xd5
,
0xd6
,
0xd7
,
0xd8
,
0xd9
,
0xda
,
0xdb
,
0xdc
,
0xdd
,
0xde
,
0xdf
,
0xd0
,
0xd1
,
0xd2
,
0xd3
,
0xd4
,
0xd5
,
0xd6
,
0xd7
,
0xd8
,
0xd9
,
0xda
,
0xdb
,
0xdc
,
0xdd
,
0xde
,
0xdf
,
0xe0
,
0xe1
,
0xe2
,
0xe3
,
0xe4
,
0xe5
,
0xe6
,
0xe7
,
0xe8
,
0xe9
,
0xea
,
0xeb
,
0xec
,
0xed
,
0xee
,
0xef
,
0xe0
,
0xe1
,
0xe2
,
0xe3
,
0xe4
,
0xe5
,
0xe6
,
0xe7
,
0xe8
,
0xe9
,
0xea
,
0xeb
,
0xec
,
0xed
,
0xee
,
0xef
,
0xf0
,
0xf1
,
0xf2
,
0xf3
,
0xf4
,
0xf5
,
0xf6
,
0xf7
,
0xf8
,
0xf9
,
0xfa
,
0xfb
,
0xfc
,
0xfd
,
0xfe
,
0xff
0xf0
,
0xf1
,
0xf2
,
0xf3
,
0xf4
,
0xf5
,
0xf6
,
0xf7
,
0xf8
,
0xf9
,
0xfa
,
0xfb
,
0xfc
,
0xfd
,
0xfe
,
0xff
};
};
// --------------------------------------------------------------------
// --------------------------------------------------------------------
bool
iequals
(
const
std
::
string
&
a
,
const
std
::
string
&
b
)
bool
iequals
(
const
std
::
string
&
a
,
const
std
::
string
&
b
)
{
{
bool
result
=
a
.
length
()
==
b
.
length
();
bool
result
=
a
.
length
()
==
b
.
length
();
for
(
auto
ai
=
a
.
begin
(),
bi
=
b
.
begin
();
result
and
ai
!=
a
.
end
()
and
bi
!=
b
.
end
();
++
ai
,
++
bi
)
for
(
auto
ai
=
a
.
begin
(),
bi
=
b
.
begin
();
result
and
ai
!=
a
.
end
()
and
bi
!=
b
.
end
();
++
ai
,
++
bi
)
...
@@ -139,7 +138,7 @@ bool iequals(const std::string& a, const std::string& b)
...
@@ -139,7 +138,7 @@ bool iequals(const std::string& a, const std::string& b)
return
result
;
return
result
;
}
}
bool
iequals
(
const
char
*
a
,
const
char
*
b
)
bool
iequals
(
const
char
*
a
,
const
char
*
b
)
{
{
bool
result
=
true
;
bool
result
=
true
;
for
(;
result
and
*
a
and
*
b
;
++
a
,
++
b
)
for
(;
result
and
*
a
and
*
b
;
++
a
,
++
b
)
...
@@ -148,7 +147,7 @@ bool iequals(const char* a, const char* b)
...
@@ -148,7 +147,7 @@ bool iequals(const char* a, const char* b)
return
result
and
*
a
==
*
b
;
return
result
and
*
a
==
*
b
;
}
}
int
icompare
(
const
std
::
string
&
a
,
const
std
::
string
&
b
)
int
icompare
(
const
std
::
string
&
a
,
const
std
::
string
&
b
)
{
{
int
d
=
0
;
int
d
=
0
;
auto
ai
=
a
.
begin
(),
bi
=
b
.
begin
();
auto
ai
=
a
.
begin
(),
bi
=
b
.
begin
();
...
@@ -167,7 +166,7 @@ int icompare(const std::string& a, const std::string& b)
...
@@ -167,7 +166,7 @@ int icompare(const std::string& a, const std::string& b)
return
d
;
return
d
;
}
}
int
icompare
(
const
char
*
a
,
const
char
*
b
)
int
icompare
(
const
char
*
a
,
const
char
*
b
)
{
{
int
d
=
0
;
int
d
=
0
;
...
@@ -185,23 +184,23 @@ int icompare(const char* a, const char* b)
...
@@ -185,23 +184,23 @@ int icompare(const char* a, const char* b)
return
d
;
return
d
;
}
}
void
toLower
(
std
::
string
&
s
)
void
toLower
(
std
::
string
&
s
)
{
{
for
(
auto
&
c
:
s
)
for
(
auto
&
c
:
s
)
c
=
tolower
(
c
);
c
=
tolower
(
c
);
}
}
std
::
string
toLowerCopy
(
const
std
::
string
&
s
)
std
::
string
toLowerCopy
(
const
std
::
string
&
s
)
{
{
std
::
string
result
(
s
);
std
::
string
result
(
s
);
for
(
auto
&
c
:
result
)
for
(
auto
&
c
:
result
)
c
=
tolower
(
c
);
c
=
tolower
(
c
);
return
result
;
return
result
;
}
}
// --------------------------------------------------------------------
// --------------------------------------------------------------------
std
::
tuple
<
std
::
string
,
std
::
string
>
splitTagName
(
const
std
::
string
&
tag
)
std
::
tuple
<
std
::
string
,
std
::
string
>
splitTagName
(
const
std
::
string
&
tag
)
{
{
if
(
tag
.
empty
())
if
(
tag
.
empty
())
throw
std
::
runtime_error
(
"empty tag"
);
throw
std
::
runtime_error
(
"empty tag"
);
...
@@ -211,9 +210,8 @@ std::tuple<std::string,std::string> splitTagName(const std::string& tag)
...
@@ -211,9 +210,8 @@ std::tuple<std::string,std::string> splitTagName(const std::string& tag)
auto
s
=
tag
.
find
(
'.'
);
auto
s
=
tag
.
find
(
'.'
);
if
(
s
==
std
::
string
::
npos
)
if
(
s
==
std
::
string
::
npos
)
throw
std
::
runtime_error
(
"tag does not contain dot"
);
throw
std
::
runtime_error
(
"tag does not contain dot"
);
return
std
::
tuple
<
std
::
string
,
std
::
string
>
{
return
std
::
tuple
<
std
::
string
,
std
::
string
>
{
tag
.
substr
(
1
,
s
-
1
),
tag
.
substr
(
s
+
1
)
tag
.
substr
(
1
,
s
-
1
),
tag
.
substr
(
s
+
1
)};
};
}
}
// --------------------------------------------------------------------
// --------------------------------------------------------------------
...
@@ -263,7 +261,7 @@ enum LineBreakClass
...
@@ -263,7 +261,7 @@ enum LineBreakClass
};
};
const
LineBreakClass
kASCII_LBTable
[
128
]
=
const
LineBreakClass
kASCII_LBTable
[
128
]
=
{
{
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_BreakAfter
,
kLBC_LineFeed
,
kLBC_MandatoryBreak
,
kLBC_MandatoryBreak
,
kLBC_CarriageReturn
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_BreakAfter
,
kLBC_LineFeed
,
kLBC_MandatoryBreak
,
kLBC_MandatoryBreak
,
kLBC_CarriageReturn
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
kLBC_CombiningMark
,
...
@@ -272,7 +270,7 @@ const LineBreakClass kASCII_LBTable[128] =
...
@@ -272,7 +270,7 @@ const LineBreakClass kASCII_LBTable[128] =
kLBC_OpenPunctuation
,
kLBC_CloseParenthesis
,
kLBC_Alphabetic
,
kLBC_PrefixNumeric
,
kLBC_OpenPunctuation
,
kLBC_CloseParenthesis
,
kLBC_Alphabetic
,
kLBC_PrefixNumeric
,
// comma treated differently here, it is not a numeric separator in PDB
// comma treated differently here, it is not a numeric separator in PDB
kLBC_SymbolAllowingBreakAfter
/* kLBC_InfixNumericSeparator */
,
kLBC_SymbolAllowingBreakAfter
/* kLBC_InfixNumericSeparator */
,
kLBC_Hyphen
,
kLBC_InfixNumericSeparator
,
kLBC_SymbolAllowingBreakAfter
,
kLBC_Hyphen
,
kLBC_InfixNumericSeparator
,
kLBC_SymbolAllowingBreakAfter
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
kLBC_Numeric
,
...
@@ -284,8 +282,7 @@ const LineBreakClass kASCII_LBTable[128] =
...
@@ -284,8 +282,7 @@ const LineBreakClass kASCII_LBTable[128] =
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_OpenPunctuation
,
kLBC_BreakAfter
,
kLBC_ClosePunctuation
,
kLBC_Alphabetic
,
kLBC_CombiningMark
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_Alphabetic
,
kLBC_OpenPunctuation
,
kLBC_BreakAfter
,
kLBC_ClosePunctuation
,
kLBC_Alphabetic
,
kLBC_CombiningMark
};
};
std
::
string
::
const_iterator
nextLineBreak
(
std
::
string
::
const_iterator
text
,
std
::
string
::
const_iterator
end
)
std
::
string
::
const_iterator
nextLineBreak
(
std
::
string
::
const_iterator
text
,
std
::
string
::
const_iterator
end
)
{
{
...
@@ -303,33 +300,33 @@ std::string::const_iterator nextLineBreak(std::string::const_iterator text, std:
...
@@ -303,33 +300,33 @@ std::string::const_iterator nextLineBreak(std::string::const_iterator text, std:
const
breakAction
brkTable
[
27
][
27
]
=
{
const
breakAction
brkTable
[
27
][
27
]
=
{
// OP CL CP QU GL NS EX SY IS PR PO NU AL ID IN HY BA BB B2 ZW CM WJ H2 H3 JL JV JT
// OP CL CP QU GL NS EX SY IS PR PO NU AL ID IN HY BA BB B2 ZW CM WJ H2 H3 JL JV JT
/* OP */
{
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
CPB
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
},
/* OP */
{
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
CPB
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
,
PBK
},
/* CL */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* CL */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* CP */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* CP */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* QU */
{
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
PBK
,
CIB
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
},
/* QU */
{
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
PBK
,
CIB
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
},
/* GL */
{
IBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
PBK
,
CIB
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
},
/* GL */
{
IBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
PBK
,
CIB
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
},
/* NS */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* NS */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* EX */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* EX */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* SY */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* SY */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* IS */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* IS */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* PR */
{
IBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
},
/* PR */
{
IBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
},
/* PO */
{
IBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* PO */
{
IBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* NU */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* NU */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* AL */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* AL */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* ID */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* ID */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* IN */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* IN */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* HY */
{
DBK
,
PBK
,
PBK
,
IBK
,
DBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* HY */
{
DBK
,
PBK
,
PBK
,
IBK
,
DBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* BA */
{
DBK
,
PBK
,
PBK
,
IBK
,
DBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* BA */
{
DBK
,
PBK
,
PBK
,
IBK
,
DBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* BB */
{
IBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
PBK
,
CIB
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
},
/* BB */
{
IBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
PBK
,
CIB
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
},
/* B2 */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
PBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* B2 */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
PBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* ZW */
{
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* ZW */
{
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* CM */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* CM */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
DBK
,
IBK
,
IBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
DBK
},
/* WJ */
{
IBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
PBK
,
CIB
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
},
/* WJ */
{
IBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
,
PBK
,
CIB
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
IBK
},
/* H2 */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
},
/* H2 */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
},
/* H3 */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
},
/* H3 */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
},
/* JL */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
DBK
},
/* JL */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
IBK
,
IBK
,
IBK
,
IBK
,
DBK
},
/* JV */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
},
/* JV */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
},
/* JT */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
},
/* JT */
{
DBK
,
PBK
,
PBK
,
IBK
,
IBK
,
IBK
,
PBK
,
PBK
,
PBK
,
DBK
,
IBK
,
DBK
,
DBK
,
DBK
,
IBK
,
IBK
,
IBK
,
DBK
,
DBK
,
PBK
,
CIB
,
PBK
,
DBK
,
DBK
,
DBK
,
DBK
,
IBK
},
};
};
uint8_t
ch
=
static_cast
<
uint8_t
>
(
*
text
);
uint8_t
ch
=
static_cast
<
uint8_t
>
(
*
text
);
...
@@ -380,10 +377,10 @@ std::string::const_iterator nextLineBreak(std::string::const_iterator text, std:
...
@@ -380,10 +377,10 @@ std::string::const_iterator nextLineBreak(std::string::const_iterator text, std:
return
text
;
return
text
;
}
}
std
::
vector
<
std
::
string
>
wrapLine
(
const
std
::
string
&
text
,
unsigned
int
width
)
std
::
vector
<
std
::
string
>
wrapLine
(
const
std
::
string
&
text
,
unsigned
int
width
)
{
{
std
::
vector
<
std
::
string
>
result
;
std
::
vector
<
std
::
string
>
result
;
std
::
vector
<
size_t
>
offsets
=
{
0
};
std
::
vector
<
size_t
>
offsets
=
{
0
};
auto
b
=
text
.
begin
();
auto
b
=
text
.
begin
();
while
(
b
!=
text
.
end
())
while
(
b
!=
text
.
end
())
...
@@ -441,13 +438,13 @@ std::vector<std::string> wrapLine(const std::string& text, unsigned int width)
...
@@ -441,13 +438,13 @@ std::vector<std::string> wrapLine(const std::string& text, unsigned int width)
return
result
;
return
result
;
}
}
std
::
vector
<
std
::
string
>
wordWrap
(
const
std
::
string
&
text
,
unsigned
int
width
)
std
::
vector
<
std
::
string
>
wordWrap
(
const
std
::
string
&
text
,
unsigned
int
width
)
{
{
std
::
vector
<
std
::
string
>
paragraphs
;
std
::
vector
<
std
::
string
>
paragraphs
;
ba
::
split
(
paragraphs
,
text
,
ba
::
is_any_of
(
"
\n
"
));
ba
::
split
(
paragraphs
,
text
,
ba
::
is_any_of
(
"
\n
"
));
std
::
vector
<
std
::
string
>
result
;
std
::
vector
<
std
::
string
>
result
;
for
(
auto
&
p
:
paragraphs
)
for
(
auto
&
p
:
paragraphs
)
{
{
if
(
p
.
empty
())
if
(
p
.
empty
())
{
{
...
@@ -467,8 +464,8 @@ std::vector<std::string> wordWrap(const std::string& text, unsigned int width)
...
@@ -467,8 +464,8 @@ std::vector<std::string> wordWrap(const std::string& text, unsigned int width)
#ifdef _MSC_VER
#ifdef _MSC_VER
}
}
#include <Windows.h>
#include <Windows.h>
#include <wincon.h>
#include <libloaderapi.h>
#include <libloaderapi.h>
#include <wincon.h>
namespace
cif
namespace
cif
{
{
...
@@ -512,7 +509,7 @@ std::string get_executable_path()
...
@@ -512,7 +509,7 @@ std::string get_executable_path()
char
path
[
PATH_MAX
]
=
""
;
char
path
[
PATH_MAX
]
=
""
;
if
(
readlink
(
"/proc/self/exe"
,
path
,
sizeof
(
path
))
==
-
1
)
if
(
readlink
(
"/proc/self/exe"
,
path
,
sizeof
(
path
))
==
-
1
)
throw
std
::
runtime_error
(
"could not get exe path "
s
+
strerror
(
errno
));
throw
std
::
runtime_error
(
"could not get exe path "
s
+
strerror
(
errno
));
return
{
path
};
return
{
path
};
}
}
#endif
#endif
...
@@ -521,9 +518,14 @@ std::string get_executable_path()
...
@@ -521,9 +518,14 @@ std::string get_executable_path()
struct
ProgressImpl
struct
ProgressImpl
{
{
ProgressImpl
(
int64_t
inMax
,
const
std
::
string
&
inAction
)
ProgressImpl
(
int64_t
inMax
,
const
std
::
string
&
inAction
)
:
mMax
(
inMax
),
mConsumed
(
0
),
mAction
(
inAction
),
mMessage
(
inAction
)
:
mMax
(
inMax
)
,
mThread
(
std
::
bind
(
&
ProgressImpl
::
Run
,
this
))
{}
,
mConsumed
(
0
)
,
mAction
(
inAction
)
,
mMessage
(
inAction
)
,
mThread
(
std
::
bind
(
&
ProgressImpl
::
Run
,
this
))
{
}
void
Run
();
void
Run
();
void
Stop
()
void
Stop
()
...
@@ -537,7 +539,7 @@ struct ProgressImpl
...
@@ -537,7 +539,7 @@ struct ProgressImpl
void
PrintDone
();
void
PrintDone
();
int64_t
mMax
;
int64_t
mMax
;
std
::
atomic
<
int64_t
>
mConsumed
;
std
::
atomic
<
int64_t
>
mConsumed
;
int64_t
mLastConsumed
=
0
;
int64_t
mLastConsumed
=
0
;
int
mSpinnerIndex
=
0
;
int
mSpinnerIndex
=
0
;
std
::
string
mAction
,
mMessage
;
std
::
string
mAction
,
mMessage
;
...
@@ -570,10 +572,11 @@ void ProgressImpl::Run()
...
@@ -570,10 +572,11 @@ void ProgressImpl::Run()
PrintProgress
();
PrintProgress
();
printedAny
=
true
;
printedAny
=
true
;
}
}
}
}
catch
(...)
{}
catch
(...)
{
}
if
(
printedAny
)
if
(
printedAny
)
PrintDone
();
PrintDone
();
...
@@ -581,19 +584,19 @@ void ProgressImpl::Run()
...
@@ -581,19 +584,19 @@ void ProgressImpl::Run()
void
ProgressImpl
::
PrintProgress
()
void
ProgressImpl
::
PrintProgress
()
{
{
// const char* kBlocks[] = {
// const char* kBlocks[] = {
// " ", // 0
// " ", // 0
// u8"\u258F", // 1
// u8"\u258F", // 1
// u8"\u258E", // 2
// u8"\u258E", // 2
// u8"\u258D", // 3
// u8"\u258D", // 3
// u8"\u258C", // 4
// u8"\u258C", // 4
// u8"\u258B", // 5
// u8"\u258B", // 5
// u8"\u258A", // 6
// u8"\u258A", // 6
// u8"\u2589", // 7
// u8"\u2589", // 7
// u8"\u2588", // 8
// u8"\u2588", // 8
// };
// };
const
char
*
kBlocks
[]
=
{
const
char
*
kBlocks
[]
=
{
" "
,
// 0
" "
,
// 0
" "
,
// 1
" "
,
// 1
" "
,
// 2
" "
,
// 2
...
@@ -623,10 +626,10 @@ void ProgressImpl::PrintProgress()
...
@@ -623,10 +626,10 @@ void ProgressImpl::PrintProgress()
int64_t
consumed
=
mConsumed
;
int64_t
consumed
=
mConsumed
;
float
progress
=
static_cast
<
float
>
(
consumed
)
/
mMax
;
float
progress
=
static_cast
<
float
>
(
consumed
)
/
mMax
;
int
pi
=
static_cast
<
int
>
(
std
::
ceil
(
progress
*
33
*
8
));
int
pi
=
static_cast
<
int
>
(
std
::
ceil
(
progress
*
33
*
8
));
// int tw = width - 28;
// int tw = width - 28;
// int twd = static_cast<int>(tw * progress + 0.5f);
// int twd = static_cast<int>(tw * progress + 0.5f);
// msg.append(twd, '=');
// msg.append(twd, '=');
// msg.append(tw - twd, ' ');
// msg.append(tw - twd, ' ');
for
(
int
i
=
0
;
i
<
33
;
++
i
)
for
(
int
i
=
0
;
i
<
33
;
++
i
)
{
{
...
@@ -641,8 +644,8 @@ void ProgressImpl::PrintProgress()
...
@@ -641,8 +644,8 @@ void ProgressImpl::PrintProgress()
msg
.
append
(
"| "
);
msg
.
append
(
"| "
);
// const char kSpinner[] = { '|', '/', '-', '\\' };
// const char kSpinner[] = { '|', '/', '-', '\\' };
const
char
kSpinner
[]
=
{
' '
,
'.'
,
'o'
,
'O'
,
'0'
,
'O'
,
'o'
,
'.'
};
const
char
kSpinner
[]
=
{
' '
,
'.'
,
'o'
,
'O'
,
'0'
,
'O'
,
'o'
,
'.'
};
const
size_t
kSpinnerCount
=
sizeof
(
kSpinner
);
const
size_t
kSpinnerCount
=
sizeof
(
kSpinner
);
if
(
mLastConsumed
<
consumed
)
if
(
mLastConsumed
<
consumed
)
...
@@ -651,16 +654,16 @@ void ProgressImpl::PrintProgress()
...
@@ -651,16 +654,16 @@ void ProgressImpl::PrintProgress()
mSpinnerIndex
=
(
mSpinnerIndex
+
1
)
%
kSpinnerCount
;
mSpinnerIndex
=
(
mSpinnerIndex
+
1
)
%
kSpinnerCount
;
}
}
const
char
spinner
[
2
]
=
{
kSpinner
[
mSpinnerIndex
],
0
};
const
char
spinner
[
2
]
=
{
kSpinner
[
mSpinnerIndex
],
0
};
msg
.
append
(
spinner
);
msg
.
append
(
spinner
);
// int perc = static_cast<int>(100 * progress);
// int perc = static_cast<int>(100 * progress);
// if (perc < 100)
// if (perc < 100)
// msg += ' ';
// msg += ' ';
// if (perc < 10)
// if (perc < 10)
// msg += ' ';
// msg += ' ';
// msg += to_string(perc);
// msg += to_string(perc);
// msg += '%';
// msg += '%';
std
::
cout
<<
'\r'
<<
msg
;
std
::
cout
<<
'\r'
<<
msg
;
std
::
cout
.
flush
();
std
::
cout
.
flush
();
...
@@ -669,8 +672,8 @@ void ProgressImpl::PrintProgress()
...
@@ -669,8 +672,8 @@ void ProgressImpl::PrintProgress()
namespace
namespace
{
{
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
const
std
::
chrono
::
duration
<
double
>&
t
)
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
const
std
::
chrono
::
duration
<
double
>
&
t
)
{
{
uint64_t
s
=
static_cast
<
uint64_t
>
(
std
::
trunc
(
t
.
count
()));
uint64_t
s
=
static_cast
<
uint64_t
>
(
std
::
trunc
(
t
.
count
()));
if
(
s
>
24
*
60
*
60
)
if
(
s
>
24
*
60
*
60
)
{
{
...
@@ -698,9 +701,9 @@ std::ostream& operator<<(std::ostream& os, const std::chrono::duration<double>&
...
@@ -698,9 +701,9 @@ std::ostream& operator<<(std::ostream& os, const std::chrono::duration<double>&
os
<<
std
::
fixed
<<
std
::
setprecision
(
1
)
<<
ss
<<
's'
;
os
<<
std
::
fixed
<<
std
::
setprecision
(
1
)
<<
ss
<<
's'
;
return
os
;
return
os
;
}
}
}
}
// namespace
void
ProgressImpl
::
PrintDone
()
void
ProgressImpl
::
PrintDone
()
{
{
...
@@ -718,7 +721,7 @@ void ProgressImpl::PrintDone()
...
@@ -718,7 +721,7 @@ void ProgressImpl::PrintDone()
std
::
cout
<<
'\r'
<<
msg
<<
std
::
endl
;
std
::
cout
<<
'\r'
<<
msg
<<
std
::
endl
;
}
}
Progress
::
Progress
(
int64_t
inMax
,
const
std
::
string
&
inAction
)
Progress
::
Progress
(
int64_t
inMax
,
const
std
::
string
&
inAction
)
:
mImpl
(
nullptr
)
:
mImpl
(
nullptr
)
{
{
if
(
isatty
(
STDOUT_FILENO
))
if
(
isatty
(
STDOUT_FILENO
))
...
@@ -751,7 +754,7 @@ void Progress::progress(int64_t inProgress)
...
@@ -751,7 +754,7 @@ void Progress::progress(int64_t inProgress)
}
}
}
}
void
Progress
::
message
(
const
std
::
string
&
inMessage
)
void
Progress
::
message
(
const
std
::
string
&
inMessage
)
{
{
if
(
mImpl
!=
nullptr
)
if
(
mImpl
!=
nullptr
)
{
{
...
@@ -760,7 +763,7 @@ void Progress::message(const std::string& inMessage)
...
@@ -760,7 +763,7 @@ void Progress::message(const std::string& inMessage)
}
}
}
}
}
}
// namespace cif
#if USE_RSRC
#if USE_RSRC
...
@@ -774,16 +777,16 @@ void Progress::message(const std::string& inMessage)
...
@@ -774,16 +777,16 @@ void Progress::message(const std::string& inMessage)
namespace
mrsrc
namespace
mrsrc
{
{
/// \brief Internal data structure as generated by mrc
/// \brief Internal data structure as generated by mrc
struct
rsrc_imp
struct
rsrc_imp
{
{
unsigned
int
m_next
;
unsigned
int
m_next
;
unsigned
int
m_child
;
unsigned
int
m_child
;
unsigned
int
m_name
;
unsigned
int
m_name
;
unsigned
int
m_size
;
unsigned
int
m_size
;
unsigned
int
m_data
;
unsigned
int
m_data
;
};
};
}
}
// namespace mrsrc
extern
const
__attribute__
((
weak
))
mrsrc
::
rsrc_imp
gResourceIndex
[];
extern
const
__attribute__
((
weak
))
mrsrc
::
rsrc_imp
gResourceIndex
[];
extern
const
__attribute__
((
weak
))
char
gResourceData
[];
extern
const
__attribute__
((
weak
))
char
gResourceData
[];
...
@@ -791,29 +794,28 @@ extern const __attribute__((weak)) char gResourceName[];
...
@@ -791,29 +794,28 @@ extern const __attribute__((weak)) char gResourceName[];
namespace
mrsrc
namespace
mrsrc
{
{
class
rsrc_data
class
rsrc_data
{
{
public
:
public
:
static
rsrc_data
&
instance
()
static
rsrc_data
&
instance
()
{
{
static
rsrc_data
s_instance
;
static
rsrc_data
s_instance
;
return
s_instance
;
return
s_instance
;
}
}
const
rsrc_imp
*
index
()
const
{
return
m_index
;
}
const
rsrc_imp
*
index
()
const
{
return
m_index
;
}
const
char
*
data
(
unsigned
int
offset
)
const
const
char
*
data
(
unsigned
int
offset
)
const
{
{
return
m_data
+
offset
;
return
m_data
+
offset
;
}
}
const
char
*
name
(
unsigned
int
offset
)
const
const
char
*
name
(
unsigned
int
offset
)
const
{
{
return
m_name
+
offset
;
return
m_name
+
offset
;
}
}
private
:
private
:
rsrc_data
()
rsrc_data
()
{
{
if
(
gResourceIndex
and
gResourceIndex
and
gResourceName
)
if
(
gResourceIndex
and
gResourceIndex
and
gResourceName
)
...
@@ -825,25 +827,29 @@ namespace mrsrc
...
@@ -825,25 +827,29 @@ namespace mrsrc
}
}
rsrc_imp
m_dummy
=
{};
rsrc_imp
m_dummy
=
{};
const
rsrc_imp
*
m_index
=
&
m_dummy
;
const
rsrc_imp
*
m_index
=
&
m_dummy
;
const
char
*
m_data
=
""
;
const
char
*
m_data
=
""
;
const
char
*
m_name
=
""
;
const
char
*
m_name
=
""
;
};
};
/// \brief Class mrsrc::rsrc contains a pointer to the data in the
/// \brief Class mrsrc::rsrc contains a pointer to the data in the
/// resource, as well as offering an iterator interface to its
/// resource, as well as offering an iterator interface to its
/// children.
/// children.
class
rsrc
class
rsrc
{
{
public
:
public
:
rsrc
()
:
m_impl
(
rsrc_data
::
instance
().
index
())
{
}
rsrc
()
:
m_impl
(
rsrc_data
::
instance
().
index
())
{}
rsrc
(
const
rsrc
&
other
)
:
m_impl
(
other
.
m_impl
)
rsrc
(
const
rsrc
&
other
)
{
:
m_impl
(
other
.
m_impl
)
{
}
}
rsrc
&
operator
=
(
const
rsrc
&
other
)
rsrc
&
operator
=
(
const
rsrc
&
other
)
{
{
m_impl
=
other
.
m_impl
;
m_impl
=
other
.
m_impl
;
return
*
this
;
return
*
this
;
...
@@ -853,41 +859,42 @@ namespace mrsrc
...
@@ -853,41 +859,42 @@ namespace mrsrc
std
::
string
name
()
const
{
return
rsrc_data
::
instance
().
name
(
m_impl
->
m_name
);
}
std
::
string
name
()
const
{
return
rsrc_data
::
instance
().
name
(
m_impl
->
m_name
);
}
const
char
*
data
()
const
{
return
rsrc_data
::
instance
().
data
(
m_impl
->
m_data
);
}
const
char
*
data
()
const
{
return
rsrc_data
::
instance
().
data
(
m_impl
->
m_data
);
}
unsigned
long
size
()
const
{
return
m_impl
->
m_size
;
}
unsigned
long
size
()
const
{
return
m_impl
->
m_size
;
}
explicit
operator
bool
()
const
{
return
m_impl
!=
NULL
and
m_impl
->
m_size
>
0
;
}
explicit
operator
bool
()
const
{
return
m_impl
!=
NULL
and
m_impl
->
m_size
>
0
;
}
template
<
typename
RSRC
>
template
<
typename
RSRC
>
class
iterator_t
class
iterator_t
{
{
public
:
public
:
using
iterator_category
=
std
::
input_iterator_tag
;
using
iterator_category
=
std
::
input_iterator_tag
;
using
value_type
=
RSRC
;
using
value_type
=
RSRC
;
using
difference_type
=
std
::
ptrdiff_t
;
using
difference_type
=
std
::
ptrdiff_t
;
using
pointer
=
value_type
*
;
using
pointer
=
value_type
*
;
using
reference
=
value_type
&
;
using
reference
=
value_type
&
;
iterator_t
(
const
rsrc_imp
*
cur
)
iterator_t
(
const
rsrc_imp
*
cur
)
:
m_cur
(
cur
)
{}
:
m_cur
(
cur
)
{
}
iterator_t
(
const
iterator_t
&
i
)
iterator_t
(
const
iterator_t
&
i
)
:
m_cur
(
i
.
m_cur
)
:
m_cur
(
i
.
m_cur
)
{
{
}
}
iterator_t
&
operator
=
(
const
iterator_t
&
i
)
iterator_t
&
operator
=
(
const
iterator_t
&
i
)
{
{
m_cur
=
i
.
m_cur
;
m_cur
=
i
.
m_cur
;
return
*
this
;
return
*
this
;
}
}
reference
operator
*
()
{
return
m_cur
;
}
reference
operator
*
()
{
return
m_cur
;
}
pointer
operator
->
()
{
return
&
m_cur
;
}
pointer
operator
->
()
{
return
&
m_cur
;
}
iterator_t
&
operator
++
()
iterator_t
&
operator
++
()
{
{
if
(
m_cur
.
m_impl
->
m_next
)
if
(
m_cur
.
m_impl
->
m_next
)
m_cur
.
m_impl
=
rsrc_data
::
instance
().
index
()
+
m_cur
.
m_impl
->
m_next
;
m_cur
.
m_impl
=
rsrc_data
::
instance
().
index
()
+
m_cur
.
m_impl
->
m_next
;
...
@@ -903,8 +910,8 @@ namespace mrsrc
...
@@ -903,8 +910,8 @@ namespace mrsrc
return
tmp
;
return
tmp
;
}
}
bool
operator
==
(
const
iterator_t
&
rhs
)
const
{
return
m_cur
.
m_impl
==
rhs
.
m_cur
.
m_impl
;
}
bool
operator
==
(
const
iterator_t
&
rhs
)
const
{
return
m_cur
.
m_impl
==
rhs
.
m_cur
.
m_impl
;
}
bool
operator
!=
(
const
iterator_t
&
rhs
)
const
{
return
m_cur
.
m_impl
!=
rhs
.
m_cur
.
m_impl
;
}
bool
operator
!=
(
const
iterator_t
&
rhs
)
const
{
return
m_cur
.
m_impl
!=
rhs
.
m_cur
.
m_impl
;
}
private
:
private
:
value_type
m_cur
;
value_type
m_cur
;
...
@@ -914,7 +921,7 @@ namespace mrsrc
...
@@ -914,7 +921,7 @@ namespace mrsrc
iterator
begin
()
const
iterator
begin
()
const
{
{
const
rsrc_imp
*
impl
=
nullptr
;
const
rsrc_imp
*
impl
=
nullptr
;
if
(
m_impl
and
m_impl
->
m_child
)
if
(
m_impl
and
m_impl
->
m_child
)
impl
=
rsrc_data
::
instance
().
index
()
+
m_impl
->
m_child
;
impl
=
rsrc_data
::
instance
().
index
()
+
m_impl
->
m_child
;
return
iterator
(
impl
);
return
iterator
(
impl
);
...
@@ -926,14 +933,16 @@ namespace mrsrc
...
@@ -926,14 +933,16 @@ namespace mrsrc
}
}
private
:
private
:
rsrc
(
const
rsrc_imp
*
imp
)
rsrc
(
const
rsrc_imp
*
imp
)
:
m_impl
(
imp
)
{}
:
m_impl
(
imp
)
{
}
const
rsrc_imp
*
m_impl
;
const
rsrc_imp
*
m_impl
;
};
};
inline
rsrc
::
rsrc
(
std
::
filesystem
::
path
p
)
inline
rsrc
::
rsrc
(
std
::
filesystem
::
path
p
)
{
{
m_impl
=
rsrc_data
::
instance
().
index
();
m_impl
=
rsrc_data
::
instance
().
index
();
// using std::filesytem::path would have been natural here of course...
// using std::filesytem::path would have been natural here of course...
...
@@ -945,8 +954,8 @@ namespace mrsrc
...
@@ -945,8 +954,8 @@ namespace mrsrc
{
{
auto
name
=
*
pb
++
;
auto
name
=
*
pb
++
;
const
rsrc_imp
*
impl
=
nullptr
;
const
rsrc_imp
*
impl
=
nullptr
;
for
(
rsrc
child
:
*
this
)
for
(
rsrc
child
:
*
this
)
{
{
if
(
child
.
name
()
==
name
)
if
(
child
.
name
()
==
name
)
{
{
...
@@ -960,15 +969,14 @@ namespace mrsrc
...
@@ -960,15 +969,14 @@ namespace mrsrc
if
(
pb
!=
pe
)
// not found
if
(
pb
!=
pe
)
// not found
m_impl
=
nullptr
;
m_impl
=
nullptr
;
}
}
// --------------------------------------------------------------------
// --------------------------------------------------------------------
template
<
typename
CharT
,
typename
Traits
>
template
<
typename
CharT
,
typename
Traits
>
class
basic_streambuf
:
public
std
::
basic_streambuf
<
CharT
,
Traits
>
class
basic_streambuf
:
public
std
::
basic_streambuf
<
CharT
,
Traits
>
{
{
public
:
public
:
typedef
CharT
char_type
;
typedef
CharT
char_type
;
typedef
Traits
traits_type
;
typedef
Traits
traits_type
;
typedef
typename
traits_type
::
int_type
int_type
;
typedef
typename
traits_type
::
int_type
int_type
;
...
@@ -976,35 +984,35 @@ namespace mrsrc
...
@@ -976,35 +984,35 @@ namespace mrsrc
typedef
typename
traits_type
::
off_type
off_type
;
typedef
typename
traits_type
::
off_type
off_type
;
/// \brief constructor taking a \a path to the resource in memory
/// \brief constructor taking a \a path to the resource in memory
basic_streambuf
(
const
std
::
string
&
path
)
basic_streambuf
(
const
std
::
string
&
path
)
:
m_rsrc
(
path
)
:
m_rsrc
(
path
)
{
{
init
();
init
();
}
}
/// \brief constructor taking a \a rsrc
/// \brief constructor taking a \a rsrc
basic_streambuf
(
const
rsrc
&
rsrc
)
basic_streambuf
(
const
rsrc
&
rsrc
)
:
m_rsrc
(
rsrc
)
:
m_rsrc
(
rsrc
)
{
{
init
();
init
();
}
}
basic_streambuf
(
const
basic_streambuf
&
)
=
delete
;
basic_streambuf
(
const
basic_streambuf
&
)
=
delete
;
basic_streambuf
(
basic_streambuf
&&
rhs
)
basic_streambuf
(
basic_streambuf
&&
rhs
)
:
basic_streambuf
(
rhs
.
m_rsrc
)
:
basic_streambuf
(
rhs
.
m_rsrc
)
{
{
}
}
basic_streambuf
&
operator
=
(
const
basic_streambuf
&
)
=
delete
;
basic_streambuf
&
operator
=
(
const
basic_streambuf
&
)
=
delete
;
basic_streambuf
&
operator
=
(
basic_streambuf
&&
rhs
)
basic_streambuf
&
operator
=
(
basic_streambuf
&&
rhs
)
{
{
swap
(
rhs
);
swap
(
rhs
);
return
*
this
;
return
*
this
;
}
}
void
swap
(
basic_streambuf
&
rhs
)
void
swap
(
basic_streambuf
&
rhs
)
{
{
std
::
swap
(
m_begin
,
rhs
.
m_begin
);
std
::
swap
(
m_begin
,
rhs
.
m_begin
);
std
::
swap
(
m_end
,
rhs
.
m_end
);
std
::
swap
(
m_end
,
rhs
.
m_end
);
...
@@ -1012,11 +1020,10 @@ namespace mrsrc
...
@@ -1012,11 +1020,10 @@ namespace mrsrc
}
}
private
:
private
:
void
init
()
void
init
()
{
{
m_begin
=
reinterpret_cast
<
const
char_type
*>
(
m_rsrc
.
data
());
m_begin
=
reinterpret_cast
<
const
char_type
*>
(
m_rsrc
.
data
());
m_end
=
reinterpret_cast
<
const
char_type
*>
(
m_rsrc
.
data
()
+
m_rsrc
.
size
());
m_end
=
reinterpret_cast
<
const
char_type
*>
(
m_rsrc
.
data
()
+
m_rsrc
.
size
());
m_current
=
m_begin
;
m_current
=
m_begin
;
}
}
...
@@ -1046,7 +1053,7 @@ namespace mrsrc
...
@@ -1046,7 +1053,7 @@ namespace mrsrc
std
::
streamsize
showmanyc
()
std
::
streamsize
showmanyc
()
{
{
assert
(
std
::
less_equal
<
const
char
*>
()(
m_current
,
m_end
));
assert
(
std
::
less_equal
<
const
char
*>
()(
m_current
,
m_end
));
return
m_end
-
m_current
;
return
m_end
-
m_current
;
}
}
...
@@ -1094,19 +1101,19 @@ namespace mrsrc
...
@@ -1094,19 +1101,19 @@ namespace mrsrc
private
:
private
:
rsrc
m_rsrc
;
rsrc
m_rsrc
;
const
char_type
*
m_begin
;
const
char_type
*
m_begin
;
const
char_type
*
m_end
;
const
char_type
*
m_end
;
const
char_type
*
m_current
;
const
char_type
*
m_current
;
};
};
using
streambuf
=
basic_streambuf
<
char
,
std
::
char_traits
<
char
>>
;
using
streambuf
=
basic_streambuf
<
char
,
std
::
char_traits
<
char
>>
;
// --------------------------------------------------------------------
// --------------------------------------------------------------------
// class mrsrc::istream
// class mrsrc::istream
template
<
typename
CharT
,
typename
Traits
>
template
<
typename
CharT
,
typename
Traits
>
class
basic_istream
:
public
std
::
basic_istream
<
CharT
,
Traits
>
class
basic_istream
:
public
std
::
basic_istream
<
CharT
,
Traits
>
{
{
public
:
public
:
typedef
CharT
char_type
;
typedef
CharT
char_type
;
typedef
Traits
traits_type
;
typedef
Traits
traits_type
;
...
@@ -1115,60 +1122,58 @@ namespace mrsrc
...
@@ -1115,60 +1122,58 @@ namespace mrsrc
typedef
typename
traits_type
::
off_type
off_type
;
typedef
typename
traits_type
::
off_type
off_type
;
private
:
private
:
using
__streambuf_type
=
basic_streambuf
<
CharT
,
Traits
>
;
using
__streambuf_type
=
basic_streambuf
<
CharT
,
Traits
>
;
using
__istream_type
=
std
::
basic_istream
<
CharT
,
Traits
>
;
using
__istream_type
=
std
::
basic_istream
<
CharT
,
Traits
>
;
__streambuf_type
m_buffer
;
__streambuf_type
m_buffer
;
public
:
public
:
basic_istream
(
const
std
::
string
&
path
)
basic_istream
(
const
std
::
string
&
path
)
:
__istream_type
(
&
m_buffer
)
:
__istream_type
(
&
m_buffer
)
,
m_buffer
(
path
)
,
m_buffer
(
path
)
{
{
this
->
init
(
&
m_buffer
);
this
->
init
(
&
m_buffer
);
}
}
basic_istream
(
rsrc
&
resource
)
basic_istream
(
rsrc
&
resource
)
:
__istream_type
(
&
m_buffer
)
:
__istream_type
(
&
m_buffer
)
,
m_buffer
(
resource
)
\
,
m_buffer
(
resource
)
{
{
this
->
init
(
&
m_buffer
);
this
->
init
(
&
m_buffer
);
}
}
basic_istream
(
const
basic_istream
&
)
=
delete
;
basic_istream
(
const
basic_istream
&
)
=
delete
;
basic_istream
(
basic_istream
&&
rhs
)
basic_istream
(
basic_istream
&&
rhs
)
:
__istream_type
(
std
::
move
(
rhs
))
:
__istream_type
(
std
::
move
(
rhs
))
,
m_buffer
(
std
::
move
(
rhs
.
m_buffer
))
,
m_buffer
(
std
::
move
(
rhs
.
m_buffer
))
{
{
__istream_type
::
set_rdbuf
(
&
m_buffer
);
__istream_type
::
set_rdbuf
(
&
m_buffer
);
}
}
basic_istream
&
operator
=
(
const
basic_istream
&
)
=
delete
;
basic_istream
&
operator
=
(
const
basic_istream
&
)
=
delete
;
basic_istream
&
operator
=
(
basic_istream
&&
rhs
)
basic_istream
&
operator
=
(
basic_istream
&&
rhs
)
{
{
__istream_type
::
operator
=
(
std
::
move
(
rhs
));
__istream_type
::
operator
=
(
std
::
move
(
rhs
));
m_buffer
=
std
::
move
(
rhs
.
m_buffer
);
m_buffer
=
std
::
move
(
rhs
.
m_buffer
);
return
*
this
;
return
*
this
;
}
}
void
swap
(
basic_istream
&
rhs
)
void
swap
(
basic_istream
&
rhs
)
{
{
__istream_type
::
swap
(
rhs
);
__istream_type
::
swap
(
rhs
);
m_buffer
.
swap
(
rhs
.
m_buffer
);
m_buffer
.
swap
(
rhs
.
m_buffer
);
}
}
__streambuf_type
*
rdbuf
()
const
__streambuf_type
*
rdbuf
()
const
{
{
return
const_cast
<
__streambuf_type
*>
(
&
m_buffer
);
return
const_cast
<
__streambuf_type
*>
(
&
m_buffer
);
}
}
};
};
using
istream
=
basic_istream
<
char
,
std
::
char_traits
<
char
>>
;
using
istream
=
basic_istream
<
char
,
std
::
char_traits
<
char
>>
;
}
}
// namespace mrsrc
#endif
#endif
...
@@ -1188,7 +1193,7 @@ std::unique_ptr<std::istream> loadResource(std::filesystem::path name)
...
@@ -1188,7 +1193,7 @@ std::unique_ptr<std::istream> loadResource(std::filesystem::path name)
#if defined(CACHE_DIR) and defined(DATA_DIR)
#if defined(CACHE_DIR) and defined(DATA_DIR)
if
(
not
fs
::
exists
(
p
))
if
(
not
fs
::
exists
(
p
))
{
{
for
(
const
char
*
dir
:
{
CACHE_DIR
,
DATA_DIR
})
for
(
const
char
*
dir
:
{
CACHE_DIR
,
DATA_DIR
})
{
{
auto
p2
=
fs
::
path
(
dir
)
/
p
;
auto
p2
=
fs
::
path
(
dir
)
/
p
;
if
(
fs
::
exists
(
p2
))
if
(
fs
::
exists
(
p2
))
...
@@ -1219,4 +1224,4 @@ std::unique_ptr<std::istream> loadResource(std::filesystem::path name)
...
@@ -1219,4 +1224,4 @@ std::unique_ptr<std::istream> loadResource(std::filesystem::path name)
return
result
;
return
result
;
}
}
}
}
// namespace cif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment