#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);
}