*** empty log message ***
[deliverable/binutils-gdb.git] / sim / ppc / misc.c
index 8c62ad2c0e4c1bf408944ccf8a66ce267d4b6dd8..d8e54ed497beb1ac06018f6866290e9e400c38f6 100644 (file)
@@ -1,6 +1,6 @@
 /*  This file is part of the program psim.
 
-    Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
+    Copyright (C) 1994-1997, 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
 
 #include <stdio.h>
 #include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
+#include <ctype.h>
 
+#include "config.h"
 #include "misc.h"
 
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
+
 void
 error (char *msg, ...)
 {
@@ -42,7 +54,7 @@ zalloc(long size)
   void *memory = malloc(size);
   if (memory == NULL)
     error("zalloc failed\n");
-  bzero(memory, size);
+  memset(memory, 0, size);
   return memory;
 }
 
@@ -58,30 +70,74 @@ dumpf (int indent, char *msg, ...)
 }
 
 
-int
-it_is(const char *flag,
-      const char *flags)
+unsigned
+a2i(const char *a)
 {
-  int flag_len = strlen(flag);
-  while (*flags != '\0') {
-    if (!strncmp(flags, flag, flag_len)
-       && (flags[flag_len] == ',' || flags[flag_len] == '\0'))
-      return 1;
-    while (*flags != ',') {
-      if (*flags == '\0')
-       return 0;
-      flags++;
+  int neg = 0;
+  int base = 10;
+  unsigned num = 0;
+  int looping;
+
+  while (isspace (*a))
+    a++;
+
+  if (*a == '-') {
+    neg = 1;
+    a++;
+  }
+
+  if (*a == '0') {
+    if (a[1] == 'x' || a[1] == 'X') {
+      a += 2;
+      base = 16;
+    }
+    else
+      base = 8;
+  }
+
+  looping = 1;
+  while (looping) {
+    int ch = *a++;
+
+    switch (base) {
+    default:
+      looping = 0;
+      break;
+
+    case 10:
+      if (ch >= '0' && ch <= '9') {
+       num = (num * 10) + (ch - '0');
+      } else {
+       looping = 0;
+      }
+      break;
+
+    case 8:
+      if (ch >= '0' && ch <= '7') {
+       num = (num * 8) + (ch - '0');
+      } else {
+       looping = 0;
+      }
+      break;
+
+    case 16:
+      if (ch >= '0' && ch <= '9') {
+       num = (num * 16) + (ch - '0');
+      } else if (ch >= 'a' && ch <= 'f') {
+       num = (num * 16) + (ch - 'a' + 10);
+      } else if (ch >= 'A' && ch <= 'F') {
+       num = (num * 16) + (ch - 'A' + 10);
+      } else {
+       looping = 0;
+      }
+      break;
     }
-    flags++;
   }
-  return 0;
-}
 
+  if (neg)
+    num = - num;
 
-unsigned
-a2i(const char *a)
-{
-  return strtoul(a, 0, 0);
+  return num;
 }
 
 unsigned
@@ -89,9 +145,9 @@ target_a2i(int ms_bit_nr,
           const char *a)
 {
   if (ms_bit_nr)
-    return (ms_bit_nr - strtoul(a, 0, 0));
+    return (ms_bit_nr - a2i(a));
   else
-    return strtoul(a, 0, 0);
+    return a2i(a);
 }
 
 unsigned
@@ -105,3 +161,55 @@ i2target(int ms_bit_nr,
 }
 
 
+int
+name2i(const char *names,
+       const name_map *map)
+{
+  const name_map *curr;
+  const char *name = names;
+  while (*name != '\0') {
+    /* find our name */
+    char *end = strchr(name, ',');
+    char *next;
+    int len;
+    if (end == NULL) {
+      end = strchr(name, '\0');
+      next = end;
+    }
+    else {
+      next = end + 1;
+    }
+    len = end - name;
+    /* look it up */
+    curr = map;
+    while (curr->name != NULL) {
+      if (strncmp(curr->name, name, len) == 0
+         && strlen(curr->name) == len)
+       return curr->i;
+      curr++;
+    }
+    name = next;
+  }
+  /* nothing found, possibly return a default */
+  curr = map;
+  while (curr->name != NULL)
+    curr++;
+  if (curr->i >= 0)
+    return curr->i;
+  else
+    error("%s contains no valid names\n", names);
+  return 0;
+}
+
+const char *
+i2name(const int i,
+       const name_map *map)
+{
+  while (map->name != NULL) {
+    if (map->i == i)
+      return map->name;
+    map++;
+  }
+  error("map lookup failed for %d\n", i);
+  return NULL;
+}
This page took 0.024671 seconds and 4 git commands to generate.