From e606d830cf992f21c125d6508cf9e71dc10da6b8 Mon Sep 17 00:00:00 2001 From: "Peter Helcmanovsky (Ped)" Date: Thu, 2 Jan 2025 22:21:31 +0100 Subject: [PATCH] reader.cpp: remove some of the duplicated delimited string parsing code --- TODO.txt | 3 +++ sjasm/reader.cpp | 54 +++++++++++++++++------------------------------- sjasm/reader.h | 11 +++++----- sjasm/sjdefs.h | 1 + 4 files changed, 29 insertions(+), 40 deletions(-) diff --git a/TODO.txt b/TODO.txt index 0e145ee3..557a0665 100644 --- a/TODO.txt +++ b/TODO.txt @@ -42,6 +42,9 @@ extern struct tm *gmtime (const time_t *__timer) __THROW; extern struct tm *localtime (const time_t *__timer) __THROW; ------------- +tables.cpp:1178: error not covered by tests why?? "if (haakjes) { Error("closing } missing"); }" +also reader.cpp:967: case 'w'*2+'o' (smallcase "word"? or are coverage data misaligned again? also doesn't feel like case matters in other cases) + unittest-cpp seems to be pretty dead now, consider migration, for example to https://github.com/neacsum/utpp (author claims C++20, header only and somewhat more compatible with GoogleTest) diff --git a/sjasm/reader.cpp b/sjasm/reader.cpp index 7e4fe8b2..3617b639 100644 --- a/sjasm/reader.cpp +++ b/sjasm/reader.cpp @@ -873,63 +873,47 @@ int GetBytesHexaText(char*& p, int e[]) { return bytes; } -std::string GetDelimitedString(char*& p) { - const char deliE = delimiters_e[DelimiterAnyBegins(p)]; +std::pair GetDelimitedStringEx(char*& p) { + std::pair result; + result.second = DelimiterAnyBegins(p); + const char deliE = delimiters_e[result.second]; char *p_begin = p; while (*p && deliE != *p) ++p; - std::string result(p_begin, p); + result.first.assign(p_begin, p); if (' ' != deliE) { if (deliE == *p) { ++p; } else { const char delimiterTxt[2] = { deliE, 0 }; Error("No closing delimiter", delimiterTxt, SUPPRESS); - result = ""; // return "empty" string + result.first = ""; // return "empty" string } } - SkipBlanks(p); // skip blanks any way + SkipBlanks(p); // skip blanks any way return result; } +std::string GetDelimitedString(char*& p) { + return GetDelimitedStringEx(p).first; // throw away delimter type and return just string +} + static EDelimiterType delimiterOfLastFileName = DT_NONE; -static std::filesystem::path GetFileName(char*& p, const std::filesystem::path & pathPrefix) { - // check if some and which delimiter is used for this filename (does advance over white chars) - // and remember type of detected delimiter (for GetDelimiterOfLastFileName function) - delimiterOfLastFileName = DelimiterAnyBegins(p); - const char deliE = delimiters_e[delimiterOfLastFileName]; // expected ending delimiter - // find all characters of file name - const char* name_begin = p; - while (*p && deliE != *p) ++p; - std::filesystem::path name(name_begin, static_cast(p)); - if (!pathPrefix.empty()) name = pathPrefix / name; +std::filesystem::path GetFileName(char*& p, const std::filesystem::path & pathPrefix) { + auto str_name = GetDelimitedStringEx(p); // get string and its delimiter type + delimiterOfLastFileName = str_name.second; // remember delimiter for GetDelimiterOfLastFileName // convert backslash and report them with warning - std::string str_name = name.string(); - if (std::string::npos != str_name.find('\\')) WarningById(W_BACKSLASH, bp); - std::replace(str_name.begin(), str_name.end(), '\\', '/'); - name = str_name; - // verify + skip end-delimiter (if other than space) - if (' ' != deliE) { - if (deliE == *p) { - ++p; - } else { - const char delimiterTxt[2] = { deliE, 0 }; - Error("No closing delimiter", delimiterTxt, SUPPRESS); - name = ""; // return "empty" string filename - } - } - SkipBlanks(p); // skip blanks any way - return name; + if (std::string::npos != str_name.first.find('\\')) WarningById(W_BACKSLASH, bp); + std::replace(str_name.first.begin(), str_name.first.end(), '\\', '/'); + // return prefixed path (or just path if no prefix is requested) + if (pathPrefix.empty()) return str_name.first; + else return pathPrefix / str_name.first; } std::filesystem::path GetOutputFileName(char*& p) { return GetFileName(p, Options::OutPrefix); } -std::filesystem::path GetFileName(char*& p) { - return GetFileName(p, ""); -} - EDelimiterType GetDelimiterOfLastFileName() { // DT_NONE if no GetFileName was called return delimiterOfLastFileName; diff --git a/sjasm/reader.h b/sjasm/reader.h index dd4b765e..d04bff69 100644 --- a/sjasm/reader.h +++ b/sjasm/reader.h @@ -77,11 +77,12 @@ int GetBytes(char*& p, int e[], int add, int dc); void GetStructText(char*& p, aint len, byte* data, const byte* initData = nullptr); // initData indicate "{}" is required for multi-value init int GetBits(char*& p, int e[]); int GetBytesHexaText(char*& p, int e[]); -int cmphstr(char*& p1, const char* p2, bool allowParenthesisEnd = false); // p2 must be lowercase to match both cases -std::string GetDelimitedString(char*& p); // get some string within delimiters (none, quotes, apostrophes, chevron) -std::filesystem::path GetFileName(char*& p); // get string in delimiters, remember delimiter and convert slashes -std::filesystem::path GetOutputFileName(char*& p); // GetFileName plus prepends the filename with OutPrefix -EDelimiterType GetDelimiterOfLastFileName(); // DT_NONE if no GetFileName was called +int cmphstr(char*& p1, const char* p2, bool allowParenthesisEnd = false); // p2 must be lowercase to match both cases +std::pair GetDelimitedStringEx(char*& p); // get some string within delimiters (none, quotes, apostrophes, chevron) +std::string GetDelimitedString(char*& p); // get some string within delimiters (none, quotes, apostrophes, chevron) +std::filesystem::path GetFileName(char*& p, const std::filesystem::path & pathPrefix = ""); // get string in delimiters, remember delimiter, convert slashes, prepend pathPrefix +std::filesystem::path GetOutputFileName(char*& p); // GetFileName with pathPrefix = OutPrefix +EDelimiterType GetDelimiterOfLastFileName(); // DT_NONE if no GetFileName was called bool isLabelStart(const char *p, bool modifiersAllowed = true); int islabchar(char p); EStructureMembers GetStructMemberId(char*& p); diff --git a/sjasm/sjdefs.h b/sjasm/sjdefs.h index 1a7cf316..b2f4e61c 100644 --- a/sjasm/sjdefs.h +++ b/sjasm/sjdefs.h @@ -49,6 +49,7 @@ #endif #include +#include #include #include #include