OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 10 Декабрь, 2024 20:55

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 27 Январь, 2021 04:42 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 249
Откуда: г. Рига, Латвийская ССР
Для своих нужд я написал для ББКП 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 КБ]
Скачиваний: 375
Комментарий к файлу: Host/Mod/Args.odc
Args.odc [2.53 КБ]
Скачиваний: 371
Комментарий к файлу: System/Mod/Args.odc
Args.odc [2.84 КБ]
Скачиваний: 366
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Январь, 2021 14:56 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1462
Откуда: Киев
Args слишком общее название для такой конкретной вещи, как аргументы командной строки, доступные лишь в ограниченном количестве платформ.
И наоборот, GetParam, ParamCount - избыточно уточняющие названия с учётом того, что они и так уточняются модулем, в которых находятся.
Ещё я бы отделил имя программы от аргументов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Январь, 2021 06:23 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 249
Откуда: г. Рига, Латвийская ССР
Сделал версию 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 КБ]
Скачиваний: 360
Комментарий к файлу: Закодированный набор из 4 модулей: Args, HostArgs, TestEnv и TestMain. Версия HostArgs для Windows.
args_windows.txt [8.14 КБ]
Скачиваний: 361
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Январь, 2021 08:17 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3806
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;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Январь, 2021 12:47 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Как расширение - приветствую. Замечательное кроссплатформенное расширение получится, и схема без Host с явным динамическим импортом тоже интересно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 02 Февраль, 2021 00:15 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Что-то не то...)
Код:
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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 02 Февраль, 2021 02:22 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Вот не то:

Код:
MODULE M;
  IMPORT
#ifdef Windows
    ConsArgsWin
#elsifdef Linux
    ConsArgsLin
#endif
    ;


Но то - это не это )


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB