68 #include <QLoggingCategory>
79 #define INF_MAGIC (0xabdc0132)
139 return (c ==
'#' || c ==
';');
192 return QStringLiteral(
"(anonymous)");
210 fp->open(QIODevice::ReadOnly);
215 qCDebug(inf_category) <<
"opened" <<
filename <<
"ok";
237 inf->
stream->setCodec(
"UTF-8");
238 inf->
stream->setAutoDetectUnicode(
true);
241 qCDebug(inf_category) <<
"opened" <<
inf_filename(inf) <<
"ok";
255 qCDebug(inf_category) <<
"sub-closing" <<
inf_filename(inf);
259 if (
dynamic_cast<KFilterDev *
>(inf->
fp)) {
260 error =
dynamic_cast<KFilterDev *
>(inf->
fp)->error() != 0;
263 qCCritical(inf_category) <<
"Error before closing" <<
inf_filename(inf)
264 <<
":" << inf->
fp->errorString();
276 qCDebug(inf_category) <<
"sub-closed ok";
289 qCDebug(inf_category) <<
"closing" <<
inf_filename(inf);
295 qCDebug(inf_category) <<
"closed ok";
348 QString include_prefix = QStringLiteral(
"*include");
349 if (!inf->
cur_line.startsWith(include_prefix)) {
365 qCCritical(inf_category,
366 "Did not find opening doublequote for '*include' line");
374 auto end = inf->
cur_line.indexOf(
'\"', start);
376 qCCritical(inf_category,
377 "Did not find closing doublequote for '*include' line");
384 for (
int i = end + 1; i < inf->
cur_line.length(); ++i) {
389 }
else if (!c.isSpace()) {
390 qCCritical(inf_category,
"Junk after filename for '*include' line");
397 if (full_name.isEmpty()) {
398 qCCritical(inf_category) <<
"Could not find included file: " <<
name;
408 qCCritical(inf_category)
409 <<
"Recursion trap on '*include' for" << full_name;
439 qCDebug(inf_category) <<
"*include end:" << inf->
filename;
445 *inf = std::move(*inc);
447 qCDebug(inf_category) <<
"back to:" << inf->
filename;
470 if (!ok && !inf->
fp->atEnd()) {
472 qCCritical(inf_category) << QString::fromUtf8(
_(
"Error reading %1: %2"))
474 .arg(inf->
fp->errorString());
503 str = QString::vasprintf(
message, args);
507 str += QStringLiteral(
"\n");
508 str += QStringLiteral(
" file \"%1\", line %2, pos %3")
513 str += QStringLiteral(
", EOF");
517 str += QStringLiteral(
"\n looking at: '%1'")
521 str += QStringLiteral(
"\n processing string starting at line %1")
525 str += QStringLiteral(
"\n included from file \"%1\", line %2")
553 qCCritical(inf_category)
554 <<
"token type" << type <<
"(" <<
name <<
") not supported yet";
567 while (!
inf_token(inf, type).isEmpty()) {
588 auto end = inf->
cur_line.indexOf(
']', start);
609 for (; i < inf->
cur_line.length(); ++i) {
620 for (; i < inf->
cur_line.length(); ++i) {
622 if (c.isSpace() || c ==
'=') {
632 auto eq = inf->
cur_line.indexOf(
'=', end);
639 if (ref.contains(
';') || ref.contains(
'#')) {
659 for (; it < inf->
cur_line.cend() && it->isSpace(); ++it) {
671 inf->
token = QStringLiteral(
" ");
685 for (; it != inf->
cur_line.cend() && it->isSpace(); ++it) {
688 if (it == inf->
cur_line.cend() || *it != target) {
728 auto begin = inf->
cur_line.cbegin();
733 for (; c != end && c->isSpace(); ++c) {
743 if (*c ==
'-' || *c ==
'+' || c->isDigit()) {
746 for (; c != end && c->isDigit(); ++c) {
752 for (; c != end && c->isDigit(); ++c) {
757 if (!(c == end || *c ==
',' || c->isSpace() ||
is_comment(*c))) {
768 bool has_i18n_marking =
false;
769 if (*c ==
'_' && *(c + 1) ==
'(') {
770 has_i18n_marking =
true;
772 while (c != end && c->isSpace()) {
780 auto border_character = *c;
781 if (border_character ==
'*') {
783 auto first = c - begin + 1;
786 auto last = inf->
cur_line.indexOf(
'*', first);
791 c += last - first + 2;
792 if (!(c == end || *c ==
',' || c->isSpace() ||
is_comment(*c))) {
799 if (rfname ==
nullptr) {
801 qCCritical(inf_category,
_(
"Cannot find stringfile \"%s\"."),
802 qUtf8Printable(
name));
805 auto fp =
new KFilterDev(rfname);
806 fp->open(QIODevice::ReadOnly);
808 qCCritical(inf_category,
_(
"Cannot open stringfile \"%s\"."),
809 qUtf8Printable(rfname));
813 qCDebug(inf_category) <<
"Stringfile" <<
name <<
"opened ok";
815 inf->
token = QStringLiteral(
"*");
816 inf->
token += QString::fromUtf8(
fp->readAll());
824 }
else if (border_character !=
'\"' && border_character !=
'\''
825 && border_character !=
'$') {
828 for (; c->isLetterOrNumber(); ++c) {
832 if (!(c == end || *c ==
',' || c->isSpace() ||
is_comment(*c))) {
863 while (c != end && *c != border_character) {
866 if (*c ==
'\\' && (c + 1) != end) {
872 if (*c == border_character) {
877 inf->
partial += QString(start);
881 qCCritical(inf_category,
882 "Bad return for multi-line string from read_a_line");
895 if (has_i18n_marking) {
899 qCWarning(inf_category,
"Missing end of i18n string marking");
#define fc_assert_ret(condition)
#define fc_assert_ret_val(condition, val)
Q_LOGGING_CATEGORY(tileset_category, "freeciv.tileset")
Functions for handling the tilespec files which describe the files and contents of tilesets.