[Crosstoolchain-logs] [device-tree-compiler] 334/357: dtc: Cleanup line number tracking, add column number tracking

Hector Oron zumbi at moszumanska.debian.org
Thu Dec 8 17:06:29 UTC 2016


This is an automated email from the git hooks/post-receive script.

zumbi pushed a commit to branch upstream/1.3.x
in repository device-tree-compiler.

commit 728c5e87c655c17c2fbc1d5386b12ff328e0fc76
Author: David Gibson <david at gibson.dropbear.id.au>
Date:   Tue Dec 8 14:24:42 2009 +1100

    dtc: Cleanup line number tracking, add column number tracking
    
    Our YYLTYPE current carries around first and last line and first and
    last column information.  However, of these, on the first line
    information is actually filled in properly.
    
    Furthermore, filling in the line number information from yylineno is
    kind of clunky: we have to copy its value to the srcfile stack and
    back to handle include file positioning correctly.
    
    This patch cleans this up.  We turn off flex's yylineno option and
    instead track the line and column number ourselves from
    YY_USER_ACTION.  The line and column number are stored directly inside
    the srcfile_state structure, so it's automatically a per-file
    quantity.  We now also fill in all the yylloc from YY_USER_ACTION.
    
    Signed-off-by: David Gibson <david at gibson.dropbear.id.au>
---
 dtc-lexer.l | 11 ++++-------
 srcpos.c    | 33 ++++++++++++++++++++++++++++++++-
 srcpos.h    |  3 ++-
 3 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/dtc-lexer.l b/dtc-lexer.l
index 12467c0..9021231 100644
--- a/dtc-lexer.l
+++ b/dtc-lexer.l
@@ -18,7 +18,7 @@
  *                                                                   USA
  */
 
-%option noyywrap nounput noinput yylineno
+%option noyywrap nounput noinput
 
 %x INCLUDE
 %x BYTESTRING
@@ -38,10 +38,11 @@ LINECOMMENT	"//".*\n
 #include "srcpos.h"
 #include "dtc-parser.tab.h"
 
+
+/* CAUTION: this will stop working if we ever use yyless() or yyunput() */
 #define	YY_USER_ACTION \
 	{ \
-		yylloc.file = current_srcfile; \
-		yylloc.first_line = yylineno; \
+		srcpos_update(&yylloc, yytext, yyleng); \
 	}
 
 /*#define LEXDEBUG	1*/
@@ -169,12 +170,9 @@ static void push_input_file(const char *filename)
 {
 	assert(filename);
 
-	current_srcfile->lineno = yylineno;
-
 	srcfile_push(filename);
 
 	yyin = current_srcfile->f;
-	yylineno = 1;
 
 	yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE));
 }
@@ -186,7 +184,6 @@ static int pop_input_file(void)
 		return 0;
 
 	yypop_buffer_state();
-	yylineno = current_srcfile->lineno;
 	yyin = current_srcfile->f;
 
 	return 1;
diff --git a/srcpos.c b/srcpos.c
index f08c1c3..ca322bb 100644
--- a/srcpos.c
+++ b/srcpos.c
@@ -87,6 +87,10 @@ void srcfile_push(const char *fname)
 	srcfile->f = srcfile_relative_open(fname, &srcfile->name);
 	srcfile->dir = dirname(srcfile->name);
 	srcfile->prev = current_srcfile;
+
+	srcfile->lineno = 1;
+	srcfile->colno = 1;
+
 	current_srcfile = srcfile;
 }
 
@@ -99,7 +103,8 @@ int srcfile_pop(void)
 	current_srcfile = srcfile->prev;
 
 	if (fclose(srcfile->f))
-		die("Error closing \"%s\": %s\n", srcfile->name, strerror(errno));
+		die("Error closing \"%s\": %s\n", srcfile->name,
+		    strerror(errno));
 
 	/* FIXME: We allow the srcfile_state structure to leak,
 	 * because it could still be referenced from a location
@@ -122,6 +127,32 @@ srcpos srcpos_empty = {
 	.file = NULL,
 };
 
+#define TAB_SIZE      8
+
+void srcpos_update(srcpos *pos, const char *text, int len)
+{
+	int i;
+
+	pos->file = current_srcfile;
+
+	pos->first_line = current_srcfile->lineno;
+	pos->first_column = current_srcfile->colno;
+
+	for (i = 0; i < len; i++)
+		if (text[i] == '\n') {
+			current_srcfile->lineno++;
+			current_srcfile->colno = 1;
+		} else if (text[i] == '\t') {
+			current_srcfile->colno =
+				ALIGN(current_srcfile->colno, TAB_SIZE);
+		} else {
+			current_srcfile->colno++;
+		}
+
+	pos->last_line = current_srcfile->lineno;
+	pos->last_column = current_srcfile->colno;
+}
+
 srcpos *
 srcpos_copy(srcpos *pos)
 {
diff --git a/srcpos.h b/srcpos.h
index 38cc988..eb60244 100644
--- a/srcpos.h
+++ b/srcpos.h
@@ -31,7 +31,7 @@ struct srcfile_state {
 	FILE *f;
 	char *name;
 	char *dir;
-	int lineno;
+	int lineno, colno;
 	struct srcfile_state *prev;
 };
 
@@ -89,6 +89,7 @@ typedef YYLTYPE srcpos;
  */
 extern srcpos srcpos_empty;
 
+extern void srcpos_update(srcpos *pos, const char *text, int len);
 extern srcpos *srcpos_copy(srcpos *pos);
 extern char *srcpos_string(srcpos *pos);
 extern void srcpos_dump(srcpos *pos);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/crosstoolchain/device-tree-compiler.git



More information about the Crosstoolchain-logs mailing list