]> granicus.if.org Git - python/commitdiff
Add checking for inconsistent tab usage
authorGuido van Rossum <guido@python.org>
Thu, 9 Apr 1998 21:38:06 +0000 (21:38 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 9 Apr 1998 21:38:06 +0000 (21:38 +0000)
Parser/tokenizer.c
Parser/tokenizer.h

index 21583acabc180d8e1026ee91b86c962f0821533a..c2cb1514d1a4ebd2dbfef9ce7feceab4672290d1 100644 (file)
@@ -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;
+                               }
                        }
                }
        }
index 837bdca2f8682875d110a6572dab9ea90c0d336a..a47b537f554b5ab7f4104589b76fde56b0c598e1 100644 (file)
@@ -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 *));