MODULE COMPARE (LANGUAGE (BLISS32), IDENT = 'X0002') = BEGIN ! ! revisions: ! X0002 ! may-27-1982 W. Koenig do string compare first before doing all this ! since disk strings can also be logical names ! this is a routine to compare two disks and decide if they are the same ! it takes as input: ! disk_1 -- a descriptor of a disk string ! disk_2 -- a descriptor of a disk string ! output: ! 0 if they don't match, 1 if they do ! disk strings have the format ddcu: with the c and u components optional ! if the controller is missing it can only match with an 'A' ! if the unit is missing it can only match with a '0' ! otherwise, if the components are present they must match exactly ! sizes are actually one larger than normally contemplated since we must ! include the ":" in the size although we won't bother comparing it ! GLOBAL ROUTINE COMPARE_DISKS (DISK_1,DISK_2) = BEGIN EXTERNAL ROUTINE UPPER; LOCAL TMP1,TMP2,SIZE1,SIZE2, DISK_1_SIZE : LONG, DISK_2_SIZE : LONG, DISK_1_ADDR : LONG, DISK_2_ADDR : LONG; MAP DISK_1_ADDR : REF VECTOR [,BYTE]; MAP DISK_2_ADDR : REF VECTOR [,BYTE]; BIND D1 = .DISK_1 : VECTOR [8,BYTE]; BIND D2 = .DISK_2 : VECTOR [8,BYTE]; DISK_1_SIZE = .(D1[0])<0,16>; DISK_2_SIZE = .(D2[0])<0,16>; DISK_1_ADDR = .(D1[4])<0,32>; DISK_2_ADDR = .(D2[4])<0,32>; ! ! UPPER (.DISK_1_ADDR,.DISK_1_SIZE); UPPER (.DISK_2_ADDR,.DISK_2_SIZE); IF CH$EQL (.DISK_1_SIZE,.DISK_1_ADDR,.DISK_2_SIZE,.DISK_2_ADDR) THEN RETURN 1; SIZE1 = .DISK_1_SIZE; SIZE2 = .DISK_2_SIZE; TMP1 = .DISK_1_SIZE + .DISK_1_ADDR - 1; TMP2 = .DISK_2_SIZE + .DISK_2_ADDR - 1; IF .(.TMP1)<0,8> EQL %C':' THEN SIZE1 = .SIZE1 - 1; IF .(.TMP2)<0,8> EQL %C':' THEN SIZE2 = .SIZE2 - 1; IF CH$EQL (.SIZE1,.DISK_1_ADDR,.SIZE2,.DISK_2_ADDR) THEN RETURN 1; IF .DISK_1_ADDR[0] NEQ .DISK_2_ADDR[0] THEN RETURN 0; IF .DISK_1_ADDR[1] NEQ .DISK_2_ADDR[1] THEN RETURN 0; IF .DISK_1_SIZE EQL 3 THEN BEGIN IF .DISK_2_SIZE EQL 3 THEN RETURN 1; IF .DISK_2_SIZE EQL 4 THEN IF .DISK_2_ADDR [2] EQL 'A' OR .DISK_2_ADDR[2] EQL '0' THEN RETURN 1 ELSE RETURN 0; IF .DISK_2_SIZE EQL 5 THEN IF .DISK_2_ADDR [2] EQL 'A' AND .DISK_2_ADDR[3] EQL '0' THEN RETURN 1 ELSE RETURN 0; END; IF .DISK_1_SIZE EQL 4 THEN BEGIN IF .DISK_2_SIZE EQL 3 THEN IF .DISK_1_ADDR [2] EQL 'A' OR .DISK_1_ADDR [2] EQL '0' THEN RETURN 1 ELSE RETURN 0; IF .DISK_2_SIZE EQL 4 THEN BEGIN IF .DISK_1_ADDR [2] EQL .DISK_2_ADDR [2] THEN RETURN 1; IF .DISK_1_ADDR [2] EQL 'A' AND .DISK_2_ADDR[2] EQL '0' THEN RETURN 1; IF .DISK_1_ADDR [2] EQL '0' AND .DISK_2_ADDR [2] EQL 'A' THEN RETURN 1; RETURN 0; END; IF .DISK_2_SIZE EQL 5 THEN BEGIN IF .DISK_1_ADDR [2] EQL .DISK_2_ADDR [2] THEN IF .DISK_2_ADDR [3] EQL '0' THEN RETURN 1; IF .DISK_1_ADDR [2] EQL .DISK_2_ADDR [3] THEN IF .DISK_2_ADDR [2] EQL 'A' THEN RETURN 1; RETURN 0; END; END; ! end of disk_1_size eql 4 IF .DISK_1_SIZE EQL 5 THEN BEGIN IF .DISK_2_SIZE EQL 3 THEN BEGIN IF .DISK_1_ADDR [2] EQL 'A' AND .DISK_1_ADDR[3] EQL '0' THEN RETURN 1 ELSE RETURN 0; END; IF .DISK_2_SIZE EQL 4 THEN BEGIN IF .DISK_2_ADDR [2] EQL .DISK_1_ADDR [2] THEN IF .DISK_1_ADDR [3] EQL '0' THEN RETURN 1; IF .DISK_2_ADDR [2] EQL .DISK_1_ADDR [3] THEN IF .DISK_1_ADDR [2] EQL 'A' THEN RETURN 1; RETURN 0; END; IF .DISK_2_SIZE EQL 5 THEN BEGIN IF .DISK_1_ADDR [2] NEQ .DISK_2_ADDR [2] THEN RETURN 0; IF .DISK_1_ADDR [3] NEQ .DISK_2_ADDR [3] THEN RETURN 0; RETURN 1; END; END; ! end of disk_1_size eql 5 RETURN 0; END; ! of routine compare_disks END ELUDOM