OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 22:59

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




Начать новую тему Ответить на тему  [ Сообщений: 54 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
СообщениеДобавлено: Вторник, 26 Январь, 2021 16:48 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 248
Откуда: г. Рига, Латвийская ССР
Да, идея в том, что консольные программы должны иметь прямой доступ к аргументам. Не только к тем, которые идут после /PAR, а ко всем.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Январь, 2021 01:39 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
kekc_leader писал(а):
Да, идея в том, что консольные программы должны иметь прямой доступ к аргументам. Не только к тем, которые идут после /PAR, а ко всем.

А поясните, пож, на примере. Вот вы пишете приложение, которое что-то должно принимать из командной строки. Его клиенты должны отправить ему что-то после PAR. Так?

Или вы хотите написать, например, свой grep на ББ, чтобы он принимал все стандартные параметры grep?


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

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 248
Откуда: г. Рига, Латвийская ССР
adimetrius писал(а):
Или вы хотите написать, например, свой grep на ББ, чтобы он принимал все стандартные параметры grep?


Да, речь о написании полноценного консольного приложения.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Январь, 2021 04:44 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 248
Откуда: г. Рига, Латвийская ССР
Создал для своих нужд пока модули Args и HostArgs. Опубликовал, чтобы не пропали:
https://forum.oberoncore.ru/viewtopic.php?f=134&t=6719

Код:
DEFINITION Args;

   PROCEDURE GetParam (n: INTEGER; OUT s: ARRAY OF CHAR);
   PROCEDURE ParamCount (): INTEGER;

END Args.


Реализовано через Kernel.Hook.


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

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 248
Откуда: г. Рига, Латвийская ССР
...И версия для Windows:
https://forum.oberoncore.ru/viewtopic.php?f=134&t=6719&p=113770#p113770

Надо придумать, как этот модуль правильно назвать (Args, Env, Params, ...), и как назвать процедуры в нём (Get, GetParam, ParamStr, Argv, ...).


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

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Зачем в System тащить устаревшие вещи? Командная строка юникса -- изделие 70-х годов. Командная строка ББ -- 90-х.
Логично внедрять механизм, который позволит из более древней командной строки обратиться к более новой, а не наоборот. А механизм такой в виде интерпретатора уже есть. Хочется вызов с параметрами командной строки -- достаточно написать на уровне системы скрипт с параметрами, которые будут подставлены в комстроку ББ.
Код:
#!/bin/sh

./run-dev0 <<DATA
DevCompiler.CompileSubs Lin System Gtk2 Std Cons Host Text Form Dev Xhtml Comm Obx

### Dev2
DevCompiler.CompileThis Dev2LnkBase Dev2LnkLoad Dev2LnkWritePe Dev2LnkWriteElf Dev2LnkWriteElfStatic Dev2Linker Dev2Linker1
DevCompiler.CompileThis Dev2LnkChmod

Dev2Linker1.LinkElfExe `uname -s` blackbox := Kernel$+ Files Utf HostEnv HostFiles HostGui StdLoader

DATA
На мой взгляд, если тут что и развивать, то это встроенный интерпретатор.

Если не хочется скрипты писать каждый раз, сделать специальный Init для консоли, который будет прямо отображать параметры командной строки на параметры главной процедуры консольного приложения. Meta это позволяет. А всякие Env и иже с ними пусть сидят в Host.


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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
kekc_leader писал(а):
Код:
DEFINITION Args;

   PROCEDURE GetParam (n: INTEGER; OUT s: ARRAY OF CHAR);
   PROCEDURE ParamCount (): INTEGER;

END Args.


Коллега, а как узнать, какого размера s будет достаточным для GetParam(n, s)? Это, кмк, брешь: передаст вам балбес или злоумышленник стопицот байтов, и будет вам авост (а если вы при компиляции отключите проверки - то и полноценный Core Dump)


Последний раз редактировалось adimetrius Воскресенье, 14 Март, 2021 22:29, всего редактировалось 1 раз.

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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Евгений Темиргалеев писал(а):
... сделать специальный Init для консоли, который будет прямо отображать параметры командной строки на параметры главной процедуры консольного приложения.

А что будет делать Init, если они не отображаются? И где задается, что есть главная процедура консольного приложения?


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

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 248
Откуда: г. Рига, Латвийская ССР
adimetrius писал(а):
Коллега, а как узнать, какого размера s будет достаточным для GetParam(n, s)? Это, кмк, брешь: передаст вам балбес или злоумышленник стопицот байтов, и будет вам авост (а если вы при компиляции отключите проверки - то и полноценный Core Dump)


Почему же авост? Просто строка обрежется — Оберон же знает, какого она размера.

Какой вариант бы вы предложили? сделать POINTER TO ARRAY OF CHAR или (условно) GetParamLen(n: INTEGER): INTEGER ?

Евгений Темиргалеев писал(а):
Зачем в System тащить устаревшие вещи?


Я не согласен, что аргументы командной строки — устаревшая вещь. Она универсальная, поддерживается всеми ОС.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 21 Март, 2021 20:17 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
adimetrius писал(а):
Это, кмк, брешь: передаст вам балбес или злоумышленник стопицот байтов, и будет вам авост (а если вы при компиляции отключите проверки - то и полноценный Core Dump)

А как он мне передаст? О себе передаст. И будет у него авост. И поделом.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 21 Март, 2021 20:25 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
kekc_leader писал(а):
Почему же авост? Просто строка обрежется — Оберон же знает, какого она размера.

Просто обрезать не совсем правильно. Надо как-то сообщить, что строка не влезла.


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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Trurl писал(а):
adimetrius писал(а):
Это, кмк, брешь: передаст вам балбес или злоумышленник стопицот байтов, и будет вам авост (а если вы при компиляции отключите проверки - то и полноценный Core Dump)

А как он мне передаст? О себе передаст. И будет у него авост. И поделом.

Ну, сделает Артур программу, и будет ее кто-нибудь использовать на стороне веб-сервера для обработки запроса. И прилетит злоумышленный запрос, который обрушит на сервере программу.


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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Trurl писал(а):
kekc_leader писал(а):
Почему же авост? Просто строка обрежется — Оберон же знает, какого она размера.

Просто обрезать не совсем правильно. Надо как-то сообщить, что строка не влезла.

Согласен, только сильнее: совсем не правильно!


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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
kekc_leader писал(а):
adimetrius писал(а):
Коллега, а как узнать, какого размера s будет достаточным для GetParam(n, s)? Это, кмк, брешь: передаст вам балбес или злоумышленник стопицот байтов, и будет вам авост (а если вы при компиляции отключите проверки - то и полноценный Core Dump)

Какой вариант бы вы предложили? сделать POINTER TO ARRAY OF CHAR или (условно) GetParamLen(n: INTEGER): INTEGER ?

Мне трудно сказать, что было бы удобнее клиенту, поскольку с аргументами комстроки я работал оч мало. Оба ваши варианта позволяют обнаружить ошибку и, при желании, обработать ее.

P.S.
А кстати, GetParam(n: INTEGER; OUT s: ARRAY OF CHAR) ведь подразумевает преобразование SHORTCHAR -> CHAR? Т.е. если ОС передает аргументы как SHORTCHAR/UTF8, то GetParam уже возвращает их как CHAR/UCS2, как принято в ББ?

Если возвращать POINTER TO ARRAY OF CHAR, то 1) опять-таки подразумевается преобразование к CHAR/UCS2 2) подразумевается, возможно, лишнее обращение к менеджеру памяти и следом - работа для сборщика.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 54 ]  На страницу Пред.  1, 2, 3

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


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

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


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

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