Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 28 Jun 1998 10:32:13 -0700 (PDT)
From:      giffunip@asme.org
To:        freebsd-gnats-submit@FreeBSD.ORG
Subject:   ports/7099: GNU readline support for SPICE port.
Message-ID:  <199806281732.KAA15826@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         7099
>Category:       ports
>Synopsis:       GNU readline support for SPICE port.
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports
>State:          open
>Quarter:
>Keywords:
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sun Jun 28 10:40:01 PDT 1998
>Last-Modified:
>Originator:     Pedro F. Giffuni
>Organization:
Universidad Nacional de Colombia
>Release:        2.2.5-R
>Environment:
>Description:
The linux version of SPICE has a patch to support GNU READLINE. I tested
it an it works well except when you close the X-Window by clicking.
It seems nice to have this as an option, but I don't recommend it by
default.
>How-To-Repeat:
Add the following patch as patches/patch-rdln but don't activate the 
-DHAS_GNUREADLINE option.
>Fix:
# This patch was adapted from GNU/Linux, BEWARE IT HAS BUGS !!!!
# if you want to GNU readline use -DHAS_GNUREADLINE and link with -lreadline
#
diff -cr spice3f4/src/bin/main.c src/bin/main.c
*** spice3f4/src/bin/main.c	Wed Nov 30 15:48:10 1994
--- src/bin/main.c	Tue Nov  4 22:19:01 1997
***************
*** 25,30 ****
--- 25,37 ----
  #include <pwd.h>
  #endif
  
+ #ifdef HAS_GNUREADLINE
+ /* Added GNU Readline Support 11/3/97 -- Andrew Veliath <veliaa@rpi.edu> */
+ #include <readline/readline.h>
+ #include <readline/history.h>
+ #include "fteinput.h"
+ #endif
+ 
  #ifdef HAS_UNIX_SIGS
  #include <signal.h>
  #endif
***************
*** 49,54 ****
--- 56,66 ----
  bool ft_intrpt = false;     /* Set by the (void) signal handlers. */
  bool ft_setflag = false;    /* Don't abort after an interrupt. */
  
+ #ifdef HAS_GNUREADLINE
+ char gnu_history_file[512];
+ static char *application_name;
+ #endif
+ 
  struct variable *(*if_getparam)( );
  
  #ifdef BATCH
***************
*** 181,186 ****
--- 193,281 ----
  
  #endif
  
+ #ifdef HAS_GNUREADLINE
+ /* Adapted ../lib/cp/lexical.c:prompt() for GNU Readline -- Andrew Veliath <veliaa@rpi.edu> */
+ static char *
+ prompt()
+ {
+     static char pbuf[128];
+     char *p = pbuf, *s;
+ 
+     if (cp_interactive == false)
+         return;
+     if (cp_promptstring == NULL)
+         s = "-> ";
+     else
+         s = cp_promptstring;
+     if (cp_altprompt)
+         s = cp_altprompt;
+     while (*s) {
+         switch (strip(*s)) {
+ 	case '!':
+ 	    p += sprintf(p, "%d", where_history() + 1);
+ 	    break;
+ 	case '\\':
+ 	    if (*(s + 1)) 
+ 		p += sprintf(p, "%c", strip(*++s));
+ 	default:
+ 	    *p = strip(*s); ++p;
+ 	    break;
+         }
+         s++;
+     }
+     *p = 0;
+     return pbuf;
+ }
+ 
+ /* Process device events in Readline's hook since there is no where
+    else to do it now - AV */
+ int rl_event_func()
+ {
+     static REQUEST reqst = { checkup_option, 0 };
+     Input(&reqst, NULL);
+     return 0;
+ }
+ 
+ /* Added GNU Readline Support -- Andrew Veliath <veliaa@rpi.edu> */
+ void app_rl_readlines()
+ {
+     char *line, *expanded_line;
+ 
+     strcpy(gnu_history_file, getenv("HOME"));
+     strcat(gnu_history_file, "/.");
+     strcat(gnu_history_file, application_name);
+     strcat(gnu_history_file, "_history");
+ 
+     using_history();
+     read_history(gnu_history_file);
+ 
+     rl_readline_name = application_name;
+     rl_instream = cp_in;
+     rl_outstream = cp_out;
+     rl_event_hook = rl_event_func;
+ 	
+     while (1) {
+ 	history_set_pos(history_length);
+ 	line = readline(prompt());
+ 	if (line && *line) {
+ 	    int s = history_expand(line, &expanded_line);
+ 		    
+ 	    if (s == 2) {
+ 		fprintf(stderr, "-> %s\n", expanded_line);
+ 	    } else if (s == -1) {
+ 		fprintf(stderr, "readline: %s\n", expanded_line);
+ 	    } else {
+ 		cp_evloop(expanded_line);
+ 		add_history(expanded_line);
+ 	    }
+ 	    free(expanded_line);
+ 	}
+ 	if (line) free(line);
+     }
+     /* History gets written in ../fte/misccoms.c com_quit */
+ }
+ #endif /* HAS_GNUREADLINE */
+ 
  char *hlp_filelist[] = { "spice", 0 };
  
  void
***************
*** 217,222 ****
--- 312,324 ----
      }
      started = true;
  
+ #ifdef HAS_GNUREADLINE
+     if (!(application_name = strrchr(av[0],'/')))
+         application_name = av[0];
+     else
+         ++application_name;
+ #endif
+ 
  #ifdef HAS_MAC_ARGCARGV
      ac = initmac(&av);
  #endif
***************
*** 393,399 ****
--- 495,505 ----
  #  ifdef HAS_UNIX_SIGS
      /* Set up (void) signal handling */
      if (!ft_batchmode) {
+ #    ifdef HAS_GNUREADLINE
+         (void) signal(SIGINT, SIG_IGN);
+ #    else
          (void) signal(SIGINT, ft_sigintr);
+ #    endif
          (void) signal(SIGFPE, sigfloat);
  #    ifdef SIGTSTP
          (void) signal(SIGTSTP, sigstop);
***************
*** 588,594 ****
--- 694,704 ----
      } else {
          (void) setjmp(jbuf);
          cp_interactive = true;
+ #ifdef HAS_GNUREADLINE
+ 	app_rl_readlines();
+ #else
  	while (cp_evloop((char *) NULL) == 1) ;
+ #endif /* ifelse HAS_GNUREADLINE */
      }
  
  #  else /* if BATCH */
***************
*** 627,633 ****
--- 737,747 ----
      /* Nutmeg "main" */
      (void) setjmp(jbuf);
      cp_interactive = true;
+ #ifdef HAS_GNUREADLINE
+     app_rl_readlines();
+ #else
      while (cp_evloop((char *) NULL) == 1) ;
+ #endif /* ifelse HAS_GNUREADLINE */
  
  #endif
  
diff -cr spice3f4/src/lib/cp/history.c src/lib/cp/history.c
*** spice3f4/src/lib/cp/history.c	Thu Jun 17 17:32:40 1993
--- src/lib/cp/history.c	Tue Nov  4 22:18:54 1997
***************
*** 11,16 ****
--- 11,24 ----
  #include "cpdefs.h"
  #include "suffix.h"
  
+ #ifdef HAS_GNUREADLINE
+ 
+ /* Added GNU Readline Support -- Andrew Veliath <veliaa@rpi.edu> */
+ #include <readline/readline.h>
+ #include <readline/history.h>
+ 
+ #endif /* HAS_GNUREADLINE */
+ 
  static char *dohs();
  static void freehist();
  static wordlist *dohmod();
***************
*** 19,24 ****
--- 27,33 ----
  static wordlist *hpattern();
  static wordlist *hprefix();
  
+ 
  struct histent *cp_lastone = NULL;
  int cp_maxhistlength = 1000;
  char cp_hat = '^';
***************
*** 345,352 ****
--- 354,363 ----
      cp_lastone->hi_next = NULL;
      cp_lastone->hi_event = event;
      cp_lastone->hi_wlist = wl_copy(wlist);
+ #ifndef HAS_GNUREADLINE
      freehist(histlength - cp_maxhistlength);
      histlength++;
+ #endif
      return;
  }
  
***************
*** 483,492 ****
--- 494,529 ----
          wl = wl->wl_next;
          rev = true;
      }
+ #ifdef HAS_GNUREADLINE
+     /* Added GNU Readline Support -- Andrew Veliath <veliaa@rpi.edu> */
+     {
+ 	HIST_ENTRY *he;
+ 	int i, N;
+ 
+ 	N = (wl == NULL) ? history_length : atoi(wl->wl_word);
+ 
+ 	if (N < 0) N = 0;
+ 	if (N > history_length) N = history_length;
+ 
+ 	if (rev)
+ 	    for (i = history_length; i > 0 && N; --i, --N) {
+ 		he = history_get(i);
+ 		if (!he) return;
+ 		fprintf(cp_out, "%d\t%s\n", i, he->line);
+ 	    }
+ 	else
+ 	    for (i = history_length - N + 1; i <= history_length; ++i) {
+ 		he = history_get(i);
+ 		if (!he) return;
+ 		fprintf(cp_out, "%d\t%s\n", i, he->line);
+ 	    }
+     }
+ #else
      if (wl == NULL)
          cp_hprint(cp_event - 1, cp_event - histlength, rev);
      else
          cp_hprint(cp_event - 1, cp_event - 1 - atoi(wl->wl_word), rev);
+ #endif /* ifelse HAS_GNUREADLINE */
      return;
  }
  
diff -cr spice3f4/src/lib/fte/misccoms.c src/lib/fte/misccoms.c
*** spice3f4/src/lib/fte/misccoms.c	Thu Jun 17 17:32:53 1993
--- src/lib/fte/misccoms.c	Tue Nov  4 22:18:54 1997
***************
*** 11,16 ****
--- 11,24 ----
  #include "hlpdefs.h"
  #include "suffix.h"
  
+ #ifdef HAS_GNUREADLINE
+ #include <readline/readline.h>
+ #include <readline/history.h>
+ 
+ extern int gnu_history_lines;
+ extern char gnu_history_file[];
+ #endif
+ 
  static void byemesg();
  
  void
***************
*** 299,304 ****
--- 307,320 ----
              byemesg();
      } else
          byemesg();
+ 
+ #ifdef HAS_GNUREADLINE
+     /* Added GNU Readline Support -- Andrew Veliath <veliaa@rpi.edu> */
+     if (cp_interactive && (cp_maxhistlength > 0)) {
+ 	stifle_history(cp_maxhistlength);
+ 	write_history(gnu_history_file);
+     }
+ #endif /* HAS_GNUREADLINE */
  
      exit(EXIT_NORMAL);
      /* NOTREACHED */
diff -cr spice3f4/src/lib/fte/signal.c src/lib/fte/signal.c
*** spice3f4/src/lib/fte/signal.c	Thu Jun 17 17:32:59 1993
--- src/lib/fte/signal.c	Tue Nov  4 22:19:01 1997
***************
*** 32,37 ****
--- 32,39 ----
   * is true.
   */
  
+ /* not using SIGINT with GNU Readline - AV */
+ #ifndef HAS_GNUREADLINE
  SIGNAL_TYPE
  ft_sigintr()
  {
***************
*** 58,63 ****
--- 60,66 ----
      cp_resetcontrol();
      longjmp(jbuf, 1);
  }
+ #endif /* !HAS_GNUREADLINE */
  
  /* ARGSUSED */
  SIGNAL_TYPE
diff -cr spice3f4/src/lib/fte/x10.c src/lib/fte/x10.c
*** spice3f4/src/lib/fte/x10.c	Thu Jun 17 17:32:54 1993
--- src/lib/fte/x10.c	Tue Nov  4 22:18:54 1997
***************
*** 726,737 ****
--- 726,740 ----
              graph->commandline, fx0, fx1, fy0, fy1);
      }
  
+ /* don't use the following if using GNU Readline - AV */
+ #ifndef HAS_GNUREADLINE
      /* hack for Gordon Jacobs */
      /* add to history list if plothistory is set */
      if (cp_getvar("plothistory", VT_BOOL, (char *) &dummy)) {
        wl = cp_parse(buf);
        (void) cp_addhistent(cp_event++, wl);
      }
+ #endif /* HAS_GNUREADLINE */
  
      (void) cp_evloop(buf);
  
diff -cr spice3f4/src/lib/fte/x11.c src/lib/fte/x11.c
*** spice3f4/src/lib/fte/x11.c	Thu Jun 17 17:32:59 1993
--- src/lib/fte/x11.c	Tue Nov  4 22:18:54 1997
***************
*** 773,784 ****
--- 773,787 ----
  	        graph->commandline, fx0, fx1, fy0, fy1);
  	}
  
+ /* don't use the following if using GNU Readline - AV */
+ #ifndef HAS_GNUREADLINE
  	/* hack for Gordon Jacobs */
  	/* add to history list if plothistory is set */
  	if (cp_getvar("plothistory", VT_BOOL, (char *) &dummy)) {
  	  wl = cp_parse(buf);
  	  (void) cp_addhistent(cp_event++, wl);
  	}
+ #endif /* HAS_GNUREADLINE */
  
  	(void) cp_evloop(buf);
  

>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-ports" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199806281732.KAA15826>