summaryrefslogtreecommitdiff
path: root/Parser
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1998-04-09 21:38:06 +0000
committerGuido van Rossum <guido@python.org>1998-04-09 21:38:06 +0000
commit3d14aea50d168840449a7258ea95243efe656a90 (patch)
tree3bb1ef78acf57bfbf3f6d7fdc7f3163d0c10a196 /Parser
parentc6f4b81a0a4eada40eedefe69bee78bcd2d8c3b7 (diff)
downloadcpython-3d14aea50d168840449a7258ea95243efe656a90.tar.gz
Add checking for inconsistent tab usage
Diffstat (limited to 'Parser')
-rw-r--r--Parser/tokenizer.c46
-rw-r--r--Parser/tokenizer.h6
2 files changed, 49 insertions, 3 deletions
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
index 21583acabc..c2cb1514d1 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -125,6 +125,11 @@ tok_new()
tok->prompt = tok->nextprompt = NULL;
tok->lineno = 0;
tok->level = 0;
+ tok->filename = NULL;
+ tok->altwarning = 0;
+ tok->alterror = 0;
+ tok->alttabsize = 1;
+ tok->altindstack[0] = 0;
return tok;
}
@@ -422,6 +427,24 @@ PyToken_TwoChars(c1, c2)
}
+static int
+indenterror(tok)
+ struct tok_state *tok;
+{
+ if (tok->alterror) {
+ tok->done = E_INDENT;
+ tok->cur = tok->inp;
+ return 1;
+ }
+ if (tok->altwarning) {
+ fprintf(stderr, "%s: inconsistent tab/space usage\n",
+ tok->filename);
+ tok->altwarning = 0;
+ }
+ return 0;
+}
+
+
/* Get next token, after space stripping etc. */
int
@@ -440,15 +463,19 @@ PyTokenizer_Get(tok, p_start, p_end)
/* Get indentation level */
if (tok->atbol) {
register int col = 0;
+ register int altcol = 0;
tok->atbol = 0;
for (;;) {
c = tok_nextc(tok);
if (c == ' ')
- col++;
- else if (c == '\t')
+ col++, altcol++;
+ else if (c == '\t') {
col = (col/tok->tabsize + 1) * tok->tabsize;
+ altcol = (altcol/tok->alttabsize + 1)
+ * tok->alttabsize;
+ }
else if (c == '\014') /* Control-L (formfeed) */
- col = 0; /* For Emacs users */
+ col = altcol = 0; /* For Emacs users */
else
break;
}
@@ -469,6 +496,10 @@ PyTokenizer_Get(tok, p_start, p_end)
if (!blankline && tok->level == 0) {
if (col == tok->indstack[tok->indent]) {
/* No change */
+ if (altcol != tok->altindstack[tok->indent]) {
+ if (indenterror(tok))
+ return ERRORTOKEN;
+ }
}
else if (col > tok->indstack[tok->indent]) {
/* Indent -- always one */
@@ -478,8 +509,13 @@ PyTokenizer_Get(tok, p_start, p_end)
tok->cur = tok->inp;
return ERRORTOKEN;
}
+ if (altcol <= tok->altindstack[tok->indent]) {
+ if (indenterror(tok))
+ return ERRORTOKEN;
+ }
tok->pendin++;
tok->indstack[++tok->indent] = col;
+ tok->altindstack[tok->indent] = altcol;
}
else /* col < tok->indstack[tok->indent] */ {
/* Dedent -- any number, must be consistent */
@@ -495,6 +531,10 @@ PyTokenizer_Get(tok, p_start, p_end)
tok->cur = tok->inp;
return ERRORTOKEN;
}
+ if (altcol != tok->altindstack[tok->indent]) {
+ if (indenterror(tok))
+ return ERRORTOKEN;
+ }
}
}
}
diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h
index 837bdca2f8..a47b537f55 100644
--- a/Parser/tokenizer.h
+++ b/Parser/tokenizer.h
@@ -62,6 +62,12 @@ struct tok_state {
int lineno; /* Current line number */
int level; /* () [] {} Parentheses nesting level */
/* Used to allow free continuations inside them */
+ /* Stuff for checking on different tab sizes */
+ char *filename; /* For error messages */
+ int altwarning; /* Issue warning if alternate tabs don't match */
+ int alterror; /* Issue error if alternate tabs don't match */
+ int alttabsize; /* Alternate tab spacing */
+ int altindstack[MAXINDENT]; /* Stack of alternate indents */
};
extern struct tok_state *PyTokenizer_FromString Py_PROTO((char *));