toplev.c (read_integral_parameter): Constify.
authorTheodore Papadopoulo <Theodore.Papadopoulo@sophia.inria.fr>
Fri, 19 Mar 1999 01:01:01 +0000 (02:01 +0100)
committerJeff Law <law@gcc.gnu.org>
Fri, 19 Mar 1999 01:01:01 +0000 (18:01 -0700)
        * toplev.c (read_integral_parameter): Constify.  Better control of
        error messages.
        (main): Use read_integral_parameter to set optimize, id_clash_len,
        larger_than_size, and the debugging level.
        * toplev.h (read_integral_parameter): Update prototype.

From-SVN: r25856

gcc/ChangeLog
gcc/toplev.c
gcc/toplev.h

index 2a2f52652611701b23ebfca98e871fefa238d68c..63a5ae9f3d7b99e31455e0f9c5f434e90d1b3665 100644 (file)
@@ -1,3 +1,11 @@
+Fri Mar 19 01:54:30 1999  Theodore Papadopoulo  <Theodore.Papadopoulo@sophia.inria.fr>
+
+       * toplev.c (read_integral_parameter): Constify.  Better control of
+       error messages.
+       (main): Use read_integral_parameter to set optimize, id_clash_len,
+       larger_than_size, and the debugging level.
+       * toplev.h (read_integral_parameter): Update prototype.
+
 Fri Mar 19 01:42:05 1999  Zack Weinberg  <zack@rabi.phys.columbia.edu>
 
        * system.h: Use putc_unlocked, fputc_unlocked, and
index eb1888d4367301c8ad5bc1ec5be95db98e99171e..b51d437e0bc047cd036c7039dc72c779a9c2e2ae 100644 (file)
@@ -1246,25 +1246,30 @@ FILE *rtl_dump_file = NULL;
 
 /* Decode the string P as an integral parameter.
    If the string is indeed an integer return its numeric value else
-   issue an Invalid Option error for the option PNAME and return DEFVAL. */
+   issue an Invalid Option error for the option PNAME and return DEFVAL.
+   If PNAME is zero just return DEFVAL, do not call error.               */
    
 int
 read_integral_parameter (p, pname, defval)
-     char *p;
-     char *pname;
-     int  defval;
+     const char *p;
+     const char *pname;
+     const int  defval;
 {
-  char *endp = p;
+  const char *endp = p;
 
   while (*endp)
     {
       if (*endp >= '0' && *endp <= '9')
        endp++;
       else
-       {
-         error ("Invalid option `%s'", pname);
-         return defval;
-       }
+       break;
+    }
+
+  if (*endp != 0)
+    {
+      if (pname != 0)
+       error ("Invalid option `%s'", pname);
+      return defval;
     }
 
   return atoi (p);
@@ -4713,7 +4718,6 @@ main (argc, argv)
        {
          /* Handle -Os, -O2, -O3, -O69, ...  */
          char *p = &argv[i][2];
-         int c;
          
          if ((p[0] == 's') && (p[1] == 0))
            {
@@ -4724,12 +4728,10 @@ main (argc, argv)
            }
          else
            {       
-             while ((c = *p++))
-               if (! (c >= '0' && c <= '9'))
-                 break;
-             if (c == 0)
+             const int optimize_val = read_integral_parameter (p, p - 2, -1);
+             if (optimize_val != -1)
                {
-                 optimize = atoi (&argv[i][2]);
+                 optimize = optimize_val;
                  optimize_size = 0;
                }
            }
@@ -4996,16 +4998,7 @@ main (argc, argv)
            }
          else if (str[0] == 'O')
            {
-             register char *p = str+1;
-             if (*p == 's')
-               p++;
-             else
-               while (*p && *p >= '0' && *p <= '9')
-                 p++;
-             if (*p == '\0')
-               ;
-             else
-               error ("Invalid option `%s'", argv[i]);
+             /* Already been treated above. Do nothing.  */
            }
          else if (!strcmp (str, "pedantic"))
            pedantic = 1;
@@ -5058,39 +5051,23 @@ main (argc, argv)
                ;
              else if (!strncmp (p, "id-clash-", 9))
                {
-                 char *endp = p + 9;
-
-                 while (*endp)
+                 const int id_clash_val
+                   = read_integral_parameter (p + 9, p - 2, -1);
+                 if (id_clash_val != -1)
                    {
-                     if (*endp >= '0' && *endp <= '9')
-                       endp++;
-                     else
-                       {
-                         error ("Invalid option `%s'", argv[i]);
-                         goto id_clash_lose;
-                       }
+                     id_clash_len = id_clash_val;
+                     warn_id_clash = 1;
                    }
-                 warn_id_clash = 1;
-                 id_clash_len = atoi (str + 10);
-               id_clash_lose: ;
                }
              else if (!strncmp (p, "larger-than-", 12))
                {
-                 char *endp = p + 12;
-
-                 while (*endp)
+                 const int larger_than_val
+                   = read_integral_parameter (p + 12, p - 2, -1);
+                 if (larger_than_val != -1)
                    {
-                     if (*endp >= '0' && *endp <= '9')
-                       endp++;
-                     else
-                       {
-                         error ("Invalid option `%s'", argv[i]);
-                         goto larger_than_lose;
-                       }
+                     larger_than_size = larger_than_val;
+                     warn_larger_than = 1;
                    }
-                 warn_larger_than = 1;
-                 larger_than_size = atoi (str + 13);
-               larger_than_lose: ;
                }
              else
                error ("Invalid option `%s'", argv[i]);
@@ -5118,7 +5095,6 @@ main (argc, argv)
            }
          else if (str[0] == 'g')
            {
-             unsigned len;
              unsigned level;
              /* A lot of code assumes write_symbols == NO_DEBUG if the
                 debugging level is 0 (thus -gstabs1 -gstabs0 would lose track
@@ -5136,48 +5112,43 @@ main (argc, argv)
                "none", "stabs", "coff", "dwarf-1", "dwarf-2", "xcoff"
              };
 
+             /* The maximum admissible debug level value.  */
+             static const unsigned max_debug_level = 3;
+
              /* Look up STR in the table.  */
              for (da = debug_args; da->arg; da++)
                {
-                 if (! strncmp (str, da->arg, strlen (da->arg)))
+                 const int da_len = strlen (da->arg);
+
+                 if (! strncmp (str, da->arg, da_len))
                    {
                      enum debug_info_type type = da->debug_type;
-                     char *p, *q;
+                     const char *p = str + da_len;
 
-                     p = str + strlen (da->arg);
                      if (*p && (*p < '0' || *p > '9'))
                        continue;
-                     len = p - str;
-                     q = p;
-                     while (*q && (*q >= '0' && *q <= '9'))
-                       q++;
-                     if (*p)
+                     
+                     level = read_integral_parameter (p, 0,
+                                                      max_debug_level + 1);
+                     if (da_len > 1 && !strncmp (str, "gdwarf", da_len))
                        {
-                         level = atoi (p);
-                         if (len > 1 && !strncmp (str, "gdwarf", len))
-                           {
-                             error ("use -gdwarf -g%d for DWARF v1, level %d",
-                                      level, level);
-                             if (level == 2)
-                               error ("use -gdwarf-2   for DWARF v2");
-                           }
+                         error ("use -gdwarf -g%d for DWARF v1, level %d",
+                                level, level);
+                         if (level == 2)
+                           error ("use -gdwarf-2   for DWARF v2");
                        }
-                     else
-                       level = 2;      /* default debugging info level */
-                     if (*q || level > 3)
+
+                     if (level > max_debug_level)
                        {
-                         warning ("invalid debug level specification in option: `-%s'",
-                                  str);
-                         /* ??? This error message is incorrect in the case of
-                            -g4 -g.  */
-                         warning ("no debugging information will be generated");
-                         level = 0;
+                         warning ("ignoring option `%s' due to invalid debug level specification",
+                                  str - 1);
+                         level = debug_info_level;
                        }
 
                      if (type == NO_DEBUG)
                        {
                          type = PREFERRED_DEBUGGING_TYPE;
-                         if (len > 1 && strncmp (str, "ggdb", len) == 0)
+                         if (da_len > 1 && strncmp (str, "ggdb", da_len) == 0)
                            {
 #if defined (DWARF2_DEBUGGING_INFO) && !defined (LINKER_DOES_NOT_WORK_WITH_DWARF2)
                              type = DWARF2_DEBUG;
@@ -5231,8 +5202,19 @@ main (argc, argv)
            }
          else if (str[0] == 'G')
            {
-             g_switch_set = TRUE;
-             g_switch_value = atoi ((str[1] != '\0') ? str+1 : argv[++i]);
+             const int g_switch_val = (str[1] != '\0') ?
+                                      read_integral_parameter(str + 1, 0, -1) :
+                                      read_integral_parameter(argv[++i], 0, -1);
+             
+             if (g_switch_val != -1)
+               {
+                 g_switch_set = TRUE;
+                 g_switch_value = g_switch_val;
+               }
+             else
+               {
+                 error("Invalid option `-%s'",str);
+               }
            }
          else if (!strncmp (str, "aux-info", 8))
            {
index d8acd0d068bf1b540f0d77d5a00792d03556d854..05a9c40315bf556c907b2554db6ab94510c9b4e7 100644 (file)
@@ -26,7 +26,8 @@ union tree_node;
 struct rtx_def;
 #endif
 
-extern int read_integral_parameter     PROTO ((char *, char *, int));
+extern int read_integral_parameter     PROTO ((const char *, const char *,
+                                               const int));
 extern int count_error                 PROTO ((int));
 extern void strip_off_ending           PROTO ((char *, int));
 extern void print_time                 PROTO ((const char *, int));