diff --git a/src/shared/xdynrec.pas b/src/shared/xdynrec.pas
index 71a95bf609811affa3c20776fe1d7b2d9ed489ed..f3400d87730d0594b176a233c5d5913558c5be21 100644 (file)
--- a/src/shared/xdynrec.pas
+++ b/src/shared/xdynrec.pas
private
procedure cleanup ();
- procedure parse (pr: TTextParser);
+ procedure parseDef (pr: TTextParser);
procedure setIVal (v: Integer); inline;
procedure setSVal (const v: AnsiString); inline;
mFields: TDynField.TDynFieldArray;
mTrigTypes: array of AnsiString; // if this is triggerdata, we'll hold list of triggers here
mHeader: Boolean; // true for header record
+ mBinBlock: Integer; // -1: none
private
- procedure parse (pr: TTextParser); // parse definition
+ procedure parseDef (pr: TTextParser); // parse definition
function findByName (const aname: AnsiString): Integer; inline;
function hasByName (const aname: AnsiString): Boolean; inline;
private
procedure cleanup ();
- procedure parse (pr: TTextParser); // parse definition
+ procedure parseDef (pr: TTextParser); // parse definition
function findByName (const aname: AnsiString): Integer; inline;
function hasByName (const aname: AnsiString): Boolean; inline;
ebs: array of TDynEBS;
private
- procedure parse (pr: TTextParser);
+ procedure parseDef (pr: TTextParser);
function getHeader (): TDynRecord; inline;
constructor TDynField.Create (pr: TTextParser);
begin
cleanup();
- parse(pr);
+ parseDef(pr);
end;
end;
-procedure TDynField.parse (pr: TTextParser);
+procedure TDynField.parseDef (pr: TTextParser);
var
fldname: AnsiString;
fldtype: AnsiString;
mFields := nil;
mTrigTypes := nil;
mHeader := false;
- parse(pr);
+ mBinBlock := -1;
+ parseDef(pr);
end;
end;
-procedure TDynRecord.parse (pr: TTextParser);
+procedure TDynRecord.parseDef (pr: TTextParser);
var
fld: TDynField;
tdn: AnsiString;
mPasName := pr.expectId(); // pascal record name
pr.expectId('is');
mName := pr.expectStr();
- if pr.eatId('header') then mHeader := true;
- if pr.eatId('size') then
+ while (pr.tokType <> pr.TTBegin) do
begin
- mSize := pr.expectInt();
- if (mSize < 1) then raise Exception.Create(Format('invalid record ''%s'' size: %d', [mName, mSize]));
- pr.expectId('bytes');
+ if pr.eatId('header') then begin mHeader := true; continue; end;
+ if pr.eatId('size') then
+ begin
+ if (mSize > 0) then raise Exception.Create(Format('duplicate `size` in record ''%s''', [mName]));
+ mSize := pr.expectInt();
+ if (mSize < 1) then raise Exception.Create(Format('invalid record ''%s'' size: %d', [mName, mSize]));
+ pr.expectId('bytes');
+ continue;
+ end;
+ if pr.eatId('binblock') then
+ begin
+ if (mBinBlock >= 0) then raise Exception.Create(Format('duplicate `binblock` in record ''%s''', [mName]));
+ mBinBlock := pr.expectInt();
+ if (mBinBlock < 1) then raise Exception.Create(Format('invalid record ''%s'' binblock: %d', [mName, mBinBlock]));
+ continue;
+ end;
end;
- if pr.eatId('header') then mHeader := true;
end;
pr.expectTT(pr.TTBegin);
constructor TDynEBS.Create (pr: TTextParser);
begin
cleanup();
- parse(pr);
+ parseDef(pr);
end;
end;
-procedure TDynEBS.parse (pr: TTextParser);
+procedure TDynEBS.parseDef (pr: TTextParser);
var
idname: AnsiString;
cv, v: Integer;
trigDatas := nil;
ebs := nil;
curheader := nil;
- parse(pr);
+ parseDef(pr);
end;
end;
-procedure TDynMapDef.parse (pr: TTextParser);
+procedure TDynMapDef.parseDef (pr: TTextParser);
var
dr, hdr: TDynRecord;
eb: TDynEBS;