| Jeroen Demeyer on Tue, 12 Jan 2016 18:12:33 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Support trailing semicolon in gp_read_str_multiline() |
On 2016-01-12 16:38, Bill Allombert wrote:
The issue is that gp does not display '123' put still put 123 in the result history: ? a=123; ? % %2 = 123 But with your patch, gp_read_str_multiline() do not allow to do it.
Here is a new version which returns the last character of the filtered input.
commit 3a4f5815b3c65b131bf513aa089f0f5d8d83dc57
Author: Jeroen Demeyer <jdemeyer@cage.ugent.be>
Date: Tue Jan 12 15:30:48 2016 +0100
Return final character in gp_read_str_multiline()
diff --git a/doc/usersch4.tex b/doc/usersch4.tex
index 719e512..a2a1d4c 100644
--- a/doc/usersch4.tex
+++ b/doc/usersch4.tex
@@ -1702,7 +1702,7 @@ There are two similar functions available to parse a string:
\fun{GEN}{gp_read_str}{const char *s}\label{se:gp_read_str}
-\fun{GEN}{gp_read_str_multiline}{const char *s}
+\fun{GEN}{gp_read_str_multiline}{const char *s, char *last}
\noindent
Both functions read the whole string \kbd{s}. The function
@@ -1714,6 +1714,12 @@ same way as the GP command \tet{read}: newlines are significant and can
be used to separate expressions.
The return value is that of the last non-empty expression evaluated.
+In \kbd{gp\_read\_str\_multiline}, if \kbd{last} is non-\kbd{NULL},
+then \kbd{*last} receives the last character from the \emph{filtered}
+input: this can be used to check if the last character was a semi-colon
+(to hide the output in interactive usage). If (and only if) the
+input contains no statements, then \kbd{*last} is set to \kbd{0}.
+
For both functions, \kbd{gp}'s metacommands \emph{are} recognized.
\misctitle{Note} The obsolete form
diff --git a/src/headers/paridecl.h b/src/headers/paridecl.h
index 070b1c5..4cfbe5b 100644
--- a/src/headers/paridecl.h
+++ b/src/headers/paridecl.h
@@ -2511,7 +2511,7 @@ void err_flush(void);
void err_printf(const char* pat, ...);
GEN gp_getenv(const char *s);
GEN gp_read_file(const char *s);
-GEN gp_read_str_multiline(const char *s);
+GEN gp_read_str_multiline(const char *s, char *last);
GEN gp_read_stream(FILE *f);
GEN gp_readvec_file(char *s);
GEN gp_readvec_stream(FILE *f);
diff --git a/src/language/es.c b/src/language/es.c
index 3c7a5e9..871f50b 100644
--- a/src/language/es.c
+++ b/src/language/es.c
@@ -262,15 +262,22 @@ gp_read_stream(FILE *fi)
}
static GEN
-gp_read_from_input(input_method* IM, int loop)
+gp_read_from_input(input_method* IM, int loop, char *last)
{
Buffer *b = new_buffer();
GEN x = gnil;
filtre_t F;
+ if (last) *last = 0;
do {
+ char *s;
init_filtre(&F, b);
if (!input_loop(&F, IM)) break;
- if (*(b->buf)) x = readseq(b->buf);
+ s = b->buf;
+ if (s[0])
+ {
+ x = readseq(s);
+ if (last) *last = s[strlen(s) - 1];
+ }
} while (loop);
delete_buffer(b);
return x;
@@ -320,7 +327,7 @@ string_gets(char *s, int size, const char **ptr)
}
GEN
-gp_read_str_multiline(const char *s)
+gp_read_str_multiline(const char *s, char *last)
{
input_method IM;
const char *ptr = s;
@@ -330,7 +337,7 @@ gp_read_str_multiline(const char *s)
IM.getline = &file_input;
IM.free = 0;
- return gp_read_from_input(&IM, 1);
+ return gp_read_from_input(&IM, 1, last);
}
GEN