diff --git a/programs/system/shell/History.txt b/programs/system/shell/History.txt index 32504a0960..cb7504d81f 100644 --- a/programs/system/shell/History.txt +++ b/programs/system/shell/History.txt @@ -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 diff --git a/programs/system/shell/all.h b/programs/system/shell/all.h index 1962d144fe..4683b78b9d 100644 --- a/programs/system/shell/all.h +++ b/programs/system/shell/all.h @@ -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" /// =========================================================== diff --git a/programs/system/shell/cmd/cmd_ccpuid.c b/programs/system/shell/cmd/cmd_ccpuid.c deleted file mode 100644 index 1b17316122..0000000000 --- a/programs/system/shell/cmd/cmd_ccpuid.c +++ /dev/null @@ -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; -} diff --git a/programs/system/shell/cmd/cmd_cp.c b/programs/system/shell/cmd/cmd_cp.c new file mode 100644 index 0000000000..e6b259828c --- /dev/null +++ b/programs/system/shell/cmd/cmd_cp.c @@ -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 \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; +} + diff --git a/programs/system/shell/cmd/cmd_kill.c b/programs/system/shell/cmd/cmd_kill.c index 8c326c3f76..50240859ab 100644 --- a/programs/system/shell/cmd/cmd_kill.c +++ b/programs/system/shell/cmd/cmd_kill.c @@ -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[]) { diff --git a/programs/system/shell/cmd/cmd_ls.c b/programs/system/shell/cmd/cmd_ls.c index cd86892039..8a8a42ffcb 100644 --- a/programs/system/shell/cmd/cmd_ls.c +++ b/programs/system/shell/cmd/cmd_ls.c @@ -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; } diff --git a/programs/system/shell/cmd/cmd_more.c b/programs/system/shell/cmd/cmd_more.c index 78fb137129..6b38e7c220 100644 --- a/programs/system/shell/cmd/cmd_more.c +++ b/programs/system/shell/cmd/cmd_more.c @@ -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> 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; } diff --git a/programs/system/shell/compile_eng.bat b/programs/system/shell/compile_eng.bat index 03f858424a..bdc98a6112 100644 --- a/programs/system/shell/compile_eng.bat +++ b/programs/system/shell/compile_eng.bat @@ -1,16 +1,15 @@ @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 kpack shell move shell bin\eng\ copy locale\eng\.shell bin\eng\ -pause \ No newline at end of file +pause diff --git a/programs/system/shell/compile_rus.bat b/programs/system/shell/compile_rus.bat index d6105bad05..db66343814 100644 --- a/programs/system/shell/compile_rus.bat +++ b/programs/system/shell/compile_rus.bat @@ -1,16 +1,15 @@ @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 kpack shell move shell bin\rus\ copy locale\rus\.shell bin\rus\ -pause \ No newline at end of file +pause diff --git a/programs/system/shell/compile_test.bat b/programs/system/shell/compile_test.bat index 09a6191913..94770e71e3 100644 --- a/programs/system/shell/compile_test.bat +++ b/programs/system/shell/compile_test.bat @@ -1,14 +1,14 @@ @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 kpack test copy test bin\eng\ move test bin\rus\ -pause \ No newline at end of file +pause diff --git a/programs/system/shell/compile_test_asm.bat b/programs/system/shell/compile_test_asm.bat new file mode 100644 index 0000000000..0d07b91641 --- /dev/null +++ b/programs/system/shell/compile_test_asm.bat @@ -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 \ No newline at end of file diff --git a/programs/system/shell/globals.h b/programs/system/shell/globals.h index ceb2a1ca70..11009d3676 100644 --- a/programs/system/shell/globals.h +++ b/programs/system/shell/globals.h @@ -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[]); + /// =========================================================== diff --git a/programs/system/shell/locale/eng/globals.h b/programs/system/shell/locale/eng/globals.h index 21f926ecfe..4800ce54c3 100644 --- a/programs/system/shell/locale/eng/globals.h +++ b/programs/system/shell/locale/eng/globals.h @@ -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 \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 \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