//
//
// DCODESBR.C -	dumps a human readable version of the current .sbr file
//		record from the r_... variables
//		
//

#include "sbrfdef.h"
#include "mbrmake.h"

char	* near prectab[] = {
		"HEADER",		// SBR_REC_HEADER
		"MODULE",		// SBR_REC_MODULE
		"LINDEF",		// SBR_REC_LINDEF
		"SYMDEF",		// SBR_REC_SYMDEF
		"SYMREFUSE",		// SBR_REC_SYMREFUSE
		"SYMREFSET",		// SBR_REC_SYMREFSET
		"MACROBEG",		// SBR_REC_MACROBEG
		"MACROEND",		// SBR_REC_MACROEND
		"BLKBEG",		// SBR_REC_BLKBEG
		"BLKEND",		// SBR_REC_BLDEND
		"MODEND",		// SBR_REC_MODEND
		"OWNER"			// SBR_REC_OWNER
};

char	* near plangtab[] = {
		"UNDEF",		// SBR_L_UNDEF
		"BASIC",		// SBR_L_BASIC
		"C",			// SBR_L_C
		"FORTRAN",		// SBR_L_FORTRAN
		"MASM",			// SBR_L_MASM
		"PASCAL",		// SBR_L_PASCAL
		"COBOL"			// SBR_L_COBOL
};

char	* near ptyptab[] = {
		"UNDEF",		// SBR_TYP_UNKNOWN
		"FUNCTION",		// SBR_TYP_FUNCTION
		"LABEL",		// SBR_TYP_LABEL
		"PARAMETER",		// SBR_TYP_PARAMETER
		"VARIABLE",		// SBR_TYP_VARIABLE
		"CONSTANT",		// SBR_TYP_CONSTANT
		"MACRO",		// SBR_TYP_MACRO
		"TYPEDEF",		// SBR_TYP_TYPEDEF
		"STRUCNAM",		// SBR_TYP_STRUCNAM
		"ENUMNAM",		// SBR_TYP_ENUMNAM
		"ENUMMEM",		// SBR_TYP_ENUMMEM
		"UNIONNAM",		// SBR_TYP_UNIONNAM
		"SEGMENT",		// SBR_TYP_SEGMENT
		"GROUP",		// SBR_TYP_GROUP
		"PROGRAM"		// SBR_TYP_PROGRAM
};

char	* near patrtab[] = {
		"LOCAL",		// SBR_ATR_LOCAL
		"STATIC",		// SBR_ATR_STATIC
		"SHARED",		// SBR_ATR_SHARED
		"NEAR", 		// SBR_ATR_NEAR
		"COMMON",		// SBR_ATR_COMMON
		"DECL_ONLY",		// SBR_ATR_DECL_ONLY
		"PUBLIC",		// SBR_ATR_PUBLIC
		"NAMED",		// SBR_ATR_NAMED
		"MODULE",		// SBR_ATR_MODULE
		"?", "?"		// reserved for expansion
};

VOID
DecodeSBR ()
{
    int     i;
    static indent;

    switch(r_rectyp) {
	case SBR_REC_MACROEND:
	case SBR_REC_BLKEND:
	case SBR_REC_MODEND:
	    indent--;
	    break;

	case SBR_REC_HEADER:
	case SBR_REC_MODULE:
	case SBR_REC_LINDEF:
	case SBR_REC_SYMDEF:
	case SBR_REC_SYMREFUSE:
	case SBR_REC_SYMREFSET:
	case SBR_REC_MACROBEG:
	case SBR_REC_BLKBEG:
	case SBR_REC_OWNER:
	    break;

	default:
	    fprintf(streamOut, "invalid record type %0xh", r_rectyp);
	    SBRCorrupt("");
	    return;
    }

    for (i = indent; i; i--)
	fprintf (streamOut, " ");

    fprintf (streamOut, "%s: (", prectab[r_rectyp]);

    switch(r_rectyp) {

    case SBR_REC_HEADER:
	fprintf (streamOut, "%1d:%1d (%s) %1d)",
		r_majv, r_minv, plangtab[r_lang], r_fcol);
	fprintf (streamOut, " in %s", r_cwd);
	break;

    case SBR_REC_MODULE:
	fprintf (streamOut, "%s", r_bname);
	indent++;
	break;

    case SBR_REC_LINDEF:
	fprintf (streamOut, "%d", r_lineno);
	break;

    case SBR_REC_SYMDEF:
	{
	WORD attr, type;

	type = (r_attrib & SBR_TYPMASK) >> SBR_TYPSHIFT;
	attr = (r_attrib & SBR_ATRMASK) >> SBR_ATRSHIFT;

	fprintf (streamOut, "%s", ptyptab[type]);

	for (i = 0 ; i < SBR_ATRBITS; i++)
	    if (attr & (1 << i))
		fprintf (streamOut, "|%s", patrtab[i]);

	fprintf (streamOut, " o:%d %s", r_ordinal, r_bname);
	}
	break;

    case SBR_REC_SYMREFUSE:
    case SBR_REC_SYMREFSET:
    case SBR_REC_OWNER:
	fprintf (streamOut, "o:%d", r_ordinal);
	break;

    case SBR_REC_MACROBEG:
    case SBR_REC_BLKBEG:
	indent++;
	break;
    }
    fprintf (streamOut, ")\n");
}