!===============================================================================
! Programm: umwandle
! Beschreibung: Liest eine UTF-8-kodierte Textdatei ein, wandelt die deutschen
!               Umlaute (ae, oe, ue, Ae, Oe, Ue) und das scharfe S (ss) in ASCII-
!               Entsprechungen um und erhaelt fuehrende Leerzeichen vollstaendig.
!
! Aufruf: umwandle <eingabedatei> <ausgabedatei>
!===============================================================================
program umwandle
    implicit none

    character(len=1024) :: input_filename, output_filename
    integer :: num_args
    integer :: u_in, u_out, ios
    character(len=10000) :: line
    character(len=20000) :: converted_line
    integer :: i, len_line, len_conv
    integer :: total_chars, total_non_ascii, umlaut_count
    integer :: count_ae_lower, count_oe_lower, count_ue_lower
    integer :: count_ae_upper, count_oe_upper, count_ue_upper
    integer :: count_ss, line_nr
    integer :: byte1, byte2

    ! Statistik-Zaehler initialisieren
    total_chars = 0
    total_non_ascii = 0
    umlaut_count = 0
    count_ae_lower = 0
    count_oe_lower = 0
    count_ue_lower = 0
    count_ae_upper = 0
    count_oe_upper = 0
    count_ue_upper = 0
    count_ss = 0
    line_nr = 0

    ! Befehlszeilenargumente pruefen
    num_args = command_argument_count()
    if (num_args /= 2) then
        print "(A)", "Fehler: Ungueltige Anzahl an Argumenten."
        print "(A)", "Aufruf: umwandle <eingabedatei> <ausgabedatei>"
        stop 1
    end if

    call get_command_argument(1, input_filename)
    call get_command_argument(2, output_filename)

    ! Eingabedatei oeffnen
    open(newunit=u_in, file=trim(input_filename), status='old', action='read', &
         form='formatted', access='stream', iostat=ios)
    if (ios /= 0) then
        print "(A, A, A)", "Fehler: Eingabedatei '", trim(input_filename), "' konnte nicht geoeffnet werden."
        stop 1
    end if

    ! Ausgabedatei oeffnen
    open(newunit=u_out, file=trim(output_filename), status='replace', action='write', &
         form='formatted', access='stream', iostat=ios)
    if (ios /= 0) then
        print "(A, A, A)", "Fehler: Ausgabedatei '", trim(output_filename), "' konnte nicht erstellt werden."
        close(u_in)
        stop 1
    end if

    ! Zeile fuer Zeile verarbeiten
    do
        line_nr = line_nr + 1
        read(u_in, "(A)", iostat=ios) line
        if (ios /= 0) exit ! Dateiende oder Fehler

        len_line = len_trim(line)
        converted_line = ""
        len_conv = 0
        i = 1

        do while (i <= len_line)
            byte1 = iachar(line(i:i))

            ! UTF-8 2-Byte Startsequenz fuer deutsche Umlaute (0xC3 / 195)
            if (byte1 == 195 .and. i < len_line) then
                byte2 = iachar(line(i+1:i+1))

                select case (byte2)
                case (164) ! ae (0xC3 0xA4)
                    len_conv = len_conv + 1
                    converted_line(len_conv:len_conv+1) = "ae"
                    len_conv = len_conv + 1
                    count_ae_lower = count_ae_lower + 1
                    umlaut_count = umlaut_count + 1
                    total_non_ascii = total_non_ascii + 1
                    i = i + 2
                case (182) ! oe (0xC3 0xB6)
                    len_conv = len_conv + 1
                    converted_line(len_conv:len_conv+1) = "oe"
                    len_conv = len_conv + 1
                    count_oe_lower = count_oe_lower + 1
                    umlaut_count = umlaut_count + 1
                    total_non_ascii = total_non_ascii + 1
                    i = i + 2
                case (188) ! ue (0xC3 0xBC)
                    len_conv = len_conv + 1
                    converted_line(len_conv:len_conv+1) = "ue"
                    len_conv = len_conv + 1
                    count_ue_lower = count_ue_lower + 1
                    umlaut_count = umlaut_count + 1
                    total_non_ascii = total_non_ascii + 1
                    i = i + 2
                case (132) ! Ae (0xC3 0x84)
                    len_conv = len_conv + 1
                    converted_line(len_conv:len_conv+1) = "Ae"
                    len_conv = len_conv + 1
                    count_ae_upper = count_ae_upper + 1
                    umlaut_count = umlaut_count + 1
                    total_non_ascii = total_non_ascii + 1
                    i = i + 2
                case (150) ! Oe (0xC3 0x96)
                    len_conv = len_conv + 1
                    converted_line(len_conv:len_conv+1) = "Oe"
                    len_conv = len_conv + 1
                    count_oe_upper = count_oe_upper + 1
                    umlaut_count = umlaut_count + 1
                    total_non_ascii = total_non_ascii + 1
                    i = i + 2
                case (156) ! Ue (0xC3 0x9C)
                    len_conv = len_conv + 1
                    converted_line(len_conv:len_conv+1) = "Ue"
                    len_conv = len_conv + 1
                    count_ue_upper = count_ue_upper + 1
                    umlaut_count = umlaut_count + 1
                    total_non_ascii = total_non_ascii + 1
                    i = i + 2
                case (159) ! ss (0xC3 0x9F)
                    len_conv = len_conv + 1
                    converted_line(len_conv:len_conv+1) = "ss"
                    len_conv = len_conv + 1
                    count_ss = count_ss + 1
                    umlaut_count = umlaut_count + 1
                    total_non_ascii = total_non_ascii + 1
                    i = i + 2
                case default
                    ! Anderes UTF-8 Zeichen mit Startbyte 0xC3
                    len_conv = len_conv + 1
                    converted_line(len_conv:len_conv) = line(i:i)
                    total_non_ascii = total_non_ascii + 1
                    print "(A, I10)", " non_ascii in Zeile Nr:  ", line_nr
                    i = i + 1
                end select

                total_chars = total_chars + 1

            else
                ! Pruefen auf sonstige Nicht-ASCII-Zeichen (Byte-Wert >= 128)
                if (byte1 >= 128) then
                    if (byte1 < 128 .or. byte1 > 191) then
                        total_non_ascii = total_non_ascii + 1
                        print "(A, I10)", " non_ascii in Zeile Nr:  ", line_nr
                        total_chars = total_chars + 1
                    end if
                else
                    total_chars = total_chars + 1
                end if

                len_conv = len_conv + 1
                converted_line(len_conv:len_conv) = line(i:i)
                i = i + 1
            end if
        end do

        ! Konvertierte Zeile exakt von Index 1 bis len_conv schreiben
        if (len_conv > 0) then
            write(u_out, "(A)") converted_line(1:len_conv)
        else
            write(u_out, "(A)") ""
        end if
    end do

    close(u_in)
    close(u_out)

    ! Statistik ausgeben
    print "(A)", "=================================================="
    print "(A)", "            STATISTIK DER UMWANDLUNG              "
    print "(A)", "=================================================="
    print "(A, I10)", " Gesamtzahl der Zeichen (Eingabe):  ", total_chars
    print "(A, I10)", " Anzahl Nicht-ASCII Zeichen:        ", total_non_ascii
    print "(A, I10)", " Anzahl umgewandelter Umlaute/ss:   ", umlaut_count
    print "(A)", "--------------------------------------------------"
    print "(A)", " Detailansicht umgewandelte Zeichen:"
    print "(A, I8)", "   'ae' (aus ae): ", count_ae_lower
    print "(A, I8)", "   'oe' (aus oe): ", count_oe_lower
    print "(A, I8)", "   'ue' (aus ue): ", count_ue_lower
    print "(A, I8)", "   'Ae' (aus Ae): ", count_ae_upper
    print "(A, I8)", "   'Oe' (aus Oe): ", count_oe_upper
    print "(A, I8)", "   'Ue' (aus Ue): ", count_ue_upper
    print "(A, I8)", "   'ss' (aus ss): ", count_ss
    if (total_non_ascii - umlaut_count > 0) then
        print "(A, I8)", "   Andere Nicht-ASCII Zeichen: ", total_non_ascii - umlaut_count
    end if
    print "(A)", "=================================================="
    print "(A, A, A)", "Datei erfolgreich umgewandelt und in '", trim(output_filename), "' gespeichert."

end program umwandle
