Koridev

Untitled

Jan 7th, 2025
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.17 KB | Fixit | 0 0
  1. #include "parameter_processing.h"
  2. #include <fstream>
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. #include <sstream>
  7. #include <unordered_map>
  8.  
  9. std::vector<std::string> processQuestFile(const std::string& filePath) {
  10.     std::vector<std::string> processedLines;
  11.     std::unordered_map<std::string, std::string> defineTable;
  12.     bool inMultilineComment = false;
  13.  
  14.     try {
  15.         std::ifstream inputFile(filePath);
  16.         if (!inputFile.is_open()) {
  17.             throw std::runtime_error("Fehler beim Öffnen der Datei: " + filePath);
  18.         }
  19.  
  20.         std::string line;
  21.         while (std::getline(inputFile, line)) {
  22.             // Entferne Kommentarblöcke oder auskommentierte Quests
  23.             if (inMultilineComment) {
  24.                 if (line.find("]]--") != std::string::npos || line.find("--]]") != std::string::npos) {
  25.                     inMultilineComment = false; // Ende des Kommentarblocks
  26.                 }
  27.                 continue; // Überspringe die gesamte Zeile
  28.             }
  29.  
  30.             // Prüfen, ob die Zeile einen mehrzeiligen Kommentarblock oder auskommentierte Quests beginnt
  31.             if (line.find("--[[") != std::string::npos) {
  32.                 inMultilineComment = true;
  33.                 continue; // Überspringe die gesamte Zeile
  34.             }
  35.  
  36.             // Entferne einzeilige Kommentare
  37.             std::string strippedLine = line.substr(0, line.find("--"));
  38.  
  39.             // Verarbeite Define-Anweisungen
  40.             if (strippedLine.find("define") == 0) {
  41.                 std::string define, key, value;
  42.                 size_t equalPos = strippedLine.find('=');
  43.  
  44.                 if (equalPos != std::string::npos) {
  45.                     // Fall: "define KEY = VALUE"
  46.                     key = strippedLine.substr(7, equalPos - 7); // Extrahiere KEY
  47.                     value = strippedLine.substr(equalPos + 1);  // Extrahiere VALUE
  48.                 } else {
  49.                     // Fall: "define KEY VALUE" (ohne "=")
  50.                     std::istringstream iss(strippedLine);
  51.                     iss >> define >> key >> value;
  52.                 }
  53.  
  54.                 // Entferne unnötige Leerzeichen
  55.                 key = key.substr(0, key.find_last_not_of(" \t") + 1);
  56.                 value = value.substr(value.find_first_not_of(" \t"));
  57.  
  58.                 // Entferne Anführungszeichen von VALUE (falls nötig)
  59.                 if (!value.empty() && value.front() == '"' && value.back() == '"') {
  60.                     value = value.substr(1, value.length() - 2);
  61.                 }
  62.  
  63.                 // Speichere KEY und VALUE in der Tabelle
  64.                 if (!key.empty() && !value.empty()) {
  65.                     defineTable[key] = value;
  66.                 }
  67.                 continue; // Überspringe die Zeile mit der Define-Anweisung
  68.             }
  69.  
  70.             // Sortiere die Define-Tabelle nach Schlüssellänge (längere Schlüssel zuerst)
  71.             std::vector<std::pair<std::string, std::string>> sortedDefines(defineTable.begin(), defineTable.end());
  72.             std::sort(sortedDefines.begin(), sortedDefines.end(), [](const auto& a, const auto& b) {
  73.                 return a.first.length() > b.first.length();
  74.             });
  75.  
  76.             // Ersetze Tokens mit Werten aus der Define-Tabelle
  77.             for (const auto& [key, value] : sortedDefines) {
  78.                 size_t pos = 0;
  79.  
  80.                 while ((pos = strippedLine.find(key, pos)) != std::string::npos) {
  81.                     // Stelle sicher, dass wir uns nicht in einem Lua-Schlüssel oder einer Punkt-Notation befinden
  82.                     size_t dotPos = strippedLine.rfind('.', pos);
  83.                     size_t bracketPos = strippedLine.rfind("[\"", pos);
  84.  
  85.                     if ((dotPos != std::string::npos && dotPos + 1 == pos) ||  // Prüfe auf Punkt-Notation
  86.                         (bracketPos != std::string::npos && pos > bracketPos &&  // Prüfe auf Schlüssel in ["..."]
  87.                          strippedLine.find("\"]", bracketPos) > pos)) {
  88.                         pos += key.length(); // Überspringe diesen Schlüssel
  89.                         continue;
  90.                     }
  91.  
  92.                     // Prüfen, ob der Token vollständig übereinstimmt
  93.                     if ((pos == 0 || !isalnum(strippedLine[pos - 1])) &&  // Kein Buchstabe/Zahl davor
  94.                         (pos + key.length() == strippedLine.length() ||  // Ende der Zeile
  95.                          !isalnum(strippedLine[pos + key.length()]))) {  // Kein Buchstabe/Zahl danach
  96.                         strippedLine.replace(pos, key.length(), value);
  97.                         pos += value.length();
  98.                     } else {
  99.                         pos += key.length();
  100.                     }
  101.                 }
  102.             }
  103.  
  104.             // Nur nicht-leere Zeilen hinzufügen
  105.             if (!strippedLine.empty()) {
  106.                 processedLines.push_back(strippedLine);
  107.             }
  108.         }
  109.  
  110.         inputFile.close();
  111.     } catch (const std::exception& e) {
  112.         std::cerr << "Fehler beim Verarbeiten der Datei: " << filePath << " - " << e.what() << std::endl;
  113.         throw; // Fehler weiterwerfen, um die Kompilierung zu stoppen
  114.     }
  115.  
  116.     return processedLines;
  117. }
Tags: cpp
Advertisement
Add Comment
Please, Sign In to add comment