OberonCore https://forum.oberoncore.ru/ |
|
Модуль Args, параметры командной строки https://forum.oberoncore.ru/viewtopic.php?f=47&t=6719 |
Страница 1 из 1 |
Автор: | kekc_leader [ Среда, 27 Январь, 2021 04:42 ] | ||||
Заголовок сообщения: | Модуль Args, параметры командной строки | ||||
Для своих нужд я написал для ББКП 1.8 небольшие модули Args и HostArgs. В случае написания с помощью Блекбокса классического консольного приложения, модуль Args позволяет свободно работать с параметрами командной строки, как это делалось в Паскале или Си. Код: DEFINITION Args; (** Puts nth command line argument in s. Argument Nr. 0 is the application name. *) PROCEDURE GetParam (n: INTEGER; OUT s: ARRAY OF CHAR); (** Returns the total number of command line arguments, including argument Nr. 0. * PROCEDURE ParamCount (): INTEGER; END Args. Код: MODULE TestEnv; IMPORT Args, Log; PROCEDURE Do*; VAR i, n: INTEGER; s: ARRAY 1000 OF CHAR; BEGIN n := Args.ParamCount(); Log.Int(n); Log.String(' parameters total.'); Log.Ln; FOR i := 0 TO n - 1 DO Args.GetParam(i, s); Log.Int(i); Log.String(' - "'); Log.String(s); Log.Char('"'); Log.Ln END END Do; END TestEnv. MODULE TestMain; IMPORT TestEnv; BEGIN TestEnv.Do END TestMain. (*Для запуска из консоли*) Для компиляции под Линукс запускаю коммандер: Код: Dev2Linker1.LinkElfExe Linux TestEnv := Kernel$+ Math Strings Files Log Dialog Console HostConsole HostArgs ConsLog TestEnv TestMain Код: $ ./TestEnv hello world! 3 parameters total. 0 - "./TestEnv" 1 - "hello" 2 - "world!" Файлы Args и HostArgs прилагаю (System/Mod/Args.odc и Host/Mod/Args.odc).
|
Автор: | Comdiv [ Среда, 27 Январь, 2021 14:56 ] |
Заголовок сообщения: | Re: Модуль Args, параметры командной строки |
Args слишком общее название для такой конкретной вещи, как аргументы командной строки, доступные лишь в ограниченном количестве платформ. И наоборот, GetParam, ParamCount - избыточно уточняющие названия с учётом того, что они и так уточняются модулем, в которых находятся. Ещё я бы отделил имя программы от аргументов. |
Автор: | kekc_leader [ Четверг, 28 Январь, 2021 06:23 ] | |||
Заголовок сообщения: | Re: Модуль Args, параметры командной строки | |||
Сделал версию HostArgs для Windows (см. вложение). Используется процедура WinApi.GetCommandLineW, возвращающая строку, которая затем разрезается на кусочки. Всё это происходит при первом обращении к GetParam() или ParamCount() Насчёт названий я не возражаю. Давайте подумаем, как лучше назвать. Я выбрал название, которое, вроде бы, использовалось в Модуле-2 и в Обероне-2, а вместе с одним из компиляторов Оберона-07 поставляется модуль extArgs. Название процедур, однако, я взял из Паскаля (правда там не GetParam, а ParamStr). Согласен, что они слишком уточняющие. В общем, я и хотел потом их поменять. Иван Денисов предлагал назвать модуль Env, но HostEnv в ББКП уже существует, и я не понял, что с ним делать (встроить свой код в него?). Ещё вариант названия модуля: Params. Params.Get(n, OUT s) Params.Count(): INTEGER Название программы всегда идёт в списке параметров коммандной строки под номером ноль: в Виндоусе, Линуксе, Маке и даже в Досе. Думаю, здесь что-то менять не стоит ради традиции, что ли, и во избежание путаницы. Программистам на ББ аргументы командной строки, пожалуй, нужны в довольно редких случаях. Мне нужны Если менять, то нужна ещё какая-то GetAppName(s), не знаю как её правильно назвать. UPD: И. Денисов предложил сделать модули ConsArgs, ConsArgsLin, ConsArgsWin.
|
Автор: | Иван Денисов [ Четверг, 28 Январь, 2021 08:17 ] |
Заголовок сообщения: | Re: Модуль Args, параметры командной строки |
kekc_leader писал(а): И. Денисов предложил сделать модули ConsArgs, ConsArgsLin, ConsArgsWin. И пока оставить в виде расширения, в базовую сборку пока не включать. Схема для расширений без Host заключается в загрузке нужной реализации в процедуре Init модуля ConsArgs. Код: PROCEDURE Init;
VAR res: INTEGER; s: ARRAY 256 OF CHAR; BEGIN (* load realisations for current platform *) IF Dialog.IsWindows() THEN ASSERT(Kernel.ThisMod('ConsArgsWin') # NIL, 20) ELSIF Dialog.IsLinux() THEN ASSERT(Kernel.ThisMod('ConsArgsLin') # NIL, 20) ELSE HALT(20) END; |
Автор: | adimetrius [ Четверг, 28 Январь, 2021 12:47 ] |
Заголовок сообщения: | Re: Модуль Args, параметры командной строки |
Как расширение - приветствую. Замечательное кроссплатформенное расширение получится, и схема без Host с явным динамическим импортом тоже интересно. |
Автор: | Евгений Темиргалеев [ Вторник, 02 Февраль, 2021 00:15 ] |
Заголовок сообщения: | Re: Модуль Args, параметры командной строки |
Что-то не то...) Код: PROCEDURE Init;
VAR res: INTEGER; s: ARRAY 256 OF CHAR; BEGIN (* load realisations for current platform *) #ifdef Windows ASSERT(Kernel.ThisMod('ConsArgsWin') # NIL, 20) #endif #ifdef Linux ASSERT(Kernel.ThisMod('ConsArgsLin') # NIL, 20) #endif |
Автор: | adimetrius [ Вторник, 02 Февраль, 2021 02:22 ] |
Заголовок сообщения: | Re: Модуль Args, параметры командной строки |
Вот не то: Код: MODULE M; IMPORT #ifdef Windows ConsArgsWin #elsifdef Linux ConsArgsLin #endif ; Но то - это не это ) |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |