/*  This file is part of the program psim.

    Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, see <http://www.gnu.org/licenses/>.
 
    */


/* Frustrating header junk */

#include "build-config.h"

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

#include "ansidecl.h"
#include "filter_filename.h"

extern void error
(char *msg, ...);

#define ASSERT(EXPRESSION) \
do { \
  if (!(EXPRESSION)) { \
    error("%s:%d: assertion failed - %s\n", \
	  filter_filename (__FILE__), __LINE__, #EXPRESSION); \
  } \
} while (0)

#define ZALLOC(TYPE) (TYPE*)zalloc(sizeof(TYPE))
#define NZALLOC(TYPE,N) ((TYPE*) zalloc (sizeof(TYPE) * (N)))

extern void *zalloc
(long size);

extern void dumpf
(int indent, char *msg, ...);

extern unsigned target_a2i
(int ms_bit_nr,
 const char *a);

extern unsigned i2target
(int ms_bit_nr,
 unsigned bit);

extern unsigned a2i
(const char *a);

/* Try looking for name in the map table (returning the corresponding
   integer value).  If that fails, try converting the name into an
   integer */

typedef struct _name_map {
  const char *name;
  int i;
} name_map;

extern int name2i
(const char *name,
 const name_map *map);

extern const char *i2name
(const int i,
 const name_map *map);
