	

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h> //includes strcmp
    #include <ctype.h> //isspace
     
    typedef enum
    {
        FEW_ARG, WRONG_ARG, MANY_ARG, NO_HLINE, NO_VLINE, WRONG_FILE, NO_SQUARE
    } ERRORS; //indicates a type of an error
     
    typedef enum
    {
        INVALID, VALID
    }MY_BOOL;
     
    typedef struct {
      int rows;
      int cols;
      char *cells;
    } Bitmap;
     
    void Help();
    void Error(ERRORS err);
    void Tisk_bool(MY_BOOL validni);
    char* alloc_Bitmap(int vyska, int sirka, Bitmap* stru);
    void free_Bitmap(Bitmap arr);
    int test(char* soubor, Bitmap* bitmapa);
    void test_bitmap(Bitmap* neco);
    char getcolor(Bitmap *bitmap, int x, int y);
    int find_vline(Bitmap *bitmap, int *x1, int *y1, int *x2, int *y2);
    int find_hline(Bitmap *bitmap, int *x1, int *y1, int *x2, int *y2);
    int find_square(Bitmap *bitmap, int *x1, int *y1, int *x2, int *y2);
     
    int main(int argc, char *argv[])
    {
        Bitmap struktura;
        int x1,x2,y1,y2;
        int found;
        switch (argc)
        {
            case 1: Error(FEW_ARG);
                    break;
            case 2: if (strcmp(argv[1], "--help" ) == 0)
                        Help();
                    else
                        Error(WRONG_ARG);
                    break;
            case 3: if (strcmp(argv[1], "--test" ) == 0)
                    {
                        Tisk_bool(test(argv[2], &struktura)); //zkontroluje a vypíše
                    }
                    else if (strcmp(argv[1], "--hline" ) == 0)
                    {
                        if(test(argv[2], &struktura ) == 1) //soubor obsahuje bitmapu
                        {
                            found = find_hline(&struktura, &x1, &y1, &x2, &y2);
                            if (found == 0)
                            {
                                Error(NO_HLINE);
                            }
                            else
                            {
                                printf("%d %d %d %d\n", x1, y1, x2, y2);
                            }
                        }
                        else
                        {
                            Error(WRONG_FILE);
                        }
                    }
                    else if (strcmp(argv[1], "--vline" ) == 0)
                    {
                        if(test(argv[2], &struktura ) == 1) //soubor obsahuje bitmapu
                        {
                            found = find_vline(&struktura, &x1, &y1, &x2, &y2);
                            if (found == 0)
                            {
                                Error(NO_VLINE);
                            }
                            else
                            {
                                printf("%d %d %d %d\n", x1, y1, x2, y2);
                            }
                        }
                        else
                        {
                            Error(WRONG_FILE);
                        }
                    }
                    else if (strcmp(argv[1], "--square" ) == 0)
                    {
                        if(test(argv[2], &struktura ) == 1) //soubor obsahuje bitmapu
                        {
                            found = find_square(&struktura, &x1, &y1, &x2, &y2);
                            if (found == 0)
                            {
                                Error(NO_SQUARE);
                            }
                            else
                            {
                                printf("%d %d %d %d\n", x1, y1, x2, y2);
                            }
                        }
                        else
                        {
                            Error(WRONG_FILE);
                        }
                    }
                    else
                        Error(WRONG_ARG);
                    break;
            default:
                    Error(MANY_ARG);
                    break;
        }
        free(struktura.cells);
        return 0;
    }
     
    void Help()
    {
         printf("Program: 3rd project for IZP - Searching of shapes\n"
        "Author: Eliska Chalupova (c) 2013\n \n"
        "Control: \n"
        "--help prints how to use the program\n"
        "--test checks if a file contains a bitmap picture or not\n"
        "--hline prints coordinates of the first longest horizontal line segment of a picture\n"
        "--vline prints coordinates of the first longest vertical line segment of a picture\n"
        "--square prints coordinates of the first biggest square of a picture\n");
    }
     
    void Error(ERRORS err)
    {
        switch(err)
        {
            case FEW_ARG:   fprintf(stderr, "You have not written enough arguments. For help use --help\n");
                            break;
            case WRONG_ARG: fprintf(stderr, "You have used wrong arguments. For help use --help\n");
                            break;
            case MANY_ARG:  fprintf(stderr, "You have written too many arguments. For help use --help\n");
                            break;
            case NO_HLINE:  fprintf(stderr, "There is no horizontal line in the file.\n");
                            break;
            case NO_VLINE:  fprintf(stderr, "There is no vertical line in the file.\n");
                            break;
            case NO_SQUARE: fprintf(stderr, "There is no square in the file.\n");
                            break;
            case WRONG_FILE:fprintf(stderr, "The file does not contain a correct bitmap.\n");
                            break;
        }
    }
     
    void Tisk_bool(MY_BOOL validni)
    {
        switch (validni)
        {
            case INVALID:   printf("Invalid\n");
                            break;
            case VALID:     printf("Valid\n");
                            break;
        }
    }
     
    int test(char* soubor, Bitmap* bitmapa)
    {
        FILE* p_file;
        p_file = fopen(soubor,"r");
        if (p_file == NULL)
        {
            return INVALID;
        }
        else //soubor se otevøel
        {
            int RP = 1; //pro switch
            int pocitadlo = 0; //pocitadlo jednicek a nul
            int c_predchozi = 0;
            int radky = 0;
            int sloupce = 0;
            int c = 0;
            Bitmap struktura;
            char* alok_pole = NULL;
            int uz_nealokuj = 0; //aby se krok 3 neopakoval vícekrát
     
            while ((c = fgetc(p_file))!=EOF)
            {
                if(isspace(c)==0) //neni mezera
                {
                    if(isdigit(c)!=0) //je číslo
                    {
                        int c_cislo = c - '0';
                        switch(RP)
                        {
                        case 1: radky = c_predchozi*10 + c_cislo;
                                c_predchozi = c_cislo;
                                //printf("radky: %d", radky); //OK
                                bitmapa->rows = radky;
                                break;
                        case 2: sloupce = c_predchozi*10 + c_cislo;
                                c_predchozi = c_cislo;
                                //printf(" sloupce: %d", sloupce); //OK
                                bitmapa->cols = sloupce;
                                break;
                        case 3: if((c == '1' || c == '0') && pocitadlo <= (radky * sloupce))
                                {
                                    alok_pole[pocitadlo] = c;
                                    pocitadlo++;
                                }
                                else
                                {
                                    if (alok_pole != NULL)
                                    {
                                        free(alok_pole);
                                        alok_pole = NULL;
                                    }
                                    return INVALID;
                                }
                                break;
                        }
                    }
                    else //není èíslo
                    {
                        if (alok_pole != NULL)
                        {
                            free(alok_pole);
                            alok_pole = NULL;
                        }
                        return INVALID;
                    }
                }
                else //je mezera
                {
                    if(radky!=0 && sloupce == 0)
                    {
                        RP = 2;
                        c_predchozi = 0;
                    }
                    if(sloupce!=0 && uz_nealokuj == 0)
                    {
                        alok_pole = alloc_Bitmap(radky, sloupce, &struktura); //nacte radky, sloupce a alokuje pole o urcite velikosti ve strukture
                        uz_nealokuj = 1;
                        RP = 3;
                    }
                }
            }
            if (pocitadlo < (radky*sloupce)) //
            {
                if (alok_pole != NULL)
                {
                    free(alok_pole);
                    alok_pole = NULL;
                }
                return INVALID;
            }
            bitmapa->cells = alok_pole;
        }
        return VALID;
    }
     
    char* alloc_Bitmap(int vyska, int sirka, Bitmap* stru)
    {
        stru->rows = vyska;
        stru->cols = sirka;
        stru->cells = malloc((vyska*sirka)*sizeof(char));
        return stru->cells; //ukazatel
    }
     
    void free_Bitmap(Bitmap stru)
    {
        free(stru.cells);
        stru.cells = NULL; //!!!!!
    }
     
    void test_bitmap(Bitmap* neco)
    {
        for(int i = 0; i < neco->rows*neco->cols; i++)
        {
           printf("%c ",neco->cells[i]);
        }
     
    }
     
    char getcolor(Bitmap *bitmap, int x, int y)
    {
        return bitmap->cells[(((bitmap->cols)*y) + x)];
    }
    int find_vline(Bitmap *bitmap, int *x1, int *y1, int *x2, int *y2)
    {
        *x1 = 1;
        *y1 = 3;
        *x2 = 4;
        *y2 = 9;
        return 0;
    }
    int find_hline(Bitmap *bitmap, int *x1, int *y1, int *x2, int *y2)
    {
        int pocitadlo = 0;
        char predch = '0';
        int nejdelsi = 0;
        int konec = 0;
        char akt;
        for (int j = 0; j < bitmap->rows; j++)
        {
            for(int i = 0; i < bitmap->cols; i++)
            {
                akt = getcolor(bitmap, i, j);
                printf("%d . ", akt);
                //if(akt!='1' || akt!='0'){exit(100);}
     
                if (i == bitmap->cols - 1)
                {
                    konec = 1;
                }
                if (akt == '1')
                {
                    pocitadlo++;
                }
     
                if(akt == '0')
                {
                    pocitadlo = 0;
                }
     
                if ((akt == '0' || konec == 1) && predch == '1' && pocitadlo > nejdelsi)
                {
                    nejdelsi = pocitadlo;
                    pocitadlo = 0;
                    if (nejdelsi >= 2)
                    {
                        *x2 = i;
                        *y2 = j;
                        *x1 = i - nejdelsi;
                        *y1 = j;
                    }
                    else
                    {
                        return 10;
                    }
                }
                predch = akt;
            }
            pocitadlo = 0;
            predch = 0;
            konec = 0;
        }
     
        return 1;
    }
    int find_square(Bitmap *bitmap, int *x1, int *y1, int *x2, int *y2)
    {
        *x1 = 1;
        *y1 = 8;
        *x2 = 4;
        *y2 = 9;
        return 0;
    }

