Neue testfälle für TAPE0200

This commit is contained in:
2026-09-15 13:40:52 +02:00
parent f075081ec5
commit 44f14e3e98
3 changed files with 394 additions and 84 deletions
+365 -83
View File
@@ -31,6 +31,9 @@ dcl-pr MD_ParseRetrieveBuffer;
MediaDefinition MediaDefinition
likeds(MD_MediaDefinition_T); likeds(MD_MediaDefinition_T);
Error
likeds(MD_Error_T);
end-pr; end-pr;
@@ -47,9 +50,11 @@ end-pr;
// - Media File Definitions // - Media File Definitions
// - Volume Identifier Arrays // - Volume Identifier Arrays
// //
// Parser errors are returned in Error.
//
//===================================================================== //=====================================================================
dcl-proc MD_ParseRetrieveBuffer export; dcl-proc MD_ParseRetrieveBuffer export;
dcl-pi *n; dcl-pi *n;
@@ -60,6 +65,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
MediaDefinition MediaDefinition
likeds(MD_MediaDefinition_T); likeds(MD_MediaDefinition_T);
Error
likeds(MD_Error_T);
end-pi; end-pi;
@@ -81,6 +89,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
// Working variables // Working variables
//================================================================== //==================================================================
dcl-s ReceiverLength
int(10);
dcl-s DeviceOffset dcl-s DeviceOffset
int(10); int(10);
@@ -99,12 +110,32 @@ dcl-proc MD_ParseRetrieveBuffer export;
dcl-s VolumeIndex dcl-s VolumeIndex
int(10); int(10);
dcl-s RequiredLength
int(10);
//================================================================== //==================================================================
// Initialize result // Initialize
//================================================================== //==================================================================
clear MediaDefinition; clear MediaDefinition;
clear Error;
ReceiverLength = %len(ReceiverBuffer);
//==================================================================
// Receiver buffer
//==================================================================
if ReceiverLength < %size(Header);
Error.HasError = *on;
Error.MessageID = 'MDF2005';
Error.MessageData = *blanks;
return;
endif;
//================================================================== //==================================================================
@@ -118,6 +149,80 @@ dcl-proc MD_ParseRetrieveBuffer export;
%size(Header)); %size(Header));
//==================================================================
// Validate Header
//==================================================================
if Header.LengthOfHeader <> %size(Header);
Error.HasError = *on;
Error.MessageID = 'MDF2001';
Error.MessageData = *blanks;
return;
endif;
if Header.NumberOfDeviceDefinitions < 1
or Header.NumberOfDeviceDefinitions > MD_MaxDeviceDefinitions;
Error.HasError = *on;
Error.MessageID = 'MDF2001';
Error.MessageData = *blanks;
return;
endif;
if Header.OffsetToFirstDeviceDefinition < %size(Header)
or Header.OffsetToFirstDeviceDefinition >
ReceiverLength - %size(Device);
Error.HasError = *on;
Error.MessageID = 'MDF2001';
Error.MessageData = *blanks;
return;
endif;
if Header.DeviceAllocation <> MD_DeviceAllocateAll
and Header.DeviceAllocation <> MD_DeviceAllocateOne
and Header.DeviceAllocation <> MD_DeviceAllocateMinimum;
Error.HasError = *on;
Error.MessageID = 'MDF2001';
Error.MessageData = *blanks;
return;
endif;
if Header.SaveFormat <> MD_SaveFormatAuto
and Header.SaveFormat <> MD_SaveFormatSerial
and Header.SaveFormat <> MD_SaveFormatParallel;
Error.HasError = *on;
Error.MessageID = 'MDF2001';
Error.MessageData = *blanks;
return;
endif;
if Header.MaximumParallelDeviceResources < 0
or Header.MinimumParallelDeviceResources < 0
or Header.MinimumParallelDeviceResources >
Header.MaximumParallelDeviceResources;
Error.HasError = *on;
Error.MessageID = 'MDF2001';
Error.MessageData = *blanks;
return;
endif;
//================================================================== //==================================================================
// Header -> Media Definition // Header -> Media Definition
//================================================================== //==================================================================
@@ -150,9 +255,24 @@ dcl-proc MD_ParseRetrieveBuffer export;
to Header.NumberOfDeviceDefinitions; to Header.NumberOfDeviceDefinitions;
//--------------------------------------------------------------- //===============================================================
// Validate Device Offset
//===============================================================
if DeviceOffset < 0
or DeviceOffset > ReceiverLength - %size(Device);
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
//===============================================================
// Read Device Definition // Read Device Definition
//--------------------------------------------------------------- //===============================================================
Device = Device =
%subst( %subst(
@@ -161,9 +281,54 @@ dcl-proc MD_ParseRetrieveBuffer export;
%size(Device)); %size(Device));
//--------------------------------------------------------------- //===============================================================
// Validate Device Definition
//===============================================================
if Device.LengthOfDeviceDefinition <> %size(Device);
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
if Device.NumberOfMediaFileDefinitions < 1
or Device.NumberOfMediaFileDefinitions > MD_MaxMediaDefinitions;
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
if %trim(Device.DeviceName) = '';
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
if Device.OffsetToFirstMediaFileDefinition < %size(Device);
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
//===============================================================
// Device -> Media Definition // Device -> Media Definition
//--------------------------------------------------------------- //===============================================================
MediaDefinition.Device(DeviceIndex).DeviceName = MediaDefinition.Device(DeviceIndex).DeviceName =
Device.DeviceName; Device.DeviceName;
@@ -172,120 +337,238 @@ dcl-proc MD_ParseRetrieveBuffer export;
Device.NumberOfMediaFileDefinitions; Device.NumberOfMediaFileDefinitions;
//--------------------------------------------------------------- //===============================================================
// Media Files // Media Files
//--------------------------------------------------------------- //===============================================================
if Device.NumberOfMediaFileDefinitions > 0; MediaOffset =
DeviceOffset
// OffsetToFirstMediaFileDefinition is relative + Device.OffsetToFirstMediaFileDefinition;
// to the Device Definition.
MediaOffset =
DeviceOffset
+ Device.OffsetToFirstMediaFileDefinition;
for MediaIndex = 1 for MediaIndex = 1
to Device.NumberOfMediaFileDefinitions; to Device.NumberOfMediaFileDefinitions;
//---------------------------------------------------------- //============================================================
// Read Media File Definition // Validate Media Offset
//---------------------------------------------------------- //============================================================
MediaFile = if MediaOffset < 0
%subst( or MediaOffset > ReceiverLength - %size(MediaFile);
ReceiverBuffer :
MediaOffset + 1 : Error.HasError = *on;
%size(MediaFile)); Error.MessageID = 'MDF2003';
Error.MessageData = *blanks;
return;
endif;
//---------------------------------------------------------- //============================================================
// Media File -> Media Definition // Read Media File Definition
//---------------------------------------------------------- //============================================================
MediaDefinition.Device(DeviceIndex) MediaFile =
.MediaFile(MediaIndex) %subst(
.SequenceNumber = ReceiverBuffer :
MediaFile.SequenceNumber; MediaOffset + 1 :
%size(MediaFile));
MediaDefinition.Device(DeviceIndex) //============================================================
.MediaFile(MediaIndex) // Validate Media File Definition
.StartingPositionInFile = //============================================================
MediaFile.StartingPositionInFile;
if MediaFile.LengthOfMediaFileDefinition <> %size(MediaFile);
Error.HasError = *on;
Error.MessageID = 'MDF2003';
Error.MessageData = *blanks;
return;
endif;
MediaDefinition.Device(DeviceIndex) if MediaFile.NumberOfVolumeIdentifiers < 0
.MediaFile(MediaIndex) or MediaFile.NumberOfVolumeIdentifiers > MD_MaxVolumeIdentifiers;
.NumberOfVolumeIdentifiers =
MediaFile.NumberOfVolumeIdentifiers; Error.HasError = *on;
Error.MessageID = 'MDF2003';
Error.MessageData = *blanks;
return;
endif;
//---------------------------------------------------------- if MediaFile.NumberOfVolumeIdentifiers = 0;
// Volume Identifier Array
//----------------------------------------------------------
if MediaFile.NumberOfVolumeIdentifiers > 0; if MediaFile.OffsetToVolumeIdentifierArray <> 0
or MediaFile.LengthOfVolumeIdentifier <> 0
or MediaFile.StartingVolumeArrayElement <> 0;
VolumeOffset = Error.HasError = *on;
MediaFile.OffsetToVolumeIdentifierArray; Error.MessageID = 'MDF2004';
Error.MessageData = *blanks;
return;
for VolumeIndex = 1
to MediaFile.NumberOfVolumeIdentifiers;
MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaIndex)
.VolumeIdentifier(VolumeIndex)
.VolumeIdentifier =
%subst(
ReceiverBuffer :
VolumeOffset
+ ((VolumeIndex - 1)
* MediaFile.LengthOfVolumeIdentifier)
+ 1 :
MediaFile.LengthOfVolumeIdentifier);
endfor;
endif; endif;
else;
//---------------------------------------------------------- if MediaFile.OffsetToVolumeIdentifierArray <= 0
// Next Media File or MediaFile.LengthOfVolumeIdentifier <> MD_VOLUME_ID_LENGTH
//---------------------------------------------------------- or MediaFile.StartingVolumeArrayElement < 1;
if MediaIndex Error.HasError = *on;
< Device.NumberOfMediaFileDefinitions; Error.MessageID = 'MDF2004';
Error.MessageData = *blanks;
if MediaFile.OffsetToNextMediaFileDefinition > 0; return;
MediaOffset =
MediaFile.OffsetToNextMediaFileDefinition;
endif;
endif; endif;
RequiredLength =
MediaFile.NumberOfVolumeIdentifiers
* MediaFile.LengthOfVolumeIdentifier;
endfor; if MediaFile.OffsetToVolumeIdentifierArray >
ReceiverLength - RequiredLength
or MediaFile.OffsetToVolumeIdentifierArray <
MediaOffset + %size(MediaFile);
endif; Error.HasError = *on;
Error.MessageID = 'MDF2004';
Error.MessageData = *blanks;
return;
endif;
endif;
//============================================================
// Media File -> Media Definition
//============================================================
MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaIndex)
.SequenceNumber =
MediaFile.SequenceNumber;
MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaIndex)
.StartingPositionInFile =
MediaFile.StartingPositionInFile;
MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaIndex)
.NumberOfVolumeIdentifiers =
MediaFile.NumberOfVolumeIdentifiers;
//============================================================
// Volume Identifier Array
//============================================================
if MediaFile.NumberOfVolumeIdentifiers > 0;
VolumeOffset =
MediaFile.OffsetToVolumeIdentifierArray;
for VolumeIndex = 1
to MediaFile.NumberOfVolumeIdentifiers;
MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaIndex)
.VolumeIdentifier(VolumeIndex)
.VolumeIdentifier =
%subst(
ReceiverBuffer :
VolumeOffset
+ ((VolumeIndex - 1)
* MediaFile.LengthOfVolumeIdentifier)
+ 1 :
MediaFile.LengthOfVolumeIdentifier);
endfor;
endif;
//============================================================
// Next Media File
//============================================================
if MediaIndex
< Device.NumberOfMediaFileDefinitions;
if MediaFile.OffsetToNextMediaFileDefinition <=
MediaOffset
or MediaFile.OffsetToNextMediaFileDefinition >
ReceiverLength - %size(MediaFile);
Error.HasError = *on;
Error.MessageID = 'MDF2003';
Error.MessageData = *blanks;
return;
endif;
MediaOffset =
MediaFile.OffsetToNextMediaFileDefinition;
else;
if MediaFile.OffsetToNextMediaFileDefinition <> 0;
Error.HasError = *on;
Error.MessageID = 'MDF2003';
Error.MessageData = *blanks;
return;
endif;
endif;
endfor;
//================================================================ //================================================================
// Next Device // Next Device
//================================================================ //================================================================
if Device.OffsetToNextDeviceDefinition > 0; if DeviceIndex < Header.NumberOfDeviceDefinitions;
if Device.OffsetToNextDeviceDefinition <=
DeviceOffset
or Device.OffsetToNextDeviceDefinition >
ReceiverLength - %size(Device);
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
DeviceOffset = DeviceOffset =
Device.OffsetToNextDeviceDefinition; Device.OffsetToNextDeviceDefinition;
else;
if Device.OffsetToNextDeviceDefinition <> 0;
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
endif; endif;
@@ -293,4 +576,3 @@ dcl-proc MD_ParseRetrieveBuffer export;
end-proc; end-proc;
+15 -1
View File
@@ -68,6 +68,9 @@ dcl-pr MD_ParseRetrieveBuffer;
MediaDefinition MediaDefinition
likeds(MD_MediaDefinition_T); likeds(MD_MediaDefinition_T);
Error
likeds(MD_Error_T);
end-pr; end-pr;
@@ -555,7 +558,18 @@ dcl-proc MD_RetrieveMediaDefinition export;
MD_ParseRetrieveBuffer( MD_ParseRetrieveBuffer(
Receiver.Data : Receiver.Data :
MediaDefinition); MediaDefinition :
Error);
if Error.HasError;
MD_SendEscape(
Error.MessageID :
Error.MessageData);
return;
endif;
end-proc; end-proc;
+14
View File
@@ -76,6 +76,20 @@ dsply '----------------------------------------';
dsply 'MEDDFN Error Test completed'; dsply 'MEDDFN Error Test completed';
dsply '----------------------------------------'; dsply '----------------------------------------';
//=====================================================================
// End
//=====================================================================
*inlr = *on;
return;
//=====================================================================
//
// TestCreateValidation
//
//=====================================================================
//===================================================================== //=====================================================================
// //