1 #include "cmdlinelib.h"
2 #include <gpxe/command.h>
3 #include <gpxe/tables.h>
9 static struct command cmd_start[0] __table_start ( commands );
10 static struct command cmd_end[0] __table_end ( commands );
12 void cmdl_setgetchar(cmd_line* cmd, cmdl_getchar_t in)
17 void cmdl_setputchar(cmd_line* cmd, cmdl_putchar_t in)
22 void cmdl_setprintf(cmd_line* cmd, cmdl_printf_t in)
27 int cmdl_getexit(cmd_line* cmd)
29 if(cmdl_check(cmd) && !cmd->exit){
37 void cmdl_setexit(cmd_line* cmd, int exit)
44 int cmdl_printf(cmd_line* cmd, const char *format, ...)
47 char string[CMDL_BUFFER_SIZE];
51 ret = vsprintf(string, format, ap);
52 cmdl_addstr(cmd, string);
57 void cmdl_addstr(cmd_line* cmd, char* str)
60 for(i = 0; i < strlen(str); i++){
61 cmdl_addchar(cmd, str[i]);
65 void cmdl_setpropmt(cmd_line* cmd, char prompt[CMDL_PROMPT_SIZE])
67 if(cmdl_check(cmd) && prompt != NULL){
68 strncat(cmd->prompt, prompt, CMDL_PROMPT_SIZE);
72 char *cmdl_getprompt(cmd_line* cmd)
81 char* cmdl_getbuffer(cmd_line* cmd){
89 void cmdl_enterloop(cmd_line* cmd)
91 while(!cmdl_getexit(cmd)){
93 cmd->printf("%s %s", cmd->prompt, cmd->buffer);
96 // cmd->printf("Got %d\n", cmd->getchar());
97 cmdl_parsechar(cmd, cmd->getchar());
101 void cmdl_addreplace(cmd_line* cmd, char in)
103 if(cmd->cursor < CMDL_BUFFER_SIZE - 2){
104 cmd->buffer[cmd->cursor] = in;
106 cmd->putchar((int)in);
110 void cmdl_addinsert(cmd_line* cmd, char in)
114 if(cmd->cursor < CMDL_BUFFER_SIZE - 2 && cmd->cursor >= 0){
115 if(strlen(cmd->buffer) < CMDL_BUFFER_SIZE - 2){
116 to = strlen(cmd->buffer);
118 to = CMDL_BUFFER_SIZE - 2;
120 for(i=to; i > cmd->cursor; i--){
121 cmd->buffer[i] = cmd->buffer[i-1];
123 cmd->buffer[cmd->cursor] = in;
125 for(i=cmd->cursor; i < to; i++){
126 cmd->putchar(cmd->buffer[i]);
129 for(i=cmd->cursor; i < to - 1; i++){
130 cmd->putchar(CMDLK_BS);
133 //cmdl_movecursor(cmd, CMDL_RIGHT);
137 void cmdl_addchar(cmd_line* cmd, char in){
139 cmdl_addinsert(cmd, in);
141 cmdl_addreplace(cmd, in);
145 void cmdl_parsechar(cmd_line* cmd, char in)
149 cmdl_addchar(cmd, in);
153 if(cmdl_movecursor(cmd, CMDL_LEFT)){
160 system ( cmd->buffer );
161 cmdl_clearbuffer(cmd);
166 cmdl_movecursor(cmd, CMDL_LEFT);
170 //cmdl_movecursor(cmd, CMDL_RIGHT);
174 cmdl_tabcomplete(cmd);
182 void cmdl_tabcomplete(cmd_line *cmd)
184 struct command *ccmd;
186 char* result[CMDL_MAX_TAB_COMPLETE_RESULT];
188 for ( ccmd = cmd_start ; ccmd < cmd_end ; ccmd++ ) {
189 if(!strncmp(ccmd->name, cmd->buffer, strlen(cmd->buffer))){
190 if(count <= CMDL_MAX_TAB_COMPLETE_RESULT){
191 result[count++] = (char*)(ccmd->name);
198 cmdl_addstr(cmd, (char*)(result[0] + strlen(cmd->buffer)));
200 cmdl_addchar(cmd, ' ');
201 } else if( count > 1 ) {
202 int i, i2, minlen=CMDL_BUFFER_SIZE, same=1;
205 for(i = 0; i < count; i ++) {
206 if(minlen > (int)strlen( result[i] ) ){
207 minlen = strlen(result[i]);
211 if((int)strlen(cmd->buffer) < minlen){
212 for(i = strlen(cmd->buffer); i < minlen; i++){
214 for(i2 = 1; i2 < count; i2 ++) {
215 if(result[i2][i] != last){
221 cmdl_addchar(cmd, last);
229 if(count > 1 && cmd->tabstate > 1){
234 for(i = 0; i < count; i ++){
235 cmd->printf("%s\t", result[i]);
244 void cmdl_clearbuffer(cmd_line* cmd)
249 for(i=0; i < CMDL_BUFFER_SIZE; i++){
255 int cmdl_movecursor(cmd_line* cmd, int direction)
262 cmd->putchar(CMDLK_BS);
268 if(cmd->cursor < CMDL_BUFFER_SIZE - 2){
280 void cmdl_del(cmd_line* cmd)
282 if(cmdl_check(cmd) && cmd->cursor < CMDL_BUFFER_SIZE - 2 && cmd->cursor >= 0){
284 for(i = cmd->cursor; i < (int)strlen(cmd->buffer); i++){
285 cmd->buffer[i] = cmd->buffer[i + 1];
289 cmd->putchar(cmd->buffer[i]);
292 for(i = cmd->cursor; i < (int)strlen(cmd->buffer) + 1; i++){
293 cmd->putchar(CMDLK_BS);
299 int cmdl_check(cmd_line* cmd)
303 cmd->buffer != NULL &&
304 cmd->prompt != NULL &&
306 cmd->cursor < CMDL_BUFFER_SIZE - 1 &&
307 cmd->buffer[CMDL_BUFFER_SIZE - 1] == 0 &&
308 cmd->prompt[CMDL_PROMPT_SIZE - 1] == 0
316 cmd_line* cmdl_create()
321 /* Initiate the command line */
323 this = (cmd_line*)malloc(sizeof(cmd_line));
330 /* Allocate output buffer */
332 /*this->output = (char*)malloc(CMDL_OUTPUT_SIZE);
333 if(this->output == NULL){
338 /* for(i = 0; i < CMDL_OUTPUT_SIZE; i++){
342 /* Allocate command line buffer */
344 this->buffer = (char*)malloc(CMDL_BUFFER_SIZE);
345 if(this->buffer == NULL){
350 for(i = 0; i < CMDL_BUFFER_SIZE; i++){
354 /* Allocate prompt buffer */
356 this->prompt = (char*)malloc(CMDL_PROMPT_SIZE);
357 if(this->prompt == NULL){
362 for(i = 0; i < CMDL_PROMPT_SIZE; i++){
366 /* Initiate cursor position etc.*/
369 //this->has_output = 0;
375 /* set callbacks to NULL */
377 this->getchar = NULL;
378 this->putchar = NULL;
381 /* List the commands */
385 printf ( "Available commands: ");
386 for ( cmd = cmd_start ; cmd < cmd_end ; cmd++ ) {
387 printf("%s ", cmd->name);
394 void cmdl_free(cmd_line* cmd)