New function: bfd_arch_list cf bfd_target_list.
authorAndrew Cagney <cagney@redhat.com>
Wed, 10 Sep 1997 05:55:15 +0000 (05:55 +0000)
committerAndrew Cagney <cagney@redhat.com>
Wed, 10 Sep 1997 05:55:15 +0000 (05:55 +0000)
Make bfd_default_scan (arch) more flexable in its match of name to arch,
remove some of the dead code.

bfd/ChangeLog
bfd/archures.c
bfd/bfd-in2.h

index 58e404b0a839759159d4a43bcf0dc868f904dcfa..6c75123a38bf8aaa0ad6b3d63d5973d5526afdce 100644 (file)
@@ -1,3 +1,17 @@
+Wed Sep 10 11:17:50 1997  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * archures.c (bfd_default_scan): Use strcasecmp.
+       (bfd_default_scan): Test for match with arch_name + ":" +
+       printable_name.
+       (bfd_default_scan): Test for match with printable_name - ":".
+       (bfd_default_scan): Delete w65, h8300, h8500, z8k, i960 special
+       cases.  Each implements their own scan function.
+       (bfd_default_scan): Delete 386, 2900, 860, mips 2000, mips 4400
+       special cases.  Since info->mach == 0.  The test mach == number
+       fails.
+       (bfd_arch_list): New function, return name of all the supported
+       architectures.
+
 Tue Sep  9 10:21:56 1997  Nick Clifton  <nickc@cygnus.com>
 
        * elf32-v850.c (v850_elf_print_private_bfd_data): Break after
index 907120bd52ce28bf2aa1eb66727346b16ffae83f..db5e76cb63b5c429f251ab2b51798313ad792968 100644 (file)
@@ -333,6 +333,61 @@ bfd_scan_arch (string)
 
 
 
+/*
+FUNCTION
+       bfd_arch_list
+
+SYNOPSIS
+       const char **bfd_arch_list(void);
+
+DESCRIPTION
+       Return a freshly malloced NULL-terminated vector of the names
+       of all the valid BFD architectures.  Do not modify the names.
+
+*/
+
+const char **
+bfd_arch_list ()
+{
+  int vec_length = 0;
+  const char **name_ptr;
+  const char **name_list;
+  const bfd_arch_info_type * const *app;
+
+  /* Determine the number of architectures */
+  vec_length = 0;
+  for (app = bfd_archures_list; *app != NULL; app++)
+    {
+      const bfd_arch_info_type *ap;
+      for (ap = *app; ap != NULL; ap = ap->next)
+       {
+         vec_length++;
+       }
+    }
+
+  name_list = (CONST char **)
+    bfd_malloc ((vec_length + 1) * sizeof (char **));
+  if (name_list == NULL)
+    return NULL;
+
+  /* Point the list at each of the names */
+  name_ptr = name_list;
+  for (app = bfd_archures_list; *app != NULL; app++)
+    {
+      const bfd_arch_info_type *ap;
+      for (ap = *app; ap != NULL; ap = ap->next)
+       {
+         *name_ptr = ap->printable_name;
+         name_ptr++;
+       }
+    }
+  *name_ptr = NULL;
+
+  return name_list;
+}
+
+
+
 /*
 FUNCTION
        bfd_arch_get_compatible
@@ -584,10 +639,56 @@ bfd_default_scan (info, string)
   const char *ptr_tst;
   unsigned long number;
   enum bfd_architecture arch;
+  const char *printable_name_colon;
+
+  /* Exact match of the architecture name (ARCH_NAME) and also the
+     default architecture? */
+  if (strcasecmp (string, info->arch_name) == 0
+      && info->the_default)
+    return true;
 
-  /* First test for an exact match */
-  if (strcmp (string, info->printable_name) == 0)
+  /* Exact match of the machine name (PRINTABLE_NAME)? */
+  if (strcasecmp (string, info->printable_name) == 0)
     return true;
+     
+  /* Given that printable_name contains no colon, attempt to match:
+     ARCH_NAME [ ":" ] PRINTABLE_NAME? */
+  printable_name_colon = strchr (info->printable_name, ':');
+  if (printable_name_colon == NULL)
+    {
+      int strlen_arch_name = strlen (info->arch_name);
+      if (strncasecmp (string, info->arch_name, strlen_arch_name) == 0)
+       if (string[strlen_arch_name] == ':')
+         {
+           if (strcasecmp (string + strlen_arch_name + 1,
+                           info->printable_name) == 0)
+             return true;
+         }
+       else
+         {
+           if (strcasecmp (string + strlen_arch_name,
+                           info->printable_name) == 0)
+             return true;
+         }
+    }
+
+  /* Given that PRINTABLE_NAME has the form: <arch> ":" <mach>;
+     Attempt to match: <arch> <mach>? */
+  if (printable_name_colon != NULL)
+    {
+      int colon_index = printable_name_colon - info->printable_name;
+      if (strncasecmp (string, info->printable_name, colon_index) == 0
+         && strcasecmp (string + colon_index,
+                        info->printable_name + colon_index + 1) == 0)
+       return true;
+    }
+
+  /* Given that PRINTABLE_NAME has the form: <arch> ":" <mach>; Do not
+     attempt to match just <mach>, it could be ambigious.  This test
+     is left until later. */
+
+  /* NOTE: The below is retained for compatibility only. Please do not
+     add to this code */
 
   /* See how much of the supplied string matches with the
      architecture, eg the string m68k:68020 would match the 68k entry
@@ -619,20 +720,11 @@ bfd_default_scan (info, string)
       ptr_src++;
     }
 
+  /* NOTE: The below is retained for compatibility only.  Please do
+     not add to this code. */
+
   switch (number) 
     {
-    case 65:
-      arch = bfd_arch_w65;
-      break;
-
-    case 300:
-      arch = bfd_arch_h8300;
-      break;
-
-    case 500:
-      arch = bfd_arch_h8500;
-      break;
-
     case 68010:
     case 68020:
     case 68030:
@@ -643,38 +735,12 @@ bfd_default_scan (info, string)
       arch = bfd_arch_m68k; 
       break;
 
-    case 386: 
-    case 80386:
-    case 486:
-    case 80486:
-      arch = bfd_arch_i386;
-      break;
-
-    case 29000: 
-      arch = bfd_arch_a29k;
-      break;
-
-    case 8000:
-      arch = bfd_arch_z8k;
-      break;
-
     case 32000:
       arch = bfd_arch_we32k;
       break;
 
-    case 860:
-    case 80860: 
-      arch = bfd_arch_i860; 
-      break;
-    case 960:
-    case 80960:
-      arch = bfd_arch_i960;
-      break;
-
-    case 2000:
     case 3000:
     case 4000:
-    case 4400:
       arch = bfd_arch_mips;
       break;
 
index 7ab176178fb2ee9db3a3bfe80bf366417df3aff3..daaeef064c409a27ff533d8e07243c90a20f551c 100644 (file)
@@ -1283,6 +1283,9 @@ bfd_printable_name PARAMS ((bfd *abfd));
 const bfd_arch_info_type *
 bfd_scan_arch PARAMS ((const char *string));
 
+const char **
+bfd_arch_list PARAMS ((void));
+
 const bfd_arch_info_type *
 bfd_arch_get_compatible PARAMS ((
     const bfd *abfd,