diff --git a/src/Sapfor.cpp b/src/Sapfor.cpp index 7c7254d..66d2010 100644 --- a/src/Sapfor.cpp +++ b/src/Sapfor.cpp @@ -2046,7 +2046,7 @@ static void findFunctionsToInclude(bool needToAddErrors) SPF_messages[byFile.first].push_back(message); else { - if (message.type != ERROR) + if (message.getType() != ERROR) SPF_messages[byFile.first].push_back(message); else lastErrors[byFile.first].push_back(message); @@ -2659,25 +2659,8 @@ int main(int argc, char **argv) printStackTrace(); printf("exception occurred\n"); for (auto& byFile : SPF_messages) - { for (auto& message : byFile.second) - { - string toPrint = ""; - for (int z = 0; z < message.engMessage.size(); ++z) - toPrint += message.engMessage[z]; - string type; - if (message.type == WARR) - type = "WARR"; - else if (message.type == ERROR) - type = "ERROR"; - else if (message.type == NOTE) - type = "NOTE"; - else - type = "UNKN"; - - printf("%s - [#%d: %s: line %d]: %s\n", type.c_str(), message.group, byFile.first.c_str(), message.line, toPrint.c_str()); - } - } + message.print(byFile.first); } deleteAllAllocatedData(withDel); diff --git a/src/Utils/errors.h b/src/Utils/errors.h index 82e198b..6251e3a 100644 --- a/src/Utils/errors.h +++ b/src/Utils/errors.h @@ -1,5 +1,7 @@ #pragma once #include +#include "json.hpp" + #ifdef __SPF #include "dvm.h" #endif @@ -164,18 +166,40 @@ public: engMessage.erase(engMessage.begin() + engMessage.size() - 1); } - std::wstring toString() const + nlohmann::json toJson() const { - std::wstring retVal = L"|"; - retVal += std::to_wstring((int)type) + L" "; - retVal += std::to_wstring(line) + L" "; - retVal += std::to_wstring(group); - retVal += L"|" + value; - return retVal; + nlohmann::json resVal; + + resVal["line"] = line; + resVal["group"] = group; + resVal["value"] = std::string(value.begin(), value.end()); + return resVal; } - std::string getString() const { return std::string(engMessage.begin(), engMessage.end()); } -public: + typeMessage getType() const { return type; } + int getLine() const { return line; } + + void print(const std::string& file) const + { + std::string toPrint = ""; + for (int z = 0; z < engMessage.size(); ++z) + toPrint += engMessage[z]; + + std::string typeStr; + if (type == WARR) + typeStr = "WARR"; + else if (type == ERROR) + typeStr = "ERROR"; + else if (type == NOTE) + typeStr = "NOTE"; + else + typeStr = "UNKN"; + + printf("%s - [#%d: %s: line %d]: %s\n", typeStr.c_str(), group, file.c_str(), line, toPrint.c_str()); + } + + auto getUniqKey() const { return std::make_tuple(type, group, line, value); } +private: typeMessage type; int group; int line; diff --git a/src/Utils/utils.cpp b/src/Utils/utils.cpp index a7d2faf..ea9f073 100644 --- a/src/Utils/utils.cpp +++ b/src/Utils/utils.cpp @@ -30,6 +30,7 @@ #include "../Distribution/Arrays.h" #include "../DynamicAnalysis/gcov_info.h" #include "../ParallelizationRegions/ParRegions.h" +#include "json.hpp" #if __SPF #include "acc_analyzer.h" @@ -42,6 +43,7 @@ using std::set; using std::vector; using std::string; using std::wstring; +using json = nlohmann::json; #if __cplusplus >= 201703L #include @@ -427,7 +429,7 @@ static map> removeCopies(map> map, const Messages*> uniq; for (auto& message : byFile.second) { - auto key = make_tuple(message.type, message.group, message.line, message.value); + auto key = message.getUniqKey(); /*string tmp = ""; for (auto& s : message.toString()) tmp += (char)s; @@ -460,7 +462,7 @@ static void convertGlobalMessagesBuffer(short *&result, int *&resultSize) bool waschanged = false; for (auto &message : byFile.second) { - if (message.line > 0) + if (message.getLine() > 0) newVal.push_back(message); else waschanged = true; @@ -470,22 +472,30 @@ static void convertGlobalMessagesBuffer(short *&result, int *&resultSize) byFile.second = newVal; } - wstring val = L""; - val += std::to_wstring(copySPF_messages.size()); - for (auto it = copySPF_messages.begin(); it != copySPF_messages.end(); ++it) + json allMessages = json::array(); + for (auto& byFile : copySPF_messages) { - val += L"|" + to_wstring(it->first.c_str()) + L"|" + std::to_wstring(it->second.size()); - for (int k = 0; k < it->second.size(); ++k) - val += it->second[k].toString(); + json inFile; + inFile["file"] = byFile.first; + + json array = json::array(); + for (auto& message : byFile.second) + { + json msg = message.toJson(); + array.push_back(msg); + } + inFile["messages"] = array; + allMessages.push_back(inFile); } - const unsigned len = (unsigned)val.size(); - result = new short[len + 1]; - allocated.insert(result); + json all; + all["allMessages"] = allMessages; - result[len] = '\0'; - for (unsigned i = 0; i < len; ++i) - result[i] = val[i]; + const string str = all.dump(); + const unsigned len = (unsigned)str.size(); + + copyStringToShort(result, str); + allocated.insert(result); resultSize = new int[1]; resultSize[0] = (int)len; @@ -1686,4 +1696,16 @@ set fillDistributedArrays(const DataDirective& dataDirectives, for (auto& elem : ret) distrArrays.insert(shortName ? elem->GetShortName() : elem->GetName()); return distrArrays; +} + +void copyStringToShort(short*& result, const string& resVal, bool withEnd) +{ + result = new short[resVal.size() + 1]; + allocated.insert(result); + + for (int i = 0; i < resVal.size(); ++i) + result[i] = resVal[i]; + + if (withEnd) + result[resVal.size()] = (short)'\0'; } \ No newline at end of file diff --git a/src/Utils/utils.h b/src/Utils/utils.h index eb25db1..e96fd1b 100644 --- a/src/Utils/utils.h +++ b/src/Utils/utils.h @@ -96,3 +96,5 @@ std::vector splitAndArgvCreate(const std::string& options); std::set fillDistributedArraysD(const DataDirective& dataDirectives, const std::map>& tableOfUniqNamesByArray, const std::map>& arrayLinksByFuncCalls, bool onlyCommon = false); std::set fillDistributedArrays(const DataDirective& dataDirectives, const std::map>& tableOfUniqNamesByArray, const std::map>& arrayLinksByFuncCalls, bool onlyCommon = false, bool shortName = false); + +void copyStringToShort(short*& result, const std::string& resVal, bool withEnd = true); diff --git a/src/Utils/version.h b/src/Utils/version.h index 495b081..43758a9 100644 --- a/src/Utils/version.h +++ b/src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2421" +#define VERSION_SPF "2422" diff --git a/src/VisualizerCalls/get_information.cpp b/src/VisualizerCalls/get_information.cpp index 881386c..8aa5102 100644 --- a/src/VisualizerCalls/get_information.cpp +++ b/src/VisualizerCalls/get_information.cpp @@ -218,18 +218,6 @@ static bool tryOpenProjectFile(const char *project) return ret; } -static void copyStringToShort(short *&result, const string &resVal, bool withEnd = true) -{ - result = new short[resVal.size() + 1]; - allocated.insert(result); - - for (int i = 0; i < resVal.size(); ++i) - result[i] = resVal[i]; - - if (withEnd) - result[resVal.size()] = (short)'\0'; -} - volatile int passDone = 0; static volatile int rethrow = 0; static void runPassesLoop(const vector &passesToRun, const char *prName, const char *folderNameChar)