/media/sda-magnetic/david/Extern-Magnetic-2022-06-29/Extern01/Dokumente-2020-11-16/disk10-ab-2020-01-10/02-debian-pc2-work/informatik/pascal-compiler/sqrparse-2020-02-22/squarecompiler03.c


#include <stdio.h>

#define LEX_NO_ERR                       0
#define LEX_ERR_BAD_CHAR                -2
#define LEX_ERR_WRONG_PARAMETER         -3
#define LEX_ERR_BAD_TOKEN               -4

#define WIDTH 6
#define HEIGHT 6

int lexer_width = 0;
int lexer_height = 0;

char bmp[HEIGHT][WIDTH] = {\
           ' ', ' ', ' ', ' ', ' ', ' ',\
           ' ', '#', '#', '#', '#', ' ',\
           ' ', '#', ' ', ' ', '#', ' ',\
           ' ', '#', ' ', ' ', '#', ' ',\
           ' ', '#', '#', '#', '#', ' ',\
           ' ', ' ', ' ', ' ', ' ', ' '};
    

int lexer(int a_limit_width, int a_limit_height, int b_limit_width, int b_limit_height, int c_limit_width, int c_limit_height, int d_limit_width, int d_limit_height, int *a_width, int *a_height, int *b_width, int *b_height, int *c_width, int *c_height, int *d_width, int *d_height);

int lexer(int a_limit_width, int a_limit_height, int b_limit_width, int b_limit_height, int c_limit_width, int c_limit_height, int d_limit_width, int d_limit_height, int *a_width, int *a_height, int *b_width, int *b_height, int *c_width, int *c_height, int *d_width, int *d_height) {
    int i, j;
    int k, l;
    
    for (i = a_limit_height;  i < d_limit_height;  i++) {
        for(j = a_limit_width;  j < b_limit_width;  j++) {
            if ((bmp[i][j] != ' ') && (bmp[i][j] != '#'))
                return LEX_ERR_BAD_CHAR;
            if (bmp[i][j] == '#')
                break;
        }
        if(bmp[i][j] == '#')
            break;  
    }
    
    *a_height = i;
    *a_width = j;
    
    if (a_limit_height != b_limit_height)
        return LEX_ERR_WRONG_PARAMETER;
    if (b_limit_width <= a_limit_width)
        return LEX_ERR_WRONG_PARAMETER;
    
    for(k = *a_height,  l = *a_width;  l < b_limit_width;   l++) {
        if ((bmp[k][l] != ' ') && (bmp[k][l] != '#'))
            return LEX_ERR_BAD_CHAR;
        if (((k - 1) >= 0) && (l > (*a_width)) && (bmp[k][l+1] != ' ')) {
            if (bmp[k-1][l] == '#')
                return LEX_ERR_BAD_TOKEN;
            if (bmp[k-1][l] != ' ')
                return LEX_ERR_BAD_CHAR;
        }
        if (((k + 1) < (HEIGHT - 1))  && (l > (*a_width)) && (bmp[k][l+1] != ' ')) {
            if (bmp[k+1][l] == '#')
                return LEX_ERR_BAD_TOKEN;
            if (bmp[k+1][l] != ' ')
                return LEX_ERR_BAD_CHAR;
        }
        if (bmp[k][l+1] == ' ')
            break;
    }
    
    *b_height = k;
    *b_width = l;
    
    if (c_limit_width != b_limit_width)
        return LEX_ERR_WRONG_PARAMETER;
    if (c_limit_height <= b_limit_height)
        return LEX_ERR_WRONG_PARAMETER;
    
    for(k = *b_height,  l = *b_width;  k < c_limit_height;   k++) {
        if ((bmp[k][l] != ' ') && (bmp[k][l] != '#'))
            return LEX_ERR_BAD_CHAR;
        if (((l - 1) >= 0) && (k > (*b_height)) && (bmp[k+1][l] != ' ')) {
            if (bmp[k][l-1] == '#')
                return LEX_ERR_BAD_TOKEN;
            if (bmp[k][l-1] != ' ')
                return LEX_ERR_BAD_CHAR;
        }
        if (((l + 1) < (WIDTH - 1))  && (k > (*b_height)) && (bmp[k+1][l] != ' ')) {
            if (bmp[k][l+1] == '#')
                return LEX_ERR_BAD_TOKEN;
            if (bmp[k][l+1] != ' ')
                return LEX_ERR_BAD_CHAR;
        }
        if (bmp[k+1][l] == ' ')
            break;
    }

    *c_height = k;
    *c_width = l;


    if (d_limit_height != c_limit_height)
        return LEX_ERR_WRONG_PARAMETER;
    if (d_limit_width >= c_limit_width)
        return LEX_ERR_WRONG_PARAMETER;
    
    for(k = *c_height,  l = *c_width;  l >= d_limit_width;   l--) {
        if ((bmp[k][l] != ' ') && (bmp[k][l] != '#'))
            return LEX_ERR_BAD_CHAR;
        if (((k - 1) >= 0) && (l > (*d_width)) && (bmp[k][l-1] != ' ')) {
            if (bmp[k-1][l] == '#')
                return LEX_ERR_BAD_TOKEN;
            if (bmp[k-1][l] != ' ')
                return LEX_ERR_BAD_CHAR;
        }
        if (((k - 1) >= 0)  && (l > (*d_width)) && (bmp[k][l-1] != ' ')) {
            if (bmp[k+1][l] == '#')
                return LEX_ERR_BAD_TOKEN;
            if (bmp[k+1][l] != ' ')
                return LEX_ERR_BAD_CHAR;
        }
        if (bmp[k][l-1] == ' ')
            break;
    }

    
    *d_height = k;
    *d_width = l;

    
    if (a_limit_width != d_limit_width)
        return LEX_ERR_WRONG_PARAMETER;
    if (d_limit_height <= a_limit_height)
        return LEX_ERR_WRONG_PARAMETER;
    
    for(k = *d_height,  l = *d_width;  k >= a_limit_height;   k--) {
        if ((bmp[k][l] != ' ') && (bmp[k][l] != '#'))
            return LEX_ERR_BAD_CHAR;
        
        /* Bitte ergaenzen */
        
        if (bmp[k-1][l] == ' ')
            break;
    }

return LEX_NO_ERR;
}

void test_init(void) {
    int i, j;
    
    /*for(i = 0;  i < HEIGHT;  i++)
        for(j = 0;  j < WIDTH;  j++)
            bmp[i][j] = ' ';
        
    bmp[28][28] = '#';*/
    
    
return;
}

int main(void) {    
    int a_width, a_height;
    int b_width, b_height;
    int c_width, c_height;
    int d_width, d_height;
    test_init();
    lexer(0, 0, WIDTH, 0, WIDTH, HEIGHT, 0, HEIGHT, &a_width, &a_height, &b_width, &b_height, &c_width, &c_height, &d_width, &d_height);
    
    printf("a: %i %i\n", a_height, a_width);
    printf("b: %i %i\n", b_height, b_width);
    printf("c: %i %i\n", c_height, c_width);
    printf("d: %i %i\n", d_height, d_width);
}