summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoralberth <alberth@openttd.org>2011-03-03 20:53:09 +0000
committeralberth <alberth@openttd.org>2011-03-03 20:53:09 +0000
commit722296e79747610b7822c07f2edd908563456d92 (patch)
tree5abad466c49bbae08ee041eef2a2773d884c8267 /src
parentd19a9f5df5ca670857ae82ae8e02e065a0035974 (diff)
downloadopenttd-722296e79747610b7822c07f2edd908563456d92.tar.xz
(svn r22168) -Codechange: Move ini file IO and file error reporting to virtual functions.
Diffstat (limited to 'src')
-rw-r--r--src/ini.cpp12
-rw-r--r--src/ini_load.cpp20
-rw-r--r--src/ini_type.h19
3 files changed, 34 insertions, 17 deletions
diff --git a/src/ini.cpp b/src/ini.cpp
index 3dc1219bb..c8cf317ac 100644
--- a/src/ini.cpp
+++ b/src/ini.cpp
@@ -105,3 +105,15 @@ bool IniFile::SaveToDisk(const char *filename)
return true;
}
+
+/* virtual */ FILE *IniFile::OpenFile(const char *filename, size_t *size)
+{
+ /* Open the text file in binary mode to prevent end-of-line translations
+ * done by ftell() and friends, as defined by K&R. */
+ return FioFOpenFile(filename, "rb", DATA_DIR, size);
+}
+
+/* virtual */ void IniFile::ReportFileError(const char * const pre, const char * const buffer, const char * const post)
+{
+ ShowInfoF("%s%s%s", pre, buffer, post);
+}
diff --git a/src/ini_load.cpp b/src/ini_load.cpp
index 65c8b865c..62bec51d5 100644
--- a/src/ini_load.cpp
+++ b/src/ini_load.cpp
@@ -12,10 +12,8 @@
#include "stdafx.h"
#include "core/alloc_func.hpp"
#include "core/mem_func.hpp"
-#include "debug.h"
#include "ini_type.h"
#include "string_func.h"
-#include "fileio_func.h"
/**
* Construct a new in-memory item of an Ini file.
@@ -205,19 +203,7 @@ void IniLoadFile::LoadFromDisk(const char *filename)
uint comment_alloc = 0;
size_t end;
- /*
- * Now we are going to open a file that contains no more than simple
- * plain text. That would raise the question: "why open the file as
- * if it is a binary file?". That's simple... Microsoft, in all
- * their greatness and wisdom decided it would be useful if ftell
- * is aware of '\r\n' and "sees" that as a single character. The
- * easiest way to test for that situation is by searching for '\n'
- * and decrease the value every time you encounter a '\n'. This will
- * thus also make ftell "see" the '\r' when it is not there, so the
- * result of ftell will be highly unreliable. So to work around this
- * marvel of wisdom we have to open in as a binary file.
- */
- FILE *in = FioFOpenFile(filename, "rb", DATA_DIR, &end);
+ FILE *in = this->OpenFile(filename, &end);
if (in == NULL) return;
end += ftell(in);
@@ -253,7 +239,7 @@ void IniLoadFile::LoadFromDisk(const char *filename)
/* it's a group? */
if (s[0] == '[') {
if (e[-1] != ']') {
- ShowInfoF("ini: invalid group name '%s'", buffer);
+ this->ReportFileError("ini: invalid group name '", buffer, "'");
} else {
e--;
}
@@ -296,7 +282,7 @@ void IniLoadFile::LoadFromDisk(const char *filename)
item->value = (!quoted && e == t) ? NULL : strndup(t, e - t);
} else {
/* it's an orphan item */
- ShowInfoF("ini: '%s' outside of group", buffer);
+ this->ReportFileError("ini: '", buffer, "' outside of group");
}
}
diff --git a/src/ini_type.h b/src/ini_type.h
index 2bb4fea27..b84f7adf6 100644
--- a/src/ini_type.h
+++ b/src/ini_type.h
@@ -61,6 +61,22 @@ struct IniLoadFile {
void RemoveGroup(const char *name);
void LoadFromDisk(const char *filename);
+
+ /**
+ * Open the INI file.
+ * @param filename Name of the INI file.
+ * @param size [out] Size of the opened file.
+ * @return File handle of the opened file, or \c NULL.
+ */
+ virtual FILE *OpenFile(const char *filename, size_t *size) = 0;
+
+ /**
+ * Report an error about the file contents.
+ * @param pre Prefix text of the \a buffer part.
+ * @param buffer Part of the file with the error.
+ * @param post Suffix text of the \a buffer part.
+ */
+ virtual void ReportFileError(const char * const pre, const char * const buffer, const char * const post) = 0;
};
/** Ini file that supports both loading and saving. */
@@ -68,6 +84,9 @@ struct IniFile : IniLoadFile {
IniFile(const char * const *list_group_names = NULL);
bool SaveToDisk(const char *filename);
+
+ virtual FILE *OpenFile(const char *filename, size_t *size);
+ virtual void ReportFileError(const char * const pre, const char * const buffer, const char * const post);
};
#endif /* INI_TYPE_H */