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>