changeset 16147:ed8ce5da525f

don't access lexer values directly when grabbing help text from .m files. * oct-parse.yy (text_getc): Don't update line number. (stdio_stream_reader::line_num, stdio_stream_reader:column_num): New data members. (stdio_stream_reader::stdio_stream_reader): New args for line and column numbers. (stdio_stream_reader::getc): Set line and column info here. (stdio_stream_reader:ungetc): Set local line number here. (gobble_leading_white_space): New args, line_num and column_num. Pass them to stdio_stream_reader constructor. (gobble_leading_white_space): Provide additional function without line and column number arguments.
author John W. Eaton <jwe@octave.org>
date Wed, 27 Feb 2013 17:28:12 -0500
parents b6050fc0a2d9
children 10abbc493f50
files libinterp/parse-tree/oct-parse.yy
diffstat 1 files changed, 49 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/parse-tree/oct-parse.yy	Wed Feb 27 16:06:03 2013 -0500
+++ b/libinterp/parse-tree/oct-parse.yy	Wed Feb 27 17:28:12 2013 -0500
@@ -3154,9 +3154,6 @@
         }
     }
 
-  if (c == '\n')
-    curr_lexer->input_line_number++;
-
   return c;
 }
 
@@ -3164,20 +3161,53 @@
 stdio_stream_reader : public stream_reader
 {
 public:
-  stdio_stream_reader (FILE *f_arg) : stream_reader (), f (f_arg) { }
-
-  int getc (void) { return ::text_getc (f); }
+
+  stdio_stream_reader (FILE *f_arg, int& l, int& c)
+    : stream_reader (), f (f_arg), line_num (l), column_num (c)
+  { }
+
+  int getc (void)
+  {
+    char c = ::text_getc (f);
+
+    if (c == '\n')
+      {
+        line_num++;
+        column_num = 0;
+      }
+    else
+      {
+        // FIXME -- try to be smarter about tabs?
+        column_num++;
+      }
+        
+    return c;
+  }
+
   int ungetc (int c)
   {
     if (c == '\n')
-      curr_lexer->input_line_number--;
+      {   
+        line_num--;
+        column_num = 0;
+      }
+    else
+      {
+        // FIXME -- try to be smarter about tabs?
+        column_num--;
+      }
 
     return ::ungetc (c, f);
   }
 
 private:
+
   FILE *f;
 
+  int& line_num;
+
+  int& column_num;
+
   // No copying!
 
   stdio_stream_reader (const  stdio_stream_reader&);
@@ -3196,11 +3226,7 @@
         {
         case ' ':
         case '\t':
-          curr_lexer->current_input_column++;
-          break;
-
         case '\n':
-          curr_lexer->current_input_column = 1;
           break;
 
         default:
@@ -3234,7 +3260,8 @@
  }
 
 static std::string
-gobble_leading_white_space (FILE *ffile, bool& eof)
+gobble_leading_white_space (FILE *ffile, bool& eof, int& line_num,
+                            int& column_num)
 {
   std::string help_txt;
 
@@ -3245,7 +3272,7 @@
 
   std::string txt;
 
-  stdio_stream_reader stdio_reader (ffile);
+  stdio_stream_reader stdio_reader (ffile, line_num, column_num);
 
   while (true)
     {
@@ -3274,6 +3301,15 @@
   return help_txt;
 }
 
+static std::string
+gobble_leading_white_space (FILE *ffile, bool& eof)
+{
+  int line_num = 1;
+  int column_num = 1;
+
+  return gobble_leading_white_space (ffile, eof, line_num, column_num);
+}
+
 static bool
 looking_at_function_keyword (FILE *ffile)
 {