Skip to content

Commit 8cee5b6

Browse files
committed
Fix token length off-by-one bug and update test scripts to python3
1 parent ff7c78e commit 8cee5b6

File tree

8 files changed

+49
-19
lines changed

8 files changed

+49
-19
lines changed

run_valgrind_tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#!/usr/bin/env python
1+
#!/usr/bin/env python3
22

33
import sys, string, glob, argparse, os
44
#import tempfile

runtests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#!/usr/bin/env python
1+
#!/usr/bin/env python3
22

33
import sys, string, glob, argparse, os
44
#import tempfile

src/lexer.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ do { \
2626
//or it's the macro PARSING (1 currently but could be any invalid non-NULL pointer) which means we're parsing
2727
token_lex read_token(FILE* file, lexer_state* lex_state, FILE* preprocessed)
2828
{
29-
static char token_buf[MAX_TOKEN_LEN];
29+
static char token_buf[MAX_TOKEN_LEN+1];
3030
int c, i = 0, tmp;
3131

3232
token_lex tok_lex = { 0 };
@@ -289,12 +289,12 @@ token_lex read_token(FILE* file, lexer_state* lex_state, FILE* preprocessed)
289289
token_buf[i++] = c;
290290
HANDLE_BACKSLASH();
291291

292-
if (i == MAX_TOKEN_LEN-1)
292+
if (i > MAX_TOKEN_LEN)
293293
goto token_length_error;
294294
}
295295

296296
if (c == '.') {
297-
if (i == MAX_TOKEN_LEN-1)
297+
if (i > MAX_TOKEN_LEN)
298298
goto token_length_error;
299299

300300
token_buf[i++] = c;
@@ -304,7 +304,7 @@ token_lex read_token(FILE* file, lexer_state* lex_state, FILE* preprocessed)
304304
token_buf[i++] = c;
305305
HANDLE_BACKSLASH();
306306

307-
if (i == MAX_TOKEN_LEN-1)
307+
if (i > MAX_TOKEN_LEN)
308308
goto token_length_error;
309309
}
310310

@@ -327,7 +327,7 @@ token_lex read_token(FILE* file, lexer_state* lex_state, FILE* preprocessed)
327327
token_buf[i++] = c;
328328
HANDLE_BACKSLASH();
329329

330-
if (i == MAX_TOKEN_LEN-1)
330+
if (i > MAX_TOKEN_LEN)
331331
goto token_length_error;
332332
}
333333
ungetc(c, file);
@@ -373,7 +373,7 @@ token_lex read_token(FILE* file, lexer_state* lex_state, FILE* preprocessed)
373373
while (c != '"') {
374374
token_buf[i++] = c;
375375
HANDLE_BACKSLASH();
376-
if (i == MAX_TOKEN_LEN -1)
376+
if (i > MAX_TOKEN_LEN)
377377
goto token_length_error;
378378
}
379379
token_buf[i] = '\0';
@@ -401,10 +401,10 @@ token_lex read_token(FILE* file, lexer_state* lex_state, FILE* preprocessed)
401401
return tok_lex;
402402

403403
stray_backslash:
404-
lex_error(lex_state, "stray \\ in program (perhaps you have a space between it and a newline)");
404+
lex_error(lex_state, "stray \\ in program (perhaps you have a space between it and a newline)\n");
405405

406406
token_length_error:
407-
lex_error(lex_state, "Token length is too long, max token length is %d,", MAX_TOKEN_LEN-1);
407+
lex_error(lex_state, "Token length is too long, max token length is %d\n", MAX_TOKEN_LEN);
408408

409409
// never gets here, gets rid of compiler warning
410410
return tok_lex;
@@ -440,7 +440,7 @@ do { \
440440

441441
token_lex read_token_from_str(char* input, lexer_state* lex_state, FILE* preprocessed)
442442
{
443-
static char token_buf[MAX_TOKEN_LEN];
443+
static char token_buf[MAX_TOKEN_LEN+1];
444444
int i = 0, tmp;
445445

446446
token_lex tok_lex = { 0 };
@@ -704,12 +704,12 @@ token_lex read_token_from_str(char* input, lexer_state* lex_state, FILE* preproc
704704
token_buf[i++] = *c;
705705
HANDLE_BACKSLASH_STR();
706706

707-
if (i == MAX_TOKEN_LEN-1)
707+
if (i > MAX_TOKEN_LEN)
708708
goto token_length_error;
709709
}
710710

711711
if (*c == '.') {
712-
if (i == MAX_TOKEN_LEN-1)
712+
if (i > MAX_TOKEN_LEN)
713713
goto token_length_error;
714714

715715
token_buf[i++] = *c;
@@ -719,7 +719,7 @@ token_lex read_token_from_str(char* input, lexer_state* lex_state, FILE* preproc
719719
token_buf[i++] = *c;
720720
HANDLE_BACKSLASH_STR();
721721

722-
if (i == MAX_TOKEN_LEN-1)
722+
if (i > MAX_TOKEN_LEN)
723723
goto token_length_error;
724724
}
725725

@@ -742,7 +742,7 @@ token_lex read_token_from_str(char* input, lexer_state* lex_state, FILE* preproc
742742
token_buf[i++] = *c;
743743
HANDLE_BACKSLASH_STR();
744744

745-
if (i == MAX_TOKEN_LEN-1)
745+
if (i > MAX_TOKEN_LEN)
746746
goto token_length_error;
747747
}
748748
--c;
@@ -785,7 +785,7 @@ token_lex read_token_from_str(char* input, lexer_state* lex_state, FILE* preproc
785785
while (*c != '"') {
786786
token_buf[i++] = *c;
787787
HANDLE_BACKSLASH_STR();
788-
if (i == MAX_TOKEN_LEN -1)
788+
if (i > MAX_TOKEN_LEN)
789789
goto token_length_error;
790790
}
791791
token_buf[i] = '\0';
@@ -816,10 +816,10 @@ token_lex read_token_from_str(char* input, lexer_state* lex_state, FILE* preproc
816816
return tok_lex;
817817

818818
stray_backslash:
819-
lex_error(lex_state, "stray \\ in program (perhaps you have a space between it and a newline)");
819+
lex_error(lex_state, "stray \\ in program (perhaps you have a space between it and a newline)\n");
820820

821821
token_length_error:
822-
lex_error(lex_state, "Token length is too long, max token length is %d,", MAX_TOKEN_LEN - 1);
822+
lex_error(lex_state, "Token length is too long, max token length is %d\n", MAX_TOKEN_LEN);
823823

824824
// never gets here, gets rid of compiler warning
825825
return tok_lex;

src/lexer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <stdio.h>
55
#include <stdarg.h>
66

7-
#define MAX_TOKEN_LEN 257
7+
#define MAX_TOKEN_LEN 256
88
#define PARSING (FILE*)1
99

1010
//tokens pg 20

tests/token_len.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
#include <stdio.h>
3+
4+
int main()
5+
{
6+
int AbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnop = 5;
7+
8+
printf("%d\n", AbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnop);
9+
10+
int AbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnop1 = 42;
11+
12+
printf("%d\n", AbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnop1);
13+
14+
return 0;
15+
}

tests/token_len.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
3+
int main()
4+
{
5+
int AbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnop = 5;
6+
7+
print AbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnop;
8+
9+
int AbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnop1 = 42;
10+
11+
print AbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnopAbcdefghijklmnop1;
12+
13+
return 0;
14+
}

tests/token_len.txt.expected

Whitespace-only changes.

tests/token_len.txt.expected.err

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../tests/token_len.txt:9:264: Lexer Error: Token length is too long, max token length is 256

0 commit comments

Comments
 (0)