Make tokenizer aware of tabstops and add the commandline option: -ftabstop=WIDTH Set the distance between tab stops. This helps sparse report correct column numbers in warnings or errors. If the value is less than 1 or greater than 100, the option is ignored. The default is 8. With simplifications suggested by Christopher Li. Signed-off-by: Hannes Eder <hannes@xxxxxxxxxxxxxx> --- On Wed, Dec 31, 2008 at 9:26 PM, Christopher Li <sparse@xxxxxxxxxxx> wrote: > I took the liberty to simplify the patch a little bit. See the attachment. I like the part in tokenizer.c, I even simplified it a bit further, to use a ternary op, and do not use a variable. > If there is no objections, I am going to apply the combined patch to > my repository: I slightly modified to option parsing part, to be at least as relaxed as GNU's CPP, where the option is from (see manpage), and to match the description in sparse.1. > With simplifications suggested by Christopher Li. How should I acknowledge your contribution? Is this Ok? Or shoul I send a patch relative to your patch? lib.c | 17 ++++++++++++++++- sparse.1 | 7 +++++++ token.h | 1 + tokenize.c | 5 +++-- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lib.c b/lib.c index 059ba3b..221e7b8 100644 --- a/lib.c +++ b/lib.c @@ -15,6 +15,8 @@ #include <string.h> #include <unistd.h> #include <assert.h> +#include <limits.h> +#include <errno.h> #include <sys/types.h> @@ -511,7 +513,20 @@ static char **handle_switch_f(char *arg, char **next) int flag = 1; arg++; - if (!strncmp(arg, "no-", 3)) { + + if (!strncmp(arg, "tabstop=", 8)) { + char *end; + unsigned long val; + arg += 8; + + if (*arg == '\0') + die("error: missing argument to \"-ftabstop=\""); + + /* we silently ignore silly values */ + val = strtoul(arg, &end, 10); + if (*end == '\0' && 1 <= val && val <= 100) + tabstop = val; + } else if (!strncmp(arg, "no-", 3)) { flag = 0; arg += 3; } diff --git a/sparse.1 b/sparse.1 index d242dc7..a9e3397 100644 --- a/sparse.1 +++ b/sparse.1 @@ -287,6 +287,13 @@ However, this behavior can lead to subtle errors. Sparse does not issue these warnings by default. . +.SH OTHER OPTIONS +.TP +.B \-ftabstop=WIDTH +Set the distance between tab stops. This helps sparse report correct +column numbers in warnings or errors. If the value is less than 1 or +greater than 100, the option is ignored. The default is 8. +. .SH SEE ALSO .BR cgcc (1) . diff --git a/token.h b/token.h index ba7866d..44128f2 100644 --- a/token.h +++ b/token.h @@ -48,6 +48,7 @@ struct stream { extern int input_stream_nr; extern struct stream *input_streams; +extern unsigned int tabstop; struct ident { struct ident *next; /* Hash chain of identifiers */ diff --git a/tokenize.c b/tokenize.c index d154882..828a76f 100644 --- a/tokenize.c +++ b/tokenize.c @@ -25,6 +25,7 @@ int input_stream_nr = 0; struct stream *input_streams; static int input_streams_allocated; +unsigned int tabstop = 8; #define BUFSIZE (8192) @@ -232,7 +233,7 @@ repeat: goto repeat; } - stream->pos++; + stream->pos += (c == '\t') ? (tabstop - stream->pos % tabstop) : 1; if (c == '\n') { stream->line++; @@ -291,7 +292,7 @@ static inline int nextchar(stream_t *stream) if (offset < stream->size) { int c = stream->buffer[offset++]; static const char special[256] = { - ['\r'] = 1, ['\n'] = 1, ['\\'] = 1 + ['\t'] = 1, ['\r'] = 1, ['\n'] = 1, ['\\'] = 1 }; if (!special[c]) { stream->offset = offset; -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html