xref: /netbsd-src/external/gpl3/gdb/dist/sim/igen/misc.c (revision 71f621822dbfd5073a314948bec169b7bb05f7be)
14e98e3e1Schristos /* The IGEN simulator generator for GDB, the GNU Debugger.
24e98e3e1Schristos 
3*71f62182Schristos    Copyright 2002-2024 Free Software Foundation, Inc.
44e98e3e1Schristos 
54e98e3e1Schristos    Contributed by Andrew Cagney.
64e98e3e1Schristos 
74e98e3e1Schristos    This file is part of GDB.
84e98e3e1Schristos 
94e98e3e1Schristos    This program is free software; you can redistribute it and/or modify
104e98e3e1Schristos    it under the terms of the GNU General Public License as published by
114e98e3e1Schristos    the Free Software Foundation; either version 3 of the License, or
124e98e3e1Schristos    (at your option) any later version.
134e98e3e1Schristos 
144e98e3e1Schristos    This program is distributed in the hope that it will be useful,
154e98e3e1Schristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
164e98e3e1Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
174e98e3e1Schristos    GNU General Public License for more details.
184e98e3e1Schristos 
194e98e3e1Schristos    You should have received a copy of the GNU General Public License
204e98e3e1Schristos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
214e98e3e1Schristos 
224e98e3e1Schristos 
234e98e3e1Schristos 
244e98e3e1Schristos #include <stdio.h>
254e98e3e1Schristos #include <stdarg.h>
264e98e3e1Schristos #include <ctype.h>
274e98e3e1Schristos 
284e98e3e1Schristos #include "misc.h"
294e98e3e1Schristos 
304e98e3e1Schristos #include <stdlib.h>
314e98e3e1Schristos #include <string.h>
324e98e3e1Schristos 
334e98e3e1Schristos /* NB: Because warning and error can be interchanged, neither append a
344e98e3e1Schristos    trailing '\n' */
354e98e3e1Schristos 
364e98e3e1Schristos void
374b169a6bSchristos error (const line_ref *line, const char *msg, ...)
384e98e3e1Schristos {
394e98e3e1Schristos   va_list ap;
404e98e3e1Schristos   if (line != NULL)
414e98e3e1Schristos     fprintf (stderr, "%s:%d: ", line->file_name, line->line_nr);
424e98e3e1Schristos   va_start (ap, msg);
434e98e3e1Schristos   vfprintf (stderr, msg, ap);
444e98e3e1Schristos   va_end (ap);
454e98e3e1Schristos   exit (1);
464e98e3e1Schristos }
474e98e3e1Schristos 
484e98e3e1Schristos void
494b169a6bSchristos warning (const line_ref *line, const char *msg, ...)
504e98e3e1Schristos {
514e98e3e1Schristos   va_list ap;
524e98e3e1Schristos   if (line != NULL)
534e98e3e1Schristos     fprintf (stderr, "%s:%d: warning: ", line->file_name, line->line_nr);
544e98e3e1Schristos   va_start (ap, msg);
554e98e3e1Schristos   vfprintf (stderr, msg, ap);
564e98e3e1Schristos   va_end (ap);
574e98e3e1Schristos }
584e98e3e1Schristos 
594e98e3e1Schristos void
604b169a6bSchristos notify (const line_ref *line, const char *msg, ...)
614e98e3e1Schristos {
624e98e3e1Schristos   va_list ap;
634e98e3e1Schristos   if (line != NULL)
644e98e3e1Schristos     fprintf (stdout, "%s %d: info: ", line->file_name, line->line_nr);
654e98e3e1Schristos   va_start (ap, msg);
664e98e3e1Schristos   vfprintf (stdout, msg, ap);
674e98e3e1Schristos   va_end (ap);
684e98e3e1Schristos }
694e98e3e1Schristos 
704e98e3e1Schristos void *
714e98e3e1Schristos zalloc (long size)
724e98e3e1Schristos {
734e98e3e1Schristos   void *memory = malloc (size);
744e98e3e1Schristos   if (memory == NULL)
754e98e3e1Schristos     ERROR ("zalloc failed");
764e98e3e1Schristos   memset (memory, 0, size);
774e98e3e1Schristos   return memory;
784e98e3e1Schristos }
794e98e3e1Schristos 
804e98e3e1Schristos 
814e98e3e1Schristos unsigned long long
824e98e3e1Schristos a2i (const char *a)
834e98e3e1Schristos {
844e98e3e1Schristos   int neg = 0;
854e98e3e1Schristos   int base = 10;
864e98e3e1Schristos   unsigned long long num = 0;
874e98e3e1Schristos   int looping;
884e98e3e1Schristos 
894e98e3e1Schristos   while (isspace (*a))
904e98e3e1Schristos     a++;
914e98e3e1Schristos 
924e98e3e1Schristos   if (strcmp (a, "true") == 0 || strcmp (a, "TRUE") == 0)
934e98e3e1Schristos     return 1;
944e98e3e1Schristos 
95212397c6Schristos   if (strcmp (a, "false") == 0 || strcmp (a, "FALSE") == 0)
964e98e3e1Schristos     return 0;
974e98e3e1Schristos 
984e98e3e1Schristos   if (*a == '-')
994e98e3e1Schristos     {
1004e98e3e1Schristos       neg = 1;
1014e98e3e1Schristos       a++;
1024e98e3e1Schristos     }
1034e98e3e1Schristos 
1044e98e3e1Schristos   if (*a == '0')
1054e98e3e1Schristos     {
1064e98e3e1Schristos       if (a[1] == 'x' || a[1] == 'X')
1074e98e3e1Schristos 	{
1084e98e3e1Schristos 	  a += 2;
1094e98e3e1Schristos 	  base = 16;
1104e98e3e1Schristos 	}
111212397c6Schristos       else if (a[1] == 'b' || a[1] == 'B')
1124e98e3e1Schristos 	{
1134e98e3e1Schristos 	  a += 2;
1144e98e3e1Schristos 	  base = 2;
1154e98e3e1Schristos 	}
1164e98e3e1Schristos       else
1174e98e3e1Schristos 	base = 8;
1184e98e3e1Schristos     }
1194e98e3e1Schristos 
1204e98e3e1Schristos   looping = 1;
1214e98e3e1Schristos   while (looping)
1224e98e3e1Schristos     {
1234e98e3e1Schristos       int ch = *a++;
1244e98e3e1Schristos 
1254e98e3e1Schristos       switch (base)
1264e98e3e1Schristos 	{
1274e98e3e1Schristos 	default:
1284e98e3e1Schristos 	  looping = 0;
1294e98e3e1Schristos 	  break;
1304e98e3e1Schristos 
1314e98e3e1Schristos 	case 2:
1324e98e3e1Schristos 	  if (ch >= '0' && ch <= '1')
1334e98e3e1Schristos 	    {
1344e98e3e1Schristos 	      num = (num * 2) + (ch - '0');
1354e98e3e1Schristos 	    }
1364e98e3e1Schristos 	  else
1374e98e3e1Schristos 	    {
1384e98e3e1Schristos 	      looping = 0;
1394e98e3e1Schristos 	    }
1404e98e3e1Schristos 	  break;
1414e98e3e1Schristos 
1424e98e3e1Schristos 	case 10:
1434e98e3e1Schristos 	  if (ch >= '0' && ch <= '9')
1444e98e3e1Schristos 	    {
1454e98e3e1Schristos 	      num = (num * 10) + (ch - '0');
1464e98e3e1Schristos 	    }
1474e98e3e1Schristos 	  else
1484e98e3e1Schristos 	    {
1494e98e3e1Schristos 	      looping = 0;
1504e98e3e1Schristos 	    }
1514e98e3e1Schristos 	  break;
1524e98e3e1Schristos 
1534e98e3e1Schristos 	case 8:
1544e98e3e1Schristos 	  if (ch >= '0' && ch <= '7')
1554e98e3e1Schristos 	    {
1564e98e3e1Schristos 	      num = (num * 8) + (ch - '0');
1574e98e3e1Schristos 	    }
1584e98e3e1Schristos 	  else
1594e98e3e1Schristos 	    {
1604e98e3e1Schristos 	      looping = 0;
1614e98e3e1Schristos 	    }
1624e98e3e1Schristos 	  break;
1634e98e3e1Schristos 
1644e98e3e1Schristos 	case 16:
1654e98e3e1Schristos 	  if (ch >= '0' && ch <= '9')
1664e98e3e1Schristos 	    {
1674e98e3e1Schristos 	      num = (num * 16) + (ch - '0');
1684e98e3e1Schristos 	    }
1694e98e3e1Schristos 	  else if (ch >= 'a' && ch <= 'f')
1704e98e3e1Schristos 	    {
1714e98e3e1Schristos 	      num = (num * 16) + (ch - 'a' + 10);
1724e98e3e1Schristos 	    }
1734e98e3e1Schristos 	  else if (ch >= 'A' && ch <= 'F')
1744e98e3e1Schristos 	    {
1754e98e3e1Schristos 	      num = (num * 16) + (ch - 'A' + 10);
1764e98e3e1Schristos 	    }
1774e98e3e1Schristos 	  else
1784e98e3e1Schristos 	    {
1794e98e3e1Schristos 	      looping = 0;
1804e98e3e1Schristos 	    }
1814e98e3e1Schristos 	  break;
1824e98e3e1Schristos 	}
1834e98e3e1Schristos     }
1844e98e3e1Schristos 
1854e98e3e1Schristos   if (neg)
1864e98e3e1Schristos     num = -num;
1874e98e3e1Schristos 
1884e98e3e1Schristos   return num;
1894e98e3e1Schristos }
1904e98e3e1Schristos 
1914e98e3e1Schristos unsigned
1924e98e3e1Schristos target_a2i (int ms_bit_nr, const char *a)
1934e98e3e1Schristos {
1944e98e3e1Schristos   if (ms_bit_nr)
1954e98e3e1Schristos     return (ms_bit_nr - a2i (a));
1964e98e3e1Schristos   else
1974e98e3e1Schristos     return a2i (a);
1984e98e3e1Schristos }
1994e98e3e1Schristos 
2004e98e3e1Schristos unsigned
2014e98e3e1Schristos i2target (int ms_bit_nr, unsigned bit)
2024e98e3e1Schristos {
2034e98e3e1Schristos   if (ms_bit_nr)
2044e98e3e1Schristos     return ms_bit_nr - bit;
2054e98e3e1Schristos   else
2064e98e3e1Schristos     return bit;
2074e98e3e1Schristos }
2084e98e3e1Schristos 
2094e98e3e1Schristos 
2104e98e3e1Schristos int
2114e98e3e1Schristos name2i (const char *names, const name_map * map)
2124e98e3e1Schristos {
2134e98e3e1Schristos   const name_map *curr;
2144e98e3e1Schristos   const char *name = names;
2154e98e3e1Schristos   while (*name != '\0')
2164e98e3e1Schristos     {
2174e98e3e1Schristos       /* find our name */
218*71f62182Schristos       const char *end = strchr (name, ',');
219*71f62182Schristos       const char *next;
2204e98e3e1Schristos       unsigned len;
2214e98e3e1Schristos       if (end == NULL)
2224e98e3e1Schristos 	{
2234e98e3e1Schristos 	  end = strchr (name, '\0');
2244e98e3e1Schristos 	  next = end;
2254e98e3e1Schristos 	}
2264e98e3e1Schristos       else
2274e98e3e1Schristos 	{
2284e98e3e1Schristos 	  next = end + 1;
2294e98e3e1Schristos 	}
2304e98e3e1Schristos       len = end - name;
2314e98e3e1Schristos       /* look it up */
2324e98e3e1Schristos       curr = map;
2334e98e3e1Schristos       while (curr->name != NULL)
2344e98e3e1Schristos 	{
2354e98e3e1Schristos 	  if (strncmp (curr->name, name, len) == 0
2364e98e3e1Schristos 	      && strlen (curr->name) == len)
2374e98e3e1Schristos 	    return curr->i;
2384e98e3e1Schristos 	  curr++;
2394e98e3e1Schristos 	}
2404e98e3e1Schristos       name = next;
2414e98e3e1Schristos     }
2424e98e3e1Schristos   /* nothing found, possibly return a default */
2434e98e3e1Schristos   curr = map;
2444e98e3e1Schristos   while (curr->name != NULL)
2454e98e3e1Schristos     curr++;
2464e98e3e1Schristos   if (curr->i >= 0)
2474e98e3e1Schristos     return curr->i;
2484e98e3e1Schristos   else
2494b169a6bSchristos     error (NULL, "%s contains no valid names\n", names);
2504e98e3e1Schristos   return 0;
2514e98e3e1Schristos }
2524e98e3e1Schristos 
2534e98e3e1Schristos const char *
2544e98e3e1Schristos i2name (const int i, const name_map * map)
2554e98e3e1Schristos {
2564e98e3e1Schristos   while (map->name != NULL)
2574e98e3e1Schristos     {
2584e98e3e1Schristos       if (map->i == i)
2594e98e3e1Schristos 	return map->name;
2604e98e3e1Schristos       map++;
2614e98e3e1Schristos     }
2624e98e3e1Schristos   error (NULL, "map lookup failed for %d\n", i);
2634e98e3e1Schristos   return NULL;
2644e98e3e1Schristos }
265