/*\r
* AcessOS Shell Version 3\r
*/\r
-#define USE_READLINE 0\r
+#define USE_READLINE 1\r
#include <acess/sys.h>\r
#include <stdlib.h>\r
#include <stdio.h>\r
#if !USE_READLINE\r
int bCached = 1;\r
#else\r
- tReadline readline_state = {0};\r
- #endif\r
- \r
- #if USE_READLINE\r
- readline_state.UseHistory = 1;\r
+ tReadline *readline_state = Readline_Init(1);\r
#endif\r
\r
gasEnvironment = envp;\r
}\r
} \r
\r
- write(_stdout, 22, "Acess Shell Version 3\n");\r
- write(_stdout, 2, "\n");\r
+ printf("Acess Shell Version 3\n\n");\r
for(;;)\r
{\r
// Free last command & arguments\r
bCached = 0;\r
#endif\r
\r
- write(_stdout, strlen(gsCurrentDirectory), gsCurrentDirectory);\r
- write(_stdout, 2, "$ ");\r
+ printf("%s$ ", gsCurrentDirectory);\r
\r
// Read Command line\r
#if USE_READLINE\r
- sCommandStr = Readline( &readline_state );\r
+ sCommandStr = Readline( readline_state );\r
+ printf("\n");\r
length = strlen(sCommandStr);\r
#else\r
sCommandStr = ReadCommandLine( &length );\r
\r
if(!sCommandStr) {\r
- write(_stdout, 25, "PANIC: Out of heap space\n");\r
+ printf("PANIC: Out of heap space\n");\r
return -1;\r
}\r
\r
}\r
}\r
\r
+#if !USE_READLINE\r
/**\r
* \fn char *ReadCommandLine(int *Length)\r
* \brief Read from the command line\r
\r
// Read In Command Line\r
do {\r
- read(_stdin, 1, &ch); // Read Character from stdin (read is a blocking call)\r
- \r
+ ch = getchar(); // Read Character from stdin (read is a blocking call)\r
if(ch == '\n') break;\r
\r
switch(ch)\r
{\r
// Control characters\r
case '\x1B':\r
- read(_stdin, 1, &ch); // Read control character\r
+ ch = getchar(); // Read control character\r
switch(ch)\r
{\r
//case 'D': if(pos) pos--; break;\r
//case 'C': if(pos<len) pos++; break;\r
case '[':\r
- read(_stdin, 1, &ch); // Read control character\r
+ ch = getchar(); // Read control character\r
switch(ch)\r
{\r
#if 0\r
ret = strdup( gasCommandHistory[--scrollbackPos] );\r
\r
len = strlen(ret);\r
- while(pos--) write(_stdout, 3, "\x1B[D");\r
+ while(pos--) printf("\x1B[D");\r
write(_stdout, len, ret); pos = len;\r
while(pos++ < oldLen) write(_stdout, 1, " ");\r
}\r
case 'D': // Left\r
if(pos == 0) break;\r
pos --;\r
- write(_stdout, 3, "\x1B[D");\r
+ printf("\x1B[D");\r
break;\r
case 'C': // Right\r
if(pos == len) break;\r
pos++;\r
- write(_stdout, 3, "\x1B[C");\r
+ printf("\x1B[C");\r
break;\r
}\r
}\r
// Backspace\r
case '\b':\r
if(len <= 0) break; // Protect against underflows\r
- write(_stdout, 1, &ch);\r
+ putchar(ch);\r
if(pos == len) { // Simple case of end of string\r
len --;\r
pos--;\r
}\r
else {\r
- char buf[7] = "\x1B[000D";\r
- buf[2] += ((len-pos+1)/100) % 10;\r
- buf[3] += ((len-pos+1)/10) % 10;\r
- buf[4] += (len-pos+1) % 10;\r
- write(_stdout, len-pos, &ret[pos]); // Move Text\r
- ch = ' '; write(_stdout, 1, &ch); ch = '\b'; // Clear deleted character\r
- write(_stdout, 7, buf); // Update Cursor\r
+ printf("%.*s ", len-pos, &ret[pos]); // Move Text\r
+ printf("\x1B[%iD", len-pos+1);\r
// Alter Buffer\r
memmove(&ret[pos-1], &ret[pos], len-pos);\r
pos --;\r
\r
// Editing inside the buffer\r
if(pos != len) {\r
- char buf[7] = "\x1B[000D";\r
- buf[2] += ((len-pos)/100) % 10;\r
- buf[3] += ((len-pos)/10) % 10;\r
- buf[4] += (len-pos) % 10;\r
- write(_stdout, 1, &ch); // Print new character\r
- write(_stdout, len-pos, &ret[pos]); // Move Text\r
- write(_stdout, 7, buf); // Update Cursor\r
+ putchar(ch); // Print new character\r
+ printf("%.*s", len-pos, &ret[pos]); // Move Text\r
+ printf("\x1B[%iD", len-pos);\r
memmove( &ret[pos+1], &ret[pos], len-pos );\r
}\r
else {\r
- write(_stdout, 1, &ch);\r
+ putchar(ch);\r
}\r
ret[pos++] = ch;\r
len ++;\r
\r
return ret;\r
}\r
+#endif\r
\r
/**\r
* \fn void Parse_Args(char *str, char **dest)\r
\r
if(buf == NULL) {\r
dest[0] = NULL;\r
- Print("Parse_Args: Out of heap space!\n");\r
+ printf("Parse_Args: Out of heap space!\n");\r
return ;\r
}\r
\r
// Check file existence\r
fd = open(sTmpBuffer, OPENFLAG_EXEC);\r
if(fd == -1) {\r
- Print("Unknown Command: `");Print(Args[0]);Print("'\n"); // Error Message\r
+ printf("Unknown Command: `%s'\n", Args[0]); // Error Message\r
return ;\r
}\r
\r
\r
// Check if the file is a directory\r
if(info.flags & FILEFLAG_DIRECTORY) {\r
- Print("`");Print(sTmpBuffer); // Error Message\r
- Print("' is a directory.\n");\r
+ printf("`%s' is a directory.\n", sTmpBuffer);\r
return ;\r
}\r
}\r
\r
// Exhausted path directories\r
if( i == giNumPathDirs ) {\r
- Print("Unknown Command: `");Print(exefile);Print("'\n");\r
+ printf("Unknown Command: `%s'\n", exefile);\r
return ;\r
}\r
}\r
if(pid == 0)\r
execve(sTmpBuffer, Args, gasEnvironment);\r
if(pid <= 0) {\r
- Print("Unablt to create process: `");Print(sTmpBuffer);Print("'\n"); // Error Message\r
+ printf("Unable to create process: `%s'\n", sTmpBuffer); // Error Message\r
}\r
else {\r
int status;\r
*/\r
void Command_Help(int argc, char **argv)\r
{\r
- Print("Acess 2 Command Line Interface\n");\r
- Print(" By John Hodge (thePowersGang / [TPG])\n");\r
- Print("\n");\r
- Print("Builtin Commands:\n");\r
- Print(" logout: Return to the login prompt\n");\r
- Print(" exit: Same\n");\r
- Print(" help: Display this message\n");\r
- Print(" clear: Clear the screen\n");\r
- Print(" cd: Change the current directory\n");\r
- Print(" dir: Print the contents of the current directory\n");\r
- //Print("\n");\r
+ printf( "Acess 2 Command Line Interface\n"\r
+ " By John Hodge (thePowersGang / [TPG])\n"\r
+ "\n"\r
+ "Builtin Commands:\n"\r
+ " logout: Return to the login prompt\n"\r
+ " exit: Same\n"\r
+ " help: Display this message\n"\r
+ " clear: Clear the screen\n"\r
+ " cd: Change the current directory\n"\r
+ " dir: Print the contents of the current directory\n");\r
return;\r
}\r
\r
*/\r
void Command_Clear(int argc, char **argv)\r
{\r
- write(_stdout, 4, "\x1B[2J"); //Clear Screen\r
+ write(_stdout, "\x1B[2J", 4); //Clear Screen\r
}\r
\r
/**\r
\r
if(argc < 2)\r
{\r
- Print(gsCurrentDirectory);Print("\n");\r
+ printf("%s\n", gsCurrentDirectory);\r
return;\r
}\r
\r
\r
fp = open(tmpPath, 0);\r
if(fp == -1) {\r
- write(_stdout, 26, "Directory does not exist\n");\r
+ printf("Directory does not exist\n");\r
return;\r
}\r
finfo(fp, &stats, 0);\r
close(fp);\r
\r
if( !(stats.flags & FILEFLAG_DIRECTORY) ) {\r
- write(_stdout, 17, "Not a Directory\n");\r
+ printf("Not a Directory\n");\r
return;\r
}\r
\r
if( finfo(dp, &info, 0) == -1 )\r
{\r
close(dp);\r
- write(_stdout, 34, "stat Failed, Bad File Descriptor\n");\r
+ printf("stat Failed, Bad File Descriptor\n");\r
return;\r
}\r
// Check if it's a directory\r
if(!(info.flags & FILEFLAG_DIRECTORY))\r
{\r
close(dp);\r
- write(_stdout, 27, "Unable to open directory `");\r
- write(_stdout, strlen(tmpPath)+1, tmpPath);\r
- write(_stdout, 20, "', Not a directory\n");\r
+ printf("Unable to open directory `%s', Not a directory\n", tmpPath);\r
return;\r
}\r
\r
if(fp < 0)\r
{\r
if(fp == -3)\r
- write(_stdout, 42, "Invalid Permissions to traverse directory\n");\r
+ printf("Invalid Permissions to traverse directory\n");\r
break;\r
}\r
// Open File\r
finfo(fp, &info, 0);\r
\r
if(info.flags & FILEFLAG_DIRECTORY)\r
- write(_stdout, 1, "d");\r
+ printf("d");\r
else\r
- write(_stdout, 1, "-");\r
+ printf("-");\r
\r
// Print Mode\r
// - Owner\r
- acl.group = 0; acl.id = info.uid;\r
+ acl.object = info.uid;\r
_SysGetACL(fp, &acl);\r
if(acl.perms & 1) modeStr[0] = 'r'; else modeStr[0] = '-';\r
if(acl.perms & 2) modeStr[1] = 'w'; else modeStr[1] = '-';\r
if(acl.perms & 8) modeStr[2] = 'x'; else modeStr[2] = '-';\r
// - Group\r
- acl.group = 1; acl.id = info.gid;\r
+ acl.object = info.gid | 0x80000000;\r
_SysGetACL(fp, &acl);\r
if(acl.perms & 1) modeStr[3] = 'r'; else modeStr[3] = '-';\r
if(acl.perms & 2) modeStr[4] = 'w'; else modeStr[4] = '-';\r
if(acl.perms & 8) modeStr[5] = 'x'; else modeStr[5] = '-';\r
// - World\r
- acl.group = 1; acl.id = -1;\r
+ acl.object = 0xFFFFFFFF;\r
_SysGetACL(fp, &acl);\r
if(acl.perms & 1) modeStr[6] = 'r'; else modeStr[6] = '-';\r
if(acl.perms & 2) modeStr[7] = 'w'; else modeStr[7] = '-';\r
if(acl.perms & 8) modeStr[8] = 'x'; else modeStr[8] = '-';\r
- write(_stdout, 10, modeStr);\r
+ printf(modeStr);\r
close(fp);\r
\r
// Colour Code\r
if(info.flags & FILEFLAG_DIRECTORY) // Directory: Green\r
- write(_stdout, 6, "\x1B[32m");\r
+ printf("\x1B[32m");\r
// Default: White\r
\r
// Print Name\r
- write(_stdout, strlen(fileName), fileName);\r
+ printf("%s", fileName);\r
\r
// Print slash if applicable\r
if(info.flags & FILEFLAG_DIRECTORY)\r
- write(_stdout, 1, "/");\r
+ printf("/");\r
\r
// Revert Colour\r
- write(_stdout, 6, "\x1B[37m");\r
+ printf("\x1B[37m");\r
\r
// Newline!\r
- write(_stdout, 1, "\n");\r
+ printf("\n");\r
}\r
// Close Directory\r
close(dp);\r