/* ---------------------------------------------------------------------- */
/*                   Copyright (C) 1991 by Natrlich!                     */
/*                      This file is copyrighted!                         */
/*                Refer to the documentation for details.                 */
/* ---------------------------------------------------------------------- */
#ifndef _LABELS_
#define _LABELS_

#if LINKER || LIBRARIAN
#define SEP  31
#else
#define SEP  30
#endif

/* number of different symbol tables */

#define L_NORMAL     0x0            /* Like FOO = $4000 */
#define L_ZERO       0x1            /* Like FOO = $40   */
#define L_EQU        0x2            /* Like FOO .= $4   */
#define L_SPECIAL    0x8            /* LIKE __RUN       */
#define L_LINKZERO   0x10           /* Like FOO == $40  */
#define L_REF        0x40
#define L_PC         0x8000         /* is label PC-relative ?? */
#define L_MASK1      (L_PC  | L_LINKZERO)
#define L_MASK2      (L_EQU | L_SPECIAL)
#define q_pcrel( p)  ((sword)((p)->type) < 0)
#define dumpable( x) (((x)->type & L_MASK1) && ! ((x)->type & L_MASK2))

#define FIX_WCODE    0x1       /* Fix 6502 word */
#define FIX_ZCODE    0x2       /* Fix 6502 byte */
#define FIX_SZCODE   0x3       /* Fix ATARI screen character */
#define FIX_BRANCH   0x4       /* Fix a 6502 branch byte */
#define FIX_DCODE    0x5       /* Fix 68000 word */
#define FIX_NOTHING  0x6       /* Fix nothing (for copexpr f.i.) */
#define FIX_LABEL    0x10      /* Fix a label */
#define FIX_NOTYET   0x20      /* For linker (obsolete) */

#define unvalued( x)   ((x)->l || (x)->label)      /* for expressions */
#define valued( x)     (! unvalued( x))
#define e_pcrel( p)    ((signed char)((p)->op) < 0)
#define is_msb( p)     (((p)->op & O_BITS) == O_MSB)  
/* ----------------------------------------------------- */
/*      Search for a label that fits the description     */
/* ----------------------------------------------------- */
#define found( p, x)  (p && p->hash == x)

#define einlinker( head, tail, last, used, p)            \
   if( last)                                             \
   {                                                     \
      MESS("last was there");                            \
      if( last->before)                                  \
      {                                                  \
         MESS("last->before exists");                    \
         last->before->next = p;                         \
         p->before = last->before;                       \
         p->next   = last;                               \
      }                                                  \
      else                                               \
      {                                                  \
         MESS("last->before does not exist");            \
         p->before = 0;                                  \
         p->next   = head[used];                         \
         head[ used] = p;                                \
      }                                                  \
      p->next->before = p;                               \
   }                                                     \
   else                                                  \
      if( tail[used])                                    \
      {                                                  \
         MESS("tail exists");                            \
         tail[used]->next = p;                           \
         p->before  = tail[used];                        \
         p->next    = 0;                                 \
         tail[used] = p;                                 \
      }                                                  \
      else                                               \
      {                                                  \
         MESS("head & tail created");                    \
         head[used] = tail[used] = p;                    \
         p->next = p->before = 0;                        \
      }

#define auslinker( head, tail, last, used, p)            \
   if( head[ used] == p)                                 \
   {                                                     \
      if( head[ used] = p->next)                         \
         p->next->before = 0;                            \
   }                                                     \
   else                                                  \
      p->before->next = p->next;                         \
   if( tail[ used] == p)                                 \
   {                                                     \
      if( tail[ used] = p->before)                       \
         tail[ used]->next = 0;                          \
   }                                                     \
   else                                                  \
      p->next->before = p->before

#endif

