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
+309 -27
View File
@@ -31,6 +31,9 @@ dcl-pr MD_ParseRetrieveBuffer;
MediaDefinition
likeds(MD_MediaDefinition_T);
Error
likeds(MD_Error_T);
end-pr;
@@ -47,6 +50,8 @@ end-pr;
// - Media File Definitions
// - Volume Identifier Arrays
//
// Parser errors are returned in Error.
//
//=====================================================================
dcl-proc MD_ParseRetrieveBuffer export;
@@ -60,6 +65,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
MediaDefinition
likeds(MD_MediaDefinition_T);
Error
likeds(MD_Error_T);
end-pi;
@@ -81,6 +89,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
// Working variables
//==================================================================
dcl-s ReceiverLength
int(10);
dcl-s DeviceOffset
int(10);
@@ -99,12 +110,32 @@ dcl-proc MD_ParseRetrieveBuffer export;
dcl-s VolumeIndex
int(10);
dcl-s RequiredLength
int(10);
//==================================================================
// Initialize result
// Initialize
//==================================================================
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));
//==================================================================
// 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
//==================================================================
@@ -150,9 +255,24 @@ dcl-proc MD_ParseRetrieveBuffer export;
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
//---------------------------------------------------------------
//===============================================================
Device =
%subst(
@@ -161,9 +281,54 @@ dcl-proc MD_ParseRetrieveBuffer export;
%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
//---------------------------------------------------------------
//===============================================================
MediaDefinition.Device(DeviceIndex).DeviceName =
Device.DeviceName;
@@ -172,14 +337,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
Device.NumberOfMediaFileDefinitions;
//---------------------------------------------------------------
//===============================================================
// Media Files
//---------------------------------------------------------------
if Device.NumberOfMediaFileDefinitions > 0;
// OffsetToFirstMediaFileDefinition is relative
// to the Device Definition.
//===============================================================
MediaOffset =
DeviceOffset
@@ -190,9 +350,24 @@ dcl-proc MD_ParseRetrieveBuffer export;
to Device.NumberOfMediaFileDefinitions;
//----------------------------------------------------------
//============================================================
// Validate Media Offset
//============================================================
if MediaOffset < 0
or MediaOffset > ReceiverLength - %size(MediaFile);
Error.HasError = *on;
Error.MessageID = 'MDF2003';
Error.MessageData = *blanks;
return;
endif;
//============================================================
// Read Media File Definition
//----------------------------------------------------------
//============================================================
MediaFile =
%subst(
@@ -201,9 +376,79 @@ dcl-proc MD_ParseRetrieveBuffer export;
%size(MediaFile));
//----------------------------------------------------------
//============================================================
// Validate Media File Definition
//============================================================
if MediaFile.LengthOfMediaFileDefinition <> %size(MediaFile);
Error.HasError = *on;
Error.MessageID = 'MDF2003';
Error.MessageData = *blanks;
return;
endif;
if MediaFile.NumberOfVolumeIdentifiers < 0
or MediaFile.NumberOfVolumeIdentifiers > MD_MaxVolumeIdentifiers;
Error.HasError = *on;
Error.MessageID = 'MDF2003';
Error.MessageData = *blanks;
return;
endif;
if MediaFile.NumberOfVolumeIdentifiers = 0;
if MediaFile.OffsetToVolumeIdentifierArray <> 0
or MediaFile.LengthOfVolumeIdentifier <> 0
or MediaFile.StartingVolumeArrayElement <> 0;
Error.HasError = *on;
Error.MessageID = 'MDF2004';
Error.MessageData = *blanks;
return;
endif;
else;
if MediaFile.OffsetToVolumeIdentifierArray <= 0
or MediaFile.LengthOfVolumeIdentifier <> MD_VOLUME_ID_LENGTH
or MediaFile.StartingVolumeArrayElement < 1;
Error.HasError = *on;
Error.MessageID = 'MDF2004';
Error.MessageData = *blanks;
return;
endif;
RequiredLength =
MediaFile.NumberOfVolumeIdentifiers
* MediaFile.LengthOfVolumeIdentifier;
if MediaFile.OffsetToVolumeIdentifierArray >
ReceiverLength - RequiredLength
or MediaFile.OffsetToVolumeIdentifierArray <
MediaOffset + %size(MediaFile);
Error.HasError = *on;
Error.MessageID = 'MDF2004';
Error.MessageData = *blanks;
return;
endif;
endif;
//============================================================
// Media File -> Media Definition
//----------------------------------------------------------
//============================================================
MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaIndex)
@@ -223,9 +468,9 @@ dcl-proc MD_ParseRetrieveBuffer export;
MediaFile.NumberOfVolumeIdentifiers;
//----------------------------------------------------------
//============================================================
// Volume Identifier Array
//----------------------------------------------------------
//============================================================
if MediaFile.NumberOfVolumeIdentifiers > 0;
@@ -236,7 +481,6 @@ dcl-proc MD_ParseRetrieveBuffer export;
for VolumeIndex = 1
to MediaFile.NumberOfVolumeIdentifiers;
MediaDefinition.Device(DeviceIndex)
.MediaFile(MediaIndex)
.VolumeIdentifier(VolumeIndex)
@@ -249,24 +493,42 @@ dcl-proc MD_ParseRetrieveBuffer export;
+ 1 :
MediaFile.LengthOfVolumeIdentifier);
endfor;
endif;
//----------------------------------------------------------
//============================================================
// Next Media File
//----------------------------------------------------------
//============================================================
if MediaIndex
< Device.NumberOfMediaFileDefinitions;
if MediaFile.OffsetToNextMediaFileDefinition > 0;
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;
@@ -274,18 +536,39 @@ dcl-proc MD_ParseRetrieveBuffer export;
endfor;
endif;
//================================================================
// 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 =
Device.OffsetToNextDeviceDefinition;
else;
if Device.OffsetToNextDeviceDefinition <> 0;
Error.HasError = *on;
Error.MessageID = 'MDF2002';
Error.MessageData = *blanks;
return;
endif;
endif;
@@ -293,4 +576,3 @@ dcl-proc MD_ParseRetrieveBuffer export;
end-proc;
+15 -1
View File
@@ -68,6 +68,9 @@ dcl-pr MD_ParseRetrieveBuffer;
MediaDefinition
likeds(MD_MediaDefinition_T);
Error
likeds(MD_Error_T);
end-pr;
@@ -555,7 +558,18 @@ dcl-proc MD_RetrieveMediaDefinition export;
MD_ParseRetrieveBuffer(
Receiver.Data :
MediaDefinition);
MediaDefinition :
Error);
if Error.HasError;
MD_SendEscape(
Error.MessageID :
Error.MessageData);
return;
endif;
end-proc;
+14
View File
@@ -76,6 +76,20 @@ dsply '----------------------------------------';
dsply 'MEDDFN Error Test completed';
dsply '----------------------------------------';
//=====================================================================
// End
//=====================================================================
*inlr = *on;
return;
//=====================================================================
//
// TestCreateValidation
//
//=====================================================================
//=====================================================================
//