From a3c09d66be617363330ccde8e0ffca54d1f15f52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Tue, 10 Nov 2015 14:13:56 +0000 Subject: [PATCH] docs --- os/readline.c | 228 ++++++++++++++++++++++---------------------------- 1 file changed, 99 insertions(+), 129 deletions(-) diff --git a/os/readline.c b/os/readline.c index 2ded3a403..d067d0551 100644 --- a/os/readline.c +++ b/os/readline.c @@ -8,7 +8,7 @@ * * ************************************************************************** * * -* File: readline.c * +* File: readline.c * * Last rev: 5/2/88 * * mods: * * comments: Input/Output C implemented predicates * @@ -19,7 +19,8 @@ static char SccsId[] = "%W% %G%"; #endif /* - * This file includes the interface to the readline library, if installed in the system. + * This file includes the interface to the readline library, if installed in the + *system. * */ @@ -44,7 +45,7 @@ static char SccsId[] = "%W% %G%"; #endif #include #ifndef S_ISDIR -#define S_ISDIR(x) (((x)&_S_IFDIR)==_S_IFDIR) +#define S_ISDIR(x) (((x)&_S_IFDIR) == _S_IFDIR) #endif #endif @@ -55,8 +56,10 @@ static char SccsId[] = "%W% %G%"; #include #include -static int ReadlineGetc( int); -static int ReadlinePutc( int,int); +static int ReadlineGetc(int); +static int ReadlinePutc(int, int); + +static const char *history_file; #define READLINE_OUT_BUF_MAX 256 @@ -65,29 +68,26 @@ typedef struct scan_atoms { Atom atom; } scan_atoms_t; -static char * -atom_enumerate(const char *prefix, int state) -{ - CACHE_REGS +static char *atom_enumerate(const char *prefix, int state) { + CACHE_REGS struct scan_atoms *index; - Atom catom; - Int i; + Atom catom; + Int i; - if ( !state ) - { index = (struct scan_atoms *)malloc(sizeof(struct scan_atoms)); - i = 0; - catom = NIL; - } else - { - CACHE_REGS - index = LOCAL_search_atoms; + if (!state) { + index = (struct scan_atoms *)malloc(sizeof(struct scan_atoms)); + i = 0; + catom = NIL; + } else { + CACHE_REGS + index = LOCAL_search_atoms; catom = index->atom; i = index->pos; } while (catom != NIL || i < AtomHashTableSize) { // if ( is_signalled() ) /* Notably allow windows version */ - // PL_handle_signals(); /* to break out on ^C */ + // PL_handle_signals(); /* to break out on ^C */ AtomEntry *ap; if (catom == NIL) { @@ -99,12 +99,12 @@ atom_enumerate(const char *prefix, int state) } else { ap = RepAtom(catom); READ_LOCK(ap->ARWLock); - if ( strstr( (char *)ap->StrOfAE, prefix) == ( char *)ap->StrOfAE) { - index->pos = i; - index->atom = ap->NextOfAE; - LOCAL_search_atoms = index; - READ_UNLOCK(ap->ARWLock); - return ap->StrOfAE; + if (strstr((char *)ap->StrOfAE, prefix) == (char *)ap->StrOfAE) { + index->pos = i; + index->atom = ap->NextOfAE; + LOCAL_search_atoms = index; + READ_UNLOCK(ap->ARWLock); + return ap->StrOfAE; } catom = ap->NextOfAE; READ_UNLOCK(ap->ARWLock); @@ -115,15 +115,13 @@ atom_enumerate(const char *prefix, int state) return NULL; } +static char *atom_generator(const char *prefix, int state) { + char *s = atom_enumerate(prefix, state); -static char * -atom_generator(const char *prefix, int state) -{ char *s = atom_enumerate(prefix, state); + if (s) { + char *copy = malloc(1 + strlen(s)); - if ( s ) - { char *copy = malloc(1 + strlen(s)); - - if ( copy ) /* else pretend no completion */ + if (copy) /* else pretend no completion */ strcpy(copy, s); s = copy; } @@ -131,51 +129,41 @@ atom_generator(const char *prefix, int state) return s; } +static char **prolog_completion(const char *text, int start, int end) { + char **matches = NULL; -static char ** -prolog_completion(const char *text, int start, int end) -{ char **matches = NULL; - - if ( (start == 1 && rl_line_buffer[0] == '[') || /* [file */ - (start == 2 && strncmp(rl_line_buffer, "['", 2)) ) - matches = rl_completion_matches((char *)text, /* for pre-4.2 */ - rl_filename_completion_function); + if ((start == 1 && rl_line_buffer[0] == '[') || /* [file */ + (start == 2 && strncmp(rl_line_buffer, "['", 2))) + matches = rl_completion_matches((char *)text, /* for pre-4.2 */ + rl_filename_completion_function); else - matches = rl_completion_matches((char *)text, - atom_generator); + matches = rl_completion_matches((char *)text, atom_generator); return matches; } - -void -Yap_ReadlineFlush( int sno ) -{ - if (GLOBAL_Stream[sno].status & Tty_Stream_f && +void Yap_ReadlineFlush(int sno) { + if (GLOBAL_Stream[sno].status & Tty_Stream_f && GLOBAL_Stream[sno].status & Output_Stream_f) { - rl_redisplay(); - + rl_redisplay(); } } -bool Yap_ReadlinePrompt( StreamDesc * s ) -{ +bool Yap_ReadlinePrompt(StreamDesc *s) { if (s->status & Tty_Stream_f) { s->stream_getc = ReadlineGetc; if (GLOBAL_Stream[0].status & Tty_Stream_f && - s->name == GLOBAL_Stream[0].name) + s->name == GLOBAL_Stream[0].name) s->stream_putc = ReadlinePutc; return true; } return false; } -bool -Yap_ReadlineOps( StreamDesc *s ) -{ +bool Yap_ReadlineOps(StreamDesc *s) { if (s->status & Tty_Stream_f) { if (GLOBAL_Stream[0].status & Tty_Stream_f && - is_same_tty(s->file,GLOBAL_Stream[0].file)) + is_same_tty(s->file, GLOBAL_Stream[0].file)) s->stream_putc = ReadlinePutc; s->stream_getc = ReadlineGetc; return true; @@ -183,17 +171,14 @@ Yap_ReadlineOps( StreamDesc *s ) return false; } - -static int -prolog_complete(int ignore, int key) -{ if ( rl_point > 0 && rl_line_buffer[rl_point-1] != ' ' ) - { -#if HAVE_DECL_RL_CATCH_SIGNALS_ /* actually version >= 1.2, or true readline */ - rl_begin_undo_group(); +static int prolog_complete(int ignore, int key) { + if (rl_point > 0 && rl_line_buffer[rl_point - 1] != ' ') { +#if HAVE_DECL_RL_CATCH_SIGNALS_ /* actually version >= 1.2, or true readline \ + */ + rl_begin_undo_group(); rl_complete(ignore, key); - if ( rl_point > 0 && rl_line_buffer[rl_point-1] == ' ' ) - { - rl_delete_text(rl_point-1, rl_point); + if (rl_point > 0 && rl_line_buffer[rl_point - 1] == ' ') { + rl_delete_text(rl_point - 1, rl_point); rl_point -= 1; rl_delete(-1, key); } @@ -205,10 +190,9 @@ prolog_complete(int ignore, int key) return 0; } -static void -InitReadline(void) { +static void InitReadline(void) { // don't call readline within emacs - //if (getenv("ËMACS")) + // if (getenv("ËMACS")) // return; GLOBAL_Stream[StdInStream].u.irl.buf = NULL; GLOBAL_Stream[StdInStream].u.irl.ptr = NULL; @@ -217,14 +201,14 @@ InitReadline(void) { #endif rl_outstream = stderr; using_history(); - char *s = Yap_AbsoluteFile("~/.YAP.history",NULL,true); - if (!read_history (s)) - { FILE *f = fopen(s, "w"); - if (f) { - fclose(f); - read_history (s); - } + char *s = Yap_AbsoluteFile("~/.YAP.history", NULL, true); + if (!read_history(s)) { + FILE *f = fopen(s, "w"); + if (f) { + fclose(f); + read_history(s); } + } rl_readline_name = "Prolog"; rl_attempted_completion_function = prolog_completion; #ifdef HAVE_RL_COMPLETION_FUNC_T @@ -232,17 +216,14 @@ InitReadline(void) { #else rl_add_defun("prolog-complete", (void *)prolog_complete, '\t'); #endif - } -static bool -getLine( int inp, int out ) -{ - CACHE_REGS +static bool getLine(int inp, int out) { + CACHE_REGS rl_instream = GLOBAL_Stream[inp].file; rl_outstream = GLOBAL_Stream[out].file; const char *myrl_line; - StreamDesc *s = GLOBAL_Stream+inp; + StreamDesc *s = GLOBAL_Stream + inp; if (!(s->status & Tty_Stream_f)) return false; @@ -252,14 +233,14 @@ getLine( int inp, int out ) if (GLOBAL_Stream[out].linepos == 0) { // no output so far fflush(NULL); - myrl_line = readline (LOCAL_Prompt); + myrl_line = readline(LOCAL_Prompt); } else { LOCAL_PrologMode |= ConsoleGetcMode; - myrl_line = readline (NULL); + myrl_line = readline(NULL); } /* Do it the gnu way */ if (LOCAL_PrologMode & InterruptMode) { - Yap_external_signal( 0, YAP_INT_SIGNAL ); + Yap_external_signal(0, YAP_INT_SIGNAL); LOCAL_PrologMode &= ~ConsoleGetcMode; if (LOCAL_PrologMode & AbortMode) { Yap_Error(ABORT_EVENT, TermNil, ""); @@ -269,57 +250,49 @@ getLine( int inp, int out ) } else { LOCAL_PrologMode &= ~ConsoleGetcMode; } - strncpy (LOCAL_Prompt, RepAtom (LOCAL_AtPrompt)->StrOfAE, MAX_PROMPT); + strncpy(LOCAL_Prompt, RepAtom(LOCAL_AtPrompt)->StrOfAE, MAX_PROMPT); /* window of vulnerability closed */ if (myrl_line == NULL) return false; if (myrl_line[0] != '\0' && myrl_line[1] != '\0') { - add_history (myrl_line); - write_history ( Yap_AbsoluteFile("~/.YAP.history", NULL, true)); - } - s->u.irl.ptr = s->u.irl.buf = myrl_line; - return true; + add_history(myrl_line); + append_history(1, history_file); } - -static int -ReadlinePutc (int sno, int ch) -{ - StreamDesc *s = &GLOBAL_Stream[sno]; -#if MAC || _MSC_VER || defined(__MINGW32__) - if (ch == 10) - { - putc ('\n', s->file); - } - else -#endif - putc (ch, s->file); - console_count_output_char(ch,s); - if (ch == 10) { - Yap_ReadlineFlush( sno ); - } - return ((int) ch); + s->u.irl.ptr = s->u.irl.buf = myrl_line; + return true; } - +static int ReadlinePutc(int sno, int ch) { + StreamDesc *s = &GLOBAL_Stream[sno]; +#if MAC || _MSC_VER || defined(__MINGW32__) + if (ch == 10) { + putc('\n', s->file); + } else +#endif + putc(ch, s->file); + console_count_output_char(ch, s); + if (ch == 10) { + Yap_ReadlineFlush(sno); + } + return ((int)ch); +} /* reading from the console is complicated because we need to know whether to prompt and so on... */ -static int -ReadlineGetc(int sno) -{ +static int ReadlineGetc(int sno) { StreamDesc *s = &GLOBAL_Stream[sno]; int ch; bool fetch = (s->u.irl.buf == NULL); - if (!fetch || getLine( sno, StdErrStream ) ) { - const char *ttyptr = s->u.irl.ptr++, *myrl_line = s->u.irl.buf; + if (!fetch || getLine(sno, StdErrStream)) { + const char *ttyptr = s->u.irl.ptr++, *myrl_line = s->u.irl.buf; ch = *ttyptr; if (ch == '\0') { ch = '\n'; - free ((void *)myrl_line); - s->u.irl.ptr = s->u.irl.buf = NULL; + free((void *)myrl_line); + s->u.irl.ptr = s->u.irl.buf = NULL; } } else { return EOF; @@ -327,21 +300,19 @@ ReadlineGetc(int sno) return console_post_process_read_char(ch, s); } -int -Yap_ReadlineForSIGINT(void) -{ - CACHE_REGS +int Yap_ReadlineForSIGINT(void) { + CACHE_REGS int ch; StreamDesc *s = &GLOBAL_Stream[StdInStream]; - const char *myrl_line = s->u.irl.buf; + const char *myrl_line = s->u.irl.buf; - if ((LOCAL_PrologMode & ConsoleGetcMode) && myrl_line != (char *) NULL) { + if ((LOCAL_PrologMode & ConsoleGetcMode) && myrl_line != (char *)NULL) { ch = myrl_line[0]; free((void *)myrl_line); myrl_line = NULL; return ch; } else { - myrl_line = readline ("Action (h for help): "); + myrl_line = readline("Action (h for help): "); if (!myrl_line) { ch = EOF; return ch; @@ -354,8 +325,7 @@ Yap_ReadlineForSIGINT(void) } } -static Int has_readline(USES_REGS1) -{ +static Int has_readline(USES_REGS1) { #if USE_READLINE return true; #else @@ -363,9 +333,9 @@ static Int has_readline(USES_REGS1) #endif } - void Yap_InitReadline(void) { - Yap_InitCPred ("$has_readline", 0, has_readline, SafePredFlag|HiddenPredFlag); + Yap_InitCPred("$has_readline", 0, has_readline, + SafePredFlag | HiddenPredFlag); InitReadline(); }