* read.c (read_a_source_file): In MRI mode, don't end the
authorIan Lance Taylor <ian@airs.com>
Mon, 21 Aug 1995 21:05:06 +0000 (21:05 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 21 Aug 1995 21:05:06 +0000 (21:05 +0000)
statement inside a quotation.
(s_space): Don't warn about a zero repeat count in MRI mode.
* config/tc-m68k.c (crack_operand): In MRI mode, don't count
parentheses inside quotes.
(md_assemble): In MRI mode, anything after the operands field is a
comment.
(parse_mri_control_operand): Adjust start and stop to remove
spaces.
(s_mri_for): Likewise.

gas/config/tc-m68k.c
gas/read.c

index fe3ee54b5e107f978782b6c86e12609f8d86789f..8f7dad320ff34cb179d20e3434b4d73043cd393a 100644 (file)
@@ -2534,25 +2534,31 @@ crack_operand (str, opP)
   register int parens;
   register int c;
   register char *beg_str;
+  int inquote = 0;
 
   if (!str)
     {
       return str;
     }
   beg_str = str;
-  for (parens = 0; *str && (parens > 0 || notend (str)); str++)
+  for (parens = 0; *str && (parens > 0 || inquote || notend (str)); str++)
     {
-      if (*str == '(')
-       parens++;
-      else if (*str == ')')
+      if (! inquote)
        {
-         if (!parens)
-           {                   /* ERROR */
-             opP->error = "Extra )";
-             return str;
+         if (*str == '(')
+           parens++;
+         else if (*str == ')')
+           {
+             if (!parens)
+               {                       /* ERROR */
+                 opP->error = "Extra )";
+                 return str;
+               }
+             --parens;
            }
-         --parens;
        }
+      if (flag_mri && *str == '\'')
+       inquote = ! inquote;
     }
   if (!*str && parens)
     {                          /* ERROR */
@@ -2781,6 +2787,41 @@ md_assemble (str)
   int shorts_this_frag;
   fixS *fixP;
 
+  /* In MRI mode, the instruction and operands are separated by a
+     space.  Anything following the operands is a comment.  The label
+     has already been removed.  */
+  if (flag_mri)
+    {
+      char *s;
+      int fields = 0;
+      int infield = 0;
+      int inquote = 0;
+
+      for (s = str; *s != '\0'; s++)
+       {
+         if ((*s == ' ' || *s == '\t') && ! inquote)
+           {
+             if (infield)
+               {
+                 ++fields;
+                 if (fields >= 2)
+                   {
+                     *s = '\0';
+                     break;
+                   }
+                 infield = 0;
+               }
+           }
+         else
+           {
+             if (! infield)
+               infield = 1;
+             if (*s == '\'')
+               inquote = ! inquote;
+           }
+       }
+    }
+
   memset ((char *) (&the_ins), '\0', sizeof (the_ins));
   m68k_ip (str);
   er = the_ins.error;
@@ -4778,6 +4819,9 @@ parse_mri_control_operand (pcc, leftstart, leftstop, rightstart, rightstop)
 
   *leftstart = input_line_pointer;
   *leftstop = s;
+  if (*leftstop > *leftstart
+      && ((*leftstop)[-1] == ' ' || (*leftstop)[-1] == '\t'))
+    --*leftstop;
 
   input_line_pointer = s;
   if (! parse_mri_condition (pcc))
@@ -4795,6 +4839,9 @@ parse_mri_control_operand (pcc, leftstart, leftstop, rightstart, rightstop)
 
   *rightstart = input_line_pointer;
   *rightstop = s;
+  if (*rightstop > *rightstart
+      && ((*rightstop)[-1] == ' ' || (*rightstop)[-1] == '\t'))
+    --*rightstop;
 
   input_line_pointer = s;
 
@@ -5283,6 +5330,7 @@ s_mri_for (qual)
        FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e
      */
 
+  SKIP_WHITESPACE ();
   varstart = input_line_pointer;
 
   /* Look for the '='.  */
@@ -5297,6 +5345,9 @@ s_mri_for (qual)
     }
 
   varstop = input_line_pointer;
+  if (varstop > varstart
+      && (varstop[-1] == ' ' || varstop[-1] == '\t'))
+    --varstop;
 
   ++input_line_pointer;
 
@@ -5330,7 +5381,11 @@ s_mri_for (qual)
       ignore_rest_of_line ();
       return;
     }
+  if (initstop > initstart
+      && (initstop[-1] == ' ' || initstop[-1] == '\t'))
+    --initstop;
 
+  SKIP_WHITESPACE ();
   endstart = input_line_pointer;
 
   /* Look for BY or DO.  */
@@ -5362,6 +5417,9 @@ s_mri_for (qual)
       ignore_rest_of_line ();
       return;
     }
+  if (endstop > endstart
+      && (endstop[-1] == ' ' || endstop[-1] == '\t'))
+    --endstop;
 
   if (! by)
     {
@@ -5370,6 +5428,7 @@ s_mri_for (qual)
     }
   else
     {
+      SKIP_WHITESPACE ();
       bystart = input_line_pointer;
 
       /* Look for DO.  */
@@ -5392,6 +5451,9 @@ s_mri_for (qual)
          ignore_rest_of_line ();
          return;
        }
+      if (bystop > bystart
+         && (bystop[-1] == ' ' || bystop[-1] == '\t'))
+       --bystop;
     }
 
   if (*input_line_pointer != '.')
index a117b757364f377f1ff44e59e5cb7a46119039b8..7efdaad626fd655a3fe45264b22a2d48ffbefbbb 100644 (file)
@@ -683,6 +683,8 @@ read_a_source_file (name)
                    }
                  else
                    {           /* machine instruction */
+                     int inquote = 0;
+
                      if (mri_pending_align)
                        {
                          do_align (1, (char *) NULL);
@@ -693,11 +695,14 @@ read_a_source_file (name)
                      /* Also: input_line_pointer->`\0` where c was. */
                      *input_line_pointer = c;
                      while (!is_end_of_line[(unsigned char) *input_line_pointer]
+                            || inquote
 #ifdef TC_EOL_IN_INSN
                             || TC_EOL_IN_INSN (input_line_pointer)
 #endif
                             )
                        {
+                         if (flag_mri && *input_line_pointer == '\'')
+                           inquote = ! inquote;
                          input_line_pointer++;
                        }
 
@@ -2017,8 +2022,9 @@ s_space (mult)
        repeat *= mult;
       if (repeat <= 0)
        {
-         as_warn (".space repeat count is %s, ignored",
-                  repeat ? "negative" : "zero");
+         if (! flag_mri || repeat < 0)
+           as_warn (".space repeat count is %s, ignored",
+                    repeat ? "negative" : "zero");
          ignore_rest_of_line ();
          return;
        }