Revert "preserve traslatable strings in simple_wml."
This reverts commit4f3ce6865c
. This reverts commit20128ac991
. see issue #3454, there were problems caused by simple_wml when joining/observing games and this commit is the obvious suspect so i'm reverting it until we can fix that one. (cherry-picked from commit6b58ce7c04
)
This commit is contained in:
parent
3c8143539e
commit
b6cce36c34
2 changed files with 27 additions and 104 deletions
|
@ -34,22 +34,6 @@ std::size_t document::document_size_limit = 40000000;
|
|||
|
||||
namespace {
|
||||
|
||||
inline const char* textdomain_str()
|
||||
{
|
||||
return "#textdomain ";
|
||||
}
|
||||
inline size_t textdomain_str_size()
|
||||
{
|
||||
return sizeof("#textdomain ") - 1; /*-1 for terminating null character in string literal*/
|
||||
}
|
||||
|
||||
//for extra safety this is only used when reading the document not when writing.
|
||||
string_span default_textdomain()
|
||||
{
|
||||
return string_span("wesnoth");
|
||||
}
|
||||
|
||||
|
||||
void debug_delete(node* n) {
|
||||
delete n;
|
||||
}
|
||||
|
@ -229,22 +213,11 @@ node::node(document& doc, node* parent) :
|
|||
{
|
||||
}
|
||||
|
||||
static void maybe_change_textdomain(const char* beginline, const char* endline, string_span& textdomain)
|
||||
{
|
||||
size_t size = endline - beginline;
|
||||
if(size < textdomain_str_size()) {
|
||||
return;
|
||||
}
|
||||
if(strncmp(beginline, textdomain_str(), textdomain_str_size()) != 0) {
|
||||
return;
|
||||
}
|
||||
textdomain = string_span(beginline + textdomain_str_size(), endline - beginline - textdomain_str_size());
|
||||
}
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning (push)
|
||||
#pragma warning (disable: 4706)
|
||||
#endif
|
||||
node::node(document& doc, node* parent, const char** str, int depth, string_span& textdomain) :
|
||||
node::node(document& doc, node* parent, const char** str, int depth) :
|
||||
doc_(&doc),
|
||||
attr_(),
|
||||
parent_(parent),
|
||||
|
@ -284,7 +257,7 @@ node::node(document& doc, node* parent, const char** str, int depth, string_span
|
|||
|
||||
s = end + 1;
|
||||
|
||||
children_[list_index].second.push_back(new node(doc, this, str, depth+1, textdomain));
|
||||
children_[list_index].second.push_back(new node(doc, this, str, depth+1));
|
||||
ordered_children_.emplace_back(list_index, children_[list_index].second.size() - 1);
|
||||
check_ordered_children();
|
||||
|
||||
|
@ -295,18 +268,14 @@ node::node(document& doc, node* parent, const char** str, int depth, string_span
|
|||
case '\n':
|
||||
++s;
|
||||
break;
|
||||
case '#': {
|
||||
const char * const endline = strchr(s, '\n');
|
||||
if(endline == nullptr) {
|
||||
case '#':
|
||||
s = strchr(s, '\n');
|
||||
if(s == nullptr) {
|
||||
throw error("did not find newline after '#'");
|
||||
}
|
||||
maybe_change_textdomain(s, endline, textdomain);
|
||||
s = endline;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
const char* end = strchr(s, '=');
|
||||
bool is_translatable = false;
|
||||
if(end == nullptr) {
|
||||
ERR_SWML << "attribute: " << s << std::endl;
|
||||
throw error("did not find '=' after attribute");
|
||||
|
@ -315,7 +284,6 @@ node::node(document& doc, node* parent, const char** str, int depth, string_span
|
|||
string_span name(s, end - s);
|
||||
s = end + 1;
|
||||
if(*s == '_') {
|
||||
is_translatable = true;
|
||||
s = strchr(s, '"');
|
||||
if(s == nullptr) {
|
||||
throw error("did not find '\"' after '_'");
|
||||
|
@ -358,12 +326,9 @@ node::node(document& doc, node* parent, const char** str, int depth, string_span
|
|||
|
||||
// Read textdomain marker.
|
||||
if (*endline == '#') {
|
||||
const char* endline2 = strchr(endline + 1, '\n');
|
||||
if (!endline2) {
|
||||
endline = strchr(endline + 1, '\n');
|
||||
if (!endline)
|
||||
throw error("did not find newline after '#'");
|
||||
}
|
||||
maybe_change_textdomain(endline, endline2, textdomain);
|
||||
endline = endline2;
|
||||
++endline;
|
||||
}
|
||||
|
||||
|
@ -385,10 +350,8 @@ node::node(document& doc, node* parent, const char** str, int depth, string_span
|
|||
}
|
||||
|
||||
s = end + 1;
|
||||
if(is_translatable)
|
||||
attr_.emplace_back(name, value, textdomain);
|
||||
else
|
||||
attr_.emplace_back(name, value);
|
||||
|
||||
attr_.emplace_back(name, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -730,7 +693,7 @@ const string_span& node::first_child() const
|
|||
return children_.begin()->first;
|
||||
}
|
||||
|
||||
int node::output_size(string_span& textdomain) const
|
||||
int node::output_size() const
|
||||
{
|
||||
check_ordered_children();
|
||||
if(output_cache_.empty() == false) {
|
||||
|
@ -740,20 +703,13 @@ int node::output_size(string_span& textdomain) const
|
|||
int res = 0;
|
||||
for(attribute_list::const_iterator i = attr_.begin(); i != attr_.end(); ++i) {
|
||||
res += i->key.size() + i->value.size() + 4;
|
||||
if(i->is_translatable()) {
|
||||
if(i->textdomain != textdomain) {
|
||||
res += textdomain_str_size() + i->textdomain.size() + 1/* \n */;
|
||||
}
|
||||
textdomain = i->textdomain;
|
||||
res += 1; // "_"
|
||||
}
|
||||
}
|
||||
|
||||
std::size_t count_children = 0;
|
||||
for(child_map::const_iterator i = children_.begin(); i != children_.end(); ++i) {
|
||||
for(child_list::const_iterator j = i->second.begin(); j != i->second.end(); ++j) {
|
||||
res += i->first.size()*2 + 7;
|
||||
res += (*j)->output_size(textdomain);
|
||||
res += (*j)->output_size();
|
||||
++count_children;
|
||||
}
|
||||
}
|
||||
|
@ -772,7 +728,6 @@ void node::shift_buffers(ptrdiff_t offset)
|
|||
for(std::vector<attribute>::iterator i = attr_.begin(); i != attr_.end(); ++i) {
|
||||
i->key = string_span(i->key.begin() + offset, i->key.size());
|
||||
i->value = string_span(i->value.begin() + offset, i->value.size());
|
||||
i->textdomain = string_span(i->textdomain.begin() + offset, i->textdomain.size());
|
||||
}
|
||||
|
||||
for(child_map::iterator i = children_.begin(); i != children_.end(); ++i) {
|
||||
|
@ -784,10 +739,9 @@ void node::shift_buffers(ptrdiff_t offset)
|
|||
}
|
||||
}
|
||||
|
||||
void node::output(char*& buf, string_span& textdomain, CACHE_STATUS cache_status)
|
||||
void node::output(char*& buf, CACHE_STATUS cache_status)
|
||||
{
|
||||
if(output_cache_.empty() == false) {
|
||||
// fixme: this skips over textdomain changes.
|
||||
memcpy(buf, output_cache_.begin(), output_cache_.size());
|
||||
if(cache_status == REFRESH_CACHE) {
|
||||
shift_buffers(buf - output_cache_.begin());
|
||||
|
@ -799,28 +753,10 @@ void node::output(char*& buf, string_span& textdomain, CACHE_STATUS cache_status
|
|||
char* begin = buf;
|
||||
|
||||
for(std::vector<attribute>::iterator i = attr_.begin(); i != attr_.end(); ++i) {
|
||||
|
||||
if(i->is_translatable()) {
|
||||
if(textdomain != i->textdomain) {
|
||||
memcpy(buf, textdomain_str(), textdomain_str_size());
|
||||
buf += textdomain_str_size();
|
||||
|
||||
memcpy(buf, i->textdomain.begin(), i->textdomain.size());
|
||||
textdomain = string_span(buf, i->textdomain.size());
|
||||
|
||||
buf += i->textdomain.size();
|
||||
*buf++ = '\n';
|
||||
}
|
||||
i->textdomain = textdomain;
|
||||
}
|
||||
|
||||
memcpy(buf, i->key.begin(), i->key.size());
|
||||
i->key = string_span(buf, i->key.size());
|
||||
buf += i->key.size();
|
||||
*buf++ = '=';
|
||||
if(i->is_translatable()) {
|
||||
*buf++ = '_';
|
||||
}
|
||||
*buf++ = '"';
|
||||
memcpy(buf, i->value.begin(), i->value.size());
|
||||
i->value = string_span(buf, i->value.size());
|
||||
|
@ -840,7 +776,7 @@ void node::output(char*& buf, string_span& textdomain, CACHE_STATUS cache_status
|
|||
buf += attr.size();
|
||||
*buf++ = ']';
|
||||
*buf++ = '\n';
|
||||
children_[i->child_map_index].second[i->child_list_index]->output(buf, textdomain, cache_status);
|
||||
children_[i->child_map_index].second[i->child_list_index]->output(buf, cache_status);
|
||||
*buf++ = '[';
|
||||
*buf++ = '/';
|
||||
memcpy(buf, attr.begin(), attr.size());
|
||||
|
@ -858,12 +794,10 @@ std::string node_to_string(const node& n)
|
|||
{
|
||||
//calling output with status=DO_NOT_MODIFY_CACHE really doesn't modify the
|
||||
//node, so we can do it safely
|
||||
string_span textdomain(0, 0);
|
||||
node& mutable_node = const_cast<node&>(n);
|
||||
std::vector<char> v(mutable_node.output_size(textdomain));
|
||||
std::vector<char> v(mutable_node.output_size());
|
||||
char* ptr = &v[0];
|
||||
textdomain = string_span(0, 0);
|
||||
mutable_node.output(ptr, textdomain, node::DO_NOT_MODIFY_CACHE);
|
||||
mutable_node.output(ptr, node::DO_NOT_MODIFY_CACHE);
|
||||
assert(ptr == &v[0] + v.size());
|
||||
return std::string(v.begin(), v.end());
|
||||
}
|
||||
|
@ -1023,8 +957,7 @@ document::document(char* buf, INIT_BUFFER_CONTROL control) :
|
|||
buffers_.push_back(buf);
|
||||
}
|
||||
const char* cbuf = buf;
|
||||
string_span textdomain = default_textdomain();
|
||||
root_ = new node(*this, nullptr, &cbuf, 0, textdomain);
|
||||
root_ = new node(*this, nullptr, &cbuf);
|
||||
|
||||
attach_list();
|
||||
}
|
||||
|
@ -1041,8 +974,7 @@ document::document(const char* buf, INIT_STATE state) :
|
|||
output_compressed();
|
||||
output_ = nullptr;
|
||||
} else {
|
||||
string_span textdomain = default_textdomain();
|
||||
root_ = new node(*this, nullptr, &buf, 0, textdomain);
|
||||
root_ = new node(*this, nullptr, &buf);
|
||||
}
|
||||
|
||||
attach_list();
|
||||
|
@ -1061,8 +993,7 @@ document::document(string_span compressed_buf) :
|
|||
output_ = uncompressed_buf.begin();
|
||||
const char* cbuf = output_;
|
||||
try {
|
||||
string_span textdomain(0, 0);
|
||||
root_ = new node(*this, nullptr, &cbuf, 0, textdomain);
|
||||
root_ = new node(*this, nullptr, &cbuf);
|
||||
} catch(...) {
|
||||
delete [] buffers_.front();
|
||||
buffers_.clear();
|
||||
|
@ -1111,9 +1042,8 @@ const char* document::output()
|
|||
|
||||
std::vector<char*> bufs;
|
||||
bufs.swap(buffers_);
|
||||
|
||||
string_span textdomain(0, 0);
|
||||
const int buf_size = root_->output_size(textdomain) + 1;
|
||||
|
||||
const int buf_size = root_->output_size() + 1;
|
||||
char* buf;
|
||||
try {
|
||||
buf = new char[buf_size];
|
||||
|
@ -1124,9 +1054,8 @@ const char* document::output()
|
|||
}
|
||||
buffers_.push_back(buf);
|
||||
output_ = buf;
|
||||
|
||||
textdomain = string_span(0, 0);
|
||||
root_->output(buf, textdomain, node::REFRESH_CACHE);
|
||||
|
||||
root_->output(buf, node::REFRESH_CACHE);
|
||||
*buf++ = 0;
|
||||
assert(buf == output_ + buf_size);
|
||||
|
||||
|
@ -1183,8 +1112,7 @@ void document::generate_root()
|
|||
|
||||
assert(root_ == nullptr);
|
||||
const char* cbuf = output_;
|
||||
string_span textdomain(0, 0);
|
||||
root_ = new node(*this, nullptr, &cbuf, 0, textdomain);
|
||||
root_ = new node(*this, nullptr, &cbuf);
|
||||
}
|
||||
|
||||
document* document::clone()
|
||||
|
|
|
@ -113,18 +113,13 @@ class node
|
|||
{
|
||||
public:
|
||||
node(document& doc, node* parent);
|
||||
node(document& doc, node* parent, const char** str, int depth, string_span& textdomain);
|
||||
node(document& doc, node* parent, const char** str, int depth=0);
|
||||
~node();
|
||||
struct attribute
|
||||
{
|
||||
attribute(const string_span& k, const string_span& v) : key(k), value(v), textdomain(string_span(0, 0)) {}
|
||||
attribute(const string_span& k, const string_span& v, const string_span& t) : key(k), value(v), textdomain(t) {}
|
||||
attribute(const string_span& k, const string_span& v) : key(k), value(v) {}
|
||||
string_span key;
|
||||
string_span value;
|
||||
string_span textdomain;
|
||||
|
||||
bool is_translatable() const
|
||||
{ return textdomain.size() != 0; }
|
||||
};
|
||||
typedef std::vector<node*> child_list;
|
||||
|
||||
|
@ -166,8 +161,8 @@ public:
|
|||
|
||||
enum CACHE_STATUS { REFRESH_CACHE, DO_NOT_MODIFY_CACHE };
|
||||
|
||||
int output_size(string_span& textdomain) const;
|
||||
void output(char*& buf, string_span& textdomain, CACHE_STATUS status=DO_NOT_MODIFY_CACHE);
|
||||
int output_size() const;
|
||||
void output(char*& buf, CACHE_STATUS status=DO_NOT_MODIFY_CACHE);
|
||||
|
||||
void copy_into(node& n) const;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue