diff options
| author | Keith Packard <keithp@keithp.com> | 2018-01-03 14:56:15 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2018-01-03 14:56:15 -0800 | 
| commit | 2bcc178f3cbfd346b134bb3fe700b0512f340fea (patch) | |
| tree | 99361e6d99eac1fd3d99392310be8b2e630b041e | |
| parent | b7c34a2e5ecff19d61d337b8c84976cc46005ec4 (diff) | |
altos/scheme: fix parsing of vector followed by list
The 'parsing a vector' state value wasn't getting cleared at the end
of the vector, so that (#(1 2) (3 4) returned (#(1 2) #(3 4)
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | src/scheme/ao_scheme_read.c | 19 | 
1 files changed, 11 insertions, 8 deletions
| diff --git a/src/scheme/ao_scheme_read.c b/src/scheme/ao_scheme_read.c index 9174de5e..7d540aa5 100644 --- a/src/scheme/ao_scheme_read.c +++ b/src/scheme/ao_scheme_read.c @@ -53,7 +53,7 @@ static const uint16_t	lex_classes[128] = {  	PRINTABLE|WHITE,	/*    */   	PRINTABLE,		/* ! */   	PRINTABLE|STRINGC,	/* " */ - 	PRINTABLE|POUND,	/* # */ + 	PRINTABLE,		/* # */   	PRINTABLE,		/* $ */   	PRINTABLE,		/* % */   	PRINTABLE,		/* & */ @@ -360,7 +360,7 @@ _lex(void)  #endif  			}  		} -		if (lex_class & POUND) { +		if (c == '#') {  			c = lexc();  			switch (c) {  			case 't': @@ -516,7 +516,7 @@ _lex(void)  static inline int lex(void)  {  	int	parse_token = _lex(); -	RDBGI("token %d (%s)\n", parse_token, token_string); +	RDBGI("token %d \"%s\"\n", parse_token, token_string);  	return parse_token;  } @@ -565,10 +565,11 @@ pop_read_stack(void)  		     ao_scheme_read_cons_tail = ao_scheme_poly_cons(ao_scheme_read_cons_tail->cdr))  			;  	} else { -		ao_scheme_read_cons = 0; -		ao_scheme_read_cons_tail = 0; -		ao_scheme_read_stack = 0;  		read_state = ao_scheme_read_state; +		ao_scheme_read_cons = NULL; +		ao_scheme_read_cons_tail = NULL; +		ao_scheme_read_stack = NULL; +		ao_scheme_read_state = 0;  	}  	RDBG_OUT();  	RDBGI("pop read stack %p %d\n", ao_scheme_read_cons, read_state); @@ -591,7 +592,7 @@ ao_scheme_read(void)  	ao_scheme_read_list = 0;  	read_state = 0; -	ao_scheme_read_cons = ao_scheme_read_cons_tail = ao_scheme_read_stack = 0; +	ao_scheme_read_cons = ao_scheme_read_cons_tail = ao_scheme_read_stack = NULL;  	for (;;) {  		parse_token = lex();  		while (is_open(parse_token)) { @@ -677,8 +678,10 @@ ao_scheme_read(void)  			--ao_scheme_read_list;  			read_state = pop_read_stack();  #ifdef AO_SCHEME_FEATURE_VECTOR -			if (read_state & READ_SAW_VECTOR) +			if (read_state & READ_SAW_VECTOR) {  				v = ao_scheme_vector_poly(ao_scheme_list_to_vector(ao_scheme_poly_cons(v))); +				read_state &= ~READ_SAW_VECTOR; +			}  #endif  			break;  		case DOT: | 
