changeset 37:5f366c1ed459

Add support for GNU readline library for easier editing of the commands.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 24 Sep 2011 17:54:36 +0300
parents 50df08fdfb2c
children e5cd0f139fc1
files GNUmakefile configure src/yadex.cc
diffstat 3 files changed, 74 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/GNUmakefile	Sat Sep 24 17:25:34 2011 +0300
+++ b/GNUmakefile	Sat Sep 24 17:54:36 2011 +0300
@@ -383,7 +383,7 @@
 $(OBJDIR)/yadex: $(OBJ_CONFIG) $(OBJ_YADEX) $(OBJ_ATCLIB) $(MAKEFILE)
 	@echo "** Linking Yadex"
 	$(CXX) $(OBJ_CONFIG) $(OBJ_YADEX) $(OBJ_ATCLIB) -o $@		\
-	  -L$(X11LIBDIR) -lX11 -lm -lc $(LDFLAGS)
+	  -L$(X11LIBDIR) -lX11 -lm -lc $(LDFLAGS) $(EXTRA_LDFLAGS)
 
 .PHONY: test
 test:
@@ -498,7 +498,7 @@
 $(DOBJDIR)/yadex: $(DOBJ_CONFIG) $(DOBJ_YADEX) $(DOBJ_ATCLIB) $(MAKEFILE)
 	@echo "** Linking Yadex"
 	$(CXX) $(DOBJ_CONFIG) $(DOBJ_YADEX) $(DOBJ_ATCLIB) -o $@	\
-	  -L$(X11LIBDIR) -lX11 -lm -lc $(DLDFLAGS)
+	  -L$(X11LIBDIR) -lX11 -lm -lc $(DLDFLAGS) $(EXTRA_LDFLAGS)
 
 .PHONY: dtest
 dtest:
@@ -586,6 +586,7 @@
 	@echo "HAVE_NANOSLEEP     \"$(HAVE_NANOSLEEP)\""
 	@echo "HAVE_SNPRINTF      \"$(HAVE_SNPRINTF)\""
 	@echo "HAVE_USLEEP        \"$(HAVE_USLEEP)\""
+	@echo "HAVE_READLINE      \"$(HAVE_READLINE)\""
 	@echo "LDFLAGS            \"$(LDFLAGS)\""
 	@echo "MANDIR             \"$(MANDIR)\""
 	@echo "OS                 \"$(OS)\""
@@ -740,15 +741,15 @@
 # To compile the modules of Atclib
 # (normal and debugging versions)
 $(OBJDIR_ATCLIB)/%.o: atclib/%.c $(HEADERS_ATCLIB)
-	$(CC) -c $(CFLAGS) $< -o $@
+	$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@
 
 $(DOBJDIR_ATCLIB)/%.o: atclib/%.c $(HEADERS_ATCLIB)
-	$(CC) -c $(DCFLAGS) $< -o $@
+	$(CC) -c $(DCFLAGS) $(EXTRA_CFLAGS) $< -o $@
 
 # To see the generated assembly code
 # for the modules of Yadex
 $(OBJDIR)/%.S: src/%.cc $(MAKEFILE)
-	$(CXX) $(CXXFLAGS) -S -fverbose-asm -Iatclib -Iboost -I$(X11INCLUDEDIR)\
+	$(CXX) $(CXXFLAGS) $(EXTRA_CXXFLAGS) -S -fverbose-asm -Iatclib -Iboost -I$(X11INCLUDEDIR)\
 	  $< -o $@
 
 # A source file containing the credits
--- a/configure	Sat Sep 24 17:25:34 2011 +0300
+++ b/configure	Sat Sep 24 17:54:36 2011 +0300
@@ -26,6 +26,7 @@
 
 CC=
 CXX=
+HAVE_READLINE=auto
 HAVE_GETTIMEOFDAY=
 HAVE_NANOSLEEP=
 HAVE_SNPRINTF=
@@ -45,7 +46,7 @@
 
   printf '%s' "$3" >$cdir/$cbasename
   printf 'checking %s...' "$1"
-  if (cd $cdir && $CC -c $cbasename >$cout 2>&1)
+  if (cd $cdir && $CC -c $cbasename $4 $5 $6 >$cout 2>&1)
   then
     echo " yes"
     eval "$2=1"
@@ -136,6 +137,7 @@
     genbool NANOSLEEP
     genbool SNPRINTF
     genbool USLEEP
+    genbool READLINE
     echo
     echo 'extern const char *yadex_etc_path[];'
     echo 'extern const char *yadex_share_path[];'
@@ -154,52 +156,32 @@
     --help)
       echo "Usage:"
       echo "  configure --help"
-      echo "  configure [--prefix path] [--cc string] [--cxx string]"
+      echo "  configure [--prefix=path] [--cc=string] [--cxx=string] [--with-readline=path] [--without-readline]"
       exit 0
       ;;
 
-    --cc)
-      shift
-      if [ "$#" -lt 1 ]
-      then
-	echo "configure: --cc requires an argument" 1>&2
-	exit 1
-      fi
-      CC="$1"
-      ;;
-
     --cc=*)
       CC=`expr "x$1" : 'x--cc=\(.*\)'`
       ;;
 
-    --cxx)
-      shift
-      if [ "$#" -lt 1 ]
-      then
-	echo "configure: --cxx requires an argument" 1>&2
-	exit 1
-      fi
-      CXX="$1"
-      ;;
-
     --cxx=*)
       CXX=`expr "x$1" : 'x--cxx=\(.*\)'`
       ;;
 
-    --prefix)
-      shift
-      if [ "$#" -lt 1 ]
-      then
-	echo "configure: --prefix requires an argument" 1>&2
-	exit 1
-      fi
-      PREFIX="$1"
-      ;;
-
     --prefix=*)
       PREFIX=`expr "x$1" : 'x--prefix=\(.*\)'`
       ;;
 
+    --with-readline=*)
+      READLINE_PREFIX=`expr "x$1" : 'x--with-readline=\(.*\)'`
+      HAVE_READLINE=yes
+      ;;
+
+    --without-readline*)
+      HAVE_READLINE=
+      ;;
+    
+    
     -*)
       echo "configure: bad argument \"$1\"" 1>&2
       exit 1
@@ -270,7 +252,7 @@
 cdir=/tmp
 cbasename=${APPNAME}_$$.c
 cout=${APPNAME}_$$.out
-printf "checking whether the C compiler works..."
+echo -n "checking whether the C compiler works..."
 echo 'int n;' >$cdir/$cbasename
 if (cd $cdir && $CC -c $cbasename >$cout 2>&1)
 then
@@ -339,6 +321,35 @@
 ' || true
 
 #
+# Do we have GNU readline?
+#
+READLINE_FLAGS=
+if [ "x$HAVE_READLINE" = "xauto" -o "x$HAVE_READLINE" = "xyes" ]
+then
+	if [ "x$HAVE_READLINE" = "xyes" ]
+	then
+		READLINE_FLAGS="-I$READLINE_PREFIX/include -L$READLINE_PREFIX/lib"
+	fi
+	
+	check "for readline" HAVE_READLINE '
+#include <stdio.h>
+#include <readline/readline.h>
+#include <readline/history.h>
+int main (int argc, char *argv[])
+{
+	char* input = readline("test");
+	add_history(input);
+	return 0;
+}
+	' -lreadline $OPTS
+fi
+
+if [ "x$HAVE_READLINE" != "x" ]
+then
+	EXTRA_LDFLAGS="$EXTRA_LDFLAGS $READLINE_FLAGS -lreadline"
+fi
+
+#
 #	Look for a C++ compiler
 #
 #	We try "g++" first, then "c++", then "cxx".
@@ -455,11 +466,15 @@
   echo "HAVE_NANOSLEEP    = $HAVE_NANOSLEEP"
   echo "HAVE_SNPRINTF     = $HAVE_SNPRINTF"
   echo "HAVE_USLEEP       = $HAVE_USLEEP"
+  echo "HAVE_READLINE     = $HAVE_READLINE"
   echo "INTERFACE         = $INTERFACE"
   echo "MANDIR            = $MANDIR"
   echo "PLATFORM          = $PLATFORM"
   echo "SHAREDIR          = $SHAREDIR" | sed "s/%v/$VERSION/g"
   echo "SHAREDIRNV        = $SHAREDIRNV"
+  echo "EXTRA_CFLAGS      = $EXTRA_CFLAGS"
+  echo "EXTRA_CXXFLAGS    = $EXTRA_CXXFLAGS"
+  echo "EXTRA_LDFLAGS     = $EXTRA_LDFLAGS"
 ) >$BUILDDIR/Makefile.config
 
 #
--- a/src/yadex.cc	Sat Sep 24 17:25:34 2011 +0300
+++ b/src/yadex.cc	Sat Sep 24 17:54:36 2011 +0300
@@ -55,6 +55,10 @@
 #include "wadres.h"
 #include "wads2.h"
 
+#ifdef Y_READLINE
+#include <readline/readline.h>
+#include <readline/history.h>
+#endif
 
 /*
  *        Constants (declared in yadex.h)
@@ -571,13 +575,20 @@
 
 static void MainLoop()
 {
+#ifdef Y_READLINE
+    char *input = NULL;
+#else
     char input[120];
+#endif
     char *com, *out;
     FILE *file, *raw;
 
     for (;;)
     {
         /* get the input */
+#ifdef Y_READLINE
+        input = readline("yadex: ");
+#else
         printf("yadex: ");
         if (!fgets(input, sizeof input, stdin))
         {
@@ -588,6 +599,7 @@
         /* Strip the trailing '\n' */
         if (strlen(input) > 0 && input[strlen(input) - 1] == '\n')
             input[strlen(input) - 1] = '\0';
+#endif
 
         /* eat the white space and get the first command word */
         com = strtok(input, " ");
@@ -710,11 +722,10 @@
                 {
                     printf("Level %s not found.", com);
                     // Hint absent-minded users
-                    if (tolower(*com) == 'e' && yg_level_name == YGLN_MAP01
-                        || tolower(*com) == 'm' && yg_level_name == YGLN_E1M1)
+                    if ((tolower(*com) == 'e' && yg_level_name == YGLN_MAP01) ||
+                        (tolower(*com) == 'm' && yg_level_name == YGLN_E1M1))
                         printf(" You are in %s mode.", Game);
-                    else if (tolower(*com) == 'e' && com[1] > '1'
-                             && !Registered)
+                    else if (tolower(*com) == 'e' && com[1] > '1' && !Registered)
                         printf(" You have the shareware iwad.");
                     putchar('\n');
                     continue;
@@ -1142,6 +1153,11 @@
         /* unknown command */
         else
             printf("Unknown command \"%s\"!\n", com);
+
+#ifdef Y_READLINE
+        add_history(input);
+        free(input);
+#endif
     }
 }