NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: PR/46935 CVS commit: src/lib/libedit
Replying to myself, Google has rejected my mail because of
a libedit-test.tar.gz attachment:
|smtp-server: 552-5.7.0 Our system detected an illegal attachment on your
message. Please
|smtp-server: 552-5.7.0 visit
http://support.google.com/mail/bin/answer.py?answer=6590 to
|smtp-server: 552 5.7.0 review our attachment guidelines.
This time attaching the same stuff as a shell archive with
compressed members.
Thanks!
|christos%zoulas.com@localhost (Christos Zoulas) wrote:
|
||On Sep 11, 4:48pm, sdaoden%gmail.com@localhost (Steffen "Daode" Nurpmeso)
wrote:
||-- Subject: Re: PR/46935 CVS commit: src/lib/libedit
||
| [.]
||| What do you think about that?
|
|First i have to say that i hope i have finally encapsulated
|el_errno=0 in el_getc() properly.
|
|And that this iteration was entirely done on NetBSD 6 RC1 using
|a libedit from HEAD (and terminfo from 6).
|
||I like the enum clarity[.]
|
|I've chosen a different name for the enum -- here there was
|a "rcmd" name clash.
|
||[.], but I am not sure about removing the EINTR
|
|Now that read_getcmd() fails with ERRCMD on error only EINTR can
|only be tested inside that conditional. Otherwise my patch would
|still not be complete.
|
||code. I also have to check the EOF logic too. Test it some more, and
|
|I'm pretty sure now that removing the ==-1 case was correct.
|I don't know what it was there for, but effectively it tests
|==OKCMD until now, which is of course wrong (since always true).
|
||I need to find some time here to test it myself. I bit busy since I
|
|I'll attach the super simple test i've used (simply copying over
|FreeBSD sh(1) code less proper buffer handling), including
|a read.c.debug file which pimps up regular read.c by an immense
|amount of debug fprintf(3) statements, which makes it easier to
|prove that this patch is now really correct. (What i hope).
[This is libedit-test.shar now..]
||just came back from vacation...
|
|AH - for us i hope we can go down south soon, and finally finally
|finally..
|And also to were you came from -- i love this fantastic light in
|Greece, and the colours, through it.. It's so beautiful.
|Unbelievable that you left that by choice!!
|[Flabbergasted for a moment]
|
|Hmm. Different to the Colossus of Rhodes the Colossa of New York
|is still standing; even without Norah Jones actually being
|around!!; that that can happen.. But i don't know, i never left
|Europe myself.. An american uncle, that's all. Traffic pollutes
|right.. Solar airplanes maybe, but they are too slow for the
|people.
|
|Anyway. Good to hear that you are recuperated, because i have
|founf two more problems in editline(3) :-)
|
|- UNBUFFERED always appends to the buffer.
| That behaviour is not documented, and i was surprised to detect
| that during testing. Is this really the desired behaviour?
|
|- There is no safety-belt against overflowing the line buffer.
| Wether UNBUFFERED or not, nothing prevents you from that (though
| of course el_gets() reset it upon entry except in the UNBUFFERED
| case), and it is only detected if DEBUG_EDIT is #define'd.
| However, the .limit is actively set in some files which i have
| not looked at yet, so i left that off.
| Maybe a different PR? And how to solve?
|
||christos
|
|'Hope this patch does it!
|Ciao,
|
|--steffen
--- read.c.orig 2012-09-12 23:33:16.000000000 +0200
+++ read.c 2012-09-13 18:47:12.000000000 +0200
@@ -52,13 +52,23 @@ __RCSID("$NetBSD: read.c,v 1.69 2012/09/
#include <limits.h>
#include "el.h"
-#define OKCMD -1 /* must be -1! */
+#ifdef WIDECHAR
+# define SCNV "%ls"
+#else
+# define SCNV "%s"
+#endif
-private int read__fixio(int, int);
-private int read_preread(EditLine *);
-private int read_char(EditLine *, Char *);
-private int read_getcmd(EditLine *, el_action_t *, Char *);
-private void read_pop(c_macro_t *);
+enum cmdstate {
+ OKCMD = -1,
+ EOFCMD = 0,
+ ERRCMD = 1
+};
+
+private int read__fixio(int, int);
+private int read_preread(EditLine *);
+private int read_char(EditLine *, Char *);
+private enum cmdstate read_getcmd(EditLine *, el_action_t *, Char *);
+private void read_pop(c_macro_t *);
/* read_init():
* Initialize the read stuff
@@ -172,9 +182,6 @@ read__fixio(int fd __attribute__((__unus
#endif /* TRY_AGAIN */
return e ? 0 : -1;
- case EINTR:
- return 0;
-
default:
return -1;
}
@@ -233,20 +240,18 @@ FUN(el,push)(EditLine *el, const Char *s
/* read_getcmd():
- * Get next command from the input stream, return OKCMD on success.
+ * Get next command from the input stream.
* Character values > 255 are not looked up in the map, but inserted.
*/
-private int
+private enum cmdstate
read_getcmd(EditLine *el, el_action_t *cmdnum, Char *ch)
{
el_action_t cmd;
int num;
- el->el_errno = 0;
do {
if ((num = FUN(el,getc)(el, ch)) != 1) {/* if EOF or error */
- el->el_errno = num == 0 ? 0 : errno;
- return 0; /* not OKCMD */
+ return (num < 0 ? ERRCMD : EOFCMD);
}
#ifdef KANJI
@@ -318,27 +323,27 @@ read_char(EditLine *el, Char *cp)
size_t cbp = 0;
int bytes = 0;
- again:
el->el_signal->sig_no = 0;
+ again:
while ((num_read = read(el->el_infd, cbuf + cbp, (size_t)1)) == -1) {
int e = errno;
- switch (el->el_signal->sig_no) {
- case SIGCONT:
- FUN(el,set)(el, EL_REFRESH);
- /*FALLTHROUGH*/
- case SIGWINCH:
- sig_set(el);
+ if (e == EINTR) {
+ switch (el->el_signal->sig_no) {
+ case SIGCONT:
+ FUN(el,set)(el, EL_REFRESH);
+ /*FALLTHROUGH*/
+ case SIGWINCH:
+ sig_set(el);
+ el->el_signal->sig_no = 0;
+ goto again;
+ default:
+ break;
+ }
+ } else if (! tried++ && read__fixio(el->el_infd, e) == 0)
goto again;
- default:
- break;
- }
- if (!tried && read__fixio(el->el_infd, e) == 0)
- tried = 1;
- else {
- errno = e;
- *cp = '\0';
- return -1;
- }
+ errno = e;
+ *cp = '\0';
+ return -1;
}
#ifdef WIDECHAR
@@ -394,6 +399,7 @@ FUN(el,getc)(EditLine *el, Char *cp)
{
int num_read;
c_macro_t *ma = &el->el_chared.c_macro;
+ el->el_errno = 0;
terminal__flush(el);
for (;;) {
@@ -437,7 +443,7 @@ FUN(el,getc)(EditLine *el, Char *cp)
*cp = *(char *)(void *)cp;
#endif
#ifdef DEBUG_READ
- (void) fprintf(el->el_errfile, "Got it %c\n", *cp);
+ (void) fprintf(el->el_errfile, "Got <%c> (return %d)\n", *cp, num_read);
#endif /* DEBUG_READ */
return num_read;
}
@@ -570,26 +576,33 @@ FUN(el,gets)(EditLine *el, int *nread)
goto noedit;
}
- for (num = OKCMD; num == OKCMD;) { /* while still editing this
- * line */
+ /* The command drive input loop */
+ for (num = 0;;) {
+ enum cmdstate cmdstate;
#ifdef DEBUG_EDIT
read_debug(el);
#endif /* DEBUG_EDIT */
- /* if EOF or error */
- if ((num = read_getcmd(el, &cmdnum, &ch)) != OKCMD) {
- num = -1;
+ if ((cmdstate = read_getcmd(el, &cmdnum, &ch)) != OKCMD) {
+ if (cmdstate == ERRCMD) {
+ num = -1;
+ if (el->el_errno == EINTR) {
+#ifdef DEBUG_READ
+ (void) fprintf(el->el_errfile,
+ "Return from el_gets due EINTR\n");
+#endif /* DEBUG_READ */
+ el->el_line.buffer[0] = '\0';
+ el->el_line.lastchar =
+ el->el_line.cursor =
+ el->el_line.buffer;
+ break;
+ }
+ }
#ifdef DEBUG_READ
(void) fprintf(el->el_errfile,
"Returning from el_gets %d\n", num);
#endif /* DEBUG_READ */
break;
}
- if (el->el_errno == EINTR) {
- el->el_line.buffer[0] = '\0';
- el->el_line.lastchar =
- el->el_line.cursor = el->el_line.buffer;
- break;
- }
if ((unsigned int)cmdnum >= (unsigned int)el->el_map.nfunc) {
/* BUG CHECK command */
#ifdef DEBUG_EDIT
(void) fprintf(el->el_errfile,
@@ -606,7 +619,7 @@ FUN(el,gets)(EditLine *el, int *nread)
break;
if (b->name)
(void) fprintf(el->el_errfile,
- "Executing %s\n", b->name);
+ "Executing " SCNV "\n", b->name);
else
(void) fprintf(el->el_errfile,
"Error command = %d\n", cmdnum);
@@ -662,16 +675,17 @@ FUN(el,gets)(EditLine *el, int *nread)
continue; /* keep going... */
case CC_EOF: /* end of file typed */
+ cmdstate = EOFCMD;
if ((el->el_flags & UNBUFFERED) == 0)
num = 0;
- else if (num == -1) {
+ else {
*el->el_line.lastchar++ = CONTROL('d');
el->el_line.cursor = el->el_line.lastchar;
- num = 1;
}
break;
case CC_NEWLINE: /* normal end of line */
+ cmdstate = EOFCMD;
num = (int)(el->el_line.lastchar - el->el_line.buffer);
break;
@@ -701,6 +715,8 @@ FUN(el,gets)(EditLine *el, int *nread)
el->el_chared.c_vcmd.action = NOP;
if (el->el_flags & UNBUFFERED)
break;
+ if (cmdstate != OKCMD)
+ break;
}
terminal__flush(el); /* flush any buffered output */
# This is a shell archive. Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file". Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# Archives produced using this implementation of shar may be easily
# examined with the command:
# $ grep '^[^X#]' shell-archive
#
# This archive contains:
# test.c
# read.c.debug
#
echo xx - test.c
sed 's/^X//' << \! | uudecode | gunzip -c -f > "test.c"
Xbegin-base64 664 /dev/stdout
XH4sIAEQKUlAAA3VTXU/bQBB8tn/FNlWQbQwEVX3BSapSAkJyg5SQl1IUXe1LcpJzju7OiFLx37u7
Xlw+XtpEi27Oze7Oze+F7pYuqKSX0pTGnq2F4AKxaalG9wVyp6reQUXpJWAtstELqG3CFmCyVYzgI
XzpIhXBspL6dXkJwhYJ1wqoBiJQxshLFSy2dXPFzOrqe33x6zFqPW1nleYqp5sWnFlHYgq3kldcZn
X9NtnhAdSICph1vOibrTL9oGnWpUhNr4qq4gq4Wsc/gqD4+M/6EFExBijWfgahsRcC6U5RZhlkW7F
XJfjxxAXQpabgeqJwqtZgBZYhvjb4MkJbcqUlJLKCATWgtHIRpT/0HlMg3zU/6sbxE8cVU4UFRJQy
XgPEsz2NsGQPP0XkKnW2Rzo5GwmAI50yq5lY6zExhlM9nY/T4ejQZXaUYRjeCHy/S1NGRFXiWepH1
XIrIipkJWnFoxXwldVtKg0iNvFkV2rUXT25vP+eRrCpzPuqjmojYQZVkMaIcXdLAU+vCBdPmpRB85
X4e8NoSweeLvhYIuQa0vpLHd15HeAJP8nSxufgizCe/AJ/xdwcp6xP1ayzjaNAlwMsSH4teRSnuQB
XJq3lutj8jA5LnAILSHHacbvMu11t7woPhgSdDPxe7Ls73gOvQOJaId8TxV7/sfFBsNjgBXU4QV4a
XXIwB/b7rDtXo3I+m9/Dlbnw/ucsvvMpBF4V6IYNuSZrxcQH97mlih5iX7k3f0YiTckN96MVbJwk6
XOMBt7wT3vMd8An/gJaJvqUucHlGNdI3REPViumG/AUVu08qnBAAA
X====
!
echo xx - read.c.debug
sed 's/^X//' << \! | uudecode | gunzip -c -f > "read.c.debug"
Xbegin-base64 664 /dev/stdout
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
X====
!
exit
Home |
Main Index |
Thread Index |
Old Index