diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/drm_fb.c | 50 | ||||
| -rw-r--r-- | src/rototiller.c | 44 | ||||
| -rw-r--r-- | src/sdl_fb.c | 49 | ||||
| -rw-r--r-- | src/settings.c | 55 | ||||
| -rw-r--r-- | src/settings.h | 2 | 
5 files changed, 108 insertions, 92 deletions
diff --git a/src/drm_fb.c b/src/drm_fb.c index 6599d9d..3d0f6ba 100644 --- a/src/drm_fb.c +++ b/src/drm_fb.c @@ -70,12 +70,18 @@ static const char * connector_type_name(uint32_t type) {  static setting_desc_t * dev_desc_generator(void *setup_context)  { -	return setting_desc_new("DRM Device Path", -				"dev", -				"/dev/dri/card[0-9]", -				"/dev/dri/card0", -				NULL, -				NULL); +	setting_desc_t	*desc = NULL; + +	(void) setting_desc_clone(&(setting_desc_t){ +					.name = "DRM Device Path", +					.key = "dev", +					.regex = "/dev/dri/card[0-9]", +					.preferred = "/dev/dri/card0", +					.values = NULL, +					.annotations = NULL +				}, &desc); + +	return desc;  } @@ -145,18 +151,20 @@ static setting_desc_t * connector_desc_generator(void *setup_context)  {  	drm_fb_setup_t	*s = setup_context;  	const char	**connectors; -	setting_desc_t	*desc; +	setting_desc_t	*desc = NULL;  	connectors = get_connectors(s->dev);  	if (!connectors)  		return NULL; -	desc = setting_desc_new("DRM Connector", -				"connector", -				"[a-zA-Z0-9]+", -				connectors[0], -				connectors, -				NULL); +	(void) setting_desc_clone(&(setting_desc_t){ +					.name = "DRM Connector", +					.key = "connector", +					.regex = "[a-zA-Z0-9]+", +					.preferred = connectors[0], +					.values = connectors, +					.annotations = NULL +				}, &desc);  	free_strv(connectors); @@ -239,19 +247,21 @@ _out:  static setting_desc_t * mode_desc_generator(void *setup_context)  {  	drm_fb_setup_t	*s = setup_context; -	setting_desc_t	*desc; +	setting_desc_t	*desc = NULL;  	const char	**modes;  	modes = get_modes(s->dev, s->connector);  	if (!modes)  		return NULL; -	desc = setting_desc_new("DRM Video Mode", -				"mode", -				"[0-9]+[xX][0-9]+@[0-9]+", -				modes[0], -				modes, -				NULL); +	(void) setting_desc_clone(&(setting_desc_t){ +					.name = "DRM Video Mode", +					.key = "mode", +					.regex = "[0-9]+[xX][0-9]+@[0-9]+", +					.preferred = modes[0], +					.values = modes, +					.annotations = NULL +				}, &desc);  	free_strv(modes); diff --git a/src/rototiller.c b/src/rototiller.c index 92821c2..7203ca2 100644 --- a/src/rototiller.c +++ b/src/rototiller.c @@ -162,17 +162,18 @@ static int setup_video(settings_t *settings, setting_desc_t **next_setting)  					"sdl",  					NULL,  				}; - -		desc = setting_desc_new("Video Backend", -					NULL, -					"[a-z]+", -					DEFAULT_VIDEO, -					values, -					NULL); -		if (!desc) -			return -ENOMEM; - -		*next_setting = desc; +		int		r; + +		r = setting_desc_clone(&(setting_desc_t){ +						.name = "Video Backend", +						.key = NULL, +						.regex = "[a-z]+", +						.preferred = DEFAULT_VIDEO, +						.values = values, +						.annotations = NULL +					}, next_setting); +		if (r < 0) +			return r;  		return 1;  	} @@ -207,22 +208,23 @@ static int setup_module(settings_t *settings, setting_desc_t **next_setting)  		const char	*annotations[nelems(modules) + 1] = {};  		setting_desc_t	*desc;  		unsigned	i; +		int		r;  		for (i = 0; i < nelems(modules); i++) {  			values[i] = modules[i]->name;  			annotations[i] = modules[i]->description;  		} -		desc = setting_desc_new("Renderer Module", -					NULL, -					"[a-zA-Z0-9]+", -					DEFAULT_MODULE, -					values, -					annotations); -		if (!desc) -			return -ENOMEM; - -		*next_setting = desc; +		r = setting_desc_clone(&(setting_desc_t){ +						.name = "Renderer Module", +						.key = NULL, +						.regex = "[a-zA-Z0-9]+", +						.preferred = DEFAULT_MODULE, +						.values = values, +						.annotations = annotations +					}, next_setting); +		if (r < 0) +			return r;  		return 1;  	} diff --git a/src/sdl_fb.c b/src/sdl_fb.c index 80a63dd..f85e9ca 100644 --- a/src/sdl_fb.c +++ b/src/sdl_fb.c @@ -36,18 +36,18 @@ int sdl_fb_setup(const settings_t *settings, setting_desc_t **next_setting)  					"on",  					NULL  				}; -		setting_desc_t	*desc; - -		desc = setting_desc_new("SDL Fullscreen Mode", -					"fullscreen", -					NULL, -					values[0], -					values, -					NULL); -		if (!desc) -			return -ENOMEM; - -		*next_setting = desc; +		int		r; + +		r = setting_desc_clone(&(setting_desc_t){ +						.name = "SDL Fullscreen Mode", +						.key = "fullscreen", +						.regex = NULL, +						.preferred = values[0], +						.values = values, +						.annotations = NULL +					}, next_setting); +		if (r < 0) +			return r;  		return 1;  	} @@ -57,18 +57,19 @@ int sdl_fb_setup(const settings_t *settings, setting_desc_t **next_setting)  		size = settings_get_value(settings, "size");  		if (!size) { -			setting_desc_t	*desc; - -			desc = setting_desc_new("SDL Window size", -						"size", -						"[1-9][0-9]*[xX][1-9][0-9]*", -						"640x480", -						NULL, -						NULL); -			if (!desc) -				return -ENOMEM; - -			*next_setting = desc; +			int	r; + +			r = setting_desc_clone(&(setting_desc_t){ +							.name = "SDL Window size", +							.key = "size", +							.regex = "[1-9][0-9]*[xX][1-9][0-9]*", +							.preferred = "640x480", +							.values = NULL, +							.annotations = NULL +						}, +						next_setting); +			if (r < 0) +				return r;  			return 1;  		} diff --git a/src/settings.c b/src/settings.c index d8be774..c24c280 100644 --- a/src/settings.c +++ b/src/settings.c @@ -214,50 +214,53 @@ int settings_apply_desc_generators(const settings_t *settings, const setting_des  /* convenience helper for creating a new setting description */ -/* copies of everything supplied are made in newly allocated memory */ -setting_desc_t * setting_desc_new(const char *name, const char *key, const char *regex, const char *preferred, const char *values[], const char *annotations[]) +/* copies of everything supplied are made in newly allocated memory, stored @ res_desc */ +/* returns < 0 on error */ +int setting_desc_clone(const setting_desc_t *desc, setting_desc_t **res_desc)  { -	setting_desc_t	*desc; +	setting_desc_t	*d; -	assert(name); -	assert(preferred);	/* XXX: require a preferred default? */ -	assert(!annotations || values); +	assert(desc); +	assert(desc->name); +	assert(desc->preferred);	/* XXX: require a preferred default? */ +	assert(!desc->annotations || desc->values); -	desc = calloc(1, sizeof(setting_desc_t)); -	if (!desc) -		return NULL; +	d = calloc(1, sizeof(setting_desc_t)); +	if (!d) +		return -ENOMEM; -	desc->name = strdup(name); -	if (key)	/* This is inappropriately subtle, but when key is NULL, the value will be the key, and there will be no value side at all. */ -		desc->key = strdup(key); -	if (regex) -		desc->regex = strdup(regex); +	d->name = strdup(desc->name); +	if (desc->key)	/* This is inappropriately subtle, but when key is NULL, the value will be the key, and there will be no value side at all. */ +		d->key = strdup(desc->key); +	if (desc->regex) +		d->regex = strdup(desc->regex); -	desc->preferred = strdup(preferred); +	d->preferred = strdup(desc->preferred); -	if (values) { +	if (desc->values) {  		unsigned	i; -		for (i = 0; values[i]; i++); +		for (i = 0; desc->values[i]; i++); -		desc->values = calloc(i + 1, sizeof(*values)); +		d->values = calloc(i + 1, sizeof(*desc->values)); -		if (annotations) -			desc->annotations = calloc(i + 1, sizeof(*annotations)); +		if (desc->annotations) +			d->annotations = calloc(i + 1, sizeof(*desc->annotations)); -		for (i = 0; values[i]; i++) { -			desc->values[i] = strdup(values[i]); +		for (i = 0; desc->values[i]; i++) { +			d->values[i] = strdup(desc->values[i]); -			if (annotations) { -				assert(annotations[i]); -				desc->annotations[i] = strdup(annotations[i]); +			if (desc->annotations) { +				assert(desc->annotations[i]); +				d->annotations[i] = strdup(desc->annotations[i]);  			}  		}  	}  	/* TODO: handle allocation errors above... */ +	*res_desc = d; -	return desc; +	return 0;  } diff --git a/src/settings.h b/src/settings.h index fe35b19..6803d09 100644 --- a/src/settings.h +++ b/src/settings.h @@ -30,7 +30,7 @@ int settings_add_value(settings_t *settings, const char *key, const char *value)  char * settings_as_arg(const settings_t *settings);  int settings_apply_desc_generators(const settings_t *settings, const setting_desc_generator_t generators[], unsigned n_generators, void *setup_context, setting_desc_t **next_setting); -setting_desc_t * setting_desc_new(const char *name, const char *key, const char *regex, const char *preferred, const char *values[], const char *annotations[]); +int setting_desc_clone(const setting_desc_t *desc, setting_desc_t **res_desc);  void setting_desc_free(setting_desc_t *desc);  #endif  | 
