#include <print>
#include <fstream>
#include <string>

using namespace std::string_literals; // Suffix s fuer string einblenden

// Ein- und Ausgabedatei
const auto IFILE = "../../04_Data/gcc.mak"s;
const auto OFILE = "../../04_Data/conv.mak"s;

// main() Funktion
int main()
{
    // string Objekt in dem der gesamte von Kommentaren und Leerzeilen
    // befreite Dateiinhalt von IFILE abgelegt wird
    std::string resString;

    // Eingabedatei öffnen
    std::ifstream inFile(IFILE);
    if (!inFile)
    {
        std::println("Fehler beim Oeffnen der Datei {}", IFILE);
        exit(1);
    }

    // Datei komplett durchlaufen
    do
    {
        // string Objekt für einzelne Zeile aus der Datei
        std::string line;
        // Komplette Zeile einlesen
        // und falls noch nicht Dateiende erreicht
        if (std::getline(inFile, line); !inFile.eof())
        {
            // Wenn Zeile nicht Leerzeile und nicht Kommentarzeile
            // ACHTUNG! Die Reihenfolge der Bedingung ist hier relevant.
            // Nur wenn keine Leerzeile eingelesen wurde kann auf
            // Kommentarzeile verglichen werden.
            if ((line.size() != 0) && (line[0] != '#'))
            {
                // Zeile zum neuen Dateiinhalt hinzufügen
                resString += line;
                // Zeilenvorschub nicht vergessen!
                resString += '\n';
            }
        }
    } while (!inFile.eof());
    // Eingabedatei schliessen
    inFile.close();

    // Jetzt alles in Grossbuchstaben wandeln
    for (auto& zeichen : resString)
        zeichen = std::toupper(zeichen);

    // Ausgabedatei öffnen
    std::ofstream outFile(OFILE);
    if (!outFile)
    {
        std::println("Fehler beim Oeffnen der Datei {}", OFILE);
        exit(1);
    }
    // Neuen Dateiinhalt in Datei übertragen
    outFile << resString;
    // Ausgabedatei schliessen
    outFile.close();
    std::println("Konvertierung abgeschlossen!");
}
