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

#define NEVHOSSZ 51
#define RENDSZAMHOSSZ 8         //a "-" jel miatt 8

struct utvonal_sofor{
        char vez_nev[NEVHOSSZ];
        char ker_nev[NEVHOSSZ];
};

struct utvonal_jarmu{
        char tipus[NEVHOSSZ];
        char rendszam[RENDSZAMHOSSZ];
};

struct indulo_allomas{
        char telepules[NEVHOSSZ];
        char kozterulet[NEVHOSSZ];
        char hazszam[NEVHOSSZ];
};

struct cel_allomas{
        char telepules[NEVHOSSZ];
        char kozterulet[NEVHOSSZ];
        char hazszam[NEVHOSSZ];
};

struct utvonal_allomas{
        struct indulo_allomas indulo;
        struct cel_allomas cel;
};

struct utvonalengedely{
        struct utvonal_sofor sofor;
        struct utvonal_jarmu jarmu;
        struct utvonal_allomas allomas;
};

void readline(char* buf, int len) {
        while(1)
        {
                int got;
                int c;
                char* res = fgets(buf, len, stdin);
                if (res == NULL) {
                        puts("EOF");
                        exit(1);
                }
                got = strlen(res);
                /* fgets beteszi a sorveget, vagjuk le ha megvan */
                if (res[got - 1] == '\n') {
                        res[got - 1] = 0;
                        return;
                }
                c = fgetc(stdin);
                if (c == EOF) {
                        puts("EOF");
                        exit(1);
                }
                if (c == '\n') {
                        /* a pufferben a teljes sor elfert csak a sorveg maradt le, kesz vagyunk */
                        return;
                }
                printf("Tul hosszu! Maximum %d betut irjon be!\n", len - 1);
                /* olvassuk be a pufferbol a sor maradekat */
                do {
                        c = fgetc(stdin);
                } while (c != EOF && c != '\n');
        }
}

struct utvonal_sofor Beker_Sofor(){
        struct utvonal_sofor l_nev;
        printf("Vezeteknev:\n");
        readline(l_nev.vez_nev, NEVHOSSZ);
        printf("Keresztnev:\n");
        readline(l_nev.ker_nev, NEVHOSSZ);
        return l_nev;
}

struct utvonal_jarmu Beker_Jarmu(){
        struct utvonal_jarmu l_jarmu;
        printf("a Gepkocsi tipusa:\n");
        readline(l_jarmu.tipus, NEVHOSSZ);
        printf("rendszama:\n");
        readline(l_jarmu.rendszam, RENDSZAMHOSSZ);
        return l_jarmu;
}

struct indulo_allomas Beker_Indulo(){
        struct indulo_allomas l_indulo;
        printf("Telepules neve:\n");
        readline(l_indulo.telepules, NEVHOSSZ);
        printf("Kozterulet neve:\n");
        readline(l_indulo.kozterulet, NEVHOSSZ);
        printf("Hazszam:\n");
        readline(l_indulo.hazszam, NEVHOSSZ);
        return l_indulo;
}

struct cel_allomas Beker_Cel(){
        struct cel_allomas l_cel;
        printf("Telepules neve:\n");
        readline(l_cel.telepules, NEVHOSSZ);
        printf("Kozterulet neve:\n");
        readline(l_cel.kozterulet, NEVHOSSZ);
        printf("Hazszam:\n");
        readline(l_cel.hazszam, NEVHOSSZ);
        return l_cel;
}

struct utvonal_allomas Beker_Allomas(){
        struct utvonal_allomas l_allomas;
        l_allomas.indulo = Beker_Indulo();
        l_allomas.cel = Beker_Cel();
        return l_allomas;
}

struct utvonalengedely Beker_utvonalengedely(){
        struct utvonalengedely l_utvonalengedely;
        printf("Kerem a sofor nevet:\n");
        l_utvonalengedely.sofor = Beker_Sofor();
        printf("Kerem a gepjarmu adatait:\n");
        l_utvonalengedely.jarmu = Beker_Jarmu();
        printf("Kerem az allomasadatokat:\n");
        l_utvonalengedely.allomas = Beker_Allomas();
        return l_utvonalengedely;
}

void Kiir_Sofor(struct utvonal_sofor p_nev){
        printf("%s %s\n\n", p_nev.vez_nev, p_nev.ker_nev);
}

void Kiir_Jarmu(struct utvonal_jarmu p_jarmu){
        printf("%s %s\n\n", p_jarmu.tipus, p_jarmu.rendszam);
}

void Kiir_Indulo(struct indulo_allomas p_indulo){
        printf("%s, %s %s.\n\n", p_indulo.telepules, p_indulo.kozterulet, p_indulo.hazszam);
}

void Kiir_Cel(struct cel_allomas p_cel){
        printf("%s, %s %s.\n\n", p_cel.telepules, p_cel.kozterulet, p_cel.hazszam);
}

void Kiir_Allomas(struct utvonal_allomas p_allomas){
        printf("Indito allomas:\n");
        Kiir_Indulo(p_allomas.indulo);
        printf("Celallomas:\n");
        Kiir_Cel(p_allomas.cel);
}

void Kiir_Utvonalengedely(struct utvonalengedely p_utvonalengedely){
        printf("\nAz utvonalengedely a kovetkezo:\n\n");
        printf("Sofor neve:\n");
        Kiir_Sofor(p_utvonalengedely.sofor);
        printf("Jarmu adatai:\n");
        Kiir_Jarmu(p_utvonalengedely.jarmu);
        Kiir_Allomas(p_utvonalengedely.allomas);
}

int main(){
        struct utvonalengedely u;
        u=Beker_utvonalengedely();
        Kiir_Utvonalengedely(u);
        return 0;
}
