#include 
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define DELKA_RADKU 128
#define DELKA_JMENA 12

/**
 *  Funkce ze znakoveho retezce odstrani pravostranne "bile" znaky
 *
 *  @param[in, out]   d  znakovy retezec - i. e. ukazatel na zacatek pameti, kde je ulozen
 *  @return  hodnotu NULL, pokud je parametr d NULL; jinak ukazatel na zadany znakovy retezec
 */
char *oriznoutVpravo(char *d);

void excerptName(char *jmeno, char *fiNa);
/**
 *  Funkce ze znakoveho retezce odstrani pravostranne "bile" znaky
 *
 *  @param[in, out]   jmeno  znakovy retezec - i. e. ukazatel na zacatek pameti, kam se ulozi prefix po znak '_' z fiNa
 *  @param[in]   fiNa  znakovy retezec - i. e. ukazatel na zacatek pameti, kde je ulozen nazev souboru
 */

/**
 *  Funkce ze znakoveho retezce odstrani pravostranne "bile" znaky
 *
 *  @param[in]   fileName  nazev  vstupniho souboru
 *  @param[in]   d  znakovy retezec - i. e. ukazatel na zacatek pameti, kde je ulozen
 *  @param[in]   neZacatek  0, pokud je zacatek - neodradkuje se na zacatku vystupniho souboru; 
 *                          nenula => odradkuje se pred jmenem osoby  
 *  @return   EXIT_FAILURE, pokud se neotevrel nektery vstupni (textovy) soubor; jinak EXIT_SUCCESS
 */
int osobaAJejiText(char *fileName, int neZacatek, FILE *output);

int main()
{
    FILE *vystup;
    int rtn;
    char nazevVystupnihoSouboru[DELKA_RADKU], nazevVstupnihoSouboru[DELKA_RADKU];
    
    printf("Zadejte jmeno primarniho vstupniho textoveho souboru: ");
    fgets(nazevVstupnihoSouboru, DELKA_RADKU, stdin);
    oriznoutVpravo(nazevVstupnihoSouboru);
    printf("        Zadejte jmeno vystupniho  textoveho  souboru: ");
    fgets(nazevVystupnihoSouboru, DELKA_RADKU, stdin);
    oriznoutVpravo(nazevVystupnihoSouboru);
    if (!(vystup = fopen(nazevVystupnihoSouboru, "w"))) {
        printf("Nepodarilo se otevrit vystupni soubor \"%s\".\n", nazevVystupnihoSouboru);
        return EXIT_FAILURE;
    } 
    rtn = osobaAJejiText(nazevVstupnihoSouboru, 0, vystup);
    fclose(vystup);    
    return rtn;
}

char *oriznoutVpravo(char *d) 
{
    char *p;

    if (d) {
        p = d + strlen(d) - 1;
        while (isspace(*p)) {
            --p;
        }
        *(p + 1) = '\0';
    }
    return p;
}

void excerptName(char *jmeno, char *fiNa)
{
    char *p;
    
    p = strchr(fiNa, '_');
    strncpy(jmeno, fiNa, p - fiNa);
    *(jmeno + (p - fiNa)) = '\0';
}

int osobaAJejiText(char *fileName, int neZacatek, FILE *output)
{
    char osoba[DELKA_JMENA], radek[DELKA_RADKU];
    FILE *vstup;
    int osobaPoprve, rtn;
    
    excerptName(osoba, fileName);
    if ((vstup = fopen(fileName, "r"))) {
        rtn = EXIT_SUCCESS;
    } else {
        printf("Nepodarilo se otevrit vstupni soubor \"%s\".\n", fileName);
        return EXIT_FAILURE;
    }
    osobaPoprve = 1;
    while (fgets(radek, DELKA_RADKU, vstup)) {
        if ((*radek == '>') && (*(radek + 1) == '>') && (*(radek + 2) == ' ')) {
            oriznoutVpravo(radek + 3); 
            rtn = osobaAJejiText(radek + 3, 1, output);
            osobaPoprve = 1;
        } else {
            if (osobaPoprve) { 
                if (neZacatek) {
                    fputc('\n', output); 
                    fputc('\n', output); 
                } else {
                    neZacatek = 1;
                } 
                fputs(osoba, output);                
                fputc('\n', output); 
                fputc('\n', output);
                osobaPoprve = 0;
            }
            fputs(radek, output);
        }
    }
    fclose(vstup);
    return rtn;
}