[GiNaC-list] pending bug fixes [Was: Parser problems once again (bad version of bison)]

Sheplyakov Alexei varg at theor.jinr.ru
Wed Jan 31 13:20:43 CET 2007


Hello!

On Tue, Jan 30, 2007 at 03:42:59PM +0100, Jens Vollinga wrote:
 
> >I propose to make new bugfix-only release (e.g. regenerate
> >input_parser.cc with "known-good" bison version)...
> 
> Okay, I will do it. Are there any pending patches/bug fixes to be 
> submitted soon?

[PATCH] Fix libreadline version detection.

Some broken libreadline versions (in particular one shipped with Mac OS X)
report non-numeric rl_library_version. Reject such libraries and
compile ginsh without libreadline.
---
 INSTALL               |    5 +++--
 acinclude.m4          |    9 ++++++++-
 ginsh/ginsh_parser.yy |    6 ++++++
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/INSTALL b/INSTALL
index 8d0b703..2c60d2d 100644
--- a/INSTALL
+++ b/INSTALL
@@ -104,12 +104,13 @@ install CLN properly on your system before continuing with GiNaC.
 Problems building ginsh
 -----------------------
 
-The most common reason why this doesn't succeed is the absence of
+The most common reason why this doesn't succeed is the absence of GNU
 libreadline and/or the corresponding header files. Depending on what your
 system/distribution is, you will have to install a package called
 libreadline and maybe libreadline-dev. If your system's vendor doesn't
 supply such packages, go to <ftp://ftp.gnu.org/gnu/readline/> and compile
-it yourself.
+it yourself. Note that non-GNU versions of libreadline (in particular
+one shipped with Mac OS X) are not supported at the moment.
 
 Problems with missing standard header files
 -------------------------------------------
diff --git a/acinclude.m4 b/acinclude.m4
index 4ab1387..64f4ec3 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -24,8 +24,15 @@ int main()
     fprintf(fd, "%s\n", rl_library_version);
     fclose(fd);
     return 0;
-}], ginac_cv_rlversion=`cat 'conftest.out'`, ginac_cv_rlversion='unknown', ginac_cv_rlversion='4.2')])
+}], [
+dnl Some non-GNU readline implementations have non-numeric rl_library_version
+ginac_cv_rlversion=`sed -e 's/[^0-9.]//g' 'conftest.out'`], [ ginac_cv_rlversion='unknown'], [ ginac_cv_rlversion='4.2'])])
+if test -z "$ginac_cv_rlversion"; then
+	GINAC_WARNING([Unsupported version of libreadline.])
+	ginac_cv_rlversion='unknown'
+fi
 if test "x${ginac_cv_rlversion}" != "xunknown"; then
+	AC_DEFINE(REALLY_HAVE_LIBREADLINE, ,[Define if GNU libreadline is installed])
   RL_VERSION_MAJOR=`echo ${ginac_cv_rlversion} | sed -e 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
   AC_DEFINE_UNQUOTED(GINAC_RL_VERSION_MAJOR, $RL_VERSION_MAJOR, [Major version of installed readline library.])
   RL_VERSION_MINOR=`echo ${ginac_cv_rlversion} | sed -e 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
diff --git a/ginsh/ginsh_parser.yy b/ginsh/ginsh_parser.yy
index b252609..954d54e 100644
--- a/ginsh/ginsh_parser.yy
+++ b/ginsh/ginsh_parser.yy
@@ -45,6 +45,7 @@
 
 #define YYERROR_VERBOSE 1
 
+#ifdef REALLY_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)
@@ -58,6 +59,7 @@ static const char *orig_basic_word_break_characters;
 #else
 #define GINAC_RL_COMPLETER_CAST(a) (a)
 #endif
+#endif // REALLY_HAVE_LIBREADLINE
 
 // Expression stack for %, %% and %%%
 static void push(const ex &e);
@@ -850,6 +852,7 @@ static char *fcn_generator(const char *text, int state)
 	return NULL;
 }
 
+#ifdef REALLY_HAVE_LIBREADLINE
 static char **fcn_completion(const char *text, int start, int end)
 {
 	if (rl_line_buffer[0] == '!') {
@@ -874,6 +877,7 @@ static char **fcn_completion(const char *text, int start, int end)
 #endif
 	}
 }
+#endif // REALLY_HAVE_LIBREADLINE
 
 void greeting(void)
 {
@@ -917,6 +921,7 @@ int main(int argc, char **argv)
 	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)
@@ -926,6 +931,7 @@ int main(int argc, char **argv)
 #endif
 	orig_completion_append_character = rl_completion_append_character;
 	orig_basic_word_break_characters = rl_basic_word_break_characters;
+#endif
 
 	// Init input file list, open first file
 	num_files = argc - 1;

----

Best regards,
 Alexei

-- 
All science is either physics or stamp collecting.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 827 bytes
Desc: Digital signature
Url : http://www.cebix.net/pipermail/ginac-list/attachments/20070131/e159bc07/attachment.pgp


More information about the GiNaC-list mailing list