2007-03-12 H.J. Lu <hongjiu.lu@intel.com>
[deliverable/binutils-gdb.git] / gas / read.c
index 97a2ab26ec8dd603e43b4b5536a486e122328690..c622eb26068274d02a5e6ddc6da6f5cafd9118f7 100644 (file)
@@ -1698,6 +1698,19 @@ s_app_file (int appfile)
     }
 }
 
+static int
+get_linefile_number (int *flag)
+{
+  SKIP_WHITESPACE ();
+
+  if (*input_line_pointer < '0' || *input_line_pointer > '9')
+    return 0;
+
+  *flag = get_absolute_expression ();
+
+  return 1;
+}
+
 /* Handle the .appline pseudo-op.  This is automatically generated by
    do_scrub_chars when a preprocessor # line comment is seen.  This
    default definition may be overridden by the object or CPU specific
@@ -1706,10 +1719,19 @@ s_app_file (int appfile)
 void
 s_app_line (int appline)
 {
+  char *file = NULL;
   int l;
 
   /* The given number is that of the next line.  */
-  l = get_absolute_expression () - 1;
+  if (appline)
+    l = get_absolute_expression ();
+  else if (!get_linefile_number (&l))
+    {
+      ignore_rest_of_line ();
+      return;
+    }
+
+  l--;
 
   if (l < -1)
     /* Some of the back ends can't deal with non-positive line numbers.
@@ -1726,18 +1748,20 @@ s_app_line (int appline)
   else
     {
       int flags = 0;
-      char *file = NULL;
       int length = 0;
 
       if (!appline)
        {
-         file = demand_copy_string (&length);
+         SKIP_WHITESPACE ();
+
+         if (*input_line_pointer == '"')
+           file = demand_copy_string (&length);
 
          if (file)
            {
              int this_flag;
 
-             while ((this_flag = get_absolute_expression ()))
+             while (get_linefile_number (&this_flag))
                switch (this_flag)
                  {
                    /* From GCC's cpp documentation:
@@ -1772,16 +1796,25 @@ s_app_line (int appline)
                             this_flag);
                    break;
                  }
+
+             if (!is_end_of_line[(unsigned char)*input_line_pointer])
+               file = 0;
            }
        }
 
-      new_logical_line_flags (file, l, flags);
+      if (appline || file)
+       {
+         new_logical_line_flags (file, l, flags);
 #ifdef LISTING
-      if (listing)
-       listing_source_line (l);
+         if (listing)
+           listing_source_line (l);
 #endif
+       }
     }
-  demand_empty_rest_of_line ();
+  if (appline || file)
+    demand_empty_rest_of_line ();
+  else
+    ignore_rest_of_line ();
 }
 
 /* Handle the .end pseudo-op.  Actually, the real work is done in
This page took 0.024469 seconds and 4 git commands to generate.