A.4. Разделы

Вверх  Предыдущий  Следующий

Помимо заголовка раздела, все данные файла PPU разделены на блоки данных, которые позволяют легко добавлять блоки данных без потери обратной совместимости. Они похожи на два куска форматов Electronic Arts IFF и Microsoft RIFF.Каждый «кусок» (tppuentry) имеет следующий формат, и куски могут быть вложенными.

Таблица А.4. Формат данных «куска».

Смещение

Размер (в байтах)

Описание

00h

1

Тип блока (1 – основной, 2 – вложенный).

01h

1

Идентификатор блока.

02h

4

Размер этого блока данных.

06h+

<переменный>

Данные для этого блока.

Каждый основной раздел куска должен заканчиваться концом куска. Вложенные куски используются для записей, классов или полей объекта.

Чтобы прочитать запись, вы можете просто вызвать ppufile.readentry:byte, который возвращает поле tppuentry.nr, которое содержит тип записи. В общем случае это работает так (пример для идентификаторов):

repeat
  b:=ppufile.readentry;
  case b of
  ib<etc> : begin end;
ibendsyms : break;
  end;
until false;

Возможные типы записей находятся в ppu.pas, но краткое описание наиболее распространённых из них находится в таблице А.5.

Таблица А.5. Возможные типы PPU Entry.

Символьное имя

Размещение

Описание

ibmodulename

General

Имя этого модуля

ibsourcefiles

General

Имя исходного файла

ibusedmacros

General

Имя и состояние используемых макросов

ibloadunit

General

Модули, используемые этим модулем

inlinkunitofiles

General

Объектные файлы, связанные с этим модулем

iblinkunitstaticlibs

General

Статические библиотеки, связанные с этим модулем

iblinkunitsharedlibs

General

Общедоступные библиотеки, связанные с этим модулем

ibendinterface

General

Конец раздела общей информации (General)

ibstartdefs

Interface

Начало объявлений

ibenddefs

Interface

Конец объявлений

ibstartsyms

Interface

Начало символьных данных

ibendsyms

Interface

Конец символьных данных

ibendimplementation

Implementation

Конец данных исполняемого блока

ibendbrowser

Browser

Конец раздела обозревателя

ibend

General

Конец файла модуля

Затем вы можете обработать каждый тип записи по своему усмотрению. О пропуске непрочитанных байтов в записи и правильном чтении следующей записи позаботится ppufile.readentry. Специальная функция skipuntilentry(untilb:byte):boolean; будет читать файл ppufile до тех пор, пока не найдёт вход untilb в основной записи.

Разбор записи можно сделать с помощью функций ppufile.getxxx. Доступные функции:

procedure ppufile.getdata(var b;len:longint);
function getbyte:byte; function getword:word;
function getlongint:longint;
function getreal:ppureal;
function getstring:string;

Чтобы проверить, достигли ли вы конца записи, вы можете использовать функцию:function EndOfEntry:boolean;

ПРИМЕЧАНИЯ

1.ppureal – это лучше, чем real, потому что создаётся для процессора, для которого создан модуль. В настоящее время это extended для i386 и single для m68k.

2.ibobjectdef и ibrecorddef имеют сохранённые объявления и раздел идентификаторов для самих себя. Так что вы должны делать рекурсивный вызов.
См. правильное выполнение в ppudump.pp.

Полный список записей и содержимое их полей можно найти в ppudump.pp.