From 24d9c064892ce9814c9af4dcb2ae83de54b638ef Mon Sep 17 00:00:00 2001 From: nickysn Date: Sat, 18 Apr 2015 12:57:04 +0000 Subject: [PATCH] + added class for encoding/decoding an omf library header record git-svn-id: trunk@30646 - --- compiler/omfbase.pas | 88 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/compiler/omfbase.pas b/compiler/omfbase.pas index 70a789ff53..5a2bb0f8a8 100644 --- a/compiler/omfbase.pas +++ b/compiler/omfbase.pas @@ -71,6 +71,7 @@ interface RT_LLNAMES = $CA; { Local Logical Names Definition Record } RT_VERNUM = $CC; { OMF Version Number Record } RT_VENDEXT = $CE; { Vendor-specific OMF Extension Record } + RT_LIBHEAD = $F0; { Library Header Record } { OMF comment class } CC_Translator = $00; { language translator (compiler or assembler) name } @@ -462,6 +463,29 @@ interface property FrameDatum: Integer read FFrameDatum write FFrameDatum; end; + { TOmfRecord_LIBHEAD } + + TOmfRecord_LIBHEAD = class(TOmfParsedRecord) + private + FPageSize: Integer; + FDictionaryOffset: DWord; + FDictionarySizeInBlocks: Word; + FFlags: Byte; + function IsCaseSensitive: Boolean; + procedure SetCaseSensitive(AValue: Boolean); + procedure SetPageSize(AValue: Integer); + public + constructor Create; + procedure DecodeFrom(RawRecord: TOmfRawRecord);override; + procedure EncodeTo(RawRecord: TOmfRawRecord);override; + + property PageSize: Integer read FPageSize write SetPageSize; + property DictionaryOffset: DWord read FDictionaryOffset write FDictionaryOffset; + property DictionarySizeInBlocks: Word read FDictionarySizeInBlocks write FDictionarySizeInBlocks; + property Flags: Byte read FFlags write FFlags; + property CaseSensitive: Boolean read IsCaseSensitive write SetCaseSensitive; + end; + TOmfLibHash = record block_x: Integer; block_d: Integer; @@ -1406,6 +1430,70 @@ implementation Result:=Offset; end; + + { TOmfRecord_LIBHEAD } + + constructor TOmfRecord_LIBHEAD.Create; + begin + PageSize:=512; + DictionarySizeInBlocks:=2; + CaseSensitive:=true; + end; + + procedure TOmfRecord_LIBHEAD.SetPageSize(AValue: Integer); + var + p: longint; + begin + { valid library page sizes are powers of two, between 2**4 and 2**15 } + if not ispowerof2(AValue,p) then + internalerror(2015041802); + if (p<4) or (p>15) then + internalerror(2015041802); + FPageSize:=AValue; + end; + + procedure TOmfRecord_LIBHEAD.DecodeFrom(RawRecord: TOmfRawRecord); + begin + if RawRecord.RecordType<>RT_LIBHEAD then + internalerror(2015040301); + { this will also range check PageSize and will ensure that RecordLength>=13 } + PageSize:=RawRecord.RecordLength+3; + DictionaryOffset:=RawRecord.RawData[0]+ + (RawRecord.RawData[1] shl 8)+ + (RawRecord.RawData[2] shl 16)+ + (RawRecord.RawData[3] shl 24); + DictionarySizeInBlocks:=RawRecord.RawData[4]+ + (RawRecord.RawData[5] shl 8); + Flags:=RawRecord.RawData[6]; + end; + + procedure TOmfRecord_LIBHEAD.EncodeTo(RawRecord: TOmfRawRecord); + begin + { make sure the LIBHEAD record is padded with zeros at the end } + FillChar(RawRecord.RawData,SizeOf(RawRecord.RawData),0); + RawRecord.RecordType:=RT_LIBHEAD; + RawRecord.RecordLength:=PageSize-3; + RawRecord.RawData[0]:=Byte(DictionaryOffset); + RawRecord.RawData[1]:=Byte(DictionaryOffset shr 8); + RawRecord.RawData[2]:=Byte(DictionaryOffset shr 16); + RawRecord.RawData[3]:=Byte(DictionaryOffset shr 24); + RawRecord.RawData[4]:=Byte(DictionarySizeInBlocks); + RawRecord.RawData[5]:=Byte(DictionarySizeInBlocks shr 8); + RawRecord.RawData[6]:=Flags; + { the LIBHEAD record contains no checksum byte, so no need to call + RawRecord.CalculateChecksumByte } + end; + + function TOmfRecord_LIBHEAD.IsCaseSensitive: Boolean; + begin + Result:=(FFlags and 1)<>0; + end; + + procedure TOmfRecord_LIBHEAD.SetCaseSensitive(AValue: Boolean); + begin + FFlags:=(FFlags and $FE) or Ord(AValue); + end; + function compute_omf_lib_hash(const name: string; blocks: Integer): TOmfLibHash; const blank=$20; // ASCII blank