Shell 0.4 from Albom

git-svn-id: svn://kolibrios.org@959 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Kirill Lipatov (Leency) 2008-12-14 11:55:46 +00:00
parent aef7c5284b
commit 939f824d96
36 changed files with 1749 additions and 0 deletions

View File

@ -0,0 +1,5 @@
#SHS
about
echo Type 'help' for help
echo

View File

@ -0,0 +1,39 @@
/// ===========================================================
#include "kolibri.h"
#include "stdlib.h"
#include "string.h"
#include "globals.h"
#include "prototypes.h"
#include "console.c"
#include "cmd_about.c"
#include "cmd_help.c"
#include "cmd_ver.c"
#include "cmd_pwd.c"
#include "cmd_ls.c"
#include "cmd_ps.c"
#include "cmd_kill.c"
#include "cmd_echo.c"
#include "cmd_date.c"
#include "cmd_exit.c"
#include "cmd_cd.c"
#include "cmd_free.c"
#include "cmd_reboot.c"
#include "cmd_mkdir.c"
#include "cmd_rmdir.c"
#include "cmd_rm.c"
#include "cmd_touch.c"
#include "cmd_alias.c"
#include "cmd_more.c"
#include "module_command.c"
#include "module_program.c"
#include "module_script.c"
#include "module_executable.c"
#include "module_alias.c"
/// ===========================================================

View File

@ -0,0 +1,9 @@
void cmd_about()
{
printf("\n\rShell for KolibriOS\n\r");
printf(" version %s\n\r", SHELL_VERSION);
printf("\n\r author: Oleksandr Bogomaz aka Albom");
printf("\n\r e-mail: albom85@yandex.ru");
printf("\n\r site: http://albom06.boom.ru/\n\r\n\r");
}

View File

@ -0,0 +1,17 @@
void cmd_alias(char arg[])
{
int result;
if (NULL == arg)
{
alias_list();
return;
}
result = alias_check(arg);
if ( ( 0 != result ) && ( -1 != result ) )
alias_add(arg);
}

View File

@ -0,0 +1,47 @@
int cmd_cd(char dir[])
{
char temp[256];
unsigned result;
if (NULL == dir)
{
printf(" cd directory\n\r");
return FALSE;
}
if ( 0 == strcmp(dir, ".") )
return FALSE;
if ( ( 0 == strcmp(dir, "..") ) && ( 0 != strcmp(cur_dir, "/")) )
{
cur_dir[strlen(cur_dir)-1]='\0';
dir_truncate(cur_dir);
return FALSE;
}
if ( '/' == dir[0])
{
if ( dir_check(dir) )
{
strcpy(cur_dir, dir);
return TRUE;
}
return FALSE;
}
else
{
strcpy(temp, cur_dir);
strcat(temp, dir);
if ( dir_check(temp) )
{
strcpy(cur_dir, temp);
return TRUE;
}
return FALSE;
}
}

View File

@ -0,0 +1,22 @@
void cmd_date()
{
unsigned date;
unsigned time;
date = kol_system_date_get();
printf(" date [dd.mm.yy]: %x%x.%x%x.%x%x",
(date&0xf00000)>>20, (date&0xf0000)>>16, // day
(date&0xf000)>>12, (date&0xf00)>>8, //month
(date&0xf0)>>4, (date&0xf) ); // year
time = kol_system_time_get();
printf("\n\r time [hh:mm:ss]: %x%x:%x%x:%x%x\n\r",
(time&0xf0)>>4, (time&0xf), // hours
(time&0xf000)>>12, (time&0xf00)>>8, // minutes
(time&0xf00000)>>20, (time&0xf0000)>>16 ); // seconds
}

View File

@ -0,0 +1,6 @@
void cmd_echo(char text[])
{
printf("%s\n\r", text);
}

View File

@ -0,0 +1,7 @@
void cmd_exit()
{
free(ALIASES);
_exit(1);
kol_exit();
}

View File

@ -0,0 +1,12 @@
void cmd_free()
{
unsigned total, free, used;
total = kol_system_mem();
free = kol_system_memfree();
used = total - free;
printf (" total [kB / MB / %%]: %-7d / %-5d / 100\n\r free [kB / MB / %%]: %-7d / %-5d / %d\n\r used [kB / MB / %%]: %-7d / %-5d / %d\n\r",
total, total/1024, free, free/1024, (free*100)/total, used, total/1024-free/1024, 100-(free*100)/total );
}

View File

@ -0,0 +1,31 @@
int cmd_help(char cmd[])
{
int i;
char available[]={" %d commands available:\n\r"};
if (NULL == cmd)
{
printf (available, NUM_OF_CMD);
for (i = 0; i < NUM_OF_CMD; i++)
printf(" %s\n\r", HELP_COMMANDS[i]);
}
else
{
for (i=0; i<NUM_OF_CMD; i++)
if ( !strcmp(cmd, HELP_COMMANDS[i]) )
{
printf(HELP_DESC[i]);
return TRUE;
}
printf (" Command \'%s\' not found.\n\r", cmd);
printf (available, NUM_OF_CMD);
for (i = 0; i < NUM_OF_CMD; i++)
printf(" %s\n\r", HELP_COMMANDS[i]);
}
return FALSE;
}

View File

@ -0,0 +1,43 @@
int _atoi ( char *s )
{
int i, n;
n = 0;
for ( i = 0; s[i]!= '\0'; ++i)
if ((s[i]<'0') || (s[i]>'9'))
return 0;
else
n = 10 * n + s[i] - '0';
return n;
}
int cmd_kill(char process[])
{
unsigned proc;
int result;
if (NULL == process)
{
printf(" kill PID\n\r");
return FALSE;
}
else
{
proc = _atoi(process);
if ( 0 != proc )
{
result = kol_process_kill_pid(proc);
if (result < 0)
return FALSE;
else
return TRUE;
}
}
}

View File

@ -0,0 +1,41 @@
int cmd_ls(char dir[])
{
kol_struct70 k70;
unsigned *n;
unsigned num_of_file;
unsigned *t;
unsigned type_of_file;
int i;
k70.p00 = 1;
k70.p04 = 0;
k70.p08 = 0;
k70.p12 = 2*1024*1024; // 2 MB
k70.p16 = malloc(2*1024*1024);
k70.p20 = 0;
k70.p21 = dir;
if ( !kol_file_70(&k70) ) // ïðîâåðÿåì ñóùåñòâîâàíèå êàòàëîãà
{
free(k70.p16);
return FALSE;
}
n = k70.p16+8;
num_of_file = *n; // ÷èñëî ôàéëîâ â êàòàëîãå
for (i = 0; i < num_of_file; i++)
{
printf (" %s", k70.p16+32+40+(264+40)*i);
t = k70.p16+32+(264+40)*i;
type_of_file = *t;
if ( (0x10 == (type_of_file&0x10)) || (8 == (type_of_file&8)) )
printf ("/");
printf ("\n\r");
}
free(k70.p16);
return TRUE;
}

View File

@ -0,0 +1,44 @@
int cmd_mkdir(char dir[])
{
char temp[256];
kol_struct70 k70;
unsigned result;
if (NULL == dir)
{
printf(" mkdir directory\n\r");
return FALSE;
}
if ( 0 == strcmp(dir, ".") || ( 0 == strcmp(dir, "..") ) || ( 0 == strcmp(cur_dir, "/")) )
{
return FALSE;
}
k70.p00 = 9;
k70.p04 = 0;
k70.p08 = 0;
k70.p12 = 0;
k70.p16 = 0;
k70.p20 = 0;
if ( '/' == dir[0])
k70.p21 = dir;
else
{
strcpy(temp, cur_dir);
strcat(temp, dir);
k70.p21 = temp;
}
result = kol_file_70(&k70);
if (0 == result)
return TRUE;
else
return FALSE;
}

View File

@ -0,0 +1,87 @@
int cmd_more(char file[])
{
kol_struct70 k70;
kol_struct_BDVK bdvk;
unsigned result, filesize, pos, i;
char buf[81]; //áóôåð
char temp[256];
unsigned flags;
if (NULL == file)
{
printf (" less filename\n\r");
return FALSE;
}
if ( '/' == file[0])
{
strcpy(temp, file);
if ( !file_check(temp) )
{
return FALSE;
}
}
else
{
strcpy(temp, cur_dir);
strcat(temp, file);
if ( !file_check(temp) )
{
return FALSE;
}
}
k70.p00 = 5;
k70.p04 = k70.p08 = k70.p12 = 0;
k70.p16 = &bdvk;
k70.p20 = 0;
k70.p21 = temp;
result = kol_file_70(&k70); // ïîëó÷àåì èíôîðìàöèþ î ôàéëå
if ( 0 != result )
return FALSE;
filesize = bdvk.p32[0]; // ïîëó÷àåì ðàçìåð ôàéëà
buf[80]=0;
flags = con_get_flags();
for (pos=0;pos<filesize;pos+=80)
{
memset(buf, 0, 80);
k70.p00 = 0;
k70.p04 = pos;
k70.p08 = 0;
k70.p12 = 80;
k70.p16 = buf;
k70.p20 = 0;
k70.p21 = temp;
result = kol_file_70(&k70); // ÷òåíèå 80 ñèìâîëîâ
for (i=0; i<80; i++)
{
if (27 == buf[i])
con_set_flags(flags|0x100);
else con_set_flags(flags);
printf ("%c", buf[i]);
}
if ( 0 != result )
{
con_set_flags(flags);
printf ("\n\r");
return TRUE;
}
}
con_set_flags(flags);
printf ("\n\r");
return TRUE;
}

View File

@ -0,0 +1,32 @@
int cmd_ps()
{
int i, n;
char *buf1k;
unsigned PID;
unsigned *p;
short *s;
short STATE;
buf1k = malloc(1024);
if (NULL == buf1k)
return FALSE;
for (i = 1;;i++)
{
n = kol_process_info(i, buf1k);
p = buf1k+30;
PID = *p;
s = buf1k+50;
STATE = *s;
if ( 9 != STATE)
printf (" %7d %s\n\r", PID, buf1k+10);
if (i == n)
break;
}
free(buf1k);
return TRUE;
}

View File

@ -0,0 +1,5 @@
void cmd_pwd()
{
printf (" %s\n\r", cur_dir);
}

View File

@ -0,0 +1,5 @@
void cmd_reboot()
{
kol_system_end(3);
}

View File

@ -0,0 +1,50 @@
int cmd_rm(char file[])
{
kol_struct70 k70;
char temp[256];
unsigned result;
if (NULL == file)
{
printf (" rm filename\n\r");
return FALSE;
}
if ( '/' == file[0])
{
strcpy(temp, file);
if ( !file_check(temp) )
{
return FALSE;
}
}
else
{
strcpy(temp, cur_dir);
strcat(temp, file);
if ( !file_check(temp) )
{
return FALSE;
}
}
k70.p00 = 8;
k70.p04 = 0;
k70.p08 = 0;
k70.p12 = 0;
k70.p16 = 0;
k70.p20 = 0;
k70.p21 = temp;
result = kol_file_70(&k70);
if (0 == result)
return TRUE;
else
return FALSE;
}

View File

@ -0,0 +1,46 @@
int cmd_rmdir(char dir[])
{
char temp[256];
kol_struct70 k70;
unsigned result;
if (NULL == dir)
{
printf(" rmdir directory\n\r");
return FALSE;
}
if ( ( 0 == strcmp(dir, ".") ) || ( 0 == strcmp(dir, "..") ) || ( 0 == strcmp(cur_dir, "/")) )
{
return FALSE;
}
k70.p00 = 8;
k70.p04 = 0;
k70.p08 = 0;
k70.p12 = 0;
k70.p16 = 0;
k70.p20 = 0;
if ( '/' == dir[0])
k70.p21 = dir;
else
{
strcpy(temp, cur_dir);
strcat(temp, dir);
k70.p21 = temp;
}
if ( !dir_check(temp) )
return FALSE;
result = kol_file_70(&k70);
if (0 == result)
return TRUE;
else
return FALSE;
}

View File

@ -0,0 +1,54 @@
int cmd_touch(char file[])
{
kol_struct70 k70;
char temp[256];
unsigned result;
if (NULL == file)
{
printf(" touch filename\n\r");
return FALSE;
}
if ( ( 0 == strcmp(file, ".") ) || ( 0 == strcmp(file, "..") ) || ( 0 == strcmp(cur_dir, "/")) )
{
return FALSE;
}
if ( '/' == file[0])
{
strcpy(temp, file);
if ( !file_check(temp) )
k70.p00 = 2;
else
k70.p00 = 3;
}
else
{
strcpy(temp, cur_dir);
strcat(temp, file);
if ( !file_check(temp) )
k70.p00 = 2;
else
k70.p00 = 3;
}
k70.p04 = 0;
k70.p08 = 0;
k70.p12 = 0;
k70.p16 = 0;
k70.p20 = 0;
k70.p21 = temp;
result = kol_file_70(&k70);
if (0 == result)
return TRUE;
else
return FALSE;
}

View File

@ -0,0 +1,5 @@
void cmd_ver()
{
printf (" %s\n\r", SHELL_VERSION);
}

View File

@ -0,0 +1,7 @@
del shell.kex
del shell.o
fasm start.asm start.o
gcc -c shell.c
ld -nostdlib -T kolibri.ld -o shell.kex start.o kolibri.o stdlib.o string.o shell.o
objcopy shell.kex -O binary
pause

View File

@ -0,0 +1,82 @@
///===========================
#define CON_COLOR_BLUE 1
#define CON_COLOR_GREEN 2
#define CON_COLOR_RED 4
#define CON_COLOR_BRIGHT 8
/* öâåò ôîíà */
#define CON_BGR_BLUE 0x10
#define CON_BGR_GREEN 0x20
#define CON_BGR_RED 0x40
#define CON_BGR_BRIGHT 0x80
///===========================
void (* _stdcall con_init)(unsigned w_w, unsigned w_h, unsigned s_w, unsigned s_h, const char* t);
void (* _cdecl printf)(const char* format,...);
void (* _stdcall _exit)(char bCloseWindow);
void (* __stdcall gets)(char* str, int n);
int (* __stdcall getch)(void);
int (* __stdcall con_get_font_height)(void);
int (* __stdcall con_set_cursor_height)(int new_height);
unsigned (*__stdcall con_get_flags)(void);
unsigned (*__stdcall con_set_flags)(unsigned new_flags);
///===========================
void CONSOLE_INIT(char title[])
{
kol_struct_import *imp;
imp = kol_cofflib_load("/sys/lib/console.obj");
if (imp == NULL)
kol_exit();
con_init = ( _stdcall void (*)(unsigned, unsigned, unsigned, unsigned, const char*))
kol_cofflib_procload (imp, "con_init");
if (con_init == NULL)
kol_exit();
printf = ( _cdecl void (*)(const char*,...))
kol_cofflib_procload (imp, "con_printf");
if (printf == NULL)
kol_exit();
_exit = ( _stdcall void (*)(char))
kol_cofflib_procload (imp, "con_exit");
if (_exit == NULL)
kol_exit();
gets = ( _stdcall void (*)(char*, int))
kol_cofflib_procload (imp, "con_gets");
if (gets == NULL)
kol_exit();
getch = ( _stdcall int (*)(void))
kol_cofflib_procload (imp, "con_getch2");
if (getch == NULL)
kol_exit();
con_get_font_height = ( _stdcall int (*)(void))
kol_cofflib_procload (imp, "con_get_font_height");
if (con_get_font_height == NULL)
kol_exit();
con_set_cursor_height = ( _stdcall int (*)(int))
kol_cofflib_procload (imp, "con_set_cursor_height");
if (con_set_cursor_height == NULL)
kol_exit();
con_get_flags = ( _stdcall unsigned (*)(void))
kol_cofflib_procload (imp, "con_get_flags");
if (con_get_flags == NULL)
kol_exit();
con_set_flags = ( _stdcall unsigned (*)(unsigned))
kol_cofflib_procload (imp, "con_set_flags");
if (con_set_flags == NULL)
kol_exit();
con_init(-1, -1, -1, -1, title);
}

View File

@ -0,0 +1,82 @@
#define FALSE 0
#define TRUE 1
#define SHELL_VERSION "0.4"
extern char PATH[256];
extern char PARAM[256];
char title[64];
char cur_dir[256];
/// ===========================================================
char *ALIASES = NULL;
unsigned ALIAS_NUM = 0;
/// ===========================================================
#define CMD_HISTORY_NUM 5
char CMD[256];
char CMD_HISTORY[CMD_HISTORY_NUM][256];
char CMD_NUM;
unsigned CMD_POS;
/// ===========================================================
char script_sign[] = {"#SHS"};
/// ===========================================================
const NUM_OF_CMD = 19;
const char HELP_COMMANDS[][10]=
{
"about",
"alias",
"cd",
"date",
"echo",
"exit",
"free",
"help",
"kill",
"ls",
"mkdir",
"more",
"ps",
"pwd",
"reboot",
"rm",
"rmdir",
"touch",
"ver"
};
const char HELP_DESC [][70]=
{
" Displays information about the program\n\r",
" Allows the user view the current aliases\n\r",
" Changes directories\n\r",
" Returns the date and time\n\r",
" Echoes the data to the screen\n\r",
" Exits program\n\r",
" Displays total, free and used memory\n\r",
" Gives help\n\r",
" Stops a running process\n\r",
" Lists the files in a directory\n\r",
" Makes directory\n\r",
" Displays a data file to the screen\n\r",
" Lists the current processes running\n\r",
" Displays the name of the working directory\n\r",
" Reboots the computer\n\r",
" Removes files\n\r",
" Removes directories\n\r",
" Creates an empty file or updates the time/date stamp on a file\n\r",
" Displays version\n\r"
};
/// ===========================================================

View File

@ -0,0 +1,90 @@
#define NULL ((void*)0)
typedef struct
{
unsigned p00 __attribute__((packed));
unsigned p04 __attribute__((packed));
unsigned p08 __attribute__((packed));
unsigned p12 __attribute__((packed));
unsigned p16 __attribute__((packed));
char p20 __attribute__((packed));
char *p21 __attribute__((packed));
} kol_struct70 __attribute__((packed));
typedef struct
{
unsigned p00 __attribute__((packed));
char p04 __attribute__((packed));
char p05[3] __attribute__((packed));
unsigned p08 __attribute__((packed));
unsigned p12 __attribute__((packed));
unsigned p16 __attribute__((packed));
unsigned p20 __attribute__((packed));
unsigned p24 __attribute__((packed));
unsigned p28 __attribute__((packed));
unsigned p32[2] __attribute__((packed));
unsigned p40 __attribute__((packed));
} kol_struct_BDVK __attribute__((packed));
typedef struct
{
char *name __attribute__((packed));
void *data __attribute__((packed));
} kol_struct_import __attribute__((packed));
void kol_exit();
void kol_sleep(unsigned d);
void kol_wnd_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c);
void kol_wnd_move(unsigned x, unsigned y);
void kol_wnd_caption(char *s);
void kol_event_mask(unsigned e);
unsigned kol_event_wait();
unsigned kol_event_wait_time(unsigned time);
unsigned kol_event_check();
void kol_paint_start();
void kol_paint_end();
void kol_paint_pixel(unsigned x, unsigned y, unsigned c);
void kol_paint_bar(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c);
void kol_paint_line(unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned c);
void kol_paint_string(unsigned x, unsigned y, char *s, unsigned c);
void kol_paint_image(unsigned x, unsigned y, unsigned w, unsigned h, char *d);
void kol_paint_image_pal(unsigned x, unsigned y, unsigned w, unsigned h, char *d, unsigned *palette);
unsigned kol_key_get();
unsigned kol_key_control();
void kol_key_lang_set(unsigned lang);
unsigned kol_key_lang_get();
void kol_key_mode_set(unsigned mode);
unsigned kol_key_mode_get();
void kol_btn_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned d, unsigned c);
unsigned kol_btn_get();
void kol_btn_type(unsigned t);
unsigned kol_mouse_pos();
unsigned kol_mouse_posw();
unsigned kol_mouse_btn();
void kol_board_putc(char c);
void kol_board_puts(char *s);
void kol_board_puti(int n);
int kol_file_70(kol_struct70 *k);
kol_struct_import* kol_cofflib_load(char *name);
void* kol_cofflib_procload (kol_struct_import *imp, char *name);
unsigned kol_cofflib_procnum (kol_struct_import *imp);
void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n);
unsigned kol_system_end(unsigned param);
unsigned kol_system_cpufreq();
unsigned kol_system_mem();
unsigned kol_system_memfree();
unsigned kol_system_time_get();
unsigned kol_system_date_get();
void kol_path_file2dir(char *dir, char *fname);
void kol_path_full(char *full, char *fname);
void kol_screen_wait_rr();
void kol_screen_get_size(unsigned *w, unsigned *h);
unsigned kol_skin_height();
unsigned kol_thread_start(unsigned start, unsigned stack);
unsigned kol_time_tick();
unsigned kol_sound_speaker(char data[]);
unsigned kol_process_info(unsigned slot, char buf1k[]);
int kol_process_kill_pid(unsigned process);

View File

@ -0,0 +1,20 @@
/*OUTPUT_FORMAT("binary")*/
ENTRY(Start)
SECTIONS
{
.text 0x000000:
{
*(.text)
}
.data : {
*(.data)
hEnd = . ;
}
.bss :
{
*(.bss)
}
Memory = . ;
}

View File

@ -0,0 +1,133 @@
/// ===========================================================
int alias_check(char alias[])
{
unsigned i;
char buf1[256];
char buf2[256];
if ( !alias_split (alias, buf1, buf2))
return FALSE;
for (i = 0; i < NUM_OF_CMD; i++)
if ( !strcmp(HELP_COMMANDS[i], buf1) )
return -1;
if (NULL == ALIASES)
ALIASES = malloc(128*1024);
if (NULL == ALIASES)
return FALSE;
if ( 0 == ALIAS_NUM )
return FALSE;
for (i = 0; i < ALIAS_NUM; i++)
{
if ( !strcmp(ALIASES+256*i, buf1) )
return TRUE;
}
return FALSE;
}
/// ===========================================================
int alias_search(char alias[])
{
unsigned i;
for (i = 0; i < ALIAS_NUM; i++)
{
if ( !strcmp(ALIASES+256*i, alias) )
return i;
}
return -1;
}
/// ===========================================================
int alias_add(char alias[])
{
char buf1[256];
char buf2[256];
if ( ALIAS_NUM > 255)
return FALSE;
if ( !alias_split (alias, buf1, buf2))
return FALSE;
strcpy (ALIASES+256*ALIAS_NUM, buf1);
strcpy (ALIASES+256*ALIAS_NUM+64*1024, buf2);
ALIAS_NUM++;
return TRUE;
}
/// ===========================================================
void alias_list()
{
unsigned i;
if ( 0 == ALIAS_NUM)
return;
for (i = 0; i < ALIAS_NUM; i++)
printf (" %s=%s\n\r",ALIASES+256*i, ALIASES+256*i+64*1024);
}
/// ===========================================================
int alias_split (char alias[], char s1[], char s2[])
{
unsigned i, j;
if (NULL == strchr(alias, '='))
return FALSE;
for (i=0, j = 0;; i++)
{
if ('=' == alias[i])
{
s1[i]='\0';
break;
}
s1[i]=alias[i];
}
j = 0;
for (;; i++, j++)
{
s2[j]=alias[i];
if ('\0' == alias[i])
break;
}
trim(s1);
for (i=0;;i++)
{
s2[i] = s2[i+1];
if ('\0' == s2[i] )
break;
}
trim(s2);
return TRUE;
}
/// ===========================================================

View File

@ -0,0 +1,336 @@
/// ===========================================================
void command_clear()
{
for (;CMD_POS;CMD_POS--)
printf("%c %c", 8, 8);
CMD[0]='\0';
}
/// ===========================================================
void command_history_add(char command[])
{
if ( (0 != strcmp( CMD_HISTORY[0], CMD)) &&
(0 != strcmp( CMD_HISTORY[1], CMD)) &&
(0 != strcmp( CMD_HISTORY[2], CMD)) &&
(0 != strcmp( CMD_HISTORY[3], CMD)) &&
(0 != strcmp( CMD_HISTORY[4], CMD)) )
{
strcpy(CMD_HISTORY[4], CMD_HISTORY[3]);
strcpy(CMD_HISTORY[3], CMD_HISTORY[2]);
strcpy(CMD_HISTORY[2], CMD_HISTORY[1]);
strcpy(CMD_HISTORY[1], CMD_HISTORY[0]);
strcpy(CMD_HISTORY[0], CMD);
}
}
/// ===========================================================
void command_get()
{
unsigned key;
//unsigned pos = 0;
int hist;
CMD_POS = 0;
CMD_NUM = 0;
for (;;)
{
key = getch();
if ( 0 != (key & 0xff) )
{
key &= 0xff;
switch (key)
{
case 27: // ESC
command_clear();
break;
case 13: // ENTER
CMD[CMD_POS] = '\0';
printf("\n\r");
command_history_add(CMD);
return;
case 8: // BACKSPACE
if (CMD_POS > 0)
{
printf ("%c %c", 8, 8);
CMD_POS--;
}
break;
case 9: // TAB
break;
default:
if (CMD_POS < 255)
{
CMD[CMD_POS] = key;
CMD_POS++;
printf("%c", key);
}
break;
};
}
else // îáðàáîòêà ðàñøèðåííûõ êëàâèø
{
key = (key>>8)&0xff;
// printf ("%d\n\r", key);
switch (key)
{
case 72: // UP
for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
{
command_clear();
if (CMD_NUM < CMD_HISTORY_NUM-1)
CMD_NUM++;
else
CMD_NUM = 0;
printf( CMD_HISTORY[CMD_NUM] );
strcpy(CMD, CMD_HISTORY[CMD_NUM]);
CMD_POS = strlen(CMD);
if (0!=strlen(CMD))
break;
}
break;
case 80: // DOWN
for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
{
command_clear();
if (CMD_NUM > 0)
CMD_NUM--;
else
CMD_NUM = CMD_HISTORY_NUM-1;
printf( CMD_HISTORY[CMD_NUM] );
strcpy(CMD, CMD_HISTORY[CMD_NUM]);
CMD_POS = strlen(CMD);
if (0!=strlen(CMD))
break;
}
break;
};
}
}
}
/// ===========================================================
int command_get_cmd(char cmd[])
{
unsigned i;
for (i=0;;i++)
{
cmd[i] = CMD[i];
if (0 == cmd[i])
{
i = -2;
break;
}
if ( iswhite(cmd[i]) )
{
cmd[i] = '\0';
break;
}
}
return i+1;
}
/// ===========================================================
void command_execute()
{
char cmd[256];
char args[256];
unsigned arg;
trim(CMD);
arg = command_get_cmd(cmd);
if ( !strlen(cmd) )
return;
strcpy(args, CMD+arg);
trim(args);
if ( !strcmp(cmd, "help") )
{
if (-1 == arg)
cmd_help(NULL);
else
cmd_help(args);
return;
}
if ( !strcmp(cmd, "ver") )
{
cmd_ver();
return;
}
if ( !strcmp(cmd, "cd") )
{
if (-1 == arg)
cmd_cd(NULL);
else
cmd_cd(args);
if ( '/' != cur_dir[strlen(cur_dir)-1] )
strcat(cur_dir, "/");
return;
}
if ( !strcmp(cmd, "ls") )
{
if (-1 == arg)
cmd_ls(cur_dir);
else
cmd_ls(args);
return;
}
if ( !strcmp(cmd, "ps") )
{
cmd_ps();
return;
}
if ( !strcmp(cmd, "kill") )
{
if (-1 == arg)
cmd_kill(NULL);
else
cmd_kill(args);
return;
}
if ( !strcmp(cmd, "pwd") )
{
cmd_pwd();
return;
}
if ( !strcmp(cmd, "mkdir") )
{
if (-1 == arg)
cmd_mkdir(NULL);
else
cmd_mkdir(args);
return;
}
if ( !strcmp(cmd, "rmdir") )
{
if (-1 == arg)
cmd_rmdir(NULL);
else
cmd_rmdir(args);
return;
}
if ( !strcmp(cmd, "rm") )
{
if (-1 == arg)
cmd_rm(NULL);
else
cmd_rm(args);
return;
}
if ( !strcmp(cmd, "more") )
{
if (-1 == arg)
cmd_more(NULL);
else
cmd_more(args);
return;
}
if ( !strcmp(cmd, "echo") )
{
cmd_echo(args);
return;
}
if ( !strcmp(cmd, "exit") )
{
cmd_exit();
return;
}
if ( !strcmp(cmd, "date") )
{
cmd_date();
return;
}
if ( !strcmp(cmd, "about") )
{
cmd_about();
return;
}
if ( !strcmp(cmd, "free") )
{
cmd_free();
return;
}
if ( !strcmp(cmd, "reboot") )
{
cmd_reboot();
return;
}
if ( !strcmp(cmd, "touch") )
{
if (-1 == arg)
cmd_touch(NULL);
else
cmd_touch(args);
return;
}
if ( !strcmp(cmd, "alias") )
{
if (-1 == arg)
cmd_alias(NULL);
else
cmd_alias(args);
return;
}
if ( -1 != alias_search(CMD) )
{
strcpy(CMD, ALIASES+64*1024+256*alias_search(CMD));
command_execute();
return;
}
executable_run(cmd, args);
}
/// ===========================================================

View File

@ -0,0 +1,60 @@
/// ===========================================================
int executable_run(char cmd[], char args[])
{
char exec[256];
char error_starting[]={" No such command '%s'.\n\r"};
int result;
if ( '/' == cmd[0]) // åñëè ïóòü àáñîëáòíûé
{
strcpy(exec, cmd);
if ( !file_check(exec) ) // ïðîâåðÿåì ñóùåñòâîâàíèå ôàéëà
{
printf(error_starting, cmd);
return FALSE;
}
}
else
{
strcpy(exec, cur_dir); // ïðîâåðÿåì ôàéë â òåêóùåì êàòàëîãå
strcat(exec, cmd);
if ( !file_check(exec) ) // ïðîâåðÿåì ñóùåñòâîâàíèå ôàéëà
{
strcpy(exec, "/rd/1/"); // ïðîâåðÿåì ôàéë íà âèðòóàëüíîì äèñêå
strcat(exec, cmd);
if ( !file_check(exec) ) // ïðîâåðÿåì ñóùåñòâîâàíèå ôàéëà
{
printf(error_starting, cmd);
return FALSE;
}
}
}
if ( script_check(exec) )
{
return script_run(exec, args);
}
/* çàïóñê ïðîãðàììû */
result = program_run(exec, args);
if (result > 0)
{
printf (" '%s' started. PID = %d\n\r", cmd, result);
return TRUE;
}
else
{
printf(error_starting, cmd);
return FALSE;
}
}
/// ===========================================================

View File

@ -0,0 +1,16 @@
int program_run(char cmd[], char param[])
{
kol_struct70 k70;
k70.p00 = 7;
k70.p04 = 0;
k70.p08 = param;
k70.p12 = 0;
k70.p16 = 0;
k70.p20 = 0;
k70.p21 = cmd;
return kol_file_70(&k70);
}

View File

@ -0,0 +1,102 @@
/// ===========================================================
int script_check(char file[])
{
kol_struct70 k70;
char buf[4];
k70.p00 = 0;
k70.p04 = 0;
k70.p08 = 0;
k70.p12 = 4; // ÷èòàòü 4 áàéòà
k70.p16 = buf;
k70.p20 = 0;
k70.p21 = file;
kol_file_70(&k70);
if ( !strcmp(buf, script_sign) )
return TRUE;
else
return FALSE;
}
/// ===========================================================
int script_run(char exec[], char args[])
{
kol_struct70 k70;
kol_struct_BDVK bdvk;
unsigned result, filesize, pos, i;
char *buf; //áóôåð, êóäà êîïèðóåòñÿ ñêðèïò
k70.p00 = 5;
k70.p04 = k70.p08 = k70.p12 = 0;
k70.p16 = &bdvk;
k70.p20 = 0;
k70.p21 = exec;
result = kol_file_70(&k70); // ïîëó÷àåì èíôîðìàöèþ î ôàéëå
if ( 0 != result )
return FALSE;
filesize = bdvk.p32[0]; // ïîëó÷àåì ðàçìåð ôàéëà
buf = malloc(filesize+256);
if (NULL == buf)
return FALSE;
buf[filesize]=0;
k70.p00 = 0;
k70.p04 = k70.p08 = 0;
k70.p12 = filesize;
k70.p16 = buf;
k70.p20 = 0;
k70.p21 = exec;
result = kol_file_70(&k70); // ñ÷èòûâàåì ôàéë â áóôåð
if ( 0 != result )
{
free(buf);
return FALSE;
}
pos = 0;
for (;;) // îáðàáîòêà ñêðèïòà
{
if (pos > filesize)
break;
for (i=0;;i++) // ñ÷èòûâàíèå ñòðîêè
{
if ((0x0A == buf[pos])||(0x0D == buf[pos])||(0 == buf[pos]))
{
pos++;
CMD[i] = '\0';
break;
}
CMD[i] = buf[pos];
pos++;
}
if ( 0 == strlen(CMD) ) // ïóñòàÿ ñòðîêà
continue;
if ('#' == CMD[0]) // êîììåíòàðèé
continue;
command_execute();
}
free(buf);
return TRUE;
}
/// ===========================================================

View File

@ -0,0 +1,27 @@
/// ===========================================================
int file_check(char file[]);
int dir_check(char dir[]);
void dir_truncate(char dir[]);
int iswhite(char c);
void trim(char string[]);
void execute();
void kol_main();
int executable_run(char cmd[], char args[]);
void command_execute();
void command_get();
int command_get_cmd(char cmd[]);
int script_check(char file[]);
int script_run(char exec[], char args[]);
int aliases_check(char alias[]);
int alias_search(char alias[]);
int alias_add(char alias[]);
int alias_split (char alias[], char s1[], char s2[]);
void alias_list();
/// ===========================================================

View File

@ -0,0 +1,27 @@
Shell for KolibriOS
version 0.4
author: Oleksandr Bogomaz aka Albom
e-mail: albom85@yandex.ru
site: http://albom06.boom.ru/
Available commands:
about Displays information about the program
alias Allows the user view the current aliases
cd Changes directories
date Returns the date and time
echo Echoes the data to the screen
exit Exits program
free Displays total, free and used memory
help Gives help
kill Stops a running process
ls Lists the files in a directory
mkdir Makes directory
more Displays a data file to the screen
ps Lists the current processes running
pwd Displays the name of the working directory
reboot Reboots the computer
rm Removes files
rmdir Removes directories
touch Creates an empty file or updates the time/date stamp on a file
ver Displays version

View File

@ -0,0 +1,134 @@
#include "all.h"
/// ===========================================================
int dir_check(char dir[])
{
kol_struct70 k70;
int result;
k70.p00 = 1;
k70.p04 = 0;
k70.p08 = 0;
k70.p12 = 2*1024*1024; // 2 MB
k70.p16 = malloc(2*1024*1024);
k70.p20 = 0;
k70.p21 = dir;
result = kol_file_70(&k70);
free(k70.p16);
if ( (0 == result)||(6 == result) )
return TRUE;
else
return FALSE;
}
/// ===========================================================
void dir_truncate(char dir[])
{
int i;
i = strlen(dir)-1;
for (;;i--)
if ('/' == dir[i])
{
dir[i+1] = 0;
break;
}
}
/// ===========================================================
int file_check(char file[])
{
kol_struct70 k70;
int result;
k70.p00 = 0;
k70.p04 = 0;
k70.p08 = 0;
k70.p12 = 0;
k70.p16 = 0;
k70.p20 = 0;
k70.p21 = file;
result = kol_file_70(&k70);
if (0 == result)
return TRUE;
else
return FALSE;
}
/// ===========================================================
int iswhite(char c)
{
return ((' ' == c) || ('\t' == c) || (13 == c) || (10 == c));
}
/// ===========================================================
void trim(char string[])
{
int i, j;
for (i=0; ;i++)
if ( !iswhite(string[i]) )
break;
j = 0;
for (;;i++, j++)
{
string[j] = string[i];
if ('\0' == string[i] )
break;
}
for (i=0; ;i++)
if ('\0' == string[i])
break;
i--;
for (;i>0;--i)
if ( iswhite(string[i]) )
string[i] = '\0';
else
break;
}
/// ===========================================================
void kol_main()
{
strcpy(title, "SHELL ");
strcat(title, SHELL_VERSION);
CONSOLE_INIT(title);
strcpy(cur_dir, PATH);
dir_truncate(cur_dir);
con_set_cursor_height(con_get_font_height()-1);
if (strlen(PARAM) > 0)
strcpy(CMD, PARAM);
else
strcpy(CMD, ".shell");
command_execute();
for (;;)
{
printf ("# ");
command_get();
command_execute();
}
_exit(0);
kol_exit();
}
/// ===========================================================

View File

@ -0,0 +1,14 @@
#define RAND_MAX 0x7FFFU
#define isspace(c) ((c)==' ')
#define abs(i) (((i)<0)?(-(i)):(i))
#define random(num) ((rand()*(num))/((RAND_MAX+1)))
void* malloc(unsigned size);
void free(void *pointer);
void* realloc(void* pointer, unsigned size);
void srand (unsigned seed);
int rand (void);

View File

@ -0,0 +1,12 @@
#define NULL ((void*)0)
void* memset(void *mem, int c, unsigned size);
void* memcpy(void *dst, const void *src, unsigned size);
void strcat(char strDest[], char strSource[]);
int strcmp(const char* string1, const char* string2);
void strcpy(char strDest[], const char strSource[]);
char* strncpy(char *strDest, const char *strSource, unsigned n);
int strlen(const char* string);
char *strchr(const char* string, int c);