Skip to content
Extraits de code Groupes Projets
Valider 67b2b204 rédigé par Anteunis Charles's avatar Anteunis Charles
Parcourir les fichiers

fin des switch curseur et direction

parent b5a26df2
Branches
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
#include "interpreteur.h" #include "interpreteur.h"
int troncate(int n) {
if (n<0)
return 0;
else if (n>255)
return 255;
else
return n;
}
void interpreteur(char **matrix, int height, int width) { void interpreteur(char **matrix, int height, int width) {
curseur cur; curseur cur;
int i, j; int i, j, a, b;
list pile = empty(); list pile = empty();
char tmp; char tmp;
time_t t;
int string_mode = 0;
int bridge = 0;
char *endptr;
/* initialise le module random */
srand((unsigned) time(&t));
cur.x = 0; cur.x = 0;
cur.y = 0; cur.y = 0;
...@@ -15,20 +31,214 @@ void interpreteur(char **matrix, int height, int width) { ...@@ -15,20 +31,214 @@ void interpreteur(char **matrix, int height, int width) {
/* Action en fonction du caractère lu */ /* Action en fonction du caractère lu */
switch (cur.current_char) switch (cur.current_char)
{ {
case 48 ... 57: /* Si on est sur un pont, on ne lit pas l'instruction et on avance sur le pont */
/* si on lit un entier */ if (bridge)
push(cur.current_char - 48, &pile); {
bridge--;
break;
}
/* Si on est en mode chaine de caractere on empile ce qu'on lit */
if (string_mode) {
push(cur.current_char, &pile);
break;
}
case '+':
a = pop(&pile);
b = pop(&pile);
push(a+b, &pile);
break;
case '-':
a = pop(&pile);
b = pop(&pile);
push(b-a, &pile);
break;
case '*':
a = pop(&pile);
b = pop(&pile);
push(a*b, &pile);
break;
case ':':
a = pop(&pile);
if (a == 0)
push(42, &pile);
else
{
b = pop(&pile);
push(b/a, &pile);
}
break;
case '%':
a = pop(&pile);
if (a == 0)
push(0xbadc0de, &pile);
else
{
b = pop(&pile);
push(b%a, &pile);
}
break;
case '!':
a = pop(&pile);
push( a == 0 ? 1 : 0, &pile);
break;
case '`':
a = pop(&pile);
b = pop(&pile);
push( b>a ? 1 : 0, &pile);
break; break;
case '>': case '>':
cur.current_dir = E;
break;
case '<':
cur.current_dir = W; cur.current_dir = W;
break; break;
case 'v':
cur.current_dir = S;
break;
case '^':
cur.current_dir = N;
break;
case '?':
a = rand() % 8;
cur.current_dir = (direction) a;
break;
case '\'':
a = pop(&pile);
cur.current_dir = (direction) a%8;
break;
case ']':
cur.current_dir = (direction) cur.current_dir - 1 < 0 ? 7 : cur.current_dir - 1;
break;
case '[':
cur.current_dir = (direction) (cur.current_dir + 1)%8;
break;
case '_':
a = pop(&pile);
cur.current_dir = a == 0 ? E : W;
break;
case '|':
a = pop(&pile);
cur.current_dir = a == 0 ? S : N;
break;
case '/':
a = pop(&pile);
cur.current_dir = a == 0 ? NE : SW;
break;
case '\\':
a = pop(&pile);
cur.current_dir = a == 0 ? SE : NW;
break;
case '"':
string_mode = 1 - string_mode;
break;
case '=':
if (is_empty(pile)) {
push(0, &pile);
push(0, &pile);
}
else
{
a = pop(&pile);
push(a, &pile);
push(a, &pile);
}
break;
case '$':
a = pop(&pile);
b = pop(&pile);
push(a, &pile);
push(b, &pile);
break;
case ';':
pop(&pile);
break;
case '.':
a = pop(&pile);
printf("%i", a);
break;
case ',': case ',':
if (is_empty(pile)) a = pop(&pile);
tmp = '0'; printf("%c", a);
break;
case '#':
a = pop(&pile);
bridge = a;
break;
case 'g':
a = pop(&pile);
b = pop(&pile);
if (a<0 || b<0 || a>=height || b>=width)
push(0, &pile);
else else
tmp = pop(&pile) + 48; push(matrix[a][b], &pile);
break;
case 'p':
a = pop(&pile);
b = pop(&pile);
int z = pop(&pile);
if (a>=0 && b>=0 && a<height && b<width)
matrix[a][b] = troncate(z);
break;
case '&':
char buf[256];
printf("Veuillez entrer un entier\n");
fgets(buf, 256, stdin);
a = strtol(buf, NULL, 10);
while (buf == endptr)
{
printf("Erreur, veuillez saisir un nombre\n");
fgets(buf, 256, stdin);
a = strtol(buf, endptr, 10);
}
break;
case '~':
printf("Veuillez entrer un caratere\n");
tmp = fgetchar();
push(tmp, &pile);
break;
case 48 ... 57:
/* si on lit un entier */
push(cur.current_char - 48, &pile);
break;
case '@':
printf("Erreur: lecture @ sans fin de programme\n");
exit(1);
break;
case ' ':
break; break;
default: default:
...@@ -39,18 +249,55 @@ void interpreteur(char **matrix, int height, int width) { ...@@ -39,18 +249,55 @@ void interpreteur(char **matrix, int height, int width) {
switch (cur.current_dir) switch (cur.current_dir)
{ {
case N: case N:
cur.x = cur.x - 1; cur.y = cur.y == 0 ? height-1 : cur.y - 1;
/* Gérer les cas si on est au bord de la matrice */ break;
cur.current_char = matrix[cur.y][cur.x];
case NE:
cur.x = cur.x == width-1 ? 0 : cur.x + 1;
cur.y = cur.y == 0 ? height-1 : cur.y - 1;
break;
case E:
cur.x = cur.x == width-1 ? 0 : cur.x + 1;
break;
case SE:
cur.x = cur.x == width-1 ? 0 : cur.x + 1;
cur.y = cur.y == height-1 ? 0 : cur.y + 1;
break;
case S:
cur.y = cur.y == height-1 ? 0 : cur.y + 1;
break;
case SW:
cur.y = cur.y == height-1 ? 0 : cur.y + 1;
cur.x = cur.x == 0 ? width-1 : cur.x - 1;
break;
case W:
cur.x = cur.x == 0 ? width-1 : cur.x - 1;
break; break;
case NW: case NW:
cur.x = cur.x - 1; cur.x = cur.x == 0 ? width-1 : cur.x - 1;
cur.y = cur.y + 1; cur.y = cur.y == 0 ? height-1 : cur.y - 1;
break; break;
default: default:
printf("Erreur de direction: %i\n", cur.current_dir);
exit(1);
break; break;
} }
cur.current_char = matrix[cur.y][cur.x];
}
printf("Contenu de la pile :\n");
while (!is_empty(pile))
{
printf("%i, ", pop(&pile));
} }
printf("Fin de l'interpreteur\n");
} }
\ No newline at end of file
...@@ -2,9 +2,11 @@ ...@@ -2,9 +2,11 @@
#define INTERPRETEUR_H #define INTERPRETEUR_H
#include "list.h" #include "list.h"
#include <time.h>
/* type des directions pour qu'elles correspondent au cas ' */
typedef enum direction { typedef enum direction {
N, S, E, W, NE, NW, SE, SW N, NE, E, SE, S, SW, W, NW
} direction; } direction;
typedef struct curseur { typedef struct curseur {
...@@ -14,6 +16,8 @@ typedef struct curseur { ...@@ -14,6 +16,8 @@ typedef struct curseur {
direction current_dir; direction current_dir;
} curseur; } curseur;
int troncate(int n);
void interpreteur(char **matrix, int height, int width); void interpreteur(char **matrix, int height, int width);
#endif #endif
\ No newline at end of file
...@@ -29,7 +29,6 @@ int main(int argc, char const *argv[]) ...@@ -29,7 +29,6 @@ int main(int argc, char const *argv[])
width = 10*width + strtol(&c, NULL, 10); width = 10*width + strtol(&c, NULL, 10);
fread(&c, sizeof(char), 1, f); fread(&c, sizeof(char), 1, f);
} }
width = width/10;
/* on récupère le nombre de lignes du fichier */ /* on récupère le nombre de lignes du fichier */
fread(&c, sizeof(char), 1, f); fread(&c, sizeof(char), 1, f);
...@@ -37,7 +36,6 @@ int main(int argc, char const *argv[]) ...@@ -37,7 +36,6 @@ int main(int argc, char const *argv[])
height = 10*height + strtol(&c, NULL, 10); height = 10*height + strtol(&c, NULL, 10);
fread(&c, sizeof(char), 1, f); fread(&c, sizeof(char), 1, f);
} }
height = height/10;
/* initialisation de la matrice */ /* initialisation de la matrice */
matrix = (char **) malloc(height*sizeof(char *)); matrix = (char **) malloc(height*sizeof(char *));
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter