[gPXE-devel] tab autocompletetion feature
Shao Miller
Shao.Miller at yrdsb.edu.on.ca
Sat Apr 10 12:16:38 EDT 2010
garg vikas wrote:
> hi ........this patch will provide auto-completion on command-line.
> please give me suggestion on this patch.
>
diff -crB gpxe-1.0.0/src/hci/readline.c gpxe-1.0.0.new/src/hci/readline.c
*** gpxe-1.0.0/src/hci/readline.c 2010-02-02 21:42:44.000000000 +0530
--- gpxe-1.0.0.new/src/hci/readline.c 2010-04-06 19:55:23.000000000 +0530
***************
*** 25,30 ****
--- 25,31 ----
#include <gpxe/keys.h>
#include <gpxe/editstring.h>
#include <readline/readline.h>
+ #include <gpxe/command.h>
/** @file
*
***************
*** 86,93 ****
char * readline ( const char *prompt ) {
char buf[READLINE_MAX];
struct edit_string string;
! int key;
char *line;
if ( prompt )
printf ( "%s", prompt );
--- 87,98 ----
char * readline ( const char *prompt ) {
char buf[READLINE_MAX];
struct edit_string string;
! int key,tempkey;
char *line;
+ int counter=0;
+ char *cmd=NULL;
+ struct command *command;
+ unsigned int hpos = 0,ref=0;
if ( prompt )
printf ( "%s", prompt );
***************
*** 98,104 ****
buf[0] = '\0';
while ( 1 ) {
! key = edit_string ( &string, getkey() );
sync_console ( &string );
switch ( key ) {
case CR:
--- 103,153 ----
buf[0] = '\0';
while ( 1 ) {
! tempkey=getkey();
! if(tempkey==TAB)
-----
Throughout this patch, there are portions where the coding style doesn't
match the coding style given in the rest of the file, such as spacing
and indentation. While an aesthetic criticism, it might be something to
consider. Someone reading the code does not have to adapt if the coding
style is consistent.
-----
! {
!
! counter=0;
! for_each_table_entry ( command, COMMANDS )
!
if(!strncmp(string.buf,command->name,strlen(string.buf))){
! counter+=1;
! if(cmd!=NULL)
! free(cmd);
-----
A look at gpxe/src/core/malloc.c suggests that this NULL-check is not
needed.
-----
! cmd=(char*)malloc(sizeof(command->name)+1);
! strcpy(cmd,command->name);}
-----
Are you overwriting random unallocated portions of the heap here?
sizeof(command->name) will give you the sizeof a const char*. Perhaps
you meant strlen()?
-----
!
! if(counter==1 && cmd!=NULL)
! {
! for(ref=strlen(string.buf);ref<strlen(cmd);ref++)
! {
! edit_string ( &string,cmd[ref]);
! sync_console ( &string );
! }
! }
! else{
! printf("\n");
! for_each_table_entry ( command, COMMANDS ) {
!
if(!strncmp(string.buf,command->name,strlen(string.buf)))
! hpos += printf ( " %s", command->name );
!
! if ( hpos > ( 16 * 4 ) ) {
! printf ( "\n" );
! hpos = 0;}
! else {
! while ( hpos % 16 ) {
! printf ( " " );
! hpos++;
! }
! }
! }
! printf("\n");
! printf ( "%s%s", prompt,string.buf);
-----
You could combine these two printf()s.
-----
!
! }
! continue;
! }
!
! key = edit_string ( &string, tempkey);
sync_console ( &string );
switch ( key ) {
case CR:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://etherboot.org/pipermail/gpxe-devel/attachments/20100410/6003eef7/attachment.html
More information about the gPXE-devel
mailing list