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

debogueur avec preobleme de restart

parent 5f462297
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
CC=gcc -Wall -Wextra -ansi CC=gcc -Wall -Wextra -ansi
TARGET=prog2d TARGETS=interpreteur debogueur
OBJ=interpreteur.o list.o OBJ=interpreteur.o list.o debogueur.o
all: $(TARGET) all: $(TARGETS)
$(TARGET): $(OBJ) interpreteur : main.c list.o interpreteur.o
$(CC) main.c $^ -o $(TARGET) $(CC) $^ -o $@
debogueur : main.c list.o debogueur.o
$(CC) $^ -o $@
%.o: %.c %.h %.o: %.c %.h
$(CC) -c $< $(CC) -c $<
interpreteur.o: interpreteur.c interpreteur.h list.h interpreteur.o: interpreteur.c common.h list.h
$(CC) -c $<
debogueur.o: debogueur.c common.h list.h
$(CC) -c $< $(CC) -c $<
clean: clean:
rm $(OBJ) $(TARGET) rm $(OBJ) $(TARGETS)
re: clean all re: clean all
\ No newline at end of file
...@@ -9,7 +9,9 @@ gcc main.c list.c interpreteur.c ...@@ -9,7 +9,9 @@ gcc main.c list.c interpreteur.c
## Pour utiliser le Makefile : ## Pour utiliser le Makefile :
- `make` pour générer l'exécutable `prog2d` - `make` pour générer les exécutables `interpreteur` et `debogueur`
- `./prog2d fichier` pour exécuter le programme avec un fichier particulier - `./interpreteur fichier` ou `./debogueur fichier` pour exécuter le programme avec un fichier particulier
- `make clean` pour nettoyer l'espace - `make clean` pour nettoyer l'espace
- `make re` pour nettoyer et re compiler - `make re` pour nettoyer et re compiler
> Si vous compilez sous windows, il peut y avoir des bugs, enlevez `width/10` et `height/10` dans le main.
\ No newline at end of file
#ifndef INTERPRETEUR_H #ifndef COMMON_H
#define INTERPRETEUR_H #define COMMON_H
#include "list.h" #include <stdio.h>
#include <stdlib.h>
#include <time.h> #include <time.h>
#include <string.h>
#include "list.h"
/* type des directions pour qu'elles correspondent au cas ' */ /* type des directions pour qu'elles correspondent au cas ' */
typedef enum direction { typedef enum direction {
...@@ -18,6 +21,10 @@ typedef struct curseur { ...@@ -18,6 +21,10 @@ typedef struct curseur {
int troncate(int n); int troncate(int n);
void affichage(char **matrix, int height, int width, list l, int x, int y);
void copy_matrix(char **src, char **dest, int height, int width);
void interpreteur(char **matrix, int height, int width); void interpreteur(char **matrix, int height, int width);
#endif #endif
\ No newline at end of file
#include "common.h"
/**
* \brief tronque un entier entre 0 et 255
*/
int troncate(int n) {
if (n<0)
return 0;
else if (n>255)
return 255;
else
return n;
}
/**
* \brief affiche la grille avec la position courante du curseur
*/
void affichage(char **matrix, int height, int width, list l, int x, int y) {
int i, j;
/* affichage du numéro des colonnes */
printf("\n ");
for ( i = 0; i < width; i+=5)
printf("%2i ",i);
printf("\n");
printf(" ");
for (i = 0; i < width; i+=1)
if (i == x)
printf("v");
else
printf("|");
printf("\n");
/* affichage principal */
for ( i = 0; i < height; i++)
{
/* affichage du numéro des lignes */
if (i == y)
printf("%2i>", i);
else
printf("%2i-", i);
for ( j = 0; j < width; j++)
{
printf("%c", matrix[i][j]);
}
printf("\n");
}
while (l != NULL) {
printf(" %i (%c) |", l->val, l->val);
l = l->next;
}
printf("\n");
printf("x: %i, y: %i\n\n", x, y);
}
/**
* \brief copie la matrice src dans la matrice dest
* \attention les matrices doivent avoir la même taille
*/
void copy_matrix(char **src, char **dest, int height, int width) {
int i, j;
for ( i = 0; i < height; i++)
for ( j = 0; j < width; j++)
dest[i][j] = src[i][j];
}
/**
* \brief debogue le fichier d'entrée en déplaçant le curseur
*/
void interpreteur(char **matrix, int height, int width) {
curseur cur;
int a, b, i;
list pile = empty();
char tmp;
time_t t;
int string_mode = 0;
int bridge = 0;
int step = 1;
int flag_command = 1;
char buf[256];
char prev_command[256];
char *endptr;
char **init_matrix;
/* initialisation pour une copie de la matrice de départ */
init_matrix = (char **) malloc(height*sizeof(char *));
for (i=0 ; i<height ; i++) {
init_matrix[i] = (char *) malloc(width*sizeof(char));
}
copy_matrix(matrix, init_matrix, height, width);
/* initialisation du module random */
srand((unsigned) time(&t));
cur.x = 0;
cur.y = 0;
/* on commence en haut à gauche, direction à droite */
cur.current_char = matrix[0][0];
cur.current_dir = E;
while (cur.current_char != '@') {
/*printf("=-=-=-=-=-=-=\n");
printf("current char: %i = %c\n", cur.current_char, cur.current_char);*/
/* affichage de la grille */
if (step == 1)
affichage(matrix, height, width, pile, cur.x, cur.y);
/* Action en fonction de la commande lue */
if (step == 1) {
printf("Veuillez saisir une commande :\n");
do
{
fgets(buf, 256, stdin);
if (strncmp(buf, "step", 4) == 0) {
flag_command = 1;
strcpy(prev_command, buf);
int n = strtol(buf+4, NULL, 10);
if (n > 0)
step = n;
else
step = 1;
}
else if (strncmp(buf, "run", 3) == 0) {
flag_command = 1;
step = 0;
}
else if (strncmp(buf, "restart", 7) == 0) {
/* retour à l'état initial */
flag_command = 1;
strcpy(prev_command, buf);
copy_matrix(init_matrix, matrix, height, width);
cur.x = 0;
cur.y = 0;
cur.current_char = matrix[0][0];
cur.current_dir = E;
string_mode = 0;
bridge = 0;
step = 1;
while (pile)
pop(&pile);
}
else if (strncmp(buf, "quit", 4) == 0) {
flag_command = 1;
printf("Arret du debogueur\n");
return;
}
else if (strncmp(buf, "\n", 1) == 0) {
flag_command = 1;
/* actions en focntion de la commande précédente */
if (strncmp(prev_command, "step", 4) == 0) {
int n = strtol(prev_command+4, NULL, 10);
if (n > 0)
step = n;
else
step = 1;
}
else if (strncmp(prev_command, "restart", 7) == 0) {
copy_matrix(init_matrix, matrix, height, width);
cur.x = 0;
cur.y = 0;
cur.current_char = matrix[0][0];
cur.current_dir = E;
string_mode = 0;
bridge = 0;
step = 1;
while (pile)
pop(&pile);
}
else {
printf("Erreur de dernière commande\n");
return;
}
}
else {
/* cas pour mauvaise commande */
printf("\nMauvaise commande, veuillez en saisir une à nouveau :\n");
flag_command = 0;
}
} while (!flag_command);
}
else if (step > 1)
step --;
/* Si on est sur un pont, on ne lit pas l'instruction et on avance sur le pont */
if (bridge)
{
bridge--;
}
/* Si on est en mode chaine de caractere on empile ce qu'on lit */
else if (string_mode == 1) {
if (cur.current_char == '"')
string_mode = 1 - string_mode;
else
push(cur.current_char, &pile);
}
else {
/* switch pour les actions en fonction du caractère lu */
switch (cur.current_char)
{
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;
case '>':
cur.current_dir = E;
break;
case '<':
cur.current_dir = W;
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 '$':
if (is_empty(pile))
a = 0;
else
a = pop(&pile);
if (is_empty(pile))
b = 0;
else
b = pop(&pile);
push(a, &pile);
push(b, &pile);
break;
case ';':
pop(&pile);
break;
case '.':
a = pop(&pile);
printf("%i", a);
break;
case ',':
a = pop(&pile);
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
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 '&':
printf("Veuillez entrer un entier\n");
fgets(buf, 256, stdin);
a = strtol(buf, &endptr, 10);
while (buf == endptr)
{
printf("Erreur, veuillez saisir un nombre\n");
fgets(buf, 256, stdin);
a = strtol(buf, &endptr, 10);
}
push(a, &pile);
break;
case '~':
printf("Veuillez entrer un caratere\n");
tmp = getchar();
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;
default:
break;
}
}
/* Déplacement du curseur et lecture du prochain caractère */
switch (cur.current_dir)
{
case N:
cur.y = cur.y == 0 ? height-1 : cur.y - 1;
break;
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;
case NW:
cur.x = cur.x == 0 ? width-1 : cur.x - 1;
cur.y = cur.y == 0 ? height-1 : cur.y - 1;
break;
default:
printf("Erreur de direction: %i\n", cur.current_dir);
exit(1);
break;
}
cur.current_char = matrix[cur.y][cur.x];
/*print_list(pile);
printf("string_mode: %i\n", string_mode);
printf("bridge: %i\n", bridge);*/
}
printf("Fin du debogueur\n");
}
\ No newline at end of file
#include "interpreteur.h" #include "common.h"
#include <stdio.h>
#include <stdlib.h>
/** /**
* \brief tronque un entier entre 0 et 255 * \brief tronque un entier entre 0 et 255
......
#include "list.h" #include "list.h"
#include "interpreteur.h" #include "common.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
...@@ -29,6 +29,8 @@ int main(int argc, char const *argv[]) ...@@ -29,6 +29,8 @@ 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);
} }
/* Enlever la ligne si y'a des bugs sous windows */
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);
...@@ -36,6 +38,8 @@ int main(int argc, char const *argv[]) ...@@ -36,6 +38,8 @@ 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);
} }
/* Enlever la ligne si y'a des bugs sous windows */
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