From ecd16166cde1ffa3edfbaa897b049d532e234ab6 Mon Sep 17 00:00:00 2001 From: Pixel Date: Wed, 2 May 2001 22:14:21 +0000 Subject: Pouet --- lib/pile.c | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) (limited to 'lib/pile.c') diff --git a/lib/pile.c b/lib/pile.c index dd43a6e..11f1327 100644 --- a/lib/pile.c +++ b/lib/pile.c @@ -18,8 +18,10 @@ pile_elem result_pile[PILE_MAX]; unsigned int pile_ptr = 0; unsigned int result_pile_ptr = 0; -/* fonctions basiques sur la pile d operandes */ +/* Fonctions basiques sur la pile d'opérandes. Elle seront appelées par le parser. */ +/* La fonction push_pile est générique. Le parser lui transmet une chaîne de caractères, et cette +fonction va tenter de la convertir en ce qui lui semble le mieux pour empiler */ void push_pile(char *st) { int valid1, valid2, valid3; @@ -35,23 +37,23 @@ void push_pile(char *st) r_number = char_to_rat(st, &valid2); valid3 = is_mute(st); poly = (polynome) NomVarToVar(st, variables, &valid4); - if (valid1) { /* il s agit d un entier */ + if (valid1) { /* il s'agit d'un entier */ pushcontext(_("it's an integer")); push_pile_poly(ply_constr(rat_constr(i_number, 1), 0)); popcontext(); - } else if (valid2) { /* il s agit d un flottant */ + } else if (valid2) { /* il s'agit d'un flottant */ pushcontext(_("it's a float")); push_pile_poly(ply_constr(r_number, 0)); popcontext(); - } else if (valid3) { /* il s agit de x */ + } else if (valid3) { /* il s'agit de x */ pushcontext(_("it's X")); push_pile_poly(ply_constr(rat_constr(1, 1), 1)); popcontext(); - } else if (valid4) { /* il s agit d une variable */ + } else if (valid4) { /* il s'agit d'une variable */ pushcontext(_("it's a variable")); push_pile_poly(ply_copy(poly)); popcontext(); - } else { /* il s agit d un nom */ + } else { /* il s'agit d'un nom */ pushcontext(_("it's a name")); if (*st == '\'') { st++; @@ -61,14 +63,12 @@ void push_pile(char *st) popcontext(); } popcontext(); - - #ifdef DEBUG - fprintf(stderr, "exiting push_pile\n"); #endif } +/* Fonctions "atomiques" appelées par push_pile() */ void push_pile_poly(polynome poly) { @@ -108,6 +108,8 @@ void push_pile_string(char *st) } +/* Dépilement */ + pile_elem pop_pile(unsigned int count) { char buf[50]; @@ -121,6 +123,8 @@ pile_elem pop_pile(unsigned int count) return pile[pile_ptr]; } +/* Vidage (appelée en cas d'erreur) */ + void flush_pile(void) { int i; @@ -144,8 +148,8 @@ void flush_pile(void) -/* fonctions basiques sur la pile de resultats */ - +/* Fonctions basiques sur la pile de resultats. Grâce à cette pile résultat, nous pouvons passer un résultat +à l'interface, dès que le parser aura terminé son travail. */ void move_to_resultat_pile(void) { pile_elem temp; @@ -189,7 +193,6 @@ char * pop_resultat(void) return result; } - polynome return_last(int *valid) { if (!result_pile_ptr) { @@ -202,12 +205,12 @@ polynome return_last(int *valid) } - int has_resultat(void) { return (result_pile_ptr ? 1 : 0); } -/* fonctions avancees sur la pile d operandes */ +/* Fonctions avancées sur la pile d'opérandes. Nous allons surtout manipuler les opérandes de la pile, à l'aide +des opérateurs que le parser nous enverra. */ char *affichage_level_1(void) { @@ -223,7 +226,6 @@ char *affichage_level_1(void) break; case T_INT: result = (char *) Emalloc(11 * sizeof(char)); - sprintf(result, "%10d", pile[pile_ptr - 1].val); break; } @@ -237,7 +239,7 @@ int is_mute(char *st) return !(strcmp(st, mute)); } - +/* Cette fonction est appelée par le parser, et est donc un énorme switch qui va tester l'opérateur passé en paramètre */ void act_pile(int func) { pile_elem operande1, operande2; @@ -423,11 +425,7 @@ void act_pile(int func) exception(1, _("act_pile: OP_FUNC_CALL need only one argument for a polynom evaluation")); } if (operande[0].poly->degre == 0) { - push_pile_poly(ply_constr - (rat_constr_from_double - (ply_valuation - (operande2.poly, rat_to_double(operande[0].poly->coef))), - 0)); + push_pile_poly(ply_constr(ply_valuation(operande2.poly, operande[0].poly->coef), 0)); if (operande[0].poly) ply_destruct(operande[0].poly); ply_destruct(operande2.poly); @@ -453,7 +451,7 @@ void act_pile(int func) popcontext(); } - +/* Fonction de déboguage uniquement */ void affichage_pile(void) { int i; -- cgit v1.2.3