registered_function_info struct changed to function_options class
[ginac.git] / ginsh / ginsh_parser.yy
index 2e02b6cc1c7fdb171ecac700c4ad31eb1ca1a732..0fcafa2eba44939ed5d55a1786acb498b9c188a2 100644 (file)
@@ -3,7 +3,7 @@
  *  Input grammar definition for ginsh.
  *  This file must be processed with yacc/bison.
  *
- *  GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -86,7 +86,7 @@ static ex lst2matrix(const ex &l);
 %token T_NUMBER T_SYMBOL T_LITERAL T_DIGITS T_QUOTE T_QUOTE2 T_QUOTE3
 %token T_EQUAL T_NOTEQ T_LESSEQ T_GREATEREQ T_MATRIX_BEGIN T_MATRIX_END
 
-%token T_QUIT T_PRINT T_TIME T_XYZZY T_INVENTORY T_LOOK T_SCORE
+%token T_QUIT T_WARRANTY T_PRINT T_READ T_WRITE T_TIME T_XYZZY T_INVENTORY T_LOOK T_SCORE
 
 /* Operator precedence and associativity */
 %right '='
@@ -139,6 +139,20 @@ line       : ';'
        | '?' T_SYMBOL          {print_help(ex_to_symbol($2).getname());}
        | '?' '?'               {print_help_topics();}
        | T_QUIT                {YYACCEPT;}
+       | T_WARRANTY {
+               cout << "This program is free software; you can redistribute it and/or modify it under\n";
+               cout << "the terms of the GNU General Public License as published by the Free Software\n";
+               cout << "Foundation; either version 2 of the License, or (at your option) any later\n";
+               cout << "version.\n";
+               cout << "This program is distributed in the hope that it will be useful, but WITHOUT\n";
+               cout << "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n";
+               cout << "FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more\n";
+               cout << "details.\n";
+               cout << "You should have received a copy of the GNU General Public License along with\n";
+               cout << "this program. If not, write to the Free Software Foundation, 675 Mass Ave,\n";
+               cout << "Cambridge, MA 02139, USA.\n";
+
+       }
        | T_XYZZY               {cout << "Nothing happens.\n";}
        | T_INVENTORY           {cout << "You're not carrying anything.\n";}
        | T_LOOK                {cout << "You're in a twisty little maze of passages, all alike.\n";}
@@ -252,7 +266,7 @@ static ex f_lsolve(const exprseq &e) {return lsolve(e[0], e[1]);}
 static ex f_nops(const exprseq &e) {return e[0].nops();}
 static ex f_normal1(const exprseq &e) {return e[0].normal();}
 static ex f_numer(const exprseq &e) {return e[0].numer();}
-static ex f_power(const exprseq &e) {return power(e[0], e[1]);}
+static ex f_pow(const exprseq &e) {return pow(e[0], e[1]);}
 static ex f_sqrt(const exprseq &e) {return sqrt(e[0]);}
 static ex f_subs2(const exprseq &e) {return e[0].subs(e[1]);}
 
@@ -298,9 +312,9 @@ static ex f_determinant(const exprseq &e)
 
 static ex f_diag(const exprseq &e)
 {
-       int dim = e.nops();
+       unsigned dim = e.nops();
        matrix &m = *new matrix(dim, dim);
-       for (int i=0; i<dim; i++)
+       for (unsigned i=0; i<dim; i++)
                m.set(i, i, e.op(i));
        return m;
 }
@@ -341,7 +355,7 @@ static ex f_evalf2(const exprseq &e)
 
 static ex f_has(const exprseq &e)
 {
-       return e[0].has(e[1]) ? exONE() : exZERO();
+       return e[0].has(e[1]) ? ex(1) : ex(0);
 }
 
 static ex f_inverse(const exprseq &e)
@@ -353,7 +367,7 @@ static ex f_inverse(const exprseq &e)
 static ex f_is(const exprseq &e)
 {
        CHECK_ARG(0, relational, is);
-       return (bool)ex_to_relational(e[0]) ? exONE() : exZERO();
+       return (bool)ex_to_relational(e[0]) ? ex(1) : ex(0);
 }
 
 static ex f_lcoeff(const exprseq &e)
@@ -378,7 +392,7 @@ static ex f_op(const exprseq &e)
 {
        CHECK_ARG(1, numeric, op);
        int n = ex_to_numeric(e[1]).to_int();
-       if (n < 0 || n >= e[0].nops())
+       if (n < 0 || n >= (int)e[0].nops())
                throw(std::out_of_range("second argument to op() is out of range"));
        return e[0].op(n);
 }
@@ -410,7 +424,7 @@ static ex f_rem(const exprseq &e)
 static ex f_series2(const exprseq &e)
 {
        CHECK_ARG(1, symbol, series);
-       return e[0].series(ex_to_symbol(e[1]), exZERO());
+       return e[0].series(ex_to_symbol(e[1]), ex(0));
 }
 
 static ex f_series3(const exprseq &e)
@@ -511,7 +525,7 @@ static const fcn_init builtin_fcns[] = {
        {"normal", fcn_desc(f_normal2, 2)},
        {"numer", fcn_desc(f_numer, 1)},
        {"op", fcn_desc(f_op, 2)},
-       {"power", fcn_desc(f_power, 2)},
+       {"pow", fcn_desc(f_pow, 2)},
        {"prem", fcn_desc(f_prem, 3)},
        {"primpart", fcn_desc(f_primpart, 2)},
        {"quo", fcn_desc(f_quo, 3)},
@@ -552,16 +566,16 @@ static ex f_ginac_function(const exprseq &es, int serial)
 }
 
 // All registered GiNaC functions
-#ifndef NO_GINAC_NAMESPACE
+#ifndef NO_NAMESPACE_GINAC
 void GiNaC::ginsh_get_ginac_functions(void)
-#else // ndef NO_GINAC_NAMESPACE
+#else // ndef NO_NAMESPACE_GINAC
 void ginsh_get_ginac_functions(void)
-#endif // ndef NO_GINAC_NAMESPACE
+#endif // ndef NO_NAMESPACE_GINAC
 {
-       vector<registered_function_info>::const_iterator i = function::registered_functions().begin(), end = function::registered_functions().end();
+       vector<function_options>::const_iterator i = function::registered_functions().begin(), end = function::registered_functions().end();
        unsigned serial = 0;
        while (i != end) {
-               fcns.insert(make_pair(i->name, fcn_desc(f_ginac_function, i->nparams, serial)));
+               fcns.insert(make_pair(i->get_name(), fcn_desc(f_ginac_function, i->get_nparams(), serial)));
                i++;
                serial++;
        }
@@ -665,7 +679,7 @@ static ex lst2matrix(const ex &l)
                throw(std::logic_error("internal error: argument to lst2matrix() is not a list"));
 
        // Find number of rows and columns
-       int rows = l.nops(), cols = 0, i, j;
+       unsigned rows = l.nops(), cols = 0, i, j;
        for (i=0; i<rows; i++)
                if (l.op(i).nops() > cols)
                        cols = l.op(i).nops();
@@ -677,7 +691,7 @@ static ex lst2matrix(const ex &l)
                        if (l.op(i).nops() > j)
                                m.set(i, j, l.op(i).op(j));
                        else
-                               m.set(i, j, exZERO());
+                               m.set(i, j, ex(0));
        return m;
 }
 
@@ -713,30 +727,33 @@ static char **fcn_completion(char *text, int start, int end)
                // For shell commands, revert back to filename completion
                rl_completion_append_character = orig_completion_append_character;
                rl_basic_word_break_characters = orig_basic_word_break_characters;
-               return completion_matches(text, filename_completion_function);
+               return completion_matches(text, (CPFunction *)filename_completion_function);
        } else {
                // Otherwise, complete function names
                rl_completion_append_character = '(';
                rl_basic_word_break_characters = " \t\n\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~";
-               return completion_matches(text, fcn_generator);
+               return completion_matches(text, (CPFunction *)fcn_generator);
        }
 }
 
+void greeting(void)
+{
+    cout << "ginsh - GiNaC Interactive Shell (" << PACKAGE << " V" << VERSION << ")" << endl;
+    cout << "  __,  _______  Copyright (C) 1999-2000 Johannes Gutenberg University Mainz,\n"
+         << " (__) *       | Germany.  This is free software with ABSOLUTELY NO WARRANTY.\n"
+         << "  ._) i N a C | You are welcome to redistribute it under certain conditions;\n"
+         << "<-------------' see the file COPYING for details.\n" << endl;
+    cout << "Type ?? for a list of help topics." << endl;
+}
 
 /*
  *  Main program
  */
-
 int main(int argc, char **argv)
 {
        // Print banner in interactive mode
-       if (isatty(0)) {
-               cout << "ginsh - GiNaC Interactive Shell (" << PACKAGE << " " << VERSION << ")\n";
-               cout << "Copyright (C) 1999 Johannes Gutenberg Universitaet Mainz, Germany\n";
-               cout << "This is free software, and you are welcome to redistribute it\n";
-               cout << "under certain conditions; see the file COPYING for details.\n";
-               cout << "Type ?? for a list of help topics.\n";
-       }
+       if (isatty(0)) 
+               greeting();
 
        // Init function table
        insert_fcns(builtin_fcns);
@@ -758,20 +775,21 @@ int main(int argc, char **argv)
        insert_fcn_help("atan2", "inverse tangent function with two arguments");
        insert_fcn_help("atanh", "inverse hyperbolic tangent function");
        insert_fcn_help("beta", "beta function");
+       insert_fcn_help("binomial", "binomial function");
        insert_fcn_help("cos", "cosine function");
        insert_fcn_help("cosh", "hyperbolic cosine function");
-       insert_fcn_help("psi", "polygamma function");
+       insert_fcn_help("exp", "exponential function");
+       insert_fcn_help("factorial", "factorial function");
+       insert_fcn_help("gamma", "gamma function");
+       insert_fcn_help("log", "natural logarithm");
+       insert_fcn_help("psi", "psi function\npsi(x) is the digamma function, psi(n,x) the nth polygamma function");
        insert_fcn_help("sin", "sine function");
        insert_fcn_help("sinh", "hyperbolic sine function");
        insert_fcn_help("tan", "tangent function");
        insert_fcn_help("tanh", "hyperbolic tangent function");
-       insert_fcn_help("exp", "exponential function");
-       insert_fcn_help("log", "natural logarithm");
+       insert_fcn_help("zeta", "zeta function\nzeta(x) is Riemann's zeta function, zeta(n,x) its nth derivative");
        insert_fcn_help("Li2", "dilogarithm");
        insert_fcn_help("Li3", "trilogarithm");
-       insert_fcn_help("binomial", "binomial function");
-       insert_fcn_help("factorial", "factorial function");
-       insert_fcn_help("gamma", "gamma function");
        insert_fcn_help("Order", "order term function (for truncated power series)");
 
        // Init readline completer