xref: /netbsd/external/gpl3/gdb.old/dist/sim/igen/misc.c (revision 184b2d41)
16ca2c52aSchristos /* The IGEN simulator generator for GDB, the GNU Debugger.
26ca2c52aSchristos 
3*184b2d41Schristos    Copyright 2002-2020 Free Software Foundation, Inc.
46ca2c52aSchristos 
56ca2c52aSchristos    Contributed by Andrew Cagney.
66ca2c52aSchristos 
76ca2c52aSchristos    This file is part of GDB.
86ca2c52aSchristos 
96ca2c52aSchristos    This program is free software; you can redistribute it and/or modify
106ca2c52aSchristos    it under the terms of the GNU General Public License as published by
116ca2c52aSchristos    the Free Software Foundation; either version 3 of the License, or
126ca2c52aSchristos    (at your option) any later version.
136ca2c52aSchristos 
146ca2c52aSchristos    This program is distributed in the hope that it will be useful,
156ca2c52aSchristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
166ca2c52aSchristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
176ca2c52aSchristos    GNU General Public License for more details.
186ca2c52aSchristos 
196ca2c52aSchristos    You should have received a copy of the GNU General Public License
206ca2c52aSchristos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
216ca2c52aSchristos 
226ca2c52aSchristos 
236ca2c52aSchristos 
246ca2c52aSchristos #include <stdio.h>
256ca2c52aSchristos #include <stdarg.h>
266ca2c52aSchristos #include <ctype.h>
276ca2c52aSchristos 
286ca2c52aSchristos #include "config.h"
296ca2c52aSchristos #include "misc.h"
306ca2c52aSchristos 
316ca2c52aSchristos #ifdef HAVE_STDLIB_H
326ca2c52aSchristos #include <stdlib.h>
336ca2c52aSchristos #endif
346ca2c52aSchristos 
356ca2c52aSchristos #ifdef HAVE_STRING_H
366ca2c52aSchristos #include <string.h>
376ca2c52aSchristos #else
386ca2c52aSchristos #ifdef HAVE_STRINGS_H
396ca2c52aSchristos #include <strings.h>
406ca2c52aSchristos #endif
416ca2c52aSchristos #endif
426ca2c52aSchristos 
436ca2c52aSchristos /* NB: Because warning and error can be interchanged, neither append a
446ca2c52aSchristos    trailing '\n' */
456ca2c52aSchristos 
466ca2c52aSchristos void
error(const line_ref * line,char * msg,...)476ca2c52aSchristos error (const line_ref *line, char *msg, ...)
486ca2c52aSchristos {
496ca2c52aSchristos   va_list ap;
506ca2c52aSchristos   if (line != NULL)
516ca2c52aSchristos     fprintf (stderr, "%s:%d: ", line->file_name, line->line_nr);
526ca2c52aSchristos   va_start (ap, msg);
536ca2c52aSchristos   vfprintf (stderr, msg, ap);
546ca2c52aSchristos   va_end (ap);
556ca2c52aSchristos   exit (1);
566ca2c52aSchristos }
576ca2c52aSchristos 
586ca2c52aSchristos void
warning(const line_ref * line,char * msg,...)596ca2c52aSchristos warning (const line_ref *line, char *msg, ...)
606ca2c52aSchristos {
616ca2c52aSchristos   va_list ap;
626ca2c52aSchristos   if (line != NULL)
636ca2c52aSchristos     fprintf (stderr, "%s:%d: warning: ", line->file_name, line->line_nr);
646ca2c52aSchristos   va_start (ap, msg);
656ca2c52aSchristos   vfprintf (stderr, msg, ap);
666ca2c52aSchristos   va_end (ap);
676ca2c52aSchristos }
686ca2c52aSchristos 
696ca2c52aSchristos void
notify(const line_ref * line,char * msg,...)706ca2c52aSchristos notify (const line_ref *line, char *msg, ...)
716ca2c52aSchristos {
726ca2c52aSchristos   va_list ap;
736ca2c52aSchristos   if (line != NULL)
746ca2c52aSchristos     fprintf (stdout, "%s %d: info: ", line->file_name, line->line_nr);
756ca2c52aSchristos   va_start (ap, msg);
766ca2c52aSchristos   vfprintf (stdout, msg, ap);
776ca2c52aSchristos   va_end (ap);
786ca2c52aSchristos }
796ca2c52aSchristos 
806ca2c52aSchristos void *
zalloc(long size)816ca2c52aSchristos zalloc (long size)
826ca2c52aSchristos {
836ca2c52aSchristos   void *memory = malloc (size);
846ca2c52aSchristos   if (memory == NULL)
856ca2c52aSchristos     ERROR ("zalloc failed");
866ca2c52aSchristos   memset (memory, 0, size);
876ca2c52aSchristos   return memory;
886ca2c52aSchristos }
896ca2c52aSchristos 
906ca2c52aSchristos 
916ca2c52aSchristos unsigned long long
a2i(const char * a)926ca2c52aSchristos a2i (const char *a)
936ca2c52aSchristos {
946ca2c52aSchristos   int neg = 0;
956ca2c52aSchristos   int base = 10;
966ca2c52aSchristos   unsigned long long num = 0;
976ca2c52aSchristos   int looping;
986ca2c52aSchristos 
996ca2c52aSchristos   while (isspace (*a))
1006ca2c52aSchristos     a++;
1016ca2c52aSchristos 
1026ca2c52aSchristos   if (strcmp (a, "true") == 0 || strcmp (a, "TRUE") == 0)
1036ca2c52aSchristos     return 1;
1046ca2c52aSchristos 
1056ca2c52aSchristos   if (strcmp (a, "false") == 0 || strcmp (a, "FALSE") == 0)
1066ca2c52aSchristos     return 0;
1076ca2c52aSchristos 
1086ca2c52aSchristos   if (*a == '-')
1096ca2c52aSchristos     {
1106ca2c52aSchristos       neg = 1;
1116ca2c52aSchristos       a++;
1126ca2c52aSchristos     }
1136ca2c52aSchristos 
1146ca2c52aSchristos   if (*a == '0')
1156ca2c52aSchristos     {
1166ca2c52aSchristos       if (a[1] == 'x' || a[1] == 'X')
1176ca2c52aSchristos 	{
1186ca2c52aSchristos 	  a += 2;
1196ca2c52aSchristos 	  base = 16;
1206ca2c52aSchristos 	}
1216ca2c52aSchristos       else if (a[1] == 'b' || a[1] == 'B')
1226ca2c52aSchristos 	{
1236ca2c52aSchristos 	  a += 2;
1246ca2c52aSchristos 	  base = 2;
1256ca2c52aSchristos 	}
1266ca2c52aSchristos       else
1276ca2c52aSchristos 	base = 8;
1286ca2c52aSchristos     }
1296ca2c52aSchristos 
1306ca2c52aSchristos   looping = 1;
1316ca2c52aSchristos   while (looping)
1326ca2c52aSchristos     {
1336ca2c52aSchristos       int ch = *a++;
1346ca2c52aSchristos 
1356ca2c52aSchristos       switch (base)
1366ca2c52aSchristos 	{
1376ca2c52aSchristos 	default:
1386ca2c52aSchristos 	  looping = 0;
1396ca2c52aSchristos 	  break;
1406ca2c52aSchristos 
1416ca2c52aSchristos 	case 2:
1426ca2c52aSchristos 	  if (ch >= '0' && ch <= '1')
1436ca2c52aSchristos 	    {
1446ca2c52aSchristos 	      num = (num * 2) + (ch - '0');
1456ca2c52aSchristos 	    }
1466ca2c52aSchristos 	  else
1476ca2c52aSchristos 	    {
1486ca2c52aSchristos 	      looping = 0;
1496ca2c52aSchristos 	    }
1506ca2c52aSchristos 	  break;
1516ca2c52aSchristos 
1526ca2c52aSchristos 	case 10:
1536ca2c52aSchristos 	  if (ch >= '0' && ch <= '9')
1546ca2c52aSchristos 	    {
1556ca2c52aSchristos 	      num = (num * 10) + (ch - '0');
1566ca2c52aSchristos 	    }
1576ca2c52aSchristos 	  else
1586ca2c52aSchristos 	    {
1596ca2c52aSchristos 	      looping = 0;
1606ca2c52aSchristos 	    }
1616ca2c52aSchristos 	  break;
1626ca2c52aSchristos 
1636ca2c52aSchristos 	case 8:
1646ca2c52aSchristos 	  if (ch >= '0' && ch <= '7')
1656ca2c52aSchristos 	    {
1666ca2c52aSchristos 	      num = (num * 8) + (ch - '0');
1676ca2c52aSchristos 	    }
1686ca2c52aSchristos 	  else
1696ca2c52aSchristos 	    {
1706ca2c52aSchristos 	      looping = 0;
1716ca2c52aSchristos 	    }
1726ca2c52aSchristos 	  break;
1736ca2c52aSchristos 
1746ca2c52aSchristos 	case 16:
1756ca2c52aSchristos 	  if (ch >= '0' && ch <= '9')
1766ca2c52aSchristos 	    {
1776ca2c52aSchristos 	      num = (num * 16) + (ch - '0');
1786ca2c52aSchristos 	    }
1796ca2c52aSchristos 	  else if (ch >= 'a' && ch <= 'f')
1806ca2c52aSchristos 	    {
1816ca2c52aSchristos 	      num = (num * 16) + (ch - 'a' + 10);
1826ca2c52aSchristos 	    }
1836ca2c52aSchristos 	  else if (ch >= 'A' && ch <= 'F')
1846ca2c52aSchristos 	    {
1856ca2c52aSchristos 	      num = (num * 16) + (ch - 'A' + 10);
1866ca2c52aSchristos 	    }
1876ca2c52aSchristos 	  else
1886ca2c52aSchristos 	    {
1896ca2c52aSchristos 	      looping = 0;
1906ca2c52aSchristos 	    }
1916ca2c52aSchristos 	  break;
1926ca2c52aSchristos 	}
1936ca2c52aSchristos     }
1946ca2c52aSchristos 
1956ca2c52aSchristos   if (neg)
1966ca2c52aSchristos     num = -num;
1976ca2c52aSchristos 
1986ca2c52aSchristos   return num;
1996ca2c52aSchristos }
2006ca2c52aSchristos 
2016ca2c52aSchristos unsigned
target_a2i(int ms_bit_nr,const char * a)2026ca2c52aSchristos target_a2i (int ms_bit_nr, const char *a)
2036ca2c52aSchristos {
2046ca2c52aSchristos   if (ms_bit_nr)
2056ca2c52aSchristos     return (ms_bit_nr - a2i (a));
2066ca2c52aSchristos   else
2076ca2c52aSchristos     return a2i (a);
2086ca2c52aSchristos }
2096ca2c52aSchristos 
2106ca2c52aSchristos unsigned
i2target(int ms_bit_nr,unsigned bit)2116ca2c52aSchristos i2target (int ms_bit_nr, unsigned bit)
2126ca2c52aSchristos {
2136ca2c52aSchristos   if (ms_bit_nr)
2146ca2c52aSchristos     return ms_bit_nr - bit;
2156ca2c52aSchristos   else
2166ca2c52aSchristos     return bit;
2176ca2c52aSchristos }
2186ca2c52aSchristos 
2196ca2c52aSchristos 
2206ca2c52aSchristos int
name2i(const char * names,const name_map * map)2216ca2c52aSchristos name2i (const char *names, const name_map * map)
2226ca2c52aSchristos {
2236ca2c52aSchristos   const name_map *curr;
2246ca2c52aSchristos   const char *name = names;
2256ca2c52aSchristos   while (*name != '\0')
2266ca2c52aSchristos     {
2276ca2c52aSchristos       /* find our name */
2286ca2c52aSchristos       char *end = strchr (name, ',');
2296ca2c52aSchristos       char *next;
2306ca2c52aSchristos       unsigned len;
2316ca2c52aSchristos       if (end == NULL)
2326ca2c52aSchristos 	{
2336ca2c52aSchristos 	  end = strchr (name, '\0');
2346ca2c52aSchristos 	  next = end;
2356ca2c52aSchristos 	}
2366ca2c52aSchristos       else
2376ca2c52aSchristos 	{
2386ca2c52aSchristos 	  next = end + 1;
2396ca2c52aSchristos 	}
2406ca2c52aSchristos       len = end - name;
2416ca2c52aSchristos       /* look it up */
2426ca2c52aSchristos       curr = map;
2436ca2c52aSchristos       while (curr->name != NULL)
2446ca2c52aSchristos 	{
2456ca2c52aSchristos 	  if (strncmp (curr->name, name, len) == 0
2466ca2c52aSchristos 	      && strlen (curr->name) == len)
2476ca2c52aSchristos 	    return curr->i;
2486ca2c52aSchristos 	  curr++;
2496ca2c52aSchristos 	}
2506ca2c52aSchristos       name = next;
2516ca2c52aSchristos     }
2526ca2c52aSchristos   /* nothing found, possibly return a default */
2536ca2c52aSchristos   curr = map;
2546ca2c52aSchristos   while (curr->name != NULL)
2556ca2c52aSchristos     curr++;
2566ca2c52aSchristos   if (curr->i >= 0)
2576ca2c52aSchristos     return curr->i;
2586ca2c52aSchristos   else
2596ca2c52aSchristos     error (NULL, "%s contains no valid names", names);
2606ca2c52aSchristos   return 0;
2616ca2c52aSchristos }
2626ca2c52aSchristos 
2636ca2c52aSchristos const char *
i2name(const int i,const name_map * map)2646ca2c52aSchristos i2name (const int i, const name_map * map)
2656ca2c52aSchristos {
2666ca2c52aSchristos   while (map->name != NULL)
2676ca2c52aSchristos     {
2686ca2c52aSchristos       if (map->i == i)
2696ca2c52aSchristos 	return map->name;
2706ca2c52aSchristos       map++;
2716ca2c52aSchristos     }
2726ca2c52aSchristos   error (NULL, "map lookup failed for %d\n", i);
2736ca2c52aSchristos   return NULL;
2746ca2c52aSchristos }
275