Trailing-Edge
-
PDP-10 Archives
-
BB-R595B-SM_11-9-85
-
mcb/utilities/lbrobj.bli
There is 1 other file named lbrobj.bli in the archive.  Click here to see a list.
MODULE LBROBJ (					!Read an object module
		IDENT = '001020',
		LANGUAGE (BLISS16, BLISS36)
		) =
BEGIN
!
!
!
!                    COPYRIGHT (c) 1980, 1981, 1982
!                    DIGITAL EQUIPMENT CORPORATION
!                        Maynard, Massachusetts
!
!     This software is furnished under a license and may  be  used
!     and copied only in accordance with the terms of such license
!     and with the inclusion of the above copyright notice.   This
!     software  or any other copies thereof may not be provided or
!     otherwise made available to any other person.  No  title  to
!     and ownership of the software is hereby transferred.
!
!     The information  in  this  software  is  subject  to  change
!     without  notice  and should not be construed as a commitment
!     by DIGITAL EQUIPMENT CORPORATION.
!
!     DIGITAL assumes no responsibility for the use or reliability
!     of  its  software  on  equipment  which  is  not supplied by
!     DIGITAL.
!
!++
! FACILITY: LBR20 - Librarian Utility
!
! ABSTRACT:
!
!
! This module contains the routines to access an object module file.
!
!
! ENVIRONMENT: ANY
!
! AUTHOR: ALAN D. PECKHAM, CREATION DATE: 12-MAY-80
!
! MODIFIED BY:
!
!	Alan D. Peckham, : VERSION 01
! 02	- Restructure file positioning to refer to block/offset.
!	  Define OBJ_MARK and OBJ_SET routines to mark the beginning
!	  of an object module and rewind the file to that position.
!--
!
! TABLE OF CONTENTS:
!
FORWARD ROUTINE
    GET_BYTE,					!Get a byte from the file
    GET_WORD,					!Get a word from the file
    OBJ_CLOSE : NOVALUE,			!Close object file
    OBJ_MARK : NOVALUE,				!Mark current record position
    OBJ_OPEN,					!Open object file
    OBJ_RECORD,					!Read length of next record
    OBJ_SET : NOVALUE,				!Reset to marked position
    OBJ_WORD;					!Read next word of record
!
! INCLUDE FILES
!
LIBRARY 'LBRCOM';				!LBR COMMON DEFINITIONS
!
! MACROS:
!
!	None
!
! EQUATED SYMBOLS:
!
LITERAL
    UNKNOWN = 0,
    RSX = 1,
    MACY11 = 2;
!
! OWN STORAGE:
!
OWN
    EOF,
    FILE_TYPE,
    FIRST_BYTE,
    MARK_BLOCK,
    MARK_OFFSET,
    OBJBLK,
    RECORD_COUNT,
    WORD_READ,
    WORD_VALUE;
BIND
    WORD_PTR = CH$PTR (WORD_VALUE,, 16);
!
! EXTERNAL REFERENCES:
!
EXTERNAL ROUTINE
    CLOSE,					!Close a file.
    FILNM : NOVALUE,				!Convert file name to ASCII.
    FILPOS,					!Get the current file position.
    GETFIL,					!Get a word from the file.
    OPEN,					!Open a file.
    POSFIL;					!Position to a word in the file
EXTERNAL
    FLAGS : BITVECTOR [M_MAX_BITS];
ROUTINE GET_BYTE =
!++
! FUNCTIONAL DESCRIPTION:
!
!
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--
    BEGIN
    IF .EOF THEN RETURN 0;
    IF (FIRST_BYTE = NOT .FIRST_BYTE)
    THEN
	BEGIN
	IF GETFIL (.OBJBLK, CH$PTR (WORD_READ,, 16), 1) EQL 0
	THEN
	    RETURN (EOF = TRUE; 0);
	WORD_READ = CH$RCHAR (CH$PTR (WORD_READ,, 16));
	.WORD_READ<0, 8>
	END
    ELSE
	.WORD_READ<8, 8>
    END;					!OF GET_BYTE
ROUTINE GET_WORD =
!++
! FUNCTIONAL DESCRIPTION:
!
!
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--
    BEGIN
    IF .EOF THEN RETURN 0;
    IF GETFIL (.OBJBLK, CH$PTR (WORD_READ,, 16), 1) EQL 0
    THEN
	RETURN (EOF = TRUE; 0);
    CH$RCHAR (CH$PTR (WORD_READ,, 16))
    END;					!OF GET_WORD
GLOBAL ROUTINE OBJ_CLOSE : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
!
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--
    BEGIN
    CLOSE (.OBJBLK);
    END;					!OF OBJ_CLOSE
GLOBAL ROUTINE OBJ_MARK : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
!
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--
    BEGIN
    FILPOS (.OBJBLK, MARK_BLOCK, MARK_OFFSET);
    IF (.FILE_TYPE EQL MACY11) AND .FIRST_BYTE
    THEN
	MARK_OFFSET<0, 1> = 1;
    END;					!OF OBJ_MARK
GLOBAL ROUTINE OBJ_OPEN (OBJ_FILBLK) =
!++
! FUNCTIONAL DESCRIPTION:
!
!
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--
    BEGIN
    OBJBLK = .OBJ_FILBLK;
    FILE_TYPE = UNKNOWN;
    EOF = FALSE;
    RECORD_COUNT = 0;
    IF NOT OPEN (.OBJBLK, F_READ, F_BINARY)
    THEN
	RETURN
	    BEGIN
	    TYPLN (1, CH$ASCIZ (FATAL, 'Unable to open object file "%@"'),
		FILNM, .OBJBLK);
	    FALSE
	    END;
    TRUE
    END;					!OF OBJ_OPEN
GLOBAL ROUTINE OBJ_RECORD =
!++
! FUNCTIONAL DESCRIPTION:
!
!
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--
    BEGIN
    WHILE .RECORD_COUNT GTR 0 DO
	OBJ_WORD ();
    CASE .FILE_TYPE FROM 0 TO 2 OF
	SET
	[UNKNOWN] :
	    BEGIN
	    UNTIL (WORD_READ = GET_WORD ()) GTR 0 DO
		IF .EOF THEN RETURN -1;
	    SELECT .WORD_READ OF
		SET
		[1] :
		    FIRST_BYTE = TRUE;
		[256] :
		    FIRST_BYTE = FALSE;
		[1, 256] :
		    BEGIN
		    FILE_TYPE = MACY11;
		    RECORD_COUNT = 0;
		    DO
			BEGIN
			GET_BYTE ();
			WORD_VALUE = 0;
			WORD_VALUE<0, 8> = GET_BYTE ();
			WORD_VALUE<8, 8> = GET_BYTE ();
			IF .WORD_VALUE GTR 4
			THEN
			    RECORD_COUNT = .WORD_VALUE - 4
			ELSE
			    BEGIN
			    GET_BYTE ();
			    UNTIL GET_BYTE () EQL 1 DO
				IF .EOF THEN RETURN -1;
			    END;
			IF .EOF THEN RETURN -1;
			END
		    WHILE .RECORD_COUNT EQL 0;
		    END;
		[OTHERWISE] :
		    BEGIN
		    FILE_TYPE = RSX;
		    UNTIL (RECORD_COUNT = .WORD_READ) GTR 0 DO
			BEGIN
			WORD_READ = GET_WORD ();
			IF .EOF THEN RETURN -1;
			END;
		    END;
		TES;
	    END;
	[RSX] :
	    BEGIN
	    WHILE (RECORD_COUNT = GET_WORD ()) EQL 0 DO
		IF .EOF THEN RETURN -1;
	    END;
	[MACY11] :
	    DO
		BEGIN
		UNTIL GET_BYTE () EQL 1 DO
		    IF .EOF THEN RETURN -1;
		GET_BYTE ();
		WORD_VALUE = 0;
		WORD_VALUE<0, 8> = GET_BYTE ();
		WORD_VALUE<8, 8> = GET_BYTE ();
		IF (RECORD_COUNT = .WORD_VALUE - 4) LEQ 0 THEN GET_BYTE ();
		IF .EOF THEN RETURN -1;
		END
	    UNTIL .RECORD_COUNT GTR 0
	TES;
    .RECORD_COUNT
    END;					!OF OBJ_RECORD
GLOBAL ROUTINE OBJ_SET : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
!
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--
    BEGIN
    IF .MARK_OFFSET<0, 1>
    THEN
	BEGIN
	FIRST_BYTE = TRUE;
	MARK_OFFSET<0, 1> = 0;
	END
    ELSE
	FIRST_BYTE = FALSE;
    POSFIL (.OBJBLK, .MARK_BLOCK, .MARK_OFFSET);
    IF .FIRST_BYTE
    THEN
	BEGIN
	GETFIL (.OBJBLK, CH$PTR (WORD_READ,, 16), 1);
	WORD_READ = CH$RCHAR (CH$PTR (WORD_READ,, 16));
	END;
    RECORD_COUNT = 0;
    END;					!OF OBJ_SET
GLOBAL ROUTINE OBJ_WORD =
!++
! FUNCTIONAL DESCRIPTION:
!
!
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--
    BEGIN
    IF .RECORD_COUNT LEQ 0
    THEN
	0
    ELSE
	CASE .FILE_TYPE FROM 1 TO 2 OF
	    SET
	    [RSX] :
		BEGIN
		RECORD_COUNT = .RECORD_COUNT - 2;
		GET_WORD ()
		END;
	    [MACY11] :
		BEGIN
		WORD_VALUE = 0;
		WORD_VALUE<0, 8> = GET_BYTE ();
		IF (RECORD_COUNT = .RECORD_COUNT - 1) GTR 0
		THEN
		    BEGIN
		    WORD_VALUE<8, 8> = GET_BYTE ();
		    RECORD_COUNT = .RECORD_COUNT - 1;
		    END;
		IF .RECORD_COUNT LEQ 0 THEN GET_BYTE ();
		.WORD_VALUE
		END;
	    TES
    END;					!OF OBJ_WORD
END
ELUDOM