]> www.ginac.de Git - ginac.git/blobdiff - ginsh/ginsh_parser.yy
- increased compatibility with RedHat's readline-4.2-1 package
[ginac.git] / ginsh / ginsh_parser.yy
index a94b92c775b1b71ec20178bdb3d8fcb65f18846e..f2cfc769103a4a47f5e818a523d0e758d4ee2d99 100644 (file)
@@ -394,6 +394,20 @@ static ex f_is(const exprseq &e)
        return (bool)ex_to<relational>(e[0]) ? ex(1) : ex(0);
 }
 
+class apply_map_function : public map_function {
+       ex apply;
+public:
+       apply_map_function(const ex & a) : apply(a) {}
+       virtual ~apply_map_function() {}
+       ex operator()(const ex & e) { return apply.subs(wild() == e, true); }
+};
+
+static ex f_map(const exprseq &e)
+{
+       apply_map_function fcn(e[1]);
+       return e[0].map(fcn);
+}
+
 static ex f_match(const exprseq &e)
 {
        lst repl_lst;
@@ -526,6 +540,7 @@ static const fcn_init builtin_fcns[] = {
        {"lcoeff", fcn_desc(f_lcoeff, 2)},
        {"ldegree", fcn_desc(f_ldegree, 2)},
        {"lsolve", fcn_desc(f_lsolve, 2)},
+       {"map", fcn_desc(f_map, 2)},
        {"match", fcn_desc(f_match, 2)},
        {"nops", fcn_desc(f_nops, 1)},
        {"normal", fcn_desc(f_normal1, 1)},
@@ -722,7 +737,7 @@ static void print_help_topics(void)
  *  Function name completion functions for readline
  */
 
-static char *fcn_generator(char *text, int state)
+static char *fcn_generator(const char *text, int state)
 {
        static int len;                         // Length of word to complete
        static fcn_tab::const_iterator index;   // Iterator to function being currently considered
@@ -743,7 +758,7 @@ static char *fcn_generator(char *text, int state)
        return NULL;
 }
 
-static char **fcn_completion(char *text, int start, int end)
+static char **fcn_completion(const char *text, int start, int end)
 {
        if (rl_line_buffer[0] == '!') {
                // For shell commands, revert back to filename completion
@@ -753,7 +768,7 @@ static char **fcn_completion(char *text, int start, int end)
 #if (GINAC_RL_VERSION_MAJOR < 4) || (GINAC_RL_VERSION_MAJOR == 4 && GINAC_RL_VERSION_MINOR < 2)
                return completion_matches(text, (CPFunction *)filename_completion_function);
 #else
-               return rl_completion_matches(text, (CPFunction *)rl_filename_completion_function);
+               return rl_completion_matches(text, rl_filename_completion_function);
 #endif
        } else {
                // Otherwise, complete function names
@@ -763,7 +778,7 @@ static char **fcn_completion(char *text, int start, int end)
 #if (GINAC_RL_VERSION_MAJOR < 4) || (GINAC_RL_VERSION_MAJOR == 4 && GINAC_RL_VERSION_MINOR < 2)
                return completion_matches(text, (CPFunction *)fcn_generator);
 #else
-               return rl_completion_matches(text, (CPFunction *)fcn_generator);
+               return rl_completion_matches(text, fcn_generator);
 #endif
        }
 }
@@ -806,7 +821,11 @@ int main(int argc, char **argv)
 
        // 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;