// 
// support for instance dumping
//
#include <string.h>
#include <stdio.h>
#if defined(OS2)
#define INCL_NOCOMMON
#define INCL_DOSPROCESS
#define INCL_DOSSEMAPHORES
#define INCL_DOSFILEMGR
#define INCL_DOSERRORS
#define INCL_DOSMISC
#include <os2.h>
#else
#include <windows.h>
#endif

#include <dos.h>

#include "hungary.h"
#include "bsc.h"
#include "bscsup.h"

char *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
};

#define C_ATR 11

char	*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 BSC_API
DumpInst(IINST iinst)
// dump a single instance
{
     ISYM isym;
     WORD i;
     LSZ  lsz;
     WORD len;
     TYP typ;
     ATR atr;

     len = BSCMaxSymLen();

     InstInfo(iinst, &isym, &typ, &atr);

     lsz = LszNameFrSym(isym);

     BSCPrintf("%s", lsz);

     for (i = strlen(lsz); i < len; i++)
	BSCPrintf(" ");

     BSCPrintf(" (%s", ptyptab[typ]);

     for (i=0; i < C_ATR; i++)
	  if (atr & (1<<i)) BSCPrintf (":%s", patrtab[i]);

     BSCPrintf(")");
}

LSZ BSC_API
LszTypInst(IINST iinst)
// return the type string of a single inst
//
{
    ISYM isym;
    TYP typ;
    ATR atr;

    InstInfo(iinst, &isym, &typ, &atr);
    return ptyptab[typ];
}