2000-08-11 Kazu Hirata <kazu@hxi.com>
[deliverable/binutils-gdb.git] / gas / cond.c
index 943c9f6bf8295b30a61465edcd6a1d91a8717518..025ca51b11a30bdeda48da82c5f72e9a042b34e8 100644 (file)
@@ -1,5 +1,5 @@
 /* cond.c - conditional assembly pseudo-ops, and .include
-   Copyright (C) 1990, 91, 92, 93, 95, 96, 97, 98, 1999
+   Copyright (C) 1990, 91, 92, 93, 95, 96, 97, 98, 99, 2000
    Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
@@ -246,6 +246,86 @@ s_ifc (arg)
   demand_empty_rest_of_line ();
 }
 
+void 
+s_elseif (arg)
+     int arg;
+{
+  expressionS operand;
+  int t;
+
+  if (current_cframe == NULL)
+    {
+      as_bad (_("\".elseif\" without matching \".if\" - ignored"));
+
+    }
+  else if (current_cframe->else_seen)
+    {
+      as_bad (_("\".elseif\" after \".else\" - ignored"));
+      as_bad_where (current_cframe->else_file_line.file,
+                   current_cframe->else_file_line.line,
+                   _("here is the previous \"else\""));
+      as_bad_where (current_cframe->if_file_line.file,
+                   current_cframe->if_file_line.line,
+                   _("here is the previous \"if\""));
+    }
+  else
+    {
+      as_where (&current_cframe->else_file_line.file,
+               &current_cframe->else_file_line.line);
+
+      if (!current_cframe->dead_tree)
+       {
+         current_cframe->ignoring = !current_cframe->ignoring;
+         if (LISTING_SKIP_COND ())
+           {
+             if (! current_cframe->ignoring)
+               listing_list (1);
+             else
+               listing_list (2);
+           }
+       }                       /* if not a dead tree */
+    }                          /* if error else do it */
+
+
+  SKIP_WHITESPACE ();          /* Leading whitespace is part of operand. */
+
+  if (current_cframe != NULL && current_cframe->ignoring)
+    {
+      operand.X_add_number = 0;
+      while (! is_end_of_line[(unsigned char) *input_line_pointer])
+       ++input_line_pointer;
+    }
+  else
+    {
+      expression (&operand);
+      if (operand.X_op != O_constant)
+       as_bad (_("non-constant expression in \".elseif\" statement"));
+    }
+  
+  switch ((operatorT) arg)
+    {
+    case O_eq: t = operand.X_add_number == 0; break;
+    case O_ne: t = operand.X_add_number != 0; break;
+    case O_lt: t = operand.X_add_number < 0; break;
+    case O_le: t = operand.X_add_number <= 0; break;
+    case O_ge: t = operand.X_add_number >= 0; break;
+    case O_gt: t = operand.X_add_number > 0; break;
+    default:
+      abort ();
+      return;
+    }
+
+  current_cframe->ignoring = current_cframe->dead_tree || ! t;
+
+  if (LISTING_SKIP_COND ()
+      && current_cframe->ignoring
+      && (current_cframe->previous_cframe == NULL
+         || ! current_cframe->previous_cframe->ignoring))
+    listing_list (2);
+
+  demand_empty_rest_of_line ();
+}
+
 void 
 s_endif (arg)
      int arg ATTRIBUTE_UNUSED;
@@ -372,11 +452,7 @@ ignore_input ()
 
   s = input_line_pointer;
 
-  if (flag_m68k_mri
-#ifdef NO_PSEUDO_DOT
-      || 1
-#endif
-      )
+  if (NO_PSEUDO_DOT || flag_m68k_mri)
     {
       if (s[-1] != '.')
        --s;
This page took 0.023793 seconds and 4 git commands to generate.