X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2FCLIShell_src%2Fmain.c;h=579df881d8636023058b797d18b821d5a283ba93;hb=45f9a29e481ce9ea7ca7121541f0e0f90147f5b1;hp=d6c40d65a4db47e3ffb24e7c8a680bf73839d4ac;hpb=466eda7c917791866a29c253c6c22197faf41bf7;p=tpg%2Facess2.git diff --git a/Usermode/Applications/CLIShell_src/main.c b/Usermode/Applications/CLIShell_src/main.c index d6c40d65..579df881 100644 --- a/Usermode/Applications/CLIShell_src/main.c +++ b/Usermode/Applications/CLIShell_src/main.c @@ -1,12 +1,17 @@ /* * AcessOS Shell Version 3 */ +#define USE_READLINE 0 #include #include #include #include #include "header.h" +#if USE_READLINE +# include "readline.h" +#endif + #define _stdin 0 #define _stdout 1 #define _stderr 2 @@ -51,7 +56,15 @@ int main(int argc, char *argv[], char *envp[]) int length = 0; int i; int iArgCount = 0; + #if !USE_READLINE int bCached = 1; + #else + tReadline readline_state = {0}; + #endif + + #if USE_READLINE + readline_state.UseHistory = 1; + #endif gasEnvironment = envp; @@ -74,13 +87,19 @@ int main(int argc, char *argv[], char *envp[]) { // Free last command & arguments if(saArgs[0]) free(saArgs); + #if !USE_READLINE if(!bCached) free(sCommandStr); bCached = 0; + #endif write(_stdout, strlen(gsCurrentDirectory), gsCurrentDirectory); write(_stdout, 2, "$ "); // Read Command line + #if USE_READLINE + sCommandStr = Readline( &readline_state ); + length = strlen(sCommandStr); + #else sCommandStr = ReadCommandLine( &length ); if(!sCommandStr) { @@ -99,6 +118,7 @@ int main(int argc, char *argv[], char *envp[]) gasCommandHistory[ giLastCommand ] = sCommandStr; bCached = 1; } + #endif // Parse Command Line into arguments Parse_Args(sCommandStr, saArgs); @@ -123,6 +143,10 @@ int main(int argc, char *argv[], char *envp[]) // Shall we? CallCommand( &saArgs[1] ); + + #if USE_READLINE + free( sCommandStr ); + #endif } } @@ -135,7 +159,9 @@ char *ReadCommandLine(int *Length) char *ret; int len, pos, space = 1023; char ch; - // int scrollbackPos = giLastCommand; + #if 0 + int scrollbackPos = giLastCommand; + #endif // Preset Variables ret = malloc( space+1 ); @@ -145,8 +171,13 @@ char *ReadCommandLine(int *Length) // Read In Command Line do { read(_stdin, 1, &ch); // Read Character from stdin (read is a blocking call) + + if(ch == '\n') break; + + switch(ch) + { // Control characters - if(ch == '\x1B') { + case '\x1B': read(_stdin, 1, &ch); // Read control character switch(ch) { @@ -158,23 +189,32 @@ char *ReadCommandLine(int *Length) { #if 0 case 'A': // Up - if( scrollbackPos > 0 ) break; - - free(ret); - ret = strdup( gasCommandHistory[--scrollbackPos] ); - - len = strlen(ret); - while(pos--) write(_stdout, 3, "\x1B[D"); - while(pos++ < len) write(_stdout, 3, "\x1B[C"); + { + int oldLen = len; + if( scrollbackPos > 0 ) break; + + free(ret); + ret = strdup( gasCommandHistory[--scrollbackPos] ); + + len = strlen(ret); + while(pos--) write(_stdout, 3, "\x1B[D"); + write(_stdout, len, ret); pos = len; + while(pos++ < oldLen) write(_stdout, 1, " "); + } break; case 'B': // Down - if( scrollbackPos < giLastCommand-1 ) break; - free(ret); - ret = strdup( gasCommandHistory[++scrollbackPos] ); - - len = strlen(ret); - while(pos--) write(_stdout, 3, "\x1B[D"); - while(pos++ < len) write(_stdout, 3, "\x1B[C"); + { + int oldLen = len; + if( scrollbackPos < giLastCommand-1 ) break; + + free(ret); + ret = strdup( gasCommandHistory[++scrollbackPos] ); + + len = strlen(ret); + while(pos--) write(_stdout, 3, "\x1B[D"); + write(_stdout, len, ret); pos = len; + while(pos++ < oldLen) write(_stdout, 1, " "); + } break; #endif case 'D': // Left @@ -183,49 +223,74 @@ char *ReadCommandLine(int *Length) write(_stdout, 3, "\x1B[D"); break; case 'C': // Right - if(pos == len-1) break; + if(pos == len) break; pos++; write(_stdout, 3, "\x1B[C"); break; } } - continue; - } + break; + // Backspace - if(ch == '\b') { - if(len <= 0) continue; // Protect against underflows + case '\b': + if(len <= 0) break; // Protect against underflows + write(_stdout, 1, &ch); if(pos == len) { // Simple case of end of string - len --; pos--; - } else { + len --; + pos--; + } + else { + char buf[7] = "\x1B[000D"; + buf[2] += ((len-pos+1)/100) % 10; + buf[3] += ((len-pos+1)/10) % 10; + buf[4] += (len-pos+1) % 10; + write(_stdout, len-pos, &ret[pos]); // Move Text + ch = ' '; write(_stdout, 1, &ch); ch = '\b'; // Clear deleted character + write(_stdout, 7, buf); // Update Cursor + // Alter Buffer memmove(&ret[pos-1], &ret[pos], len-pos); pos --; len --; } - write(_stdout, 1, &ch); - continue; - } + break; + // Tab - if(ch == '\t') { + case '\t': //TODO: Implement Tab-Completion //Currently just ignore tabs - continue; - } + break; - // Expand Buffer - if(len > space) { - space += 256; - ret = realloc(ret, space+1); - if(!ret) return NULL; + default: + // Expand Buffer + if(len+1 > space) { + space += 256; + ret = realloc(ret, space+1); + if(!ret) return NULL; + } + + // Editing inside the buffer + if(pos != len) { + char buf[7] = "\x1B[000D"; + buf[2] += ((len-pos)/100) % 10; + buf[3] += ((len-pos)/10) % 10; + buf[4] += (len-pos) % 10; + write(_stdout, 1, &ch); // Print new character + write(_stdout, len-pos, &ret[pos]); // Move Text + write(_stdout, 7, buf); // Update Cursor + memmove( &ret[pos+1], &ret[pos], len-pos ); + } + else { + write(_stdout, 1, &ch); + } + ret[pos++] = ch; + len ++; + break; } - - write(_stdout, 1, &ch); - ret[pos++] = ch; - len ++; } while(ch != '\n'); - // Remove newline - pos --; - ret[pos] = '\0'; + // Cap String + ret[len] = '\0'; + printf("\n"); // Return length if(Length) *Length = len;