diff options
author | Pixel <Pixel> | 2001-05-02 22:14:21 +0000 |
---|---|---|
committer | Pixel <Pixel> | 2001-05-02 22:14:21 +0000 |
commit | ecd16166cde1ffa3edfbaa897b049d532e234ab6 (patch) | |
tree | 192b47251b141e0dd0f53530e3a4a2a5f961ea0f /lib/pile.c | |
parent | 8626b278cdccd95e628f14c027ae8a1c47133c48 (diff) |
Pouet
Diffstat (limited to 'lib/pile.c')
-rw-r--r-- | lib/pile.c | 42 |
1 files changed, 20 insertions, 22 deletions
@@ -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; |