]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gas MMIX: Use more of is_... framework like is_whitespace and is_end_of_stmt
authorJan Beulich <jbeulich@suse.com>
Mon, 3 Feb 2025 06:52:19 +0000 (07:52 +0100)
committerHans-Peter Nilsson <hp@bitrange.com>
Wed, 5 Feb 2025 06:07:24 +0000 (07:07 +0100)
Convert uses of ISSPACE() and testing for specific characters into
calls to is_whitespace and is_end_of_stmt.  While doing that, also
remove some redundant tests, like ';' together with is_end_of_line[]
and is_whitespace and !is_end_of_line.

Note the invalid casts being fixed as part of moving to is_... macros;
there were (unsigned int) where there should have been (unsigned char)
applied on char as index to is_end_of_line[].

Beware that the input language changes slightly: some constructs with
whitespace characters other than space and TAB are now invalid.

gas/config/tc-mmix.c

index a43774d755c0e6188fb01c35651acfb14d3cab52..3715790348cf302b18f8d1ecbdc21a8f16c4794b 100644 (file)
@@ -454,11 +454,11 @@ get_operands (int max_operands, char *s, expressionS *exp)
   while (nextchar == ',')
     {
       /* Skip leading whitespace */
-      while (*p == ' ' || *p == '\t')
+      while (is_whitespace (*p))
        p++;
 
       /* Check to see if we have any operands left to parse */
-      if (*p == 0 || *p == '\n' || *p == '\r')
+      if (is_end_of_stmt (*p))
        {
          break;
        }
@@ -489,7 +489,7 @@ get_operands (int max_operands, char *s, expressionS *exp)
       p = input_line_pointer;
 
       /* Skip leading whitespace */
-      while (*p == ' ' || *p == '\t')
+      while (is_whitespace (*p))
        p++;
       nextchar = *p++;
     }
@@ -545,7 +545,7 @@ get_putget_operands (struct mmix_opcode *insn, char *operands,
   int regno;
 
   /* Skip leading whitespace */
-  while (*p == ' ' || *p == '\t')
+  while (is_whitespace (*p))
     p++;
 
   input_line_pointer = p;
@@ -565,7 +565,7 @@ get_putget_operands (struct mmix_opcode *insn, char *operands,
       p = input_line_pointer;
 
       /* Skip whitespace */
-      while (*p == ' ' || *p == '\t')
+      while (is_whitespace (*p))
        p++;
 
       if (*p == ',')
@@ -573,7 +573,7 @@ get_putget_operands (struct mmix_opcode *insn, char *operands,
          p++;
 
          /* Skip whitespace */
-         while (*p == ' ' || *p == '\t')
+         while (is_whitespace (*p))
            p++;
          sregp = p;
          input_line_pointer = sregp;
@@ -594,7 +594,7 @@ get_putget_operands (struct mmix_opcode *insn, char *operands,
       p = input_line_pointer;
 
       /* Skip whitespace */
-      while (*p == ' ' || *p == '\t')
+      while (is_whitespace (*p))
        p++;
 
       if (*p == ',')
@@ -602,7 +602,7 @@ get_putget_operands (struct mmix_opcode *insn, char *operands,
          p++;
 
          /* Skip whitespace */
-         while (*p == ' ' || *p == '\t')
+         while (is_whitespace (*p))
            p++;
 
          input_line_pointer = p;
@@ -829,7 +829,7 @@ md_assemble (char *str)
        ++operands)
     ;
 
-  if (ISSPACE (*operands))
+  if (is_whitespace (*operands))
     {
       modified_char = *operands;
       *operands++ = '\0';
@@ -2924,7 +2924,11 @@ mmix_handle_mmixal (void)
   /* If we're on a line with a label, check if it's a mmixal fb-label.
      Save an indicator and skip the label; it must be set only after all
      fb-labels of expressions are evaluated.  */
-  if (ISDIGIT (s[0]) && s[1] == 'H' && ISSPACE (s[2]))
+  if (ISDIGIT (s[0]) && s[1] == 'H'
+      /* A lone "1H" on a line is valid: we'll then see is_end_of_stmt()
+        being true for the following character (likely a '\n' but '\n'
+        doesn't count as is_whitespace).  */
+      && (is_whitespace (s[2]) || is_end_of_stmt (s[2])))
     {
       current_fb_label = s[0] - '0';
 
@@ -2935,12 +2939,12 @@ mmix_handle_mmixal (void)
       s += 2;
       input_line_pointer = s;
 
-      while (*s && ISSPACE (*s) && ! is_end_of_line[(unsigned int) *s])
+      while (is_whitespace (*s))
        s++;
 
       /* For errors emitted here, the book-keeping is off by one; the
         caller is about to bump the counters.  Adjust the error messages.  */
-      if (is_end_of_line[(unsigned int) *s])
+      if (is_end_of_stmt (*s))
        {
          unsigned int line;
          const char * name = as_where (&line);
@@ -2973,7 +2977,7 @@ mmix_handle_mmixal (void)
       return;
     }
 
-  if (*s == 0 || is_end_of_line[(unsigned int) *s])
+  if (is_end_of_stmt (*s))
     /* We avoid handling empty lines here.  */
     return;
 
@@ -2986,9 +2990,7 @@ mmix_handle_mmixal (void)
 
   /* Find the start of the instruction or pseudo following the label,
      if there is one.  */
-  for (insn = s;
-       *insn && ISSPACE (*insn) && ! is_end_of_line[(unsigned int) *insn];
-       insn++)
+  for (insn = s; is_whitespace (*insn); insn++)
     /* Empty */
     ;
 
@@ -3003,7 +3005,7 @@ mmix_handle_mmixal (void)
              instruction or MMIXAL-pseudo (getting its alignment).  Thus
              is acts like a "normal" :-ended label.  Ditto if it's
              followed by a non-MMIXAL pseudo.  */
-          && !is_end_of_line[(unsigned int) *insn]
+          && !is_end_of_stmt (*insn)
           && *insn != '.')
     {
       /* For labels that don't end in ":", we save it so we can later give
@@ -3038,7 +3040,7 @@ mmix_handle_mmixal (void)
   while (*s)
     {
       c = *s++;
-      if (is_end_of_line[(unsigned int) c])
+      if (is_end_of_stmt (c))
        break;
       if (c == MAGIC_FB_BACKWARD_CHAR || c == MAGIC_FB_FORWARD_CHAR)
        as_bad (_("invalid characters in input"));
@@ -3048,34 +3050,24 @@ mmix_handle_mmixal (void)
   s = insn;
 
   /* Skip the insn.  */
-  while (*s
-        && ! ISSPACE (*s)
-        && *s != ';'
-        && ! is_end_of_line[(unsigned int) *s])
+  while (! is_whitespace (*s) && ! is_end_of_stmt (*s))
     s++;
 
   /* Skip the spaces after the insn.  */
-  while (*s
-        && ISSPACE (*s)
-        && *s != ';'
-        && ! is_end_of_line[(unsigned int) *s])
+  while (is_whitespace (*s))
     s++;
 
   /* Skip the operands.  While doing this, replace [0-9][BF] with
      (MAGIC_FB_BACKWARD_CHAR|MAGIC_FB_FORWARD_CHAR)[0-9].  */
-  while ((c = *s) != 0
-        && ! ISSPACE (c)
-        && c != ';'
-        && ! is_end_of_line[(unsigned int) c])
+  while (! is_whitespace (c = *s) && ! is_end_of_stmt (c))
     {
       if (c == '"')
        {
          s++;
 
          /* FIXME: Test-case for semi-colon in string.  */
-         while (*s
-                && *s != '"'
-                && (! is_end_of_line[(unsigned int) *s] || *s == ';'))
+         while (*s != '"'
+                && (! is_end_of_stmt (*s) || *s == ';'))
            s++;
 
          if (*s == '"')
@@ -3101,10 +3093,7 @@ mmix_handle_mmixal (void)
     }
 
   /* Skip any spaces after the operands.  */
-  while (*s
-        && ISSPACE (*s)
-        && *s != ';'
-        && !is_end_of_line[(unsigned int) *s])
+  while (is_whitespace (*s))
     s++;
 
   /* If we're now looking at a semi-colon, then it's an end-of-line
@@ -3114,7 +3103,8 @@ mmix_handle_mmixal (void)
   /* Make IS into an EQU by replacing it with "= ".  Only match upper-case
      though; let lower-case be a syntax error.  */
   s = insn;
-  if (s[0] == 'I' && s[1] == 'S' && ISSPACE (s[2]))
+  if (s[0] == 'I' && s[1] == 'S'
+      && (is_whitespace (s[2]) || is_end_of_stmt (s[2])))
     {
       *s = '=';
       s[1] = ' ';
@@ -3163,7 +3153,7 @@ mmix_handle_mmixal (void)
   else if (s[0] == 'G'
           && s[1] == 'R'
           && startswith (s, "GREG")
-          && (ISSPACE (s[4]) || is_end_of_line[(unsigned char) s[4]]))
+          && (is_whitespace (s[4]) || is_end_of_stmt (s[4])))
     {
       input_line_pointer = s + 4;
 
@@ -4258,7 +4248,7 @@ mmix_cons (int nbytes)
 
   SKIP_WHITESPACE ();
 
-  if (is_end_of_line[(unsigned int) *input_line_pointer])
+  if (is_end_of_stmt (*input_line_pointer))
     {
       /* Default to zero if the expression was absent.  */