OberonCore
https://forum.oberoncore.ru/

Views.Old и .OldView: реализация не соотв. документации
https://forum.oberoncore.ru/viewtopic.php?f=23&t=6635
Страница 1 из 1

Автор:  adimetrius [ Пятница, 10 Июль, 2020 00:04 ]
Заголовок сообщения:  Views.Old и .OldView: реализация не соотв. документации

Коллеги,
Views Documentation писал(а):
PROCEDURE Old (ask: BOOLEAN; VAR loc: Files.Locator; VAR name: Files.Name;
VAR conv: Converters.Converter): View
conv determines the converter which is used for reading the document. conv = NIL means that no conversion is necessary, i.e., the file format already has the standard BlackBox format.

Т.е. если передать conv = NIL, то конверсия не должна производиться. И если читать, напр, .png файл этой командой, указав conv = NIL, то должно вернуться res = NIL, т.к. невозможно извлечь Views.View из Png-файла.

Однако де-факто реализация (в StdDialog.OldView) вызывает Converters.Import, передавая ему conv Без изменений. Но
документация PROCEDURE Converters.Import (loc: Files.Locator; name: Files.Name; VAR conv: Converter; OUT s: Stores.Store) писал(а):
If conv = NIL, the first suitable converter in list is used and returned in the VAR parameter.


В итоге, де-факто Views.Old, если передан conv = NIL, перебирает все установленные конвертеры, хватает первый попавшийся и читает с его помощью файл. И возвращается некая кирдымырда, поскольку Png не конвертируется в Зрителя.

Как вылечить:
Кажется, что-то напутано в StdDialog.OldView, там зачем-то введена локальная переменная c: Converters.Converter, какие-то с ней непонятные манипуляции, результат их не используется. Ее нужно удалить, вместо нее в тексте везде использовать формальный параметр conv:
Код:
      c := conv;  (* удалить *)
      IF c = NIL THEN c := Converters.list END;   (* use document converter *)
         (* IF conv = NIL THEN conv := Converters.list END; *)
      w := Windows.GetBySpec(loc, name, c (* -> conv *), {});
      IF w # NIL THEN s := w.doc.ThisView() END;
      IF s = NIL THEN
         Converters.Import(loc, name, conv, s);


Предлагаю вылечить.

Кроме того, уточнить документацию Views.Old: там ничего не сказано про случай, когда импортировать Зритель невозможно, кроме того, ошибочно указано постусловие
result = NIL => loc.res # 0
Надо указать, что если заданным конвертером не получается извлечь Зрителя из файла - то возвращается NIL.

Де-факто даже сейчас NIL вполне может вернуться, если Converters.Import не найдет подходящего конвертера (это маловероятно, т.к. есть HostTextConv.ImportText, (и .ImportHex, StdETHConv.ImportETHDoc), которые отмечены флагом Converters.importAll, т.е. он-то как раз и "ловит" все, для чего не нашлось спецконвертера, и превращает любой файл в текстовый кирдымырды; полезность этого весьма сомнительна, кмк, и я бы снял с него флажок importAll)

Автор:  Info21 [ Суббота, 11 Июль, 2020 16:21 ]
Заголовок сообщения:  Re: Views.Old и .OldView: реализация не соотв. документации

Если правильно понимаю проблему, то надо лечить.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/