* This file must be processed with yacc/bison. */
/*
- * GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2011 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
*/
%{
+#ifdef HAVE_CONFIG_H
#include "config.h"
+#endif
#ifdef HAVE_RUSAGE
#include <sys/resource.h>
#else
#include <ctime>
#endif
-#if HAVE_UNISTD_H
+#ifdef HAVE_UNISTD_H
#include <sys/types.h>
#include <unistd.h>
#endif
#define YYERROR_VERBOSE 1
-#ifdef REALLY_HAVE_LIBREADLINE
+#ifdef HAVE_LIBREADLINE
// Original readline settings
static int orig_completion_append_character;
-#if (GINAC_RL_VERSION_MAJOR < 4) || (GINAC_RL_VERSION_MAJOR == 4 && GINAC_RL_VERSION_MINOR < 2)
-static char *orig_basic_word_break_characters;
-#else
static const char *orig_basic_word_break_characters;
-#endif
-#if (GINAC_RL_VERSION_MAJOR >= 5)
+#if (RL_VERSION_MAJOR >= 5)
#define GINAC_RL_COMPLETER_CAST(a) const_cast<char *>((a))
#else
#define GINAC_RL_COMPLETER_CAST(a) (a)
#endif
-#endif // REALLY_HAVE_LIBREADLINE
+#endif // HAVE_LIBREADLINE
// Expression stack for %, %% and %%%
static void push(const ex &e);
%%
// Error print routine
-int yyerror(char *s)
+int yyerror(const char *s)
{
cerr << s << " at " << yytext << endl;
return 0;
static ex f_find(const exprseq &e)
{
- lst found;
+ exset found;
e[0].find(e[1], found);
- return found;
+ lst l;
+ for (exset::const_iterator i = found.begin(); i != found.end(); ++i)
+ l.append(*i);
+ return l;
}
static ex f_fsolve(const exprseq &e)
static ex f_match(const exprseq &e)
{
- lst repl_lst;
- if (e[0].match(e[1], repl_lst))
+ exmap repls;
+ if (e[0].match(e[1], repls)) {
+ lst repl_lst;
+ for (exmap::const_iterator i = repls.begin(); i != repls.end(); ++i)
+ repl_lst.append(relational(i->first, i->second, relational::equal));
return repl_lst;
- else
- return fail();
+ }
+ throw std::runtime_error("FAIL");
}
static ex f_normal2(const exprseq &e)
static ex f_ginac_function(const exprseq &es, int serial)
{
- return function(serial, es).eval(1);
+ return GiNaC::function(serial, es).eval(1);
}
// All registered GiNaC functions
namespace GiNaC {
-void ginsh_get_ginac_functions(void)
+static void ginsh_get_ginac_functions(void)
{
- vector<function_options>::const_iterator i = function::registered_functions().begin(), end = function::registered_functions().end();
+ vector<function_options> gfv = function::get_registered_functions();
+ vector<function_options>::const_iterator i = gfv.begin(), end = gfv.end();
unsigned serial = 0;
while (i != end) {
fcns.insert(make_pair(i->get_name(), fcn_desc(f_ginac_function, i->get_nparams(), serial)));
return NULL;
}
-#ifdef REALLY_HAVE_LIBREADLINE
+#ifdef HAVE_LIBREADLINE
static char **fcn_completion(const char *text, int start, int end)
{
if (rl_line_buffer[0] == '!') {
rl_completion_append_character = orig_completion_append_character;
rl_basic_word_break_characters = orig_basic_word_break_characters;
rl_completer_word_break_characters = GINAC_RL_COMPLETER_CAST(rl_basic_word_break_characters);
-#if (GINAC_RL_VERSION_MAJOR < 4) || (GINAC_RL_VERSION_MAJOR == 4 && GINAC_RL_VERSION_MINOR < 2)
- return completion_matches(const_cast<char *>(text), (CPFunction *)filename_completion_function);
-#else
return rl_completion_matches(text, rl_filename_completion_function);
-#endif
} else {
// Otherwise, complete function names
rl_completion_append_character = '(';
rl_basic_word_break_characters = " \t\n\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~";
rl_completer_word_break_characters = GINAC_RL_COMPLETER_CAST(rl_basic_word_break_characters);
-#if (GINAC_RL_VERSION_MAJOR < 4) || (GINAC_RL_VERSION_MAJOR == 4 && GINAC_RL_VERSION_MINOR < 2)
- return completion_matches(const_cast<char *>(text), (CPFunction *)fcn_generator);
-#else
return rl_completion_matches(text, fcn_generator);
-#endif
}
}
-#endif // REALLY_HAVE_LIBREADLINE
+#endif // HAVE_LIBREADLINE
+
+static void ginsh_readline_init(char* name)
+{
+#ifdef HAVE_LIBREADLINE
+ // Init readline completer
+ rl_readline_name = name;
+ rl_attempted_completion_function = fcn_completion;
+ orig_completion_append_character = rl_completion_append_character;
+ orig_basic_word_break_characters = rl_basic_word_break_characters;
+#endif // HAVE_LIBREADLINE
+}
void greeting(void)
{
- cout << "ginsh - GiNaC Interactive Shell (" << PACKAGE << " V" << VERSION << ")" << endl;
- cout << " __, _______ Copyright (C) 1999-2008 Johannes Gutenberg University Mainz,\n"
+ cout << "ginsh - GiNaC Interactive Shell (GiNaC V" << GINACLIB_VERSION << ")" << endl;
+ cout << " __, _______ Copyright (C) 1999-2011 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"
<< "<-------------' For details type `warranty;'.\n" << endl;
insert_help("print_latex", "print_latex(expression) - prints a LaTeX representation of the given expression");
insert_help("print_csrc", "print_csrc(expression) - prints a C source code representation of the given expression");
-#ifdef REALLY_HAVE_LIBREADLINE
- // Init readline completer
- rl_readline_name = argv[0];
-#if (GINAC_RL_VERSION_MAJOR < 4) || (GINAC_RL_VERSION_MAJOR == 4 && GINAC_RL_VERSION_MINOR < 2)
- rl_attempted_completion_function = (CPPFunction *)fcn_completion;
-#else
- rl_attempted_completion_function = fcn_completion;
-#endif
- orig_completion_append_character = rl_completion_append_character;
- orig_basic_word_break_characters = rl_basic_word_break_characters;
-#endif
+ ginsh_readline_init(argv[0]);
// Init input file list, open first file
num_files = argc - 1;