* [PATCH] normal/cmdline.c : history contains empty lines
@ 2004-12-14 7:08 Vincent Pelletier
2004-12-19 15:15 ` Yoshinori K. Okuji
2004-12-29 19:31 ` Marco Gerards
0 siblings, 2 replies; 7+ messages in thread
From: Vincent Pelletier @ 2004-12-14 7:08 UTC (permalink / raw)
To: Grub-devel
[-- Attachment #1.1: Type: text/plain, Size: 382 bytes --]
Hi.
Here is my first patch to grub2 :) .
Changelog :
2004-12-13 Vincent Pelletier <subdino2004@yahoo.fr>
* grub_history_get : doesn't add empty lines, exits if called with NULL
argument
* grub_cmdline_get : command is added to history after user hit
"return", when pressing "down" arrow when on the most recent item in
history an empty line is shown
Vincent "Subdino" Pelletier
[-- Attachment #1.2: normal_cmdline_history_fixes.diff --]
[-- Type: text/plain, Size: 2646 bytes --]
Index: cmdline.c
===================================================================
RCS file: /cvsroot/grub/grub2/normal/cmdline.c,v
retrieving revision 1.10
diff -p -u -r1.10 cmdline.c
--- cmdline.c 13 Dec 2004 17:26:17 -0000 1.10
+++ cmdline.c 13 Dec 2004 22:35:46 -0000
@@ -102,26 +102,30 @@ grub_history_get (int pos)
static void
grub_history_add (char *s)
{
- /* Remove the oldest entry in the history to make room for a new
- entry. */
- if (hist_used + 1 > hist_size)
- {
- hist_end--;
- if (hist_end < 0)
- hist_end = hist_size + hist_end;
+ /* avoid inserting empty lines & protect from mistakes */
+ if(s && grub_strlen(s))
+ {
+ /* Remove the oldest entry in the history to make room for a new
+ entry. */
+ if (hist_used + 1 > hist_size)
+ {
+ hist_end--;
+ if (hist_end < 0)
+ hist_end = hist_size + hist_end;
- grub_free (hist_lines[hist_end]);
- }
- else
- hist_used++;
+ grub_free (hist_lines[hist_end]);
+ }
+ else
+ hist_used++;
- /* Move to the next position. */
- hist_pos--;
- if (hist_pos < 0)
- hist_pos = hist_size + hist_pos;
+ /* Move to the next position. */
+ hist_pos--;
+ if (hist_pos < 0)
+ hist_pos = hist_size + hist_pos;
- /* Insert into history. */
- hist_lines[hist_pos] = grub_strdup (s);
+ /* Insert into history. */
+ hist_lines[hist_pos] = grub_strdup (s);
+ }
}
/* Replace the history entry on position POS with the string S. */
@@ -475,6 +479,7 @@ grub_cmdline_get (const char *prompt, ch
auto void cl_delete (unsigned len);
auto void cl_print (int pos, int c);
auto void cl_set_pos (void);
+ const char empty_line[] = "";
void cl_set_pos (void)
{
@@ -556,8 +561,6 @@ grub_cmdline_get (const char *prompt, ch
cl_insert (cmdline);
- grub_history_add (buf);
-
while ((key = GRUB_TERM_ASCII_CHAR (grub_getkey ())) != '\n' && key != '\r')
{
if (readline)
@@ -640,12 +643,16 @@ grub_cmdline_get (const char *prompt, ch
lpos = 0;
+ cl_delete (llen);
if (histpos > 0)
- histpos--;
+ {
+ histpos--;
+ hist = grub_history_get (histpos);
+ }
+ else
+ hist = empty_line;
- cl_delete (llen);
- hist = grub_history_get (histpos);
- cl_insert (hist);
+ cl_insert (hist);
break;
}
@@ -726,6 +733,7 @@ grub_cmdline_get (const char *prompt, ch
grub_history_replace (histpos, buf);
}
+ grub_history_add (buf);
grub_putchar ('\n');
grub_refresh ();
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 256 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH] normal/cmdline.c : history contains empty lines
2004-12-14 7:08 [PATCH] normal/cmdline.c : history contains empty lines Vincent Pelletier
@ 2004-12-19 15:15 ` Yoshinori K. Okuji
2004-12-19 15:46 ` Vincent Pelletier
2004-12-29 19:31 ` Marco Gerards
1 sibling, 1 reply; 7+ messages in thread
From: Yoshinori K. Okuji @ 2004-12-19 15:15 UTC (permalink / raw)
To: The development of GRUB 2
On Tuesday 14 December 2004 08:08, Vincent Pelletier wrote:
> 2004-12-13 Vincent Pelletier <subdino2004@yahoo.fr>
> * grub_history_get : doesn't add empty lines, exits if called with
> NULL argument
> * grub_cmdline_get : command is added to history after user hit
> "return", when pressing "down" arrow when on the most recent item in
> history an empty line is shown
I agree that empty lines should not be added into the history, but I
don't think it is a good idea to show an empty line when you go down
the history. Because I really like to have compatibility with BASH.
I don't know how the current implementation behaves very well, but it
should work in the same way as GRUB legacy. It should be like this:
PROMPT HISTORY
grub> []
foo[RET]
grub> ["foo"]
bar[RET]
grub> ["foo", "bar"]
[RET]
grub> ["foo", "bar"]
[C-p]
grub> bar ["foo", "bar"]
[C-n]
grub> ["foo", "bar"]
[C-p]
grub> bar ["foo", "bar"]
baz[RET]
grub> ["foo", "bar", "barbaz"]
Okuji
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] normal/cmdline.c : history contains empty lines
2004-12-19 15:15 ` Yoshinori K. Okuji
@ 2004-12-19 15:46 ` Vincent Pelletier
2004-12-19 15:59 ` Yoshinori K. Okuji
0 siblings, 1 reply; 7+ messages in thread
From: Vincent Pelletier @ 2004-12-19 15:46 UTC (permalink / raw)
To: The development of GRUB 2
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Yoshinori K. Okuji a écrit :
| I agree that empty lines should not be added into the history, but I
| don't think it is a good idea to show an empty line when you go down
| the history. Because I really like to have compatibility with BASH.
I meant not to add the empty line to the history, but to clear the line :
PROMPT HISTORY
grub> barbaz ["foo", "bar", "barbaz"]
[C-n]
grub> ["foo", "bar", "barbaz"]
Last time I tried that before modifying cmdline.c , the last line was
still displayed in front of the prompt, IIRC.
Vincent Pelletier
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org
iD8DBQFBxaJIFEQoKRQyjtURAkp9AJ46NW87th/7ZVc3cj4oteaotSisRQCdGGzq
qFzY3psuiW/At4/t6Likla8=
=Becq
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] normal/cmdline.c : history contains empty lines
2004-12-14 7:08 [PATCH] normal/cmdline.c : history contains empty lines Vincent Pelletier
2004-12-19 15:15 ` Yoshinori K. Okuji
@ 2004-12-29 19:31 ` Marco Gerards
2004-12-29 19:49 ` Vincent Pelletier
1 sibling, 1 reply; 7+ messages in thread
From: Marco Gerards @ 2004-12-29 19:31 UTC (permalink / raw)
To: The development of GRUB 2
Vincent Pelletier <subdino2004@yahoo.fr> writes:
> Hi.
> Here is my first patch to grub2 :) .
Thanks. :)
> Changelog :
>
> 2004-12-13 Vincent Pelletier <subdino2004@yahoo.fr>
> * grub_history_get : doesn't add empty lines, exits if called with NULL
> argument
> * grub_cmdline_get : command is added to history after user hit
> "return", when pressing "down" arrow when on the most recent item in
> history an empty line is shown
>
> Vincent "Subdino" Pelletier
Your patch was kinda hard to comprehend, especially because you
rewrote grub_history_add. And unfortunately it caused a segfault
here. :/
The main problem was in the logic of the history code. I should be
terribly ashamed for doing it wrong like this in the first place. I
made a fix to change the logic there, instead of in grub_history_add.
In the meanwhile I made it work just like bash, like Okuji requested.
Vincent, does this patch solve your problem? I will commit it soon.
Thanks,
Marco
2004-12-29 Marco Gerards <metgerards@student.han.nl>
* normal/cmdline.c (grub_cmdline_get): Redone logic so no empty
lines are inserted and make it work like readline. Reported by
Vincent Pelletier <subdino2004@yahoo.fr>.
Index: normal/cmdline.c
===================================================================
RCS file: /cvsroot/grub/grub2/normal/cmdline.c,v
retrieving revision 1.10
diff -u -p -u -p -r1.10 cmdline.c
--- normal/cmdline.c 13 Dec 2004 17:26:17 -0000 1.10
+++ normal/cmdline.c 29 Dec 2004 19:19:03 -0000
@@ -556,7 +556,8 @@ grub_cmdline_get (const char *prompt, ch
cl_insert (cmdline);
- grub_history_add (buf);
+ if (hist_used == 0)
+ grub_history_add (buf);
while ((key = GRUB_TERM_ASCII_CHAR (grub_getkey ())) != '\n' && key != '\r')
{
@@ -641,7 +642,10 @@ grub_cmdline_get (const char *prompt, ch
lpos = 0;
if (histpos > 0)
- histpos--;
+ {
+ grub_history_replace (histpos, buf);
+ histpos--;
+ }
cl_delete (llen);
hist = grub_history_get (histpos);
@@ -656,7 +660,10 @@ grub_cmdline_get (const char *prompt, ch
lpos = 0;
if (histpos < hist_used - 1)
- histpos++;
+ {
+ grub_history_replace (histpos, buf);
+ histpos++;
+ }
cl_delete (llen);
hist = grub_history_get (histpos);
@@ -723,8 +730,6 @@ grub_cmdline_get (const char *prompt, ch
}
break;
}
-
- grub_history_replace (histpos, buf);
}
grub_putchar ('\n');
@@ -736,6 +741,13 @@ grub_cmdline_get (const char *prompt, ch
while (buf[lpos] == ' ')
lpos++;
+ histpos = 0;
+ if (grub_strlen (buf) > 0)
+ {
+ grub_history_replace (histpos, buf);
+ grub_history_add ("");
+ }
+
grub_memcpy (cmdline, buf + lpos, llen - lpos + 1);
return 1;
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH] normal/cmdline.c : history contains empty lines
2004-12-29 19:31 ` Marco Gerards
@ 2004-12-29 19:49 ` Vincent Pelletier
2004-12-29 21:06 ` Marco Gerards
0 siblings, 1 reply; 7+ messages in thread
From: Vincent Pelletier @ 2004-12-29 19:49 UTC (permalink / raw)
To: The development of GRUB 2
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Marco Gerards a ?crit :
| Your patch was kinda hard to comprehend, especially because you
| rewrote grub_history_add. And unfortunately it caused a segfault
| here. :/
|
| The main problem was in the logic of the history code. I should be
| terribly ashamed for doing it wrong like this in the first place. I
| made a fix to change the logic there, instead of in grub_history_add.
| In the meanwhile I made it work just like bash, like Okuji requested.
|
| Vincent, does this patch solve your problem? I will commit it soon.
|
| Thanks,
| Marco
|
| 2004-12-29 Marco Gerards <metgerards@student.han.nl>
|
| * normal/cmdline.c (grub_cmdline_get): Redone logic so no empty
| lines are inserted and make it work like readline. Reported by
| Vincent Pelletier <subdino2004@yahoo.fr>.
Nice for the grub_history_replace, I missed that function and was trying
to rewrite it (I was redesigning the patch according to Okuji's requests).
I don't understand how the changes I made on grub_history_add could made
it segfault, as I only checks for null pointer and empty string (to
prevent adding an empty line or - ironically - to prevent it from
segfaulting when duplicating an invalid buffer). The empty string could
be checked using a buf[0]==0 instead of calling grub_strlen as I did
(faster, but maybe less portable in case of wide chars).
grub_history_add should be moved after the while loop too.
The use of "empty_line" was only a dirty hack, I should have 0-ed the
first char of hist instead.
Vincent Pelletier
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org
iD8DBQFB0wpSFEQoKRQyjtURAsekAJ0QEuqGVGEDwa5J14t9tCoejHFUiwCgnVGl
XqsCAjSJpxbDY2C0PeC8BKE=
=d/Hc
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2004-12-29 21:21 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-12-14 7:08 [PATCH] normal/cmdline.c : history contains empty lines Vincent Pelletier
2004-12-19 15:15 ` Yoshinori K. Okuji
2004-12-19 15:46 ` Vincent Pelletier
2004-12-19 15:59 ` Yoshinori K. Okuji
2004-12-29 19:31 ` Marco Gerards
2004-12-29 19:49 ` Vincent Pelletier
2004-12-29 21:06 ` Marco Gerards
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.