#include <stdio.h>
#include <stdlib.h>

void vypis_pole(int pole[], int dlzka) {
    int i = 0;
    for(; i < dlzka; i++) {
        printf("%d ", pole[i]);
    }
    printf("\n");
}

/**
 * Funkcia vrati z pola <pole> zadanej dlzky <dlzka_pola>
 * pointer na nove pole, ktore obsahuje len kladne prvky.
 * Dlzka vrateneho pola sa odozvda vo vstupno-vystupnom parametri
 * <dlzka_noveho_pola>.
 *
 * Dovodom je to, ze nevieme naraz vratit aj pole, aj jeho dlzku,
 * preto hackneme jeden z parametrov tak, aby plnil ulohu
 * ,,druhej navratovej hodnoty".
 */
int * len_kladne(int pole[], int dlzka_pola, int * dlzka_noveho_pola) {
    int i;
    int j = 0;
    int pocet_kladnych = 0;
    int * len_kladne;

    for(i = 0; i < dlzka_pola; i++) {
        if(pole[i] > 0) {
            pocet_kladnych++;
        }
    }

    len_kladne = calloc(pocet_kladnych, sizeof(int));
    /**
     * Kedze dlzka_noveho_pola je pointer (= adresa),
     * pouzime dereferenciu na ulozenie novej hodnoty.
     */
    (*dlzka_noveho_pola) = pocet_kladnych;

    for(i = 0; i < dlzka_pola; i++) {
        if(pole[i] > 0) {
            len_kladne[j] = pole[i];
            j++;
        }
    }
    return len_kladne;
}

int main(int argc, char** argv) {
    FILE * subor;
    int pocet_prvkov = 0;
    int * pole = NULL;
    int * kladne;
    int cislo;
    int index;
    int pocet_prvkov_noveho_pola;

    subor = fopen("cisla.txt", "r");
    if(subor == NULL) {
        printf("Subor sa nepodarilo otvorit.");
        return EXIT_FAILURE;
    }

    fscanf(subor, "%d", &pocet_prvkov);
    pole = calloc(pocet_prvkov, sizeof(int));
    if(pole == NULL) {
        printf("Nedostatok pamate pre pole.");
        return EXIT_FAILURE;
    }

    while(!feof(subor)) {
        for(index = 0; index < pocet_prvkov; index++) {
            fscanf(subor, "%d", &cislo);
            pole[index] = cislo;
        }
        /* premenna <kladne> bude ukazovat na pamat, ktoru
         * alokovala funkcia len_kladne, cize my sme
         * zodpovedny za dealokaciu.
         */
        kladne = len_kladne(pole, pocet_prvkov, &pocet_prvkov_noveho_pola);
        vypis_pole(kladne, pocet_prvkov_noveho_pola);

        /* Pole sme vypisali, mozeme ho dealokovat. */
        free(kladne);
        /* nastavime pointer na NULL, aby bolo jasne, ze nikam neukazuje */
        kladne = NULL;
    }


    free(pole);
    fclose(subor);

    return (EXIT_SUCCESS);
}

