OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 06 Август, 2020 05:04

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




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Файлы в памяти
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 12:10 
Аватара пользователя

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

а есть ли реализация интерфейса Files для файлов в памяти?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файлы в памяти
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 19:32 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2808
Вот моя реализация, чтобы хранить один временный файл в памяти.

Код:
MODULE RobustFiles;

   IMPORT Files;

   CONST
      fileMaxSize = 51200; (* increase if you planning to transfer big structures *)

   TYPE

      Locator* = POINTER TO RECORD (Files.Locator) END;

      File* = POINTER TO RECORD (Files.File)
         data*:  POINTER TO ARRAY OF BYTE;
      END;

      Reader = POINTER TO RECORD (Files.Reader)
         base: File; pos: INTEGER;
      END;

      Writer = POINTER TO RECORD (Files.Writer)
         base: File; pos: INTEGER;
      END;

      Directory* = POINTER TO RECORD (Files.Directory)
      END;
         VAR
      dir-: Directory;
      close: BOOLEAN;
      bytes: POINTER TO ARRAY OF BYTE;
   
   PROCEDURE NewLocator* (IN fname: ARRAY OF CHAR): Locator;
   BEGIN
      RETURN NIL
   END NewLocator;

   (* File *)
   
   PROCEDURE (f: File) NewReader* (old: Files.Reader): Files.Reader;
      VAR r: Reader;
   BEGIN
      IF (old # NIL) & (old IS Reader) THEN
         r := old(Reader)
      ELSE
         NEW(r)
      END;
      r.base := f;
      r.pos := 0;
      RETURN r
   END NewReader;

   PROCEDURE (f: File) NewWriter* (old: Files.Writer): Files.Writer;
      VAR w: Writer;
   BEGIN
      IF (old # NIL) & (old IS Writer) THEN
         w := old(Writer)
      ELSE
         NEW(w)
      END;
      w.base := f;
      w.pos := 0;
      RETURN w
   END NewWriter;

   PROCEDURE (f: File) Length* (): INTEGER;
   BEGIN
      RETURN 0 (* для оптимизации, длина файла узнается по положению wr.pos *)
   END Length;
   
   PROCEDURE (f: File) Flush*;
   BEGIN
   END Flush;

   PROCEDURE (f: File) Register* (name: Files.Name; type: Files.Type; ask: BOOLEAN; OUT res: INTEGER);
   BEGIN HALT(0)
   END Register;

   PROCEDURE (f: File) Close*;
   BEGIN
      f.data := NIL;
      close := TRUE
   END Close;

   PROCEDURE (f: File) Closed *(): BOOLEAN;
   BEGIN RETURN close
   END Closed;

   PROCEDURE (f: File) Shared* (): BOOLEAN;
   BEGIN
      RETURN TRUE
   END Shared;

   (* Locator *)

   PROCEDURE (loc: Locator) This* (IN path: ARRAY OF CHAR): Locator;
   BEGIN
      RETURN NIL
   END This;

   (* Reader *)

   PROCEDURE (r: Reader) Base (): Files.File;
   BEGIN
      RETURN r.base
   END Base;

   PROCEDURE (r: Reader) SetPos (pos: INTEGER);
   BEGIN
      r.pos := pos
   END SetPos;

   PROCEDURE (r: Reader) Pos (): INTEGER;
   BEGIN
      RETURN r.pos
   END Pos;

   PROCEDURE (r: Reader) ReadByte (OUT x: BYTE);
   BEGIN
      x := r.base.data[r.pos];
      INC(r.pos);
   END ReadByte;

   PROCEDURE (r: Reader) ReadBytes (VAR x: ARRAY OF BYTE; beg, len: INTEGER);
   BEGIN
      len := beg + len;
      WHILE beg < len DO
         x[beg] := r.base.data[r.pos];
         INC(r.pos); INC(beg)
      END
   END ReadBytes;

   (* Writer *)

   PROCEDURE (w: Writer) Base (): Files.File;
   BEGIN
      RETURN w.base
   END Base;

   PROCEDURE (w: Writer) SetPos (pos: INTEGER);
   BEGIN
      w.pos := pos
   END SetPos;

   PROCEDURE (w: Writer) Pos (): INTEGER;
   BEGIN
      RETURN w.pos
   END Pos;

   PROCEDURE (w: Writer) WriteByte (x: BYTE);
   BEGIN
      w.base.data[w.pos] := x;
      INC(w.pos)
   END WriteByte;

   PROCEDURE (w: Writer) WriteBytes (IN x: ARRAY OF BYTE; beg, len: INTEGER);
   BEGIN
      len := beg + len;
      WHILE beg < len DO
         w.base.data[w.pos] := x[beg];
         INC(w.pos); INC(beg)
      END
   END WriteBytes;

   (* Directory *)

   PROCEDURE (d: Directory) This* (IN path: ARRAY OF CHAR): Files.Locator;
   BEGIN
      HALT(0);
      RETURN NIL
   END This;

   PROCEDURE (d: Directory) New* (loc: Files.Locator; ask: BOOLEAN): Files.File;
   BEGIN
      HALT(0);
      RETURN NIL
   END New;
   
   PROCEDURE (d: Directory) Temp* (): Files.File;
   VAR file: File;
   BEGIN
      IF close THEN
         NEW(file);
         close := FALSE;
         file.data := bytes;
      ELSE
         file := NIL (* only one file can be opened *)
      END;
      RETURN file
   END Temp;

   PROCEDURE (d: Directory) Old* (loc: Files.Locator; name: Files.Name; shrd: BOOLEAN): Files.File;
   BEGIN
      HALT(0);
      RETURN NIL
   END Old;

   PROCEDURE (d: Directory) Delete* (loc: Files.Locator; name: Files.Name);
   BEGIN
   END Delete;

   PROCEDURE (d: Directory) Rename* (loc: Files.Locator; old, new: Files.Name; ask: BOOLEAN);
   BEGIN
   END Rename;

   PROCEDURE (d: Directory) SameFile* (loc0: Files.Locator; name0: Files.Name;
      loc1: Files.Locator; name1: Files.Name
   ): BOOLEAN;
   BEGIN RETURN TRUE
   END SameFile;

   PROCEDURE (d: Directory) FileList* (loc: Files.Locator): Files.FileInfo;
   BEGIN
      RETURN NIL
   END FileList;
   
   PROCEDURE (d: Directory) LocList* (loc: Files.Locator): Files.LocInfo;
   BEGIN
      RETURN NIL
   END LocList;

   PROCEDURE (d: Directory) GetFileName* (name: Files.Name; type: Files.Type; OUT filename: Files.Name);
   BEGIN
   END GetFileName;

BEGIN
   NEW(dir);
   NEW(bytes, fileMaxSize);
   close := TRUE;
END RobustFiles.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файлы в памяти
СообщениеДобавлено: Понедельник, 06 Январь, 2020 02:18 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 270
Иван, благодарю, возьму за основу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файлы в памяти
СообщениеДобавлено: Понедельник, 06 Январь, 2020 05:06 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2808
adimetrius писал(а):
Иван, благодарю, возьму за основу.

Погодите, у орловцев есть более полные реализации, если у вас более сложная задача. Я думаю, что они выложат или дадут ссылку, где это уже лежит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файлы в памяти
СообщениеДобавлено: Понедельник, 06 Январь, 2020 08:12 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4442
Откуда: Россия, Орёл
Иван Денисов писал(а):
Погодите, у орловцев есть более полные реализации, если у вас более сложная задача. Я думаю, что они выложат или дадут ссылку, где это уже лежит.

Да оно давно лежит.
86-й модуль этой подсистемы: https://oberoncore.ru/bbcc/subs/ipui/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файлы в памяти
СообщениеДобавлено: Понедельник, 06 Январь, 2020 14:24 
Аватара пользователя

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


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

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


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

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


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

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