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