Shell v0.6. See History.txt.

git-svn-id: svn://kolibrios.org@3245 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Albom 2013-02-16 11:25:37 +00:00
parent 0da906311f
commit 4ed6be1119
27 changed files with 742 additions and 130 deletions

View File

@ -1,3 +1,17 @@
Shell 0.6 // 16.02.2013 // Albom
+ Добавлена возможность запускать программы, имена которых или путь к которым содержат пробелы. Имя программы (возможно с путём к ней) для этого необходимо заключать в кавычки. Т.е. наконец-то можно запустить программу из /rd/1/File managers, не переходя в неё
+ Добавлена функция разделения строковой переменной на int argc, char* argv[], что означает возможность улучшения команд (обработка нескольких параметров)
+ Добавлена команда cp (копирование файла). Принимает обязательно два параметра - имя файла-источника и имя файла-результата. Имена могут быть краткими (в текущем каталоге), так и с полным путём (должны начинаться с /). Ограничение на размер файла - 4 Гбайта
* Исправлена кодировка в сообщении об ошибке в консольном приложении
* Клавиши истории (вверх и вниз) поменяны между собой
* Количество команд в истории увеличено с пяти до десяти
* Уменьшено количество предупреждений при компиляции
* Команда ccpuid преобразована в параметр cpu команды ver
* Исправления в пакетных файлах сборки
+ Добавлен пример консольного приложения на ассемблере и пакетный файл для его сборки
Shell 0.5.4 // 04.06.2012 // Albom Shell 0.5.4 // 04.06.2012 // Albom
======================================= =======================================
* Исправлен интерфейс исполняемых консольных приложений. Теперь они должны создавать буфер с именем pid-SHELL, где pid - идентификатор процесса без заглавных нулей * Исправлен интерфейс исполняемых консольных приложений. Теперь они должны создавать буфер с именем pid-SHELL, где pid - идентификатор процесса без заглавных нулей
@ -47,7 +61,7 @@ Shell 0.4.5 // 19.10.2010 // Pterox
======================================= =======================================
Программа теперь многоязыковая (английский, и русский язык). Программа полностью русифицированна. Программа теперь многоязыковая (английский, и русский язык). Программа полностью русифицированна.
* Команда "free" переименована в "memory" - для точности. * Команда "free" переименована в "memory" - для точности.
* Добавлены команды turnoff (выключить компьютер), kerver (версия ядра KoOS), uptime; reboot теперь может перезагружать ядро ("reboot kernel") * Добавлены команды turnoff (выключить компьютер), kerver (версия ядра KolibriOS), uptime; reboot теперь может перезагружать ядро ("reboot kernel")
Shell 0.4.4 // 20.08.2010 // Albom Shell 0.4.4 // 20.08.2010 // Albom
@ -59,8 +73,8 @@ Shell 0.4.4 // 20.08.2010 // Albom
* ccpuid - вывод в консоль информации (пока скудно) о процессоре. пользы мало, но давно хотел с командой cpuid разобраться (в следующем семестре буду студентам курс читать, включил разбор команды в программу). * ccpuid - вывод в консоль информации (пока скудно) о процессоре. пользы мало, но давно хотел с командой cpuid разобраться (в следующем семестре буду студентам курс читать, включил разбор команды в программу).
есть много идей. некоторые легко реализуются, некоторые сложнее. если интересно: есть много идей. некоторые легко реализуются, некоторые сложнее. если интересно:
1) добавить переменную (одну!), в которую будет результат в текстовой форме (не то что возвращает ф-ция) записываться. с ней можно будет работать из командной строки. 1) добавить переменную (одну!), в которую будет результат в текстовой форме (не то что возвращает функция) записываться. с ней можно будет работать из командной строки
2) внедрить простую стековую машину для вычислений с вещественными числами. 2) внедрить простую стековую машину для вычислений с вещественными числами
Shell 0.4.3 // 20.08.2010 // Albom Shell 0.4.3 // 20.08.2010 // Albom
@ -70,7 +84,7 @@ Shell 0.4.3 // 20.08.2010 // Albom
Shell 0.4.2 // 28.08.2009 // diamond Shell 0.4.2 // 28.08.2009 // diamond
======================================= =======================================
* Добавил корректное завершение работы при закрытии окна консоли, работает только начиная с последней на данный момент версией библиотеки (лежит на svn, включена в ночную сборку). Перекомпилировал в VS2008 с LTCG, ещё пошаманил с оптимизацией по размеру. * Добавил корректное завершение работы при закрытии окна консоли, работает только начиная с последней на данный момент версией библиотеки (лежит на svn, включена в ночную сборку). Перекомпилировал в VS2008 с LTCG, ещё пошаманил с оптимизацией по размеру
Shell 0.4.1 // 16.03.2009 // Albom Shell 0.4.1 // 16.03.2009 // Albom
@ -94,33 +108,33 @@ alias DIr = ls
alias ls=somecommand alias ls=somecommand
- при отладке получал странную информацию, но так как у меня всё работает, то пока изменений вносить не планирую - при отладке получал странную информацию, но так как у меня всё работает, то пока изменений вносить не планирую
2) Теперь шелл можно запускать с параметром (из самого себя, например). 2) Теперь шелл можно запускать с параметром (из самого себя, например)
- синтаксис: - синтаксис:
shell команда shell команда
- пример: - пример:
shell /sys/somescript shell /sys/somescript
- при этом .shell не запускается - при этом .shell не запускается
3) Реализована команда more. ( MEMENTO MORI! - Моментально... в море! ) 3) Реализована команда more
- просмотр текстовых и бинарных файлов (вроде бы задача простая, но пришлось повозиться с управляющими символами) - просмотр текстовых и бинарных файлов (вроде бы задача простая, но пришлось повозиться с управляющими символами)
- очень не рекомендуется просматривать большие файлы - очень не рекомендуется просматривать большие файлы
Shell 0.3 // 07.08.2008 // Albom Shell 0.3 // 07.08.2008 // Albom
======================================= =======================================
1) Возможность запуска скриптов. 1) Возможность запуска скриптов
* каждая строка должна представляет собой команду * каждая строка должна представляет собой команду
* строкой считается набор символов, который заканчивается CR+LF (Windows) или LF(UNIX) или CR(Mac) * строкой считается набор символов, который заканчивается CR+LF (Windows) или LF(UNIX) или CR(Mac)
* если строка начинается с #, то вся строка (т.е. комментарий) игнорируется * если строка начинается с #, то вся строка (т.е. комментарий) игнорируется
* скрипт должен начитаться с #SHS * скрипт должен начитаться с #SHS
* при запуске шелла автоматически запускается скрипт .shell * при запуске шелла автоматически запускается скрипт .shell
2) История из 5 (можно изменить при компиляции) введённых команд. 2) История из 5 (можно изменить при компиляции) введённых команд
* перемещение по истории - UP/DOWN * перемещение по истории - UP/DOWN
3) Команда alias, которая позволяет вводить синонимы для команд. 3) Команда alias, которая позволяет вводить синонимы для команд
* до 256 (можно изменить при компиляции) синонимов * до 256 (можно изменить при компиляции) синонимов
* пока работает только добавление и просмотр синонимов, а отработка пока не реализована. * пока работает только добавление и просмотр синонимов, а отработка пока не реализована
Shell 0.2 // 04.08.2008 // Albom Shell 0.2 // 04.08.2008 // Albom
@ -131,13 +145,13 @@ Shell 0.2 // 04.08.2008 // Albom
Shell 0.11 // 01.08.2008 // Albom Shell 0.11 // 01.08.2008 // Albom
======================================= =======================================
* Добавил команды free и reboot, внёс некоторые изменения, исправил найденные ошибки. * Добавил команды free и reboot, внёс некоторые изменения, исправил найденные ошибки
Shell 0.1 // 29.07.2008 // Albom Shell 0.1 // 29.07.2008 // Albom
======================================= =======================================
* Реализованы (не полностью) команды: about, cd, date, echo, exit, help, kill, ls, ps, pwd, ver * Реализованы (не полностью) команды: about, cd, date, echo, exit, help, kill, ls, ps, pwd, ver
* При запуске программы (если не указан полный путь) она ищется в каталоге /rd/1 и текущем каталоге. * При запуске программы (если не указан полный путь) она ищется в каталоге /rd/1 и текущем каталоге
Shell 0.02 // 27.07.2008 // Albom Shell 0.02 // 27.07.2008 // Albom
@ -153,6 +167,6 @@ Shell 0.02 // 27.07.2008 // Albom
Shell 0.01 // 27.07.2008 // Albom Shell 0.01 // 27.07.2008 // Albom
======================================= =======================================
* Решил написать функциональный шелл на Си с использованием console.obj. * Решил написать функциональный шелл на Си с использованием console.obj
* Пока сделал функцию отделения команды и параметров, а также реализовал команды help (пока без параметров), ver и exit. * Пока сделал функцию отделения команды и параметров, а также реализовал команды help (пока без параметров), ver и exit

View File

@ -37,12 +37,12 @@
#include "cmd/cmd_alias.c" #include "cmd/cmd_alias.c"
#include "cmd/cmd_more.c" #include "cmd/cmd_more.c"
#include "cmd/cmd_clear.c" #include "cmd/cmd_clear.c"
#include "cmd/cmd_ccpuid.c"
#include "cmd/cmd_sleep.c" #include "cmd/cmd_sleep.c"
#include "cmd/cmd_shutdown.c" #include "cmd/cmd_shutdown.c"
#include "cmd/cmd_uptime.c" #include "cmd/cmd_uptime.c"
#include "cmd/cmd_killall.c" #include "cmd/cmd_killall.c"
#include "cmd/cmd_history.c" #include "cmd/cmd_history.c"
#include "cmd/cmd_cp.c"
#include "modules/module_command.c" #include "modules/module_command.c"
#include "modules/module_program_console.c" #include "modules/module_program_console.c"
@ -50,5 +50,6 @@
#include "modules/module_script.c" #include "modules/module_script.c"
#include "modules/module_executable.c" #include "modules/module_executable.c"
#include "modules/module_alias.c" #include "modules/module_alias.c"
#include "modules/module_parameters.c"
/// =========================================================== /// ===========================================================

View File

@ -1,33 +0,0 @@
int cmd_ccpuid(char param[])
{
unsigned a, b, c, d;
char str[13];
str[12] = '\0';
asm ("cpuid" :
"=a" (a),
"=b" (b),
"=c" (c),
"=d" (d):
"a"(0));
str[0] = (b&0x000000ff) >> 0;
str[1] = (b&0x0000ff00) >> 8;
str[2] = (b&0x00ff0000) >> 16;
str[3] = (b&0xff000000) >> 24;
str[4] = (d&0x000000ff) >> 0;
str[5] = (d&0x0000ff00) >> 8;
str[6] = (d&0x00ff0000) >> 16;
str[7] = (d&0xff000000) >> 24;
str[8] = (c&0x000000ff) >> 0;
str[9] = (c&0x0000ff00) >> 8;
str[10] = (c&0x00ff0000) >> 16;
str[11] = (c&0xff000000) >> 24;
printf("%s\n\r", str);
return TRUE;
}

View File

@ -0,0 +1,189 @@
void print_error(void)
{
#if LANG_ENG
printf(" Error!\n\r");
#elif LANG_RUS
printf(" Žè¨¡ª !\n\r");
#endif
}
int cmd_cp(char param[])
{
char* argv[100];
int i;
int argc;
char *filename_in;
char *filename_out;
char *buffer;
kol_struct70 k70_in;
kol_struct70 k70_out;
kol_struct_BDVK bdvk;
unsigned filesize, result;
unsigned n; // ª®«¨ç¥á⢮ à § ª®¯¨à®¢ ­¨ï ¯® 4 ª¡ ©â 
argc = parameters_prepare(param, argv);
if (argc != 2)
{
#if LANG_ENG
printf(" cp <file_in> <file_out>\n\r");
#elif LANG_RUS
printf(" cp <¨áâ®ç­¨ª> <१ã«ìâ â>\n\r");
#endif
parameters_free(argc, argv);
return FALSE;
}
filename_in = (char*) malloc(4096);
filename_out = (char*) malloc(4096);
if (argv[0][0] != '/')
{
strcpy(filename_in, cur_dir);
if (filename_in[strlen(filename_in)-1] != '/')
strcat(filename_in, "/"); // add slash
strcat(filename_in, argv[0]);
}
else
{
strcpy(filename_in, argv[0]);
}
if (argv[1][0] != '/')
{
strcpy(filename_out, cur_dir);
if (filename_out[strlen(filename_out)-1] != '/')
strcat(filename_out, "/"); // add slash
strcat(filename_out, argv[1]);
}
else
{
strcpy(filename_out, argv[1]);
}
k70_in.p00 = 5;
k70_in.p04 = k70_in.p08 = k70_in.p12 = 0;
k70_in.p16 = (unsigned) &bdvk;
k70_in.p20 = 0;
k70_in.p21 = filename_in;
result = kol_file_70(&k70_in); // ¯®«ãç ¥¬ ¨­ä®à¬ æ¨î ® ä ©«¥
if ( 0 != result )
{
print_error();
parameters_free(argc, argv);
free(filename_in);
free(filename_out);
return FALSE;
}
filesize = bdvk.p32[0]; // ¯®«ãç ¥¬ à §¬¥à ä ©«  (®£à ­¨ç¥­¨¥ - 4 ƒ¡ ©â )
n = filesize / 4096;
buffer = (char*) malloc(4096);
k70_in.p00 = 0;
k70_in.p08 = 0;
k70_in.p12 = 4096;
k70_in.p16 = (unsigned) buffer;
k70_in.p20 = 0;
k70_in.p21 = filename_in;
k70_out.p00 = 2;
k70_out.p08 = 0;
k70_out.p12 = 4096;
k70_out.p16 = (unsigned) buffer;
k70_out.p20 = 0;
k70_out.p21 = filename_out;
i = 0; // ¤«ï ⮣®, çâ®¡ë ª®¯¨à®¢ âì ä ©«ë á à §¬¥à®¬ ¬¥­ìè¥ 4 ª<> ©â
for ( i = 0; i < n; i++)
{
k70_in.p04 = i*4096;
result = kol_file_70(&k70_in); // ç⥭¨¥
if (result != 0)
{
print_error();
parameters_free(argc, argv);
free(filename_in);
free(filename_out);
free(buffer);
return FALSE;
}
k70_out.p04 = i*4096;
result = kol_file_70(&k70_out); // § ¯¨áì
if (result != 0)
{
print_error();
parameters_free(argc, argv);
free(filename_in);
free(filename_out);
free(buffer);
return FALSE;
}
if (i == 0)
k70_out.p00 = 3; // ¬¥­ï¥¬ äã­ªæ¨î á ᮧ¤ ­¨ï (2) ­  ¤®§ ¯¨áì (3)
}
if ( (filesize%4096) != 0 ) // ¥á«¨ à §¬¥à ä ©«  ­¥ ªà â¥­ 4 ª<> ©â ¬
{
k70_in.p12 = filesize%4096;
k70_out.p12 = filesize%4096;
k70_in.p04 = i*4096; // ¢ i ¤®«¦­® ¡ëâì ¯à ¢¨«ì­®¥ ᬥ饭¨¥
result = kol_file_70(&k70_in); // ç⥭¨¥
if (result != 0)
{
print_error();
parameters_free(argc, argv);
free(filename_in);
free(filename_out);
free(buffer);
return FALSE;
}
k70_out.p04 = i*4096;
result = kol_file_70(&k70_out); // § ¯¨áì
if (result != 0)
{
print_error();
parameters_free(argc, argv);
free(filename_in);
free(filename_out);
free(buffer);
return FALSE;
}
}
parameters_free(argc, argv);
free(filename_in);
free(filename_out);
free(buffer);
return TRUE;
}

View File

@ -1,21 +1,5 @@
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[]) int cmd_kill(char process[])
{ {

View File

@ -14,7 +14,7 @@ k70.p00 = 1;
k70.p04 = 0; k70.p04 = 0;
k70.p08 = 0; k70.p08 = 0;
k70.p12 = 10000; k70.p12 = 10000;
k70.p16 = malloc(32+k70.p12*560); k70.p16 = (unsigned) malloc(32+k70.p12*560);
k70.p20 = 0; k70.p20 = 0;
/// !!! /// !!!
@ -27,23 +27,23 @@ else
result = kol_file_70(&k70); result = kol_file_70(&k70);
if ( !((result==0) || (result==6)) ) // ïðîâåðÿåì ñóùåñòâîâàíèå êàòàëîãà if ( !((result==0) || (result==6)) ) // ïðîâåðÿåì ñóùåñòâîâàíèå êàòàëîãà
{ {
free(k70.p16); free( (void*) k70.p16);
return FALSE; return FALSE;
} }
n = k70.p16+8; n = (unsigned*) (k70.p16+8);
num_of_file = *n; // ÷èñëî ôàéëîâ â êàòàëîãå num_of_file = *n; // ÷èñëî ôàéëîâ â êàòàëîãå
for (i = 0; i < num_of_file; i++) for (i = 0; i < num_of_file; i++)
{ {
printf (" %s", k70.p16+32+40+(264+40)*i); printf (" %s", k70.p16+32+40+(264+40)*i);
t = k70.p16+32+(264+40)*i; t = (unsigned*) (k70.p16+32+(264+40)*i);
type_of_file = *t; type_of_file = *t;
if ( (0x10 == (type_of_file&0x10)) || (8 == (type_of_file&8)) ) if ( (0x10 == (type_of_file&0x10)) || (8 == (type_of_file&8)) )
printf ("/"); printf ("/");
printf ("\n\r"); printf ("\n\r");
} }
free(k70.p16); free((void*)k70.p16);
return TRUE; return TRUE;
} }

View File

@ -45,7 +45,7 @@ else
k70.p00 = 5; k70.p00 = 5;
k70.p04 = k70.p08 = k70.p12 = 0; k70.p04 = k70.p08 = k70.p12 = 0;
k70.p16 = &bdvk; k70.p16 = (unsigned) &bdvk;
k70.p20 = 0; k70.p20 = 0;
k70.p21 = temp; k70.p21 = temp;
@ -67,7 +67,7 @@ for (pos=0;pos<filesize;pos+=80)
k70.p04 = pos; k70.p04 = pos;
k70.p08 = 0; k70.p08 = 0;
k70.p12 = 80; k70.p12 = 80;
k70.p16 = buf; k70.p16 = (unsigned) buf;
k70.p20 = 0; k70.p20 = 0;
k70.p21 = temp; k70.p21 = temp;

View File

@ -10,25 +10,56 @@ if (!strcmp(param, "kernel"))
kvbuf = malloc(16); kvbuf = malloc(16);
kol_get_kernel_ver(kvbuf); kol_get_kernel_ver(kvbuf);
vA = kvbuf+0; vA = kvbuf+0;
vA = *vA;
vB = kvbuf+1; vB = kvbuf+1;
vB = *vB;
vC = kvbuf+2; vC = kvbuf+2;
vC = *vC;
vD = kvbuf+3; vD = kvbuf+3;
vD = *vD;
Rev = kvbuf+5; Rev = kvbuf+5;
Rev = *Rev;
#if LANG_ENG #if LANG_ENG
printf (" KolibriOS v%d.%d.%d.%d. Kernel SVN-rev.: %d\n\r", vA, vB, vC, vD, Rev); printf (" KolibriOS v%d.%d.%d.%d. Kernel SVN-rev.: %d\n\r", *vA, *vB, *vC, *vD, *Rev);
#elif LANG_RUS #elif LANG_RUS
printf (" KolibriOS v%d.%d.%d.%d. SVN-ॢ. ï¤à : %d\n\r", vA, vB, vC, vD, Rev); printf (" KolibriOS v%d.%d.%d.%d. SVN-ॢ. ï¤à : %d\n\r", *vA, *vB, *vC, *vD, *Rev);
#endif #endif
free(kvbuf); free(kvbuf);
}
else
printf (" Shell v%s\n\r", SHELL_VERSION);
return TRUE; return TRUE;
} }
if (!strcmp(param, "cpu"))
{
unsigned a, b, c, d;
char str[13];
str[12] = '\0';
asm ("cpuid" :
"=a" (a),
"=b" (b),
"=c" (c),
"=d" (d):
"a"(0));
str[0] = (b&0x000000ff) >> 0;
str[1] = (b&0x0000ff00) >> 8;
str[2] = (b&0x00ff0000) >> 16;
str[3] = (b&0xff000000) >> 24;
str[4] = (d&0x000000ff) >> 0;
str[5] = (d&0x0000ff00) >> 8;
str[6] = (d&0x00ff0000) >> 16;
str[7] = (d&0xff000000) >> 24;
str[8] = (c&0x000000ff) >> 0;
str[9] = (c&0x0000ff00) >> 8;
str[10] = (c&0x00ff0000) >> 16;
str[11] = (c&0xff000000) >> 24;
printf("%s\n\r", str);
return TRUE;
}
printf (" Shell v%s\n\r", SHELL_VERSION);
return TRUE;
}

View File

@ -1,12 +1,11 @@
@echo off @echo off
erase lang.h
echo #define LANG_ENG 1 > lang.h echo #define LANG_ENG 1 > lang.h
fasm start.asm start.o fasm start.asm start.o
gcc -c shell.c gcc -c -fno-builtin shell.c
gcc -c system/kolibri.c gcc -c -fno-builtin system/kolibri.c
gcc -c system/stdlib.c gcc -c -fno-builtin system/stdlib.c
gcc -c system/string.c gcc -c -fno-builtin system/string.c
gcc -c system/ctype.c gcc -c -fno-builtin system/ctype.c
ld -nostdlib -T kolibri.ld -o shell start.o kolibri.o stdlib.o string.o ctype.o shell.o ld -nostdlib -T kolibri.ld -o shell start.o kolibri.o stdlib.o string.o ctype.o shell.o
objcopy shell -O binary objcopy shell -O binary
erase lang.h start.o shell.o kolibri.o stdlib.o string.o erase lang.h start.o shell.o kolibri.o stdlib.o string.o

View File

@ -1,12 +1,11 @@
@echo off @echo off
erase lang.h
echo #define LANG_RUS 1 > lang.h echo #define LANG_RUS 1 > lang.h
fasm start.asm start.o fasm start.asm start.o
gcc -c shell.c gcc -c -fno-builtin shell.c
gcc -c system/kolibri.c gcc -c -fno-builtin system/kolibri.c
gcc -c system/stdlib.c gcc -c -fno-builtin system/stdlib.c
gcc -c system/string.c gcc -c -fno-builtin system/string.c
gcc -c system/ctype.c gcc -c -fno-builtin system/ctype.c
ld -nostdlib -T kolibri.ld -o shell start.o kolibri.o stdlib.o string.o ctype.o shell.o ld -nostdlib -T kolibri.ld -o shell start.o kolibri.o stdlib.o string.o ctype.o shell.o
objcopy shell -O binary objcopy shell -O binary
erase lang.h start.o shell.o kolibri.o stdlib.o string.o ctype.o erase lang.h start.o shell.o kolibri.o stdlib.o string.o ctype.o

View File

@ -1,10 +1,10 @@
@echo off @echo off
fasm start.asm start.o fasm start.asm start.o
gcc -c test.c gcc -c -fno-builtin test.c
gcc -c system/kolibri.c gcc -c -fno-builtin system/kolibri.c
gcc -c system/stdlib.c gcc -c -fno-builtin system/stdlib.c
gcc -c system/string.c gcc -c -fno-builtin system/string.c
gcc -c system/ctype.c gcc -c -fno-builtin system/ctype.c
ld -nostdlib -T kolibri.ld -o test start.o kolibri.o stdlib.o string.o ctype.o test.o ld -nostdlib -T kolibri.ld -o test start.o kolibri.o stdlib.o string.o ctype.o test.o
objcopy test -O binary objcopy test -O binary
erase start.o kolibri.o stdlib.o string.o ctype.o test.o erase start.o kolibri.o stdlib.o string.o ctype.o test.o

View File

@ -0,0 +1,6 @@
@echo off
fasm test.asm test_asm
kpack test_asm
copy test_asm bin\eng\
move test_asm bin\rus\
pause

View File

@ -1,5 +1,5 @@
#define SHELL_VERSION "0.5.4" #define SHELL_VERSION "0.6"
extern char PATH[256]; extern char PATH[256];
extern char PARAM[256]; extern char PARAM[256];
@ -14,7 +14,7 @@ unsigned ALIAS_NUM = 0;
/// =========================================================== /// ===========================================================
#define CMD_HISTORY_NUM 5 #define CMD_HISTORY_NUM 10
char CMD[256]; char CMD[256];
char CMD_HISTORY[CMD_HISTORY_NUM][256]; char CMD_HISTORY[CMD_HISTORY_NUM][256];
@ -44,7 +44,6 @@ typedef struct
int cmd_about(char arg[]); int cmd_about(char arg[]);
int cmd_alias(char arg[]); int cmd_alias(char arg[]);
int cmd_ccpuid(char dir[]);
int cmd_cd(char dir[]); int cmd_cd(char dir[]);
int cmd_clear(char arg[]); int cmd_clear(char arg[]);
int cmd_date(char arg[]); int cmd_date(char arg[]);
@ -68,6 +67,8 @@ int cmd_shutdown(char arg[]);
int cmd_uptime(char param[]); int cmd_uptime(char param[]);
int cmd_killall(char process_name[]); int cmd_killall(char process_name[]);
int cmd_history(char arg[]); int cmd_history(char arg[]);
int cmd_cp(char param[]);
/// =========================================================== /// ===========================================================

View File

@ -3,9 +3,9 @@ const command_t COMMANDS[]=
{ {
{"about", " Displays information about Shell\n\r", &cmd_about}, {"about", " Displays information about Shell\n\r", &cmd_about},
{"alias", " Allows the user view the current aliases\n\r", &cmd_alias}, {"alias", " Allows the user view the current aliases\n\r", &cmd_alias},
{"ccpuid", " Displays CPU information\n\r", &cmd_ccpuid},
{"cd", " Changes current directory. Usage:\n\r cd <directory name>\n\r", &cmd_cd}, {"cd", " Changes current directory. Usage:\n\r cd <directory name>\n\r", &cmd_cd},
{"clear", " Clears the screen\n\r", &cmd_clear}, {"clear", " Clears the screen\n\r", &cmd_clear},
{"cp", " Copies file\n\r", &cmd_cp},
{"date", " Returns the current date and time\n\r", &cmd_date}, {"date", " Returns the current date and time\n\r", &cmd_date},
{"echo", " Echoes the data to the screen. Usage:\n\r echo <data>\n\r", &cmd_echo}, {"echo", " Echoes the data to the screen. Usage:\n\r echo <data>\n\r", &cmd_echo},
{"exit", " Exits from Shell\n\r", &cmd_exit}, {"exit", " Exits from Shell\n\r", &cmd_exit},
@ -26,5 +26,5 @@ const command_t COMMANDS[]=
{"sleep", " Stops the shell for the desired period. Usage:\n\r sleep <time in the 1/100 of second>\n\r Example:\n\r sleep 500 ;pause for 5sec.\n\r", &cmd_sleep}, {"sleep", " Stops the shell for the desired period. Usage:\n\r sleep <time in the 1/100 of second>\n\r Example:\n\r sleep 500 ;pause for 5sec.\n\r", &cmd_sleep},
{"touch", " Creates an empty file or updates the time/date stamp on a file. Usage:\n\r touch <file name>\n\r", &cmd_touch}, {"touch", " Creates an empty file or updates the time/date stamp on a file. Usage:\n\r touch <file name>\n\r", &cmd_touch},
{"uptime", " Displays the uptime\n\r", &cmd_uptime}, {"uptime", " Displays the uptime\n\r", &cmd_uptime},
{"ver", " Displays version. Usage:\n\r ver ;Shell version\n\r ver kernel ;version of KolibriOS kernel\n\r", &cmd_ver}, {"ver", " Displays version. Usage:\n\r ver ;Shell version\n\r ver kernel ;version of KolibriOS kernel\n\r ver cpu ;information about CPU\n\r", &cmd_ver},
}; };

View File

@ -3,9 +3,9 @@ const command_t COMMANDS[]=
{ {
{"about", " ‚뢮¤¨â ¨­ä®à¬ æ¨î ® ¯à®£à ¬¬¥ Shell\n\r", &cmd_about}, {"about", " ‚뢮¤¨â ¨­ä®à¬ æ¨î ® ¯à®£à ¬¬¥ Shell\n\r", &cmd_about},
{"alias", " <20>®ª §ë¢ ¥â ¨ ¯®§¢®«ï¥â ¨§¬¥­¨âì ᯨ᮪ ᨭ®­¨¬®¢ ª®¬ ­¤\n\r", &cmd_alias}, {"alias", " <20>®ª §ë¢ ¥â ¨ ¯®§¢®«ï¥â ¨§¬¥­¨âì ᯨ᮪ ᨭ®­¨¬®¢ ª®¬ ­¤\n\r", &cmd_alias},
{"ccpuid", " ‚뢮¤¨â ¨­ä®à¬ æ¨î ® CPU\n\r", &cmd_ccpuid},
{"cd", " ˆ§¬¥­ï¥â ⥪ãéãî ¤¥à¨ªâ®à¨î. ˆá¯®«ì§®¢ ­¨¥:\n\r cd <¤¨à¥ªâ®à¨ï>\n\r", &cmd_cd}, {"cd", " ˆ§¬¥­ï¥â ⥪ãéãî ¤¥à¨ªâ®à¨î. ˆá¯®«ì§®¢ ­¨¥:\n\r cd <¤¨à¥ªâ®à¨ï>\n\r", &cmd_cd},
{"clear", " Žç¨é ¥â íªà ­\n\r", &cmd_clear}, {"clear", " Žç¨é ¥â íªà ­\n\r", &cmd_clear},
{"cp", " Š®¯¨àã¥â ä ©«\n\r", &cmd_cp},
{"date", " <20>®ª §ë¢ ¥â ⥪ãéãî ¤ âã ¨ ¢à¥¬ï\n\r", &cmd_date}, {"date", " <20>®ª §ë¢ ¥â ⥪ãéãî ¤ âã ¨ ¢à¥¬ï\n\r", &cmd_date},
{"echo", " ‚뢮¤¨â ¤ ­­ë¥ ­  íªà ­. ˆá¯®«ì§®¢ ­¨¥:\n\r echo <¤ ­­ë¥>\n\r", &cmd_echo}, {"echo", " ‚뢮¤¨â ¤ ­­ë¥ ­  íªà ­. ˆá¯®«ì§®¢ ­¨¥:\n\r echo <¤ ­­ë¥>\n\r", &cmd_echo},
{"exit", " ‡ ¢¥à襭¨¥ à ¡®âë Shell\n\r", &cmd_exit}, {"exit", " ‡ ¢¥à襭¨¥ à ¡®âë Shell\n\r", &cmd_exit},
@ -26,5 +26,5 @@ const command_t COMMANDS[]=
{"sleep", " Žáâ ­ ¢«¨¢ ¥â à ¡®âã Shell'  ­  § ¤ ­­®¥ ¢à¥¬ï. ˆá¯®«ì§®¢ ­¨¥:\n\r sleep <¨­â¥à¢ « ¢ á®âëå ¤®«ï ᥪ㭤ë>\n\r <20>ਬ¥à:\n\r sleep 500 ;¯ ã§  ­  5 ᥪ.\n\r", &cmd_sleep}, {"sleep", " Žáâ ­ ¢«¨¢ ¥â à ¡®âã Shell'  ­  § ¤ ­­®¥ ¢à¥¬ï. ˆá¯®«ì§®¢ ­¨¥:\n\r sleep <¨­â¥à¢ « ¢ á®âëå ¤®«ï ᥪ㭤ë>\n\r <20>ਬ¥à:\n\r sleep 500 ;¯ ã§  ­  5 ᥪ.\n\r", &cmd_sleep},
{"touch", " ‘®§¤ ñâ ¯ãá⮩ ä ©« ¨«¨ ¨§¬¥­ï¥â ¤ âã/¢à¥¬ï ᮧ¤ ­¨ï ä ©« . ˆá¯®«ì§®¢ ­¨¥:\n\r touch <¨¬ï ä ©« >\n\r", &cmd_touch}, {"touch", " ‘®§¤ ñâ ¯ãá⮩ ä ©« ¨«¨ ¨§¬¥­ï¥â ¤ âã/¢à¥¬ï ᮧ¤ ­¨ï ä ©« . ˆá¯®«ì§®¢ ­¨¥:\n\r touch <¨¬ï ä ©« >\n\r", &cmd_touch},
{"uptime", " <20>®ª §ë¢ ¥â uptime\n\r", &cmd_uptime}, {"uptime", " <20>®ª §ë¢ ¥â uptime\n\r", &cmd_uptime},
{"ver", " <20>®ª §ë¢ ¥â ¢¥àá¨î. ˆá¯®«ì§®¢ ­¨¥:\n\r ver ;¢¥àá¨ï Shell\n\r ver kernel ;¢¥àá¨ï ¨ ­®¬¥à ॢ¨§¨¨ ï¤à  KolibriOS\n\r", &cmd_ver}, {"ver", " <20>®ª §ë¢ ¥â ¢¥àá¨î. ˆá¯®«ì§®¢ ­¨¥:\n\r ver ;¢¥àá¨ï Shell\n\r ver kernel ;¢¥àá¨ï ¨ ­®¬¥à ॢ¨§¨¨ ï¤à  KolibriOS\n\r ver cpu ;¨­ä®à¬ æ¨ï ® ¯à®æ¥áá®à¥\n\r", &cmd_ver},
}; };

View File

@ -17,9 +17,19 @@ if ( (0 != strcmp( CMD_HISTORY[0], CMD)) &&
(0 != strcmp( CMD_HISTORY[1], CMD)) && (0 != strcmp( CMD_HISTORY[1], CMD)) &&
(0 != strcmp( CMD_HISTORY[2], CMD)) && (0 != strcmp( CMD_HISTORY[2], CMD)) &&
(0 != strcmp( CMD_HISTORY[3], CMD)) && (0 != strcmp( CMD_HISTORY[3], CMD)) &&
(0 != strcmp( CMD_HISTORY[4], CMD)) ) (0 != strcmp( CMD_HISTORY[4], CMD)) &&
(0 != strcmp( CMD_HISTORY[5], CMD)) &&
(0 != strcmp( CMD_HISTORY[6], CMD)) &&
(0 != strcmp( CMD_HISTORY[7], CMD)) &&
(0 != strcmp( CMD_HISTORY[8], CMD)) &&
(0 != strcmp( CMD_HISTORY[9], CMD)) )
{ {
strcpy(CMD_HISTORY[9], CMD_HISTORY[8]);
strcpy(CMD_HISTORY[8], CMD_HISTORY[7]);
strcpy(CMD_HISTORY[7], CMD_HISTORY[6]);
strcpy(CMD_HISTORY[6], CMD_HISTORY[5]);
strcpy(CMD_HISTORY[5], CMD_HISTORY[4]);
strcpy(CMD_HISTORY[4], CMD_HISTORY[3]); strcpy(CMD_HISTORY[4], CMD_HISTORY[3]);
strcpy(CMD_HISTORY[3], CMD_HISTORY[2]); strcpy(CMD_HISTORY[3], CMD_HISTORY[2]);
strcpy(CMD_HISTORY[2], CMD_HISTORY[1]); strcpy(CMD_HISTORY[2], CMD_HISTORY[1]);
@ -100,7 +110,7 @@ for (;;)
switch (key) switch (key)
{ {
case 72: // UP case 80: // Down
for (hist = 0; hist < CMD_HISTORY_NUM; hist++) for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
{ {
command_clear(); command_clear();
@ -118,7 +128,7 @@ for (;;)
break; break;
case 80: // DOWN case 72: // Up
for (hist = 0; hist < CMD_HISTORY_NUM; hist++) for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
{ {
command_clear(); command_clear();
@ -150,7 +160,14 @@ for (;;)
int command_get_cmd(char cmd[]) int command_get_cmd(char cmd[])
{ {
unsigned i; unsigned i, len;
int quote = 0;
if (CMD[0]=='"')
quote = 1;
if (quote == 0)
{
for (i=0;;i++) for (i=0;;i++)
{ {
cmd[i] = CMD[i]; cmd[i] = CMD[i];
@ -167,6 +184,28 @@ for (i=0;;i++)
} }
return i+1; return i+1;
} }
else
{
len = 0;
for (i=1;;i++)
{
cmd[len] = CMD[i];
if (0 == cmd[len])
{
len = -2;
break;
}
if ( cmd[len] == '"' )
{
cmd[len] = '\0';
break;
}
len++;
}
trim(cmd);
return len+2;
}
}
/// =========================================================== /// ===========================================================

View File

@ -0,0 +1,91 @@
/// ===========================================================
int parameters_prepare(char *param, char* argv[])
{
int i, param_len;
int argc = 1;
int quote = 0;
int argv_len;
param_len = strlen(param);
if ( param_len == 0 )
return 0;
argv[0] = (char*) malloc(4096);
argv_len = 0;
for (i = 0; i < param_len; i++)
{
switch (param[i])
{
case '"':
if (quote == 0)
quote = 1;
else
{
quote = 0;
argv[argc-1][argv_len] = '\0';
argc++;
argv[argc-1] = (char*) malloc(4096);
argv[argc-1][argv_len] = '\0';
argv_len = 0;
}
break;
case 9:
case 32:
if (quote == 0)
{
if ( ( param[i+1] != 32) || ( param[i+1] != 9) )
{
if (argv_len != 0)
{
argv[argc-1][argv_len] = '\0';
argc++;
argv[argc-1] = (char*) malloc(4096);
argv[argc-1][argv_len] = '\0';
argv_len = 0;
}
}
}
else
{
argv[argc-1][argv_len] = param[i];
argv_len++;
}
break;
default:
argv[argc-1][argv_len] = param[i];
argv_len++;
break;
};
}
argv[argc-1][argv_len] = '\0';
if ( strlen(argv[argc-1]) == 0 )
{
free(argv[argc-1]);
argc--;
}
return argc;
}
/// ===========================================================
void parameters_free(int argc, char* argv[])
{
int i;
for (i = 0; i < argc; i++)
free(argv[i]);
}
/// ===========================================================

View File

@ -6,7 +6,7 @@ kol_struct70 k70;
k70.p00 = 7; k70.p00 = 7;
k70.p04 = 0; k70.p04 = 0;
k70.p08 = param; k70.p08 = (unsigned) param;
k70.p12 = 0; k70.p12 = 0;
k70.p16 = 0; k70.p16 = 0;
k70.p20 = 0; k70.p20 = 0;

View File

@ -80,7 +80,7 @@ for (i = 0; i < 30; i++)
#if LANG_ENG #if LANG_ENG
printf (" Error in console application.\n\r"); printf (" Error in console application.\n\r");
#elif LANG_RUS #elif LANG_RUS
printf (" Ошибка в консольном приложении.\n\r"); printf (" Žè¨¡ª  ¢ ª®­á®«ì­®¬ ¯à¨«®¦¥­¨¨.\n\r");
#endif #endif
return 0; return 0;
}; };

View File

@ -11,7 +11,7 @@ k70.p00 = 0;
k70.p04 = 0; k70.p04 = 0;
k70.p08 = 0; k70.p08 = 0;
k70.p12 = 4; // ÷èòàòü 4 áàéòà k70.p12 = 4; // ÷èòàòü 4 áàéòà
k70.p16 = buf; k70.p16 = (unsigned) buf;
k70.p20 = 0; k70.p20 = 0;
k70.p21 = file; k70.p21 = file;
@ -35,7 +35,7 @@ char *buf; //
k70.p00 = 5; k70.p00 = 5;
k70.p04 = k70.p08 = k70.p12 = 0; k70.p04 = k70.p08 = k70.p12 = 0;
k70.p16 = &bdvk; k70.p16 = (unsigned) &bdvk;
k70.p20 = 0; k70.p20 = 0;
k70.p21 = exec; k70.p21 = exec;
@ -54,7 +54,7 @@ buf[filesize]=0;
k70.p00 = 0; k70.p00 = 0;
k70.p04 = k70.p08 = 0; k70.p04 = k70.p08 = 0;
k70.p12 = filesize; k70.p12 = filesize;
k70.p16 = buf; k70.p16 = (unsigned) buf;
k70.p20 = 0; k70.p20 = 0;
k70.p21 = exec; k70.p21 = exec;

View File

@ -25,4 +25,9 @@ int alias_add(char alias[]);
int alias_split (char alias[], char s1[], char s2[]); int alias_split (char alias[], char s1[], char s2[]);
void alias_list(); void alias_list();
int parameters_prepare(char *param, char* argv[]);
void parameters_free(int argc, char* argv[]);
void print_error(void);
/// =========================================================== /// ===========================================================

View File

@ -12,13 +12,13 @@ k70.p00 = 1;
k70.p04 = 0; k70.p04 = 0;
k70.p08 = 0; k70.p08 = 0;
k70.p12 = 2*1024*1024; // 2 MB k70.p12 = 2*1024*1024; // 2 MB
k70.p16 = malloc(2*1024*1024); k70.p16 = (unsigned) malloc(2*1024*1024);
k70.p20 = 0; k70.p20 = 0;
k70.p21 = dir; k70.p21 = dir;
result = kol_file_70(&k70); result = kol_file_70(&k70);
free(k70.p16); free((void*)k70.p16);
if ( (0 == result)||(6 == result) ) if ( (0 == result)||(6 == result) )
return TRUE; return TRUE;

View File

@ -0,0 +1,234 @@
SC_OK = 0
SC_EXIT = 1
SC_PUTC = 2
SC_PUTS = 3
SC_GETC = 4
SC_GETS = 5
SC_CLS = 6
SHM_WRITE = 0x01
SHM_OPEN_ALWAYS = 0x04
;============================
align 4
sc_name rb 64
sc_pid dd 0
sc_buffer dd 0
sc_process dd 0
;============================
align 4
_sc_pid2name:
push esp
push ebx
xor ecx, ecx
mov eax, [sc_pid]
mov ebx, 10
@@:
xor edx, edx
div ebx
push edx
inc ecx
test eax, eax
jnz @b
mov edi, sc_name
@@:
pop eax
add al, '0'
stosb
loop @b
mov al, '-'
stosb
mov al, 'S'
stosb
mov al, 'H'
stosb
mov al, 'E'
stosb
mov al, 'L'
stosb
mov al, 'L'
stosb
mov al, 0
stosb
pop ebx
pop esp
ret
;============================
align 4
; void __stdcall sc_init();
_sc_init:
push esp
push ebx
mov eax, 68
mov ebx, 11
int 0x40
mov eax, 68 ; ¢ë¤¥«¨âì ¯ ¬ïâì
mov ebx, 12
mov ecx, 1024
int 0x40
mov [sc_process], eax
mov eax, 9 ; ¯®«ãç¨âì ¨­ä®à¬ æ¨î ® ⥪ã饬 ¯à®æ¥áá¥
mov ebx, [sc_process]
mov ecx, -1
int 0x40
mov dword eax, [ebx+30] ; ¯®«ãç ¥¬ PID ⥪饣® ¯à®æ¥áá 
mov [sc_pid], eax
mov eax, 68 ; ®á¢®¡®¤¨âì ¯ ¬ïâì
mov ebx, 13
mov ecx, [sc_process]
int 0x40
call _sc_pid2name
mov eax, 68 ; ®âªàëâì ¨¬¥­®¢ ­­ãî ®¡« áâì
mov ebx, 22
mov dword ecx, sc_name
mov edx, 4096
mov esi, SHM_OPEN_ALWAYS or SHM_WRITE
int 0x40
mov [sc_buffer], eax
pop ebx
pop esp
ret
;============================
align 4
; void __stdcall sc_puts(char *str);
_sc_puts:
push esp
push ebx
mov esi, [esp+12]
mov edi, [sc_buffer]
mov al, SC_PUTS
stosb
@@:
lodsb
stosb
test al, al
jnz @b
mov ebx, [sc_buffer]
@@:
mov byte dl, [ebx]
test dl, dl
jz @f
push ebx
mov eax, 5
mov ebx, 5
int 0x40
pop ebx
jmp @b
@@:
pop ebx
pop esp
ret 4
;============================
align 4
; void __stdcall sc_exit();
_sc_exit:
push ebx
push esp
mov ebx, [sc_buffer]
mov byte [ebx], SC_EXIT
@@:
mov byte dl, [ebx]
test dl, dl
jz @f
push ebx
mov eax, 5
mov ebx, 5
int 0x40
pop ebx
jmp @b
@@:
mov eax, 68 ;§ ªàëâì ¨¬¥­®¢ ­­ãî ®¡« áâì
mov ebx, 23
mov dword ecx, sc_name
int 0x40
pop esp
pop ebx
ret
;============================
align 4
; void __stdcall sc_gets(char *str);
_sc_gets:
push esp
push ebx
mov edi, [esp+12]
mov ebx, [sc_buffer]
mov byte [ebx], SC_GETS
@@:
mov byte dl, [ebx]
test dl, dl
jz @f
push ebx
mov eax, 5
mov ebx, 5
int 0x40
pop ebx
jmp @b
@@:
mov esi, [sc_buffer]
inc esi
@@:
lodsb
stosb
test al, al
jnz @b
pop ebx
pop esp
ret 4
;============================

View File

@ -158,15 +158,30 @@ s[4] = 0;
{ {
int i, sign; int i, sign;
if ((sign = n) < 0) /* записываем знак */ if ((sign = n) < 0)
n = -n; /* делаем n положительным числом */ n = -n;
i = 0; i = 0;
do { /* генерируем цифры в обратном порядке */ do {
s[i++] = n % 10 + '0'; /* берем следующую цифру */ s[i++] = n % 10 + '0';
} while ((n /= 10) > 0); /* удаляем */ } while ((n /= 10) > 0);
if (sign < 0) if (sign < 0)
s[i++] = '-'; s[i++] = '-';
s[i] = '\0'; s[i] = '\0';
reverse(s); reverse(s);
} }
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;
}

View File

@ -16,3 +16,4 @@ char* strchr(const char* string, int c);
void _itoa(int i, char *s); void _itoa(int i, char *s);
void reverse(char *s); void reverse(char *s);
void itoa(int i, char *s); void itoa(int i, char *s);
int _atoi ( char *s );

View File

@ -0,0 +1,36 @@
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd 0x10000 ; memory for app
dd 0x10000 ; esp
dd param_area ; I_Param
dd app_path ; I_Path
include 'shell.inc'
START: ; start of execution
call _sc_init
push dword s
call _sc_gets
push dword s
call _sc_puts
call _sc_exit
mov eax, -1
int 0x40
I_END:
param_area rb 256
app_path rb 256
s rb 256