diff options
| author | Keith Packard <keithp@keithp.com> | 2017-12-19 11:33:36 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2017-12-19 11:33:36 -0800 | 
| commit | 431165e5fa72ba6dffd477de32960745cdec332c (patch) | |
| tree | e27c174d5d6cea72caf92de3a4fe2c97e9249ddf /src/scheme/ao_scheme_poly.c | |
| parent | 5628b983497d9d03e10cccee157419210a49cfa9 (diff) | |
altos/scheme: Rework display/write code
Unify output functions and add bool to switch between write and
display mode. Make that only affect strings (as per r⁷rs).
Use print recursion detection in frame and stack code, eliminating
PRINT flags in type field.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/scheme/ao_scheme_poly.c')
| -rw-r--r-- | src/scheme/ao_scheme_poly.c | 103 | 
1 files changed, 22 insertions, 81 deletions
| diff --git a/src/scheme/ao_scheme_poly.c b/src/scheme/ao_scheme_poly.c index 70e577a2..25ac6d67 100644 --- a/src/scheme/ao_scheme_poly.c +++ b/src/scheme/ao_scheme_poly.c @@ -14,100 +14,41 @@  #include "ao_scheme.h" -struct ao_scheme_funcs { -	void (*write)(ao_poly); -	void (*display)(ao_poly); -}; +static void ao_scheme_invalid_write(ao_poly p, bool write) { +	printf("??? type %d poly 0x%04x ???", ao_scheme_poly_type (p), p); +	(void) write; +	ao_scheme_abort(); +} -static const struct ao_scheme_funcs ao_scheme_funcs[AO_SCHEME_NUM_TYPE] = { -	[AO_SCHEME_CONS] = { -		.write = ao_scheme_cons_write, -		.display = ao_scheme_cons_display, -	}, +static void (*const ao_scheme_write_funcs[AO_SCHEME_NUM_TYPE]) (ao_poly p, bool write) = { +	[AO_SCHEME_CONS] = ao_scheme_cons_write,  #ifdef AO_SCHEME_FEATURE_BIGINT -	[AO_SCHEME_BIGINT] = { -		.write = ao_scheme_bigint_write, -		.display = ao_scheme_bigint_write, -	}, +	[AO_SCHEME_BIGINT] = ao_scheme_bigint_write,  #endif -	[AO_SCHEME_INT] = { -		.write = ao_scheme_int_write, -		.display = ao_scheme_int_write, -	}, -	[AO_SCHEME_ATOM] = { -		.write = ao_scheme_atom_write, -		.display = ao_scheme_atom_write, -	}, -	[AO_SCHEME_BUILTIN] = { -		.write = ao_scheme_builtin_write, -		.display = ao_scheme_builtin_write, -	}, -	[AO_SCHEME_FRAME] = { -		.write = ao_scheme_frame_write, -		.display = ao_scheme_frame_write, -	}, -	[AO_SCHEME_FRAME_VALS] = { -		.write = NULL, -		.display = NULL, -	}, -	[AO_SCHEME_LAMBDA] = { -		.write = ao_scheme_lambda_write, -		.display = ao_scheme_lambda_write, -	}, -	[AO_SCHEME_STACK] = { -		.write = ao_scheme_stack_write, -		.display = ao_scheme_stack_write, -	}, -	[AO_SCHEME_BOOL] = { -		.write = ao_scheme_bool_write, -		.display = ao_scheme_bool_write, -	}, -	[AO_SCHEME_STRING] = { -		.write = ao_scheme_string_write, -		.display = ao_scheme_string_display, -	}, +	[AO_SCHEME_INT] = ao_scheme_int_write, +	[AO_SCHEME_ATOM] = ao_scheme_atom_write, +	[AO_SCHEME_BUILTIN] = ao_scheme_builtin_write, +	[AO_SCHEME_FRAME] = ao_scheme_frame_write, +	[AO_SCHEME_FRAME_VALS] = ao_scheme_invalid_write, +	[AO_SCHEME_LAMBDA] = ao_scheme_lambda_write, +	[AO_SCHEME_STACK] = ao_scheme_stack_write, +	[AO_SCHEME_BOOL] = ao_scheme_bool_write, +	[AO_SCHEME_STRING] = ao_scheme_string_write,  #ifdef AO_SCHEME_FEATURE_FLOAT -	[AO_SCHEME_FLOAT] = { -		.write = ao_scheme_float_write, -		.display = ao_scheme_float_write, -	}, +	[AO_SCHEME_FLOAT] = ao_scheme_float_write,  #endif  #ifdef AO_SCHEME_FEATURE_VECTOR -	[AO_SCHEME_VECTOR] = { -		.write = ao_scheme_vector_write, -		.display = ao_scheme_vector_display -	}, +	[AO_SCHEME_VECTOR] = ao_scheme_vector_write,  #endif  }; -static void ao_scheme_invalid_write(ao_poly p) { -	printf("??? 0x%04x ???", p); -	ao_scheme_abort(); -} - -static const struct ao_scheme_funcs ao_scheme_invalid_funcs = { -	.write = ao_scheme_invalid_write, -	.display = ao_scheme_invalid_write, -}; - -static const struct ao_scheme_funcs * -funcs(ao_poly p) +void (*ao_scheme_poly_write_func(ao_poly p))(ao_poly p, bool write)  {  	uint8_t	type = ao_scheme_poly_type(p);  	if (type < AO_SCHEME_NUM_TYPE) -		return &ao_scheme_funcs[type]; -	return &ao_scheme_invalid_funcs; -} - -void (*ao_scheme_poly_write_func(ao_poly p))(ao_poly p) -{ -	return funcs(p)->write; -} - -void (*ao_scheme_poly_display_func(ao_poly p))(ao_poly p) -{ -	return funcs(p)->display; +		return ao_scheme_write_funcs[type]; +	return ao_scheme_invalid_write;  }  void * | 
