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).

Вложения:
Комментарий к файлу: Запакованный файл с четырьмя модулями.
args_linux.txt [7.12 КБ]
Скачиваний: 284
Комментарий к файлу: Host/Mod/Args.odc
Args.odc [2.53 КБ]
Скачиваний: 279
Комментарий к файлу: System/Mod/Args.odc
Args.odc [2.84 КБ]
Скачиваний: 276

Автор:  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

Название программы всегда идёт в списке параметров коммандной строки под номером ноль: в Виндоусе, Линуксе, Маке и даже в Досе. Думаю, здесь что-то менять не стоит ради традиции, что ли, и во избежание путаницы. Программистам на ББ аргументы командной строки, пожалуй, нужны в довольно редких случаях. Мне нужны :D
Если менять, то нужна ещё какая-то GetAppName(s), не знаю как её правильно назвать.

UPD:
И. Денисов предложил сделать модули ConsArgs, ConsArgsLin, ConsArgsWin.

Вложения:
Комментарий к файлу: Windows-версия модуля HostArgs
Args.odc [3.5 КБ]
Скачиваний: 273
Комментарий к файлу: Закодированный набор из 4 модулей: Args, HostArgs, TestEnv и TestMain. Версия HostArgs для Windows.
args_windows.txt [8.14 КБ]
Скачиваний: 287

Автор:  Иван Денисов [ Четверг, 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/