System call sys_getchar () was improved; stdin is correspond with 0. fd and stdout...
[ZeXOS.git] / apps / sh / main.c
blob8d9cb6fa2f829e1a89180c312ac2e684f522127b
1 /*
2 * ZeX/OS
3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
4 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include <stdio.h>
22 #include <string.h>
23 #include <stdlib.h>
24 #include <unistd.h>
26 #define SHELL_VERSION "0.0.2"
28 char *cmdline;
29 int cmdline_len;
31 unsigned key_pressed (int keycode)
33 int scancode = getkey ();
35 if (scancode == keycode)
36 return 1;
38 if (scancode == keycode+128)
39 return 2;
40 else
41 return 0;
44 int init ()
46 cmdline = (char *) malloc (sizeof (char) * 64);
48 if (!cmdline) {
49 printf ("ERROR -> not enough memory !\n");
50 return 0;
53 cmdline_len = 0;
55 return 1;
58 int refresh_cmd ()
60 setcolor (7, 0);
61 printf (" $ ");
62 setcolor (15, 0);
64 return 1;
67 int check_cmd ()
69 if (!cmdline_len)
70 return 1;
72 printf ("\n");
74 /* exit app */
75 if (!strcmp (cmdline, "exit"))
76 return 0;
78 system (cmdline);
80 refresh_cmd ();
82 return 1;
85 int loop ()
87 int ret = 1;
88 unsigned char c;
90 c = getch ();
92 if (c && cmdline_len < 64) {
93 cmdline[cmdline_len] = (char) c;
95 if (c == '\n') {
96 cmdline[cmdline_len] = '\0';
97 ret = check_cmd ();
98 cmdline_len = 0;
99 } else {
100 if (c == '\b') {
101 if (cmdline_len > 0)
102 cmdline_len --;
103 } else
104 cmdline_len ++;
106 if (cmdline_len >= 0)
107 putch (c);
111 schedule ();
113 return ret;
116 int main (int argc, char **argv)
118 printf ("Shell v%s\n", SHELL_VERSION);
120 int ret = init ();
122 refresh_cmd ();
124 while (ret)
125 ret = loop ();
127 printf ("Bye !\n");
129 free (cmdline);
131 return 0;