forked from KolibriOS/kolibrios
Shell v0.6. See History.txt.
git-svn-id: svn://kolibrios.org@3245 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
0da906311f
commit
4ed6be1119
@ -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
|
||||
=======================================
|
||||
* Исправлен интерфейс исполняемых консольных приложений. Теперь они должны создавать буфер с именем pid-SHELL, где pid - идентификатор процесса без заглавных нулей
|
||||
@ -47,7 +61,7 @@ Shell 0.4.5 // 19.10.2010 // Pterox
|
||||
=======================================
|
||||
Программа теперь многоязыковая (английский, и русский язык). Программа полностью русифицированна.
|
||||
* Команда "free" переименована в "memory" - для точности.
|
||||
* Добавлены команды turnoff (выключить компьютер), kerver (версия ядра KoOS), uptime; reboot теперь может перезагружать ядро ("reboot kernel")
|
||||
* Добавлены команды turnoff (выключить компьютер), kerver (версия ядра KolibriOS), uptime; reboot теперь может перезагружать ядро ("reboot kernel")
|
||||
|
||||
|
||||
Shell 0.4.4 // 20.08.2010 // Albom
|
||||
@ -59,8 +73,8 @@ Shell 0.4.4 // 20.08.2010 // Albom
|
||||
* ccpuid - вывод в консоль информации (пока скудно) о процессоре. пользы мало, но давно хотел с командой cpuid разобраться (в следующем семестре буду студентам курс читать, включил разбор команды в программу).
|
||||
|
||||
есть много идей. некоторые легко реализуются, некоторые сложнее. если интересно:
|
||||
1) добавить переменную (одну!), в которую будет результат в текстовой форме (не то что возвращает ф-ция) записываться. с ней можно будет работать из командной строки.
|
||||
2) внедрить простую стековую машину для вычислений с вещественными числами.
|
||||
1) добавить переменную (одну!), в которую будет результат в текстовой форме (не то что возвращает функция) записываться. с ней можно будет работать из командной строки
|
||||
2) внедрить простую стековую машину для вычислений с вещественными числами
|
||||
|
||||
|
||||
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
|
||||
=======================================
|
||||
* Добавил корректное завершение работы при закрытии окна консоли, работает только начиная с последней на данный момент версией библиотеки (лежит на svn, включена в ночную сборку). Перекомпилировал в VS2008 с LTCG, ещё пошаманил с оптимизацией по размеру.
|
||||
* Добавил корректное завершение работы при закрытии окна консоли, работает только начиная с последней на данный момент версией библиотеки (лежит на svn, включена в ночную сборку). Перекомпилировал в VS2008 с LTCG, ещё пошаманил с оптимизацией по размеру
|
||||
|
||||
|
||||
Shell 0.4.1 // 16.03.2009 // Albom
|
||||
@ -94,33 +108,33 @@ alias DIr = ls
|
||||
alias ls=somecommand
|
||||
- при отладке получал странную информацию, но так как у меня всё работает, то пока изменений вносить не планирую
|
||||
|
||||
2) Теперь шелл можно запускать с параметром (из самого себя, например).
|
||||
2) Теперь шелл можно запускать с параметром (из самого себя, например)
|
||||
- синтаксис:
|
||||
shell команда
|
||||
- пример:
|
||||
shell /sys/somescript
|
||||
- при этом .shell не запускается
|
||||
|
||||
3) Реализована команда more. ( MEMENTO MORI! - Моментально... в море! )
|
||||
3) Реализована команда more
|
||||
- просмотр текстовых и бинарных файлов (вроде бы задача простая, но пришлось повозиться с управляющими символами)
|
||||
- очень не рекомендуется просматривать большие файлы
|
||||
|
||||
|
||||
Shell 0.3 // 07.08.2008 // Albom
|
||||
=======================================
|
||||
1) Возможность запуска скриптов.
|
||||
1) Возможность запуска скриптов
|
||||
* каждая строка должна представляет собой команду
|
||||
* строкой считается набор символов, который заканчивается CR+LF (Windows) или LF(UNIX) или CR(Mac)
|
||||
* если строка начинается с #, то вся строка (т.е. комментарий) игнорируется
|
||||
* скрипт должен начитаться с #SHS
|
||||
* при запуске шелла автоматически запускается скрипт .shell
|
||||
|
||||
2) История из 5 (можно изменить при компиляции) введённых команд.
|
||||
2) История из 5 (можно изменить при компиляции) введённых команд
|
||||
* перемещение по истории - UP/DOWN
|
||||
|
||||
3) Команда alias, которая позволяет вводить синонимы для команд.
|
||||
3) Команда alias, которая позволяет вводить синонимы для команд
|
||||
* до 256 (можно изменить при компиляции) синонимов
|
||||
* пока работает только добавление и просмотр синонимов, а отработка пока не реализована.
|
||||
* пока работает только добавление и просмотр синонимов, а отработка пока не реализована
|
||||
|
||||
|
||||
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
|
||||
=======================================
|
||||
* Добавил команды free и reboot, внёс некоторые изменения, исправил найденные ошибки.
|
||||
* Добавил команды free и reboot, внёс некоторые изменения, исправил найденные ошибки
|
||||
|
||||
|
||||
Shell 0.1 // 29.07.2008 // Albom
|
||||
=======================================
|
||||
* Реализованы (не полностью) команды: about, cd, date, echo, exit, help, kill, ls, ps, pwd, ver
|
||||
* При запуске программы (если не указан полный путь) она ищется в каталоге /rd/1 и текущем каталоге.
|
||||
* При запуске программы (если не указан полный путь) она ищется в каталоге /rd/1 и текущем каталоге
|
||||
|
||||
|
||||
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
|
||||
=======================================
|
||||
* Решил написать функциональный шелл на Си с использованием console.obj.
|
||||
* Пока сделал функцию отделения команды и параметров, а также реализовал команды help (пока без параметров), ver и exit.
|
||||
* Решил написать функциональный шелл на Си с использованием console.obj
|
||||
* Пока сделал функцию отделения команды и параметров, а также реализовал команды help (пока без параметров), ver и exit
|
||||
|
||||
|
@ -37,12 +37,12 @@
|
||||
#include "cmd/cmd_alias.c"
|
||||
#include "cmd/cmd_more.c"
|
||||
#include "cmd/cmd_clear.c"
|
||||
#include "cmd/cmd_ccpuid.c"
|
||||
#include "cmd/cmd_sleep.c"
|
||||
#include "cmd/cmd_shutdown.c"
|
||||
#include "cmd/cmd_uptime.c"
|
||||
#include "cmd/cmd_killall.c"
|
||||
#include "cmd/cmd_history.c"
|
||||
#include "cmd/cmd_cp.c"
|
||||
|
||||
#include "modules/module_command.c"
|
||||
#include "modules/module_program_console.c"
|
||||
@ -50,5 +50,6 @@
|
||||
#include "modules/module_script.c"
|
||||
#include "modules/module_executable.c"
|
||||
#include "modules/module_alias.c"
|
||||
#include "modules/module_parameters.c"
|
||||
|
||||
/// ===========================================================
|
||||
|
@ -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;
|
||||
}
|
189
programs/system/shell/cmd/cmd_cp.c
Normal file
189
programs/system/shell/cmd/cmd_cp.c
Normal 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;
|
||||
}
|
||||
|
@ -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[])
|
||||
{
|
||||
|
||||
|
@ -14,7 +14,7 @@ k70.p00 = 1;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 10000;
|
||||
k70.p16 = malloc(32+k70.p12*560);
|
||||
k70.p16 = (unsigned) malloc(32+k70.p12*560);
|
||||
k70.p20 = 0;
|
||||
|
||||
/// !!!
|
||||
@ -27,23 +27,23 @@ else
|
||||
result = kol_file_70(&k70);
|
||||
if ( !((result==0) || (result==6)) ) // ïðîâåðÿåì ñóùåñòâîâàíèå êàòàëîãà
|
||||
{
|
||||
free(k70.p16);
|
||||
free( (void*) k70.p16);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
n = k70.p16+8;
|
||||
n = (unsigned*) (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;
|
||||
t = (unsigned*) (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);
|
||||
free((void*)k70.p16);
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ else
|
||||
|
||||
k70.p00 = 5;
|
||||
k70.p04 = k70.p08 = k70.p12 = 0;
|
||||
k70.p16 = &bdvk;
|
||||
k70.p16 = (unsigned) &bdvk;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = temp;
|
||||
|
||||
@ -67,7 +67,7 @@ for (pos=0;pos<filesize;pos+=80)
|
||||
k70.p04 = pos;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 80;
|
||||
k70.p16 = buf;
|
||||
k70.p16 = (unsigned) buf;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = temp;
|
||||
|
||||
|
@ -10,25 +10,56 @@ if (!strcmp(param, "kernel"))
|
||||
kvbuf = malloc(16);
|
||||
kol_get_kernel_ver(kvbuf);
|
||||
vA = kvbuf+0;
|
||||
vA = *vA;
|
||||
vB = kvbuf+1;
|
||||
vB = *vB;
|
||||
vC = kvbuf+2;
|
||||
vC = *vC;
|
||||
vD = kvbuf+3;
|
||||
vD = *vD;
|
||||
Rev = kvbuf+5;
|
||||
Rev = *Rev;
|
||||
|
||||
#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
|
||||
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
|
||||
free(kvbuf);
|
||||
}
|
||||
else
|
||||
printf (" Shell v%s\n\r", SHELL_VERSION);
|
||||
|
||||
free(kvbuf);
|
||||
|
||||
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;
|
||||
}
|
||||
|
@ -1,12 +1,11 @@
|
||||
@echo off
|
||||
erase lang.h
|
||||
echo #define LANG_ENG 1 > lang.h
|
||||
fasm start.asm start.o
|
||||
gcc -c shell.c
|
||||
gcc -c system/kolibri.c
|
||||
gcc -c system/stdlib.c
|
||||
gcc -c system/string.c
|
||||
gcc -c system/ctype.c
|
||||
gcc -c -fno-builtin shell.c
|
||||
gcc -c -fno-builtin system/kolibri.c
|
||||
gcc -c -fno-builtin system/stdlib.c
|
||||
gcc -c -fno-builtin system/string.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
|
||||
objcopy shell -O binary
|
||||
erase lang.h start.o shell.o kolibri.o stdlib.o string.o
|
||||
|
@ -1,12 +1,11 @@
|
||||
@echo off
|
||||
erase lang.h
|
||||
echo #define LANG_RUS 1 > lang.h
|
||||
fasm start.asm start.o
|
||||
gcc -c shell.c
|
||||
gcc -c system/kolibri.c
|
||||
gcc -c system/stdlib.c
|
||||
gcc -c system/string.c
|
||||
gcc -c system/ctype.c
|
||||
gcc -c -fno-builtin shell.c
|
||||
gcc -c -fno-builtin system/kolibri.c
|
||||
gcc -c -fno-builtin system/stdlib.c
|
||||
gcc -c -fno-builtin system/string.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
|
||||
objcopy shell -O binary
|
||||
erase lang.h start.o shell.o kolibri.o stdlib.o string.o ctype.o
|
||||
|
@ -1,10 +1,10 @@
|
||||
@echo off
|
||||
fasm start.asm start.o
|
||||
gcc -c test.c
|
||||
gcc -c system/kolibri.c
|
||||
gcc -c system/stdlib.c
|
||||
gcc -c system/string.c
|
||||
gcc -c system/ctype.c
|
||||
gcc -c -fno-builtin test.c
|
||||
gcc -c -fno-builtin system/kolibri.c
|
||||
gcc -c -fno-builtin system/stdlib.c
|
||||
gcc -c -fno-builtin system/string.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
|
||||
objcopy test -O binary
|
||||
erase start.o kolibri.o stdlib.o string.o ctype.o test.o
|
||||
|
6
programs/system/shell/compile_test_asm.bat
Normal file
6
programs/system/shell/compile_test_asm.bat
Normal 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
|
@ -1,5 +1,5 @@
|
||||
|
||||
#define SHELL_VERSION "0.5.4"
|
||||
#define SHELL_VERSION "0.6"
|
||||
|
||||
extern char PATH[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_HISTORY[CMD_HISTORY_NUM][256];
|
||||
@ -44,7 +44,6 @@ typedef struct
|
||||
|
||||
int cmd_about(char arg[]);
|
||||
int cmd_alias(char arg[]);
|
||||
int cmd_ccpuid(char dir[]);
|
||||
int cmd_cd(char dir[]);
|
||||
int cmd_clear(char arg[]);
|
||||
int cmd_date(char arg[]);
|
||||
@ -68,6 +67,8 @@ int cmd_shutdown(char arg[]);
|
||||
int cmd_uptime(char param[]);
|
||||
int cmd_killall(char process_name[]);
|
||||
int cmd_history(char arg[]);
|
||||
int cmd_cp(char param[]);
|
||||
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
|
@ -3,9 +3,9 @@ const command_t COMMANDS[]=
|
||||
{
|
||||
{"about", " Displays information about Shell\n\r", &cmd_about},
|
||||
{"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},
|
||||
{"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},
|
||||
{"echo", " Echoes the data to the screen. Usage:\n\r echo <data>\n\r", &cmd_echo},
|
||||
{"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},
|
||||
{"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},
|
||||
{"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},
|
||||
};
|
||||
|
@ -3,9 +3,9 @@ const command_t COMMANDS[]=
|
||||
{
|
||||
{"about", " ‚뢮¤¨â ¨ä®à¬ æ¨î ® ¯à®£à ¬¬¥ Shell\n\r", &cmd_about},
|
||||
{"alias", " <20>®ª §ë¢ ¥â ¨ ¯®§¢®«ï¥â ¨§¬¥¨âì ᯨ᮪ ᨮ¨¬®¢ ª®¬ ¤\n\r", &cmd_alias},
|
||||
{"ccpuid", " ‚뢮¤¨â ¨ä®à¬ æ¨î ® CPU\n\r", &cmd_ccpuid},
|
||||
{"cd", " ˆ§¬¥ï¥â ⥪ãéãî ¤¥à¨ªâ®à¨î. ˆá¯®«ì§®¢ ¨¥:\n\r cd <¤¨à¥ªâ®à¨ï>\n\r", &cmd_cd},
|
||||
{"clear", " Žç¨é ¥â íªà \n\r", &cmd_clear},
|
||||
{"cp", " Š®¯¨àã¥â ä ©«\n\r", &cmd_cp},
|
||||
{"date", " <20>®ª §ë¢ ¥â ⥪ãéãî ¤ âã ¨ ¢à¥¬ï\n\r", &cmd_date},
|
||||
{"echo", " ‚뢮¤¨â ¤ ë¥ íªà . ˆá¯®«ì§®¢ ¨¥:\n\r echo <¤ ë¥>\n\r", &cmd_echo},
|
||||
{"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},
|
||||
{"touch", " ‘®§¤ ñâ ¯ãá⮩ ä ©« ¨«¨ ¨§¬¥ï¥â ¤ âã/¢à¥¬ï ᮧ¤ ¨ï ä ©« . ˆá¯®«ì§®¢ ¨¥:\n\r touch <¨¬ï ä ©« >\n\r", &cmd_touch},
|
||||
{"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},
|
||||
};
|
||||
|
@ -17,9 +17,19 @@ 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)) )
|
||||
(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[3], CMD_HISTORY[2]);
|
||||
strcpy(CMD_HISTORY[2], CMD_HISTORY[1]);
|
||||
@ -100,7 +110,7 @@ for (;;)
|
||||
switch (key)
|
||||
{
|
||||
|
||||
case 72: // UP
|
||||
case 80: // Down
|
||||
for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
|
||||
{
|
||||
command_clear();
|
||||
@ -118,7 +128,7 @@ for (;;)
|
||||
|
||||
break;
|
||||
|
||||
case 80: // DOWN
|
||||
case 72: // Up
|
||||
for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
|
||||
{
|
||||
command_clear();
|
||||
@ -150,8 +160,15 @@ for (;;)
|
||||
|
||||
int command_get_cmd(char cmd[])
|
||||
{
|
||||
unsigned i;
|
||||
for (i=0;;i++)
|
||||
unsigned i, len;
|
||||
int quote = 0;
|
||||
|
||||
if (CMD[0]=='"')
|
||||
quote = 1;
|
||||
|
||||
if (quote == 0)
|
||||
{
|
||||
for (i=0;;i++)
|
||||
{
|
||||
cmd[i] = CMD[i];
|
||||
if (0 == cmd[i])
|
||||
@ -165,7 +182,29 @@ for (i=0;;i++)
|
||||
break;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
91
programs/system/shell/modules/module_parameters.c
Normal file
91
programs/system/shell/modules/module_parameters.c
Normal 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]);
|
||||
|
||||
}
|
||||
|
||||
/// ===========================================================
|
@ -6,7 +6,7 @@ kol_struct70 k70;
|
||||
|
||||
k70.p00 = 7;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = param;
|
||||
k70.p08 = (unsigned) param;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
|
@ -80,7 +80,7 @@ for (i = 0; i < 30; i++)
|
||||
#if LANG_ENG
|
||||
printf (" Error in console application.\n\r");
|
||||
#elif LANG_RUS
|
||||
printf (" Ошибка в консольном приложении.\n\r");
|
||||
printf (" Žè¨¡ª ¢ ª®á®«ì®¬ ¯à¨«®¦¥¨¨.\n\r");
|
||||
#endif
|
||||
return 0;
|
||||
};
|
||||
|
@ -11,7 +11,7 @@ k70.p00 = 0;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 4; // ÷èòàòü 4 áàéòà
|
||||
k70.p16 = buf;
|
||||
k70.p16 = (unsigned) buf;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = file;
|
||||
|
||||
@ -35,7 +35,7 @@ char *buf; //
|
||||
|
||||
k70.p00 = 5;
|
||||
k70.p04 = k70.p08 = k70.p12 = 0;
|
||||
k70.p16 = &bdvk;
|
||||
k70.p16 = (unsigned) &bdvk;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = exec;
|
||||
|
||||
@ -54,7 +54,7 @@ buf[filesize]=0;
|
||||
k70.p00 = 0;
|
||||
k70.p04 = k70.p08 = 0;
|
||||
k70.p12 = filesize;
|
||||
k70.p16 = buf;
|
||||
k70.p16 = (unsigned) buf;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = exec;
|
||||
|
||||
|
@ -25,4 +25,9 @@ int alias_add(char alias[]);
|
||||
int alias_split (char alias[], char s1[], char s2[]);
|
||||
void alias_list();
|
||||
|
||||
int parameters_prepare(char *param, char* argv[]);
|
||||
void parameters_free(int argc, char* argv[]);
|
||||
|
||||
void print_error(void);
|
||||
|
||||
/// ===========================================================
|
||||
|
@ -12,13 +12,13 @@ k70.p00 = 1;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 2*1024*1024; // 2 MB
|
||||
k70.p16 = malloc(2*1024*1024);
|
||||
k70.p16 = (unsigned) malloc(2*1024*1024);
|
||||
k70.p20 = 0;
|
||||
k70.p21 = dir;
|
||||
|
||||
result = kol_file_70(&k70);
|
||||
|
||||
free(k70.p16);
|
||||
free((void*)k70.p16);
|
||||
|
||||
if ( (0 == result)||(6 == result) )
|
||||
return TRUE;
|
||||
|
234
programs/system/shell/shell.inc
Normal file
234
programs/system/shell/shell.inc
Normal 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
|
||||
|
||||
;============================
|
||||
|
@ -7,7 +7,7 @@
|
||||
#define random(num) ((rand()*(num))/((RAND_MAX+1)))
|
||||
|
||||
void* malloc(unsigned size);
|
||||
void free(void *pointer);
|
||||
void free(void* pointer);
|
||||
void* realloc(void* pointer, unsigned size);
|
||||
|
||||
void srand (unsigned seed);
|
||||
|
@ -158,15 +158,30 @@ s[4] = 0;
|
||||
{
|
||||
int i, sign;
|
||||
|
||||
if ((sign = n) < 0) /* записываем знак */
|
||||
n = -n; /* делаем n положительным числом */
|
||||
if ((sign = n) < 0)
|
||||
n = -n;
|
||||
i = 0;
|
||||
do { /* генерируем цифры в обратном порядке */
|
||||
s[i++] = n % 10 + '0'; /* берем следующую цифру */
|
||||
} while ((n /= 10) > 0); /* удаляем */
|
||||
do {
|
||||
s[i++] = n % 10 + '0';
|
||||
} while ((n /= 10) > 0);
|
||||
if (sign < 0)
|
||||
s[i++] = '-';
|
||||
s[i] = '\0';
|
||||
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;
|
||||
}
|
||||
|
@ -16,3 +16,4 @@ char* strchr(const char* string, int c);
|
||||
void _itoa(int i, char *s);
|
||||
void reverse(char *s);
|
||||
void itoa(int i, char *s);
|
||||
int _atoi ( char *s );
|
||||
|
36
programs/system/shell/test.asm
Normal file
36
programs/system/shell/test.asm
Normal 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
|
||||
|
Loading…
Reference in New Issue
Block a user