summaryrefslogtreecommitdiff
path: root/ZAPD/WarningHandler.h
diff options
context:
space:
mode:
authorEllipticEllipsis <73679967+EllipticEllipsis@users.noreply.github.com>2021-11-27 20:06:29 +0000
committerGitHub <noreply@github.com>2021-11-27 15:06:29 -0500
commit0966109a1402ac4a070345f9e151b93064d09fc9 (patch)
tree58043fa7bd894bb57a61d843bca9e99492387df4 /ZAPD/WarningHandler.h
parent6948306d97a8d87c5ecae23c409894383badfe67 (diff)
Warning system (#189)
* first draft * take vt.h from mm repo * Colors * Fix argument types * Add argument parser to errorhandler * Rename ErrorHandler to WarningHandler * Add -Wno- and more warning types * header and body in warnings * Small cleanup * Replace a bunch of warnings with the new system Co-authored-by: EllipticEllipsis <EllipticEllipsis@users.noreply.github.com> * Move stuff around * Move stuff to header * Make some more VT macros, new Warning_Build function + macro, ZBackground * Add remaining warnings * Add ZResource* param to Warning_Resource * Add warning help message * Simplify help message a bit * Refactor warnings into lots of helper functions * Fix HANG_INDT in the wild * Builds now * Update macros to use bold * Fix body printing and error colour * Add -Werror= * Add warningType to HANDLE_ERROR * Change some throws into HANDLE_ERROR * Create init and main maps and write new help printer * Changed ZTextureAnimation to new w/e * Typo * Delete build warnings list file * Use ERROR in ZResource and ZPath * Remove extra structs * Move ifdef into the InitMap, add descriptions * Actually move into initMap and add descriptions... * Remove Everything from the WarningType enum * Make more of the handler arguments const for compatibility * Fix warning * Document macros a bit * Add ImageBackend ERRRORs * Note on Weverything, rename InvalidData to InvalidExtractedData * add texture and mesh warnings/errors * InvalidExtractedData * Add description for InvalidPNG * print which warnings are enabled by using debug verbosity * Fix everything * Fix some newlines * Move help to the end, start some documentation * Remove unnecessary `WarningHandler::`s * Remove commented code * Some more documentation * Make first letters consistenty lowercase, more docs * Consistently use lowercase, more docs * Format consistently, more detail in documentation * Simplify enabled warnings checks * Rename HANDLE_WARNING_BUILD and add HANDLE_ERROR_PROCESS * Delete BuildInfo.cpp * Use PROCESS where possible, bit more documentation * Add documenation to README, sort when printing help * Add an example, escalate the rest of the invalids by default * Format warning names in table * format readme * Remove old flags info * Remove obsolete variables * Format * assert.h -> cassert * Replace some asserts in ZTexture * Remove test file * Minor cleanup * Bit more in the help * Fix header includes * Format * One character in readme * Update README.md Co-authored-by: Anghelo Carvajal <angheloalf95@gmail.com> * Some Morita inspiration * Convert new errors * Static warnings/errors * Merge remote-tracking branch 'upstream/master' into errorlib * Add explanation for switch control flow * format * whooops * Fix segment warning that doesn't apply now we assume no segment means use VRAM * Comment out MM in Jenkinsfile Co-authored-by: Angie <angheloalf95@gmail.com> Co-authored-by: EllipticEllipsis <EllipticEllipsis@users.noreply.github.com>
Diffstat (limited to 'ZAPD/WarningHandler.h')
-rw-r--r--ZAPD/WarningHandler.h145
1 files changed, 145 insertions, 0 deletions
diff --git a/ZAPD/WarningHandler.h b/ZAPD/WarningHandler.h
new file mode 100644
index 0000000..bb0360a
--- /dev/null
+++ b/ZAPD/WarningHandler.h
@@ -0,0 +1,145 @@
+#pragma once
+
+#include <array>
+#include <string>
+#include <string_view>
+#include <unordered_map>
+
+#include "Utils/vt.h"
+#include "ZFile.h"
+
+#ifdef _MSC_VER
+#define __PRETTY_FUNCTION__ __FUNCSIG__
+#elif not defined(__GNUC__)
+#define __PRETTY_FUNCTION__ __func__
+#endif
+
+// =======================================
+/* Formatting macros */
+
+// TODO: move this somewhere else so it can be used by other help
+#define HELP_DT_INDT " "
+
+/* Macros for formatting warnings/errors */
+#define VT_HILITE VT_BOLD_FGCOL(WHITE)
+#define VT_WARN VT_BOLD_FGCOL(PURPLE)
+#define VT_ERR VT_BOLD_FGCOL(RED)
+
+#define HILITE(string) (VT_HILITE string VT_RST)
+#define WARN_FMT(string) (VT_WARN string VT_RST)
+#define ERR_FMT(string) (VT_ERR string VT_RST)
+
+// Maybe make WARN_LF instead
+// Currently 8 spaces
+#define WARN_INDT " "
+// Currently 16 spaces
+#define HANG_INDT " "
+
+// =======================================
+/* Warning and error macros */
+// TODO: better names
+
+// General-purpose, plain style (only prints function,file,line in the preamble)
+#define HANDLE_ERROR(warningType, header, body) \
+ WarningHandler::Error_Plain(__FILE__, __LINE__, __PRETTY_FUNCTION__, warningType, header, body)
+#define HANDLE_WARNING(warningType, header, body) \
+ WarningHandler::Warning_Plain(__FILE__, __LINE__, __PRETTY_FUNCTION__, warningType, header, \
+ body)
+
+// For processing XMLs or textures/blobs (preamble contains function,file,line; processed file)
+#define HANDLE_ERROR_PROCESS(warningType, header, body) \
+ WarningHandler::Error_Process(__FILE__, __LINE__, __PRETTY_FUNCTION__, warningType, header, \
+ body)
+#define HANDLE_WARNING_PROCESS(warningType, header, body) \
+ WarningHandler::Warning_Process(__FILE__, __LINE__, __PRETTY_FUNCTION__, warningType, header, \
+ body)
+
+// For ZResource-related stuff (preamble contains function,file,line; processed file; extracted file
+// and offset)
+#define HANDLE_ERROR_RESOURCE(warningType, parent, resource, offset, header, body) \
+ WarningHandler::Error_Resource(__FILE__, __LINE__, __PRETTY_FUNCTION__, warningType, parent, \
+ resource, offset, header, body)
+#define HANDLE_WARNING_RESOURCE(warningType, parent, resource, offset, header, body) \
+ WarningHandler::Warning_Resource(__FILE__, __LINE__, __PRETTY_FUNCTION__, warningType, parent, \
+ resource, offset, header, body)
+
+// =======================================
+
+enum class WarningType
+{
+ Always, // Warnings of this type are always printed, cannot be disabled.
+ Deprecated,
+ Unaccounted,
+ MissingOffsets,
+ Intersection,
+ MissingAttribute,
+ InvalidAttributeValue,
+ UnknownAttribute,
+ InvalidXML,
+ InvalidJPEG,
+ InvalidPNG,
+ InvalidExtractedData,
+ MissingSegment,
+ HardcodedPointer,
+ NotImplemented,
+ Max,
+};
+
+enum class WarningLevel
+{
+ Off,
+ Warn,
+ Err,
+};
+
+class WarningHandler
+{
+public:
+ static void ConstructTypeToInfoMap();
+
+ static void Init(int argc, char* argv[]);
+
+ static bool IsWarningEnabled(WarningType warnType);
+ static bool WasElevatedToError(WarningType warnType);
+
+ static void FunctionPreamble(const char* filename, int32_t line, const char* function);
+ static void ProcessedFilePreamble();
+ static void ExtractedFilePreamble(const ZFile* parent, const ZResource* res,
+ const uint32_t offset);
+ static std::string ConstructMessage(std::string message, const std::string& header,
+ const std::string& body);
+
+ [[noreturn]] static void PrintErrorAndThrow(const std::string& header, const std::string& body);
+ static void PrintWarningBody(const std::string& header, const std::string& body);
+
+ [[noreturn]] static void ErrorType(WarningType warnType, const std::string& header,
+ const std::string& body);
+ [[noreturn]] static void Error_Plain(const char* filename, int32_t line, const char* function,
+ WarningType warnType, const std::string& header,
+ const std::string& body);
+ [[noreturn]] static void Error_Process(const char* filename, int32_t line, const char* function,
+ WarningType warnType, const std::string& header,
+ const std::string& body);
+ [[noreturn]] static void Error_Resource(const char* filename, int32_t line,
+ const char* function, WarningType warnType,
+ const ZFile* parent, const ZResource* res,
+ const uint32_t offset, const std::string& header,
+ const std::string& body);
+
+ static void WarningTypeAndChooseEscalate(WarningType warnType, const std::string& header,
+ const std::string& body);
+
+ static void Warning_Plain(const char* filename, int32_t line, const char* function,
+ WarningType warnType, const std::string& header,
+ const std::string& body);
+ static void Warning_Process(const char* filename, int32_t line, const char* function,
+ WarningType warnType, const std::string& header,
+ const std::string& body);
+ static void Warning_Resource(const char* filename, int32_t line, const char* function,
+ WarningType warnType, const ZFile* parent, const ZResource* res,
+ const uint32_t offset, const std::string& header,
+ const std::string& body);
+
+ static void PrintHelp();
+ static void PrintWarningsDebugInfo();
+};