summaryrefslogtreecommitdiff
path: root/userspace/foolshell.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-23 23:26:26 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-23 23:26:26 +0100
commitec0ba7bc40854eab6a1cdb41364f41f9c11407e1 (patch)
tree88f3896c70ac32bc1b70dcd7ebddbbe595c6608f /userspace/foolshell.c
parent50300fa573bf2bc00f9732e812d54ab77cf03dd7 (diff)
foolshell and syscalls improvememets
Diffstat (limited to 'userspace/foolshell.c')
-rw-r--r--userspace/foolshell.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/userspace/foolshell.c b/userspace/foolshell.c
new file mode 100644
index 0000000..819c5d6
--- /dev/null
+++ b/userspace/foolshell.c
@@ -0,0 +1,151 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+
+//
+void hello()
+{
+ // ascci art: http://patorjk.com/software/taag/#p=testall&f=Cards&t=Fool%20OS
+ puts(
+
+ " ______ __ ____ _____ \n"
+ " / ____/___ ____ / / / __ \\/ ___/ \n"
+ " / /_ / __ \\/ __ \\/ / / / / /\\__ \\ \n"
+ " / __/ / /_/ / /_/ / / / /_/ /___/ / \n"
+ " /_/ \\____/\\____/_/ \\____//____/ \n"
+ " \n"
+ "Welcome to FoolShell v0.2 (Compiled on " __DATE__ " at " __TIME__ "\n"
+ "--------------------------------------------------------------------\n\n"
+ "type 'help' anytime to show shell built-ins\n"
+ "or execute user programms that are in the '/bin' directory (e.g. ls)\n"
+ );
+}
+
+void prompt()
+{
+ printf(
+ "$ "
+ );
+}
+
+int main(int argc, char **argv)
+{
+
+ bool silent=false;
+ for(int i=0;i<argc;i++)
+ {
+ if(!strcmp(argv[i],"--silent"))silent=true;
+ }
+
+ if(!silent)hello();
+
+ char *buf=malloc(256);
+
+ while(1)
+ {
+ prompt();
+ fgets(buf,255,stdin);
+ buf[strlen(buf)-1]=0; // remove \n
+ process(buf);
+ }
+
+ return 0;
+}
+
+char **tokenize(char *buf)
+{
+
+ char **token;
+ token=malloc(10*sizeof(char*));
+
+ int l=strlen(buf);
+
+ int i;
+ int c=0;
+
+ for(i=0;i<l;i++)
+ {
+ // init space for next token
+ token[c]=malloc(256);
+
+ //skip all the whitespace
+ while(buf[i]==' '&&i<l)i++;
+ if(i==l)break;
+
+ //get token
+ int t=0;
+
+ while(buf[i]!=' '&&i<l)
+ {
+ token[c][t]=buf[i];
+ t++;
+ i++;
+ }
+ token[c][t]=0;
+
+
+
+// printf("token %i : <%s>\n",c, token[c]);
+ c++;
+ token[c]=NULL;
+
+ }
+
+ return token;
+
+}
+
+int process(char *buf)
+{
+
+ char **token=tokenize(buf);
+ char *command=token[0];
+ // puts(command);
+ // copied from trottelshell
+
+ if(!strcmp(command,"help"))
+ {
+ puts("foolshell: supported built-in commands: 'help', 'echo [string]', 'malloc [bytes]', 'free [address]', 'getenv [var]', 'putenv [var] [val]'");
+ }
+ else if(!strcmp(command,"echo"))
+ {
+ printf("\"%s\"\n",token[1]);
+
+ }
+ else if(!strcmp(command,"malloc"))
+ {
+ uint8_t *mall=malloc(atoi(token[1]));
+ printf("allocated %d bytes at 0x%08X (%i).\n",atoi(token[1]),mall,mall);
+ }
+ else if(!strcmp(command,"free"))
+ {
+ free(atoi(token[1]));
+ printf("called free(0x%08X).\n",atoi(token[1]));
+ }
+ else if(!strcmp(command,"getenv"))
+ {
+ printf("%s = %s \n",token[1],getenv(token[1]));
+ }
+ else if(!strcmp(command,"putenv"))
+ {
+ char buf[256];
+ sprintf(buf,"%s=%s",token[1],token[2]);
+ putenv(buf);
+ printf("set: %s = %s \n",token[1],getenv(token[1]));
+ }
+ else
+ {
+ execve(token[0],token,0);
+ char buf[256];
+ sprintf(buf,"/bin/%s",token[0]);
+ execve(buf,token,0);
+ puts("foolshell: command not found");
+ }
+
+}
+
+
+
+
+