OberonCore
https://forum.oberoncore.ru/

Файлы в памяти
https://forum.oberoncore.ru/viewtopic.php?f=23&t=6534
Страница 1 из 1

Автор:  adimetrius [ Воскресенье, 05 Январь, 2020 12:10 ]
Заголовок сообщения:  Файлы в памяти

Коллеги,

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

Автор:  Иван Денисов [ Воскресенье, 05 Январь, 2020 19:32 ]
Заголовок сообщения:  Re: Файлы в памяти

Вот моя реализация, чтобы хранить один временный файл в памяти.

Код:
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.

Автор:  adimetrius [ Понедельник, 06 Январь, 2020 02:18 ]
Заголовок сообщения:  Re: Файлы в памяти

Иван, благодарю, возьму за основу.

Автор:  Иван Денисов [ Понедельник, 06 Январь, 2020 05:06 ]
Заголовок сообщения:  Re: Файлы в памяти

adimetrius писал(а):
Иван, благодарю, возьму за основу.

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

Автор:  Борис Рюмшин [ Понедельник, 06 Январь, 2020 08:12 ]
Заголовок сообщения:  Re: Файлы в памяти

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

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

Автор:  adimetrius [ Понедельник, 06 Январь, 2020 14:24 ]
Заголовок сообщения:  Re: Файлы в памяти

О!

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