|
Помимо заголовка раздела, все данные файла 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.
|