Analyse syntaxique de la commande
Code de la séance du 05/05/14 + Code à la maison * Différenciation entre flags de production et flags de tests * Mise à jour de TODO.md * Abandon de BGI * Définition partielle de l'analyse de commande * Ajout de la fonction decoupeCommande() * Ajout de la fonction boucleDeCommandes() * Modification de l'appel des fichiers externes * Ajout d'un mode hors-REPL * Ajout du code correct pour creer() * Changement de l'indentation de traitementImage.cpp
This commit is contained in:
parent
c65e17bc7b
commit
2e5cbafa3c
7
Makefile
7
Makefile
|
@ -3,7 +3,8 @@
|
|||
.PHONY: clean, mrproper
|
||||
## Compilation
|
||||
CXX = g++
|
||||
CXXFLAGS = -lSDL -lSDLmain -DDEBUG
|
||||
CXXFLAGS = -lSDL -lSDLmain
|
||||
CXXFLAGSDEBUG = -lSDL -lSDLmain -DDEBUG
|
||||
## Chemins
|
||||
EXEPATH = bin/
|
||||
OBJPATH = obj/
|
||||
|
@ -14,14 +15,14 @@ main: main.o image.o
|
|||
$(CXX) $(OBJPATH)main.o $(OBJPATH)image.o -o $(EXEPATH)$@ $(CXXFLAGS)
|
||||
|
||||
testing: test.o image.o
|
||||
$(CXX) $(OBJPATH)test.o $(OBJPATH)image.o -o $(EXEPATH)$@ $(CXXFLAGS)
|
||||
$(CXX) $(OBJPATH)test.o $(OBJPATH)image.o -o $(EXEPATH)$@ $(CXXFLAGSDEBUG)
|
||||
|
||||
# Dépendances
|
||||
main.o: $(SRCPATH)main.cpp $(SRCPATH)image.h
|
||||
$(CXX) -c $< -o $(OBJPATH)$@ $(CXXFLAGS)
|
||||
|
||||
test.o: $(SRCPATH)test.cpp $(SRCPATH)image.cpp
|
||||
$(CXX) -c $< -o $(OBJPATH)$@ $(CXXFLAGS)
|
||||
$(CXX) -c $< -o $(OBJPATH)$@ $(CXXFLAGSDEBUG)
|
||||
|
||||
image.o: $(SRCPATH)image.cpp
|
||||
$(CXX) -c $< -o $(OBJPATH)$@
|
||||
|
|
45
TODO.md
45
TODO.md
|
@ -10,21 +10,19 @@
|
|||
|
||||
* Fonction principale
|
||||
* Fonction d'analyse de commande
|
||||
* Analyse de la commande
|
||||
* Analyse de la commande **C**
|
||||
* Analyse des arguments
|
||||
* Correspondance commandes ↔ fonctions
|
||||
* Objets **D**
|
||||
* Fenêtre **D**
|
||||
* SDL **C**
|
||||
* BGI **A**
|
||||
* Correspondance commandes ↔ fonctions **D**
|
||||
* Objets **C**
|
||||
* Fenêtre **C**
|
||||
* Pixel **C**
|
||||
* Image **C**
|
||||
* Fonctions **D**
|
||||
* Gestion de fichier **D**
|
||||
* Créer
|
||||
* Ouvrir
|
||||
* Enregistrer
|
||||
* Importer
|
||||
* Créer **C**
|
||||
* Ouvrir **D**
|
||||
* Enregistrer **D**
|
||||
* Importer **A**
|
||||
* Édition
|
||||
* Copier tout
|
||||
* Couper tout
|
||||
|
@ -32,23 +30,24 @@
|
|||
* Annuler
|
||||
* Refaire
|
||||
* Couleur **D**
|
||||
* Teinte **D**
|
||||
* Teinte **A**
|
||||
* Saturation **D**
|
||||
* Luminosité **D**
|
||||
* Contraste **D**
|
||||
* Luminosité **A**
|
||||
* Contraste **A**
|
||||
* Dessin **D**
|
||||
* Trait
|
||||
* Rectangle
|
||||
* Cercle
|
||||
* Disque
|
||||
* Trait **D**
|
||||
* Rectangle **A**
|
||||
* Cercle **D**
|
||||
* Disque **D**
|
||||
* Géométrie **D**
|
||||
* Zoom
|
||||
* Pivot
|
||||
* Redimensionner
|
||||
* Zoomer
|
||||
* Pivoter
|
||||
* Retourner **D**
|
||||
* Redimensionner **A**
|
||||
* Conversion du mode **D**
|
||||
* Binaire
|
||||
* Niveaux de gris
|
||||
* Couleur
|
||||
* Binaire **D**
|
||||
* Niveaux de gris **D**
|
||||
* Couleur **D**
|
||||
* Aide
|
||||
* Documentation
|
||||
|
||||
|
|
|
@ -1,30 +0,0 @@
|
|||
#include <graphics.h>
|
||||
|
||||
int ouvrirFenetre(int dimensionX, int dimensionY, const char *nom) { // Crée une fenêtre
|
||||
initwindow(dimensionX, dimensionY, nom, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int setNomFenetre(const char *nom) { // Change le nom de la fenêtre
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pointFenetre(int x, int y, int r, int v, int b) {
|
||||
putpixel(x, y, COLOR(r, v, b));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int afficherFenetre() {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int attendreFenetre() {
|
||||
while (kbhit()) {
|
||||
delay(100);
|
||||
}
|
||||
}
|
||||
|
||||
int fermerFenetre() {
|
||||
closegraph(ALL_WINDOWS);
|
||||
}
|
|
@ -1,3 +1,89 @@
|
|||
int analyserCommande(string nom) {
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int messageErreur(string message) {
|
||||
cerr << "Erreur : " << message << endl;
|
||||
}
|
||||
|
||||
int decoupeCommande(string commande, vector< string > &decoupe) {
|
||||
// Boucle de découpage
|
||||
// vector< string > decoupe;
|
||||
string elementCourrant = "";
|
||||
bool dansLeVide = false;
|
||||
bool echape = false;
|
||||
bool vaEchapper = false;
|
||||
bool entreSimplesGuillemets = false;
|
||||
bool entreDoublesGuillemets = false;
|
||||
for (int i = 0; i < commande.length(); i++) {
|
||||
echape = false;
|
||||
if (vaEchapper) {
|
||||
vaEchapper = false;
|
||||
echape = true;
|
||||
}
|
||||
if (commande[i] == ' ' && !(echape || entreSimplesGuillemets || entreDoublesGuillemets)) {
|
||||
// cout << i << " : " << "espace" << endl;
|
||||
if (!dansLeVide) {
|
||||
// cout << "Ajout de " << elementCourrant << endl;
|
||||
decoupe.push_back(elementCourrant);
|
||||
elementCourrant = "";
|
||||
dansLeVide = true;
|
||||
}
|
||||
} else if (commande[i] == '\\' && !echape) {
|
||||
vaEchapper = true;
|
||||
} else if (commande[i] == '\'' && !(echape || entreDoublesGuillemets)) {
|
||||
if (entreSimplesGuillemets) {
|
||||
entreSimplesGuillemets = false;
|
||||
// cout << "Ajout de " << elementCourrant << endl;
|
||||
decoupe.push_back(elementCourrant);
|
||||
elementCourrant = "";
|
||||
dansLeVide = true;
|
||||
} else {
|
||||
entreSimplesGuillemets = true;
|
||||
}
|
||||
} else if (commande[i] == '"' && !(echape || entreSimplesGuillemets)) {
|
||||
if (entreDoublesGuillemets) {
|
||||
entreDoublesGuillemets = false;
|
||||
// cout << "Ajout de " << elementCourrant << endl;
|
||||
decoupe.push_back(elementCourrant);
|
||||
elementCourrant = "";
|
||||
dansLeVide = true;
|
||||
} else {
|
||||
entreDoublesGuillemets = true;
|
||||
}
|
||||
} else {
|
||||
// cout << i << " : " << "else" << endl;
|
||||
elementCourrant += commande[i];
|
||||
dansLeVide = false;
|
||||
}
|
||||
}
|
||||
if (!dansLeVide) {
|
||||
// cout << "Ajout de " << elementCourrant << endl;
|
||||
decoupe.push_back(elementCourrant);
|
||||
}
|
||||
}
|
||||
|
||||
int analyserDecoupe(vector< string > decoupe) {
|
||||
for (int i = 0; i < decoupe.size(); i++) { // DEBUG
|
||||
cout << "Argument " << i << " = " << decoupe[i] << endl;
|
||||
}
|
||||
}
|
||||
|
||||
int boucleDeCommandes() {
|
||||
bool continuer = true;
|
||||
string commande;
|
||||
|
||||
while (continuer) {
|
||||
cout << "$ ";
|
||||
getline(cin, commande);
|
||||
if (commande == "exit" || commande == "quitter") {
|
||||
continuer = false;
|
||||
} else {
|
||||
vector< string > decoupe;
|
||||
decoupeCommande(commande, decoupe);
|
||||
analyserDecoupe(decoupe);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
19
src/main.cpp
19
src/main.cpp
|
@ -1,14 +1,13 @@
|
|||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
#include "affichageFenetreSDL.cpp"
|
||||
#include "image.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
// Insertion des ensembles de fonctions massives séparés pour plus de clarté
|
||||
#include "analyserCommande.cpp"
|
||||
#include "affichageFenetre.cpp"
|
||||
#include "image.h"
|
||||
#include "traitementImage.cpp"
|
||||
#include "analyserCommande.cpp"
|
||||
|
||||
|
||||
int main(int argc, char *args[]) {
|
||||
#if defined(WIN32) // Permet de refaire fonctionner cin et cout sous Windows après démarrage de SDL
|
||||
|
@ -18,5 +17,15 @@ int main(int argc, char *args[]) {
|
|||
|
||||
cout << "PILG" << endl; // Message d'entrée et de test
|
||||
|
||||
if (argc > 1) {
|
||||
vector< string > decoupe;
|
||||
for (int i = 1; i < argc; i++) {
|
||||
decoupe.push_back(args[i]);
|
||||
}
|
||||
analyserDecoupe(decoupe);
|
||||
} else {
|
||||
boucleDeCommandes();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
161
src/test.cpp
161
src/test.cpp
|
@ -1,11 +1,13 @@
|
|||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
#include "affichageFenetreSDL.cpp"
|
||||
#include "image.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "affichageFenetre.cpp"
|
||||
#include "image.h"
|
||||
#include "traitementImage.cpp"
|
||||
#include "analyserCommande.cpp"
|
||||
|
||||
|
||||
int main(int argc, char *args[]) {
|
||||
#if defined(WIN32) // Permet de refaire fonctionner cin et cout sous Windows après démarrage de SDL
|
||||
|
@ -15,76 +17,87 @@ int main(int argc, char *args[]) {
|
|||
|
||||
cout << "PILG - Debug" << endl; // Message d'entrée et de test
|
||||
|
||||
int dimX = 640, dimY = 128;
|
||||
ouvrirFenetre(dimX, dimY, "PILG - Fenêtre de debug");
|
||||
|
||||
// Création imageRoue
|
||||
Image imageRoue(dimX, dimY, 255, PILG_RVB);
|
||||
Pixel pointRoue = imageRoue.g_pixelVide();
|
||||
int x, y, step;
|
||||
float substep, lum;
|
||||
for (x = 0; x < dimX; x++) {
|
||||
for (y = 0; y < dimY; y++) {
|
||||
step = (x * 6.0) / dimX;
|
||||
substep = (x - step * (dimX / 6.0)) / (dimX / 6.0)*255;
|
||||
lum = 1-((float) y)/dimY;
|
||||
switch (step) {
|
||||
case 0:
|
||||
pointRoue.r = 255;
|
||||
pointRoue.v = substep;
|
||||
pointRoue.b = 0;
|
||||
break;
|
||||
case 1:
|
||||
pointRoue.r = 255-substep;
|
||||
pointRoue.v = 255;
|
||||
pointRoue.b = 0;
|
||||
break;
|
||||
case 2:
|
||||
pointRoue.r = 0;
|
||||
pointRoue.v = 255;
|
||||
pointRoue.b = substep;
|
||||
break;
|
||||
case 3:
|
||||
pointRoue.r = 0;
|
||||
pointRoue.v = 255-substep;
|
||||
pointRoue.b = 255;
|
||||
break;
|
||||
case 4:
|
||||
pointRoue.r = substep;
|
||||
pointRoue.v = 0;
|
||||
pointRoue.b = 255;
|
||||
break;
|
||||
case 5:
|
||||
pointRoue.r = 255;
|
||||
pointRoue.v = 0;
|
||||
pointRoue.b = 255-substep;
|
||||
break;
|
||||
// Analyse de commandes
|
||||
if (argc > 1) {
|
||||
vector< string > decoupe;
|
||||
for (int i = 1; i < argc; i++) {
|
||||
decoupe.push_back(args[i]);
|
||||
}
|
||||
// Dégradé vers le noir
|
||||
pointRoue.r = pointRoue.r*lum;
|
||||
pointRoue.v = pointRoue.v*lum;
|
||||
pointRoue.b = pointRoue.b*lum;
|
||||
|
||||
// // Ajout de luminosité
|
||||
// pointRoue.r = pointRoue.r + 50;
|
||||
// pointRoue.v = pointRoue.v + 50;
|
||||
// pointRoue.b = pointRoue.b + 50;
|
||||
|
||||
// Remise dans l'intervalle
|
||||
pointRoue.r = (pointRoue.r > 255 ? 255 : pointRoue.r);
|
||||
pointRoue.v = (pointRoue.v > 255 ? 255 : pointRoue.v);
|
||||
pointRoue.b = (pointRoue.b > 255 ? 255 : pointRoue.b);
|
||||
|
||||
if (imageRoue.s_point(x, y, pointRoue) == 1) {
|
||||
cerr << "Erreur : s_point() a été entré avec des valeurs incorrectes" << endl;
|
||||
cout << "X : " << x << " - Y: " << y << " - R : " << pointRoue.r << " - V : " << pointRoue.v << " - B : " << pointRoue.b << endl; // DEBUG
|
||||
return 1;
|
||||
analyserDecoupe(decoupe);
|
||||
} else {
|
||||
boucleDeCommandes();
|
||||
}
|
||||
imageRoue.g_point(x, y, pointRoue);
|
||||
pointFenetre(x, y, pointRoue.r, pointRoue.v, pointRoue.b);
|
||||
}
|
||||
}
|
||||
afficherFenetre();
|
||||
|
||||
// int dimX = 640, dimY = 128;
|
||||
// ouvrirFenetre(dimX, dimY, "PILG - Fenêtre de debug");
|
||||
|
||||
// // Création imageRoue
|
||||
// Image imageRoue(dimX, dimY, 255, PILG_RVB);
|
||||
// Pixel pointRoue = imageRoue.g_pixelVide();
|
||||
// int x, y, step;
|
||||
// float substep, lum;
|
||||
// for (x = 0; x < dimX; x++) {
|
||||
// for (y = 0; y < dimY; y++) {
|
||||
// step = (x * 6.0) / dimX;
|
||||
// substep = (x - step * (dimX / 6.0)) / (dimX / 6.0)*255;
|
||||
// lum = 1-((float) y)/dimY;
|
||||
// switch (step) {
|
||||
// case 0:
|
||||
// pointRoue.r = 255;
|
||||
// pointRoue.v = substep;
|
||||
// pointRoue.b = 0;
|
||||
// break;
|
||||
// case 1:
|
||||
// pointRoue.r = 255-substep;
|
||||
// pointRoue.v = 255;
|
||||
// pointRoue.b = 0;
|
||||
// break;
|
||||
// case 2:
|
||||
// pointRoue.r = 0;
|
||||
// pointRoue.v = 255;
|
||||
// pointRoue.b = substep;
|
||||
// break;
|
||||
// case 3:
|
||||
// pointRoue.r = 0;
|
||||
// pointRoue.v = 255-substep;
|
||||
// pointRoue.b = 255;
|
||||
// break;
|
||||
// case 4:
|
||||
// pointRoue.r = substep;
|
||||
// pointRoue.v = 0;
|
||||
// pointRoue.b = 255;
|
||||
// break;
|
||||
// case 5:
|
||||
// pointRoue.r = 255;
|
||||
// pointRoue.v = 0;
|
||||
// pointRoue.b = 255-substep;
|
||||
// break;
|
||||
// }
|
||||
// // Dégradé vers le noir
|
||||
// pointRoue.r = pointRoue.r*lum;
|
||||
// pointRoue.v = pointRoue.v*lum;
|
||||
// pointRoue.b = pointRoue.b*lum;
|
||||
|
||||
// // // Ajout de luminosité
|
||||
// // pointRoue.r = pointRoue.r + 50;
|
||||
// // pointRoue.v = pointRoue.v + 50;
|
||||
// // pointRoue.b = pointRoue.b + 50;
|
||||
|
||||
// // Remise dans l'intervalle
|
||||
// pointRoue.r = (pointRoue.r > 255 ? 255 : pointRoue.r);
|
||||
// pointRoue.v = (pointRoue.v > 255 ? 255 : pointRoue.v);
|
||||
// pointRoue.b = (pointRoue.b > 255 ? 255 : pointRoue.b);
|
||||
|
||||
// if (imageRoue.s_point(x, y, pointRoue) == 1) {
|
||||
// cerr << "Erreur : s_point() a été entré avec des valeurs incorrectes" << endl;
|
||||
// cout << "X : " << x << " - Y: " << y << " - R : " << pointRoue.r << " - V : " << pointRoue.v << " - B : " << pointRoue.b << endl; // DEBUG
|
||||
// return 1;
|
||||
// }
|
||||
// imageRoue.g_point(x, y, pointRoue);
|
||||
// pointFenetre(x, y, pointRoue.r, pointRoue.v, pointRoue.b);
|
||||
// }
|
||||
// }
|
||||
// afficherFenetre();
|
||||
|
||||
// Cycle de couleurs avec utilisation d'Image
|
||||
// Image imageRoue(dimX, dimY, 255, PILG_RVB);
|
||||
|
@ -119,9 +132,9 @@ int main(int argc, char *args[]) {
|
|||
// afficherFenetre();
|
||||
// }
|
||||
|
||||
cout << "Éxecution du programme terminée. Vous pouvez quitter la fenêtre." << endl;
|
||||
attendreFenetre();
|
||||
fermerFenetre();
|
||||
// cout << "Éxecution du programme terminée. Vous pouvez quitter la fenêtre." << endl;
|
||||
// attendreFenetre();
|
||||
// fermerFenetre();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,15 +1,17 @@
|
|||
// Gestion de fichiers
|
||||
int creer(Image &sortie, unsigned int dimensionX, unsigned int dimensionY, unsigned int maxComposante, PILG_Comp typeComposantes) { // Créer une image de dimensions X et Y
|
||||
|
||||
sortie = new Image(dimensionX, dimensionY, maxComposante, typeComposantes); // Nouvelle
|
||||
|
||||
Image *nouvelle = new Image(dimensionX, dimensionY, maxComposante, typeComposantes);
|
||||
sortie = *nouvelle;
|
||||
}
|
||||
|
||||
int ouvrir(Image &sortie, string nomFichier) { // Ouvrir une image existante à partir du nom du fichier ***Geoffrey
|
||||
|
||||
}
|
||||
int sauver(Image entree, string nomFichier) { // Sauvegarder l'image obtenue dans un nouveau fichier
|
||||
|
||||
int sauver(Image entree, string nomFichier, bool ASCII, string commentaire) { // Sauvegarder l'image obtenue dans un nouveau fichier
|
||||
|
||||
}
|
||||
|
||||
int import(Image entree, Image &sortie, string nomFichier, int x, int y) {
|
||||
// Image fichierImporte;
|
||||
// sortie = entree
|
||||
|
@ -71,6 +73,7 @@ int saturation(Image entree, Image &sortie, float saturation) { // Sature l'imag
|
|||
// Fin Pour
|
||||
// Fin Pour
|
||||
}
|
||||
|
||||
int luminosite(Image entree, Image &sortie, float luminosite) { // Augmente la luminosité de l'image
|
||||
// Pour x=0 à x=image.g_DimensionX()
|
||||
// Pour y=0 à y=image.g_DimensionY()
|
||||
|
@ -88,6 +91,7 @@ int luminosite(Image entree, Image &sortie, float luminosite) { // Augmente la l
|
|||
// Fin Pour
|
||||
// Fin Pour
|
||||
}
|
||||
|
||||
int contraste(Image entree, Image &sortie, float contraste) { // Accentue les contrastes de l'image
|
||||
// pour x=0 à x=image.g_dimensionX()
|
||||
// pour y=0 à y=image.g_DimensionY()
|
||||
|
@ -121,6 +125,7 @@ int trait(Image entree, Image &sortie, int x1, int y1, int x2, int y2, Pixel pix
|
|||
//fin procédure ;
|
||||
|
||||
}
|
||||
|
||||
int rectangle(Image entree, Image &sortie, int x1, int y1, int x2, int y2, Pixel couleur) {
|
||||
// sortie = entree
|
||||
// pour x=x1 à x=x2
|
||||
|
@ -130,9 +135,11 @@ int rectangle(Image entree, Image &sortie, int x1, int y1, int x2, int y2, Pixel
|
|||
// FinPour
|
||||
|
||||
}
|
||||
|
||||
int cercle(Image entree, Image &sortie, int x, int y, int r, Pixel couleur) {
|
||||
|
||||
}
|
||||
|
||||
int disque(Image entree, Image &sortie, int x, int y, int r, Pixel couleur) {
|
||||
|
||||
}
|
||||
|
@ -141,31 +148,34 @@ int disque(Image entree, Image &sortie, int x, int y, int r, Pixel couleur) {
|
|||
int zoom(Image entree, Image &sortie) {
|
||||
|
||||
}
|
||||
|
||||
int pivoter(Image entree, Image &sortie) {
|
||||
|
||||
}
|
||||
|
||||
int retourner(Image entree, Image &sortie, int rotation) {
|
||||
|
||||
}
|
||||
|
||||
int redimensionner(Image entree, Image &sortie, int x1, int x2, int y1, int y2) {
|
||||
// sortie = new Image(x2-x1, y2-y1, entree.g_maxComposante(), entree.g_typeComposantes())
|
||||
// Image *nouvelle = new Image(x2-x1, y2-y1, entree.g_maxComposante(), entree.g_typeComposantes());
|
||||
// sortie = *nouvelle;
|
||||
// pour x=x1 à x=x2
|
||||
// pour y=y1 à y=y2
|
||||
// sortie.s_pixel(x, y, entree.g_pixel(x+x1, y+y1));
|
||||
// FinPour
|
||||
// FinPour
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
// Modification couleur
|
||||
int convBIN(Image entree, Image &sortie) {
|
||||
|
||||
}
|
||||
|
||||
int convNIV(Image entree, Image &sortie) {
|
||||
|
||||
}
|
||||
|
||||
int convRVB(Image entree, Image &sortie) {
|
||||
|
||||
}
|
||||
|
|
Reference in a new issue