aboutsummaryrefslogtreecommitdiff
path: root/srcpos.c
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2009-12-08 14:24:42 +1100
committerJon Loeliger <jdl@jdl.com>2010-01-14 07:52:48 -0600
commit728c5e87c655c17c2fbc1d5386b12ff328e0fc76 (patch)
tree9650c3532d9d0225f6a5e415a86567502ba12890 /srcpos.c
parentd68cb36b0bebc7711ada9b750f3c19398c44efb7 (diff)
downloaddtc-728c5e87c655c17c2fbc1d5386b12ff328e0fc76.zip
dtc-728c5e87c655c17c2fbc1d5386b12ff328e0fc76.tar.gz
dtc-728c5e87c655c17c2fbc1d5386b12ff328e0fc76.tar.bz2
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@gibson.dropbear.id.au>
Diffstat (limited to 'srcpos.c')
-rw-r--r--srcpos.c33
1 files changed, 32 insertions, 1 deletions
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)
{