/* ---------------------------------------------------------------------- */
/*                   Copyright (C) 1991 by Natrlich!                     */
/*                      This file is copyrighted!                         */
/*                Refer to the documentation for details.                 */
/* ---------------------------------------------------------------------- */
#include "defines.h"
#include "nasm.h"
#include <stdio.h>
#include "y_tab.h"

extern char   *yylval;

void prtname( no)
{
   char  *x = 0;

   fprintf( ESTREAM, "Token %d == ", no);
   switch( no)
   {
      case T_EOL   :    x = "T_EOL";      break;
      case T_LABEL :    fprintf( ESTREAM, "T_LABEL \"%s\"", yylval); break;
      case T_DOTEQ :    x = "T_DOTEQ";    break;
      case T_INSTR :    x = "T_INSTR";    break;
      case T_IDENT :    fprintf( ESTREAM, "T_IDENT \"%s\"", yylval); break;
      case T_EXPR  :    x = "T_EXPR";     break;
      case T_IF    :    x = "T_IF";       break;
      case T_ELSE  :    x = "T_ELSE" ;    break;
      case T_ENDIF :    x = "T_ENDIF";    break;
      case T_ORG   :    x = "T_ORG";      break;
      case T_DS    :    x = "T_DS";       break;
      case T_WORD  :    x = "T_WORD";     break;
      case T_BYTE  :    x = "T_BYTE";     break;
      case T_SBYTE :    x = "T_SBYTE";    break;
      case T_OPT   :    x = "T_OPT";      break;
      case T_MACRO :    x = "T_MACRO";    break;
      case T_ENDM  :    x = "T_ENDM";     break;
      case T_END   :    x = "T_END";      break;
      case T_NUM   :    x = "T_NUM";      break;
      case T_ACCU  :    x = "T_ACCU";     break;
      case T_AND   :    x = "T_AND";      break;
      case T_OR    :    x = "T_OR";       break;
      case T_NEQ   :    x = "T_NEQ";      break;
      case T_GEQ   :    x = "T_GEQ";      break;
      case T_LEQ   :    x = "T_LEQ";      break;
      case T_NOT   :    x = "T_NOT";      break;
      case T_DEF   :    x = "T_DEF";      break;
      case T_NUMBER :   fprintf( ESTREAM, "T_NUMBER=%ld", yylval); break;
      case T_CHAR  :    x = "T_CHAR";     break;
      case T_STRING:    x = "T_STRING";   break;
      case T_NO    :    x = "T_NO";       break;
      case T_OBJ   :    x = "T_OBJ";      break;
      case T_MLIST :    x = "T_MLIST";    break;
      case T_CLIST :    x = "T_CLIST";    break;
      case T_EJECT :    x = "T_EJECT";    break;
      case T_XREF  :    x = "T_XREF";     break;
      case T_ERR   :    x = "T_ERR";      break;
      case T_PAGE  :    x = "T_PAGE";     break;
      case T_ERROR :    x = "T_ERROR";    break;
      case T_TITLE :    x = "T_TITLE";    break;
      case T_DBYTE :    x = "T_DBYTE";    break;
      case T_TAB   :    x = "T_TAB";      break;
      case T_FLOAT :    x = "T_FLOAT";    break;
      case T_XFLOAT:    x = "T_XFLOAT";   break;
      case T_UNDEF :    x = "T_UNDEF";    break;
      case T_CBYTE :    x = "T_CBYTE";    break;
      case T_LOCAL :    x = "T_LOCAL";    break;
      case T_SET   :    x = "T_SET";      break;
      case T_REF   :    x = "T_REF";      break;
      case T_LIST  :    x = "T_LIST";     break;
      case T_FILE  :    x = "T_FILE";     break;
      case T_PARA  :    x = "T_PARA";     break;
      case T_MPARA :    x = "T_MPARA";    break;
      case T_MSPARA  :  x = "T_MSPARA";   break;
      case T_MLPARA  :  x = "T_MLPARA";   break;
      case T_MLSPARA :  x = "T_MLSPARA";  break;
      case T_INCLUDE :  x = "T_INCLUDE";  break;
      default      :
         switch( no)
         {
            case ' '  : x = "[SPACE]"; break;
            case '\t' : x = "[TAB]";   break;
            case '\n' : x = "[LF]";    break;
            case '\r' : x = "[CR]";    break;
            case '\f' : x = "[FF]";    break;
            default   :
               if( no > ' ' && no <= 126)
                  fprintf( ESTREAM, "'%c'", no);
               else
                  fprintf( ESTREAM, "#$%04X", no);
         }
   }
   if( x)
      fputs( x, ESTREAM);
   putc( '\n', ESTREAM);
}

#include <setjmp.h>

#define NOLONGS   (sizeof( jmp_buf) >> 2)
void   show_jmp( s, foo)
char     *s;
jmp_buf  foo;
{
   long  *p = (long *) foo;
   int   i = 0;

   fprintf( ESTREAM, "\"%s\":\n", s);
   do
      fprintf( ESTREAM, "[%2.2d]:%8.8lx [%2.2d]:%8.8lx [%2.2d]:%8.8lx  [%2.2d]:%8.8lx\n",
                           i, *p, i+1, p[1], i+2, p[2], i+3, p[3]);
   while( p +=4, (i+=4) < NOLONGS);
}

void   dump_buffer( p)
register buffer huge *p;
{
   register int   i = 0, j;
   while( p)
   {
      for( j = i; j; --j) putc( ' ', ESTREAM);
      fprintf( ESTREAM, "BUFFER @$%lx\n", p);
      for( j = i; j; --j) putc( ' ', ESTREAM);
      fprintf( ESTREAM," ->next : $%lx   ->before : $%lx\n",
                  p->next, p->before);
      for( j = i; j; --j) putc( ' ', ESTREAM);
      fprintf( ESTREAM, "buflist : $%lx name : \"%s\"\n",
                  p->buflist, p->name);
      for( j = i; j; --j) putc( ' ', ESTREAM);
      fprintf( ESTREAM, "remain = %ld   oremain = %ld  line = %d\n",
                  p->remain, p->oremain, p->line);
      for( j = i; j; --j) putc( ' ', ESTREAM);
      fprintf( ESTREAM, "_aux1 = %d  _aux2 = %d  type = %x\n",
                  p->_aux1, p->_aux2, p->type);
      i += 3;
      p = p->before;
   }
}

