diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/stage.c | 42 | 
1 files changed, 37 insertions, 5 deletions
| diff --git a/src/stage.c b/src/stage.c index 806b633..a9a5829 100644 --- a/src/stage.c +++ b/src/stage.c @@ -14,6 +14,7 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ +#include <assert.h>  #include <stdlib.h>  #include <string.h> @@ -40,6 +41,9 @@ struct stage_t {  /* minimally initialize a stage to carry an object */  static void _stage_set_object(stage_t *stage, const char *name, void *object, stage_render_func_t render_func, stage_free_func_t free_func)  { +	assert(stage); +	assert(name); +  	strncpy(stage->name, name, sizeof(stage->name));  	stage->render = render_func;  	stage->free = free_func; @@ -69,6 +73,8 @@ static stage_t * _stage_new(const char *name, void *object, stage_render_func_t  /* free a stage, no list manipulation occurs, this is purely cleanup of the stage and its object */  static void _stage_free(stage_t *stage)  { +	assert(stage); +  	if (stage->free)  		stage->free(stage, stage->object); @@ -82,6 +88,9 @@ stage_t * stage_new(stage_t *parent, int layer, const char *name, void *object,  {  	stage_t	*stage; +	assert(parent || !layer); +	assert(layer < STAGE_LAYERS_MAX); +  	stage = _stage_new(name, object, render_func, free_func);  	if (!stage)  		return NULL; @@ -98,12 +107,16 @@ stage_t * stage_new(stage_t *parent, int layer, const char *name, void *object,  /* replace a given stage's object only - retain render/free hooks and everything else, invalidates cache  - DOES NOT FREE OLD OBJECT */  void stage_set_object(stage_t *stage, void *object)  { +	assert(stage); +  	stage->object = object;  }  void stage_get_object(const stage_t *stage, void **res_object)  { +	assert(stage); +  	*res_object = stage->object;  } @@ -111,6 +124,8 @@ void stage_get_object(const stage_t *stage, void **res_object)  /* replaces a given stage's object-related properties but otherwise keeping the existing state */  void stage_replace(stage_t *stage, const char *name, void *object, stage_render_func_t render_func, stage_free_func_t free_func)  { +	assert(stage); +  	if (stage->free)  		stage->free(stage, stage->object); @@ -124,6 +139,8 @@ static void _stage_free_all(stage_t *stage, int force);  /* recursively free the layers of this stage, but not the stage itself */  static void _stage_free_layers(stage_t *stage, int force)  { +	assert(stage); +  	for (int i = 0; i < STAGE_LAYERS_MAX; i++) {  		stage_t	*s, *_s; @@ -136,6 +153,8 @@ static void _stage_free_layers(stage_t *stage, int force)  /* free the stage recursively, skipping locked stages if !force */  static void _stage_free_all(stage_t *stage, int force)  { +	assert(stage); +  	if (stage->locked && !force)  		return; @@ -160,6 +179,8 @@ stage_t * stage_free(stage_t *stage)  /* set the alpha on a stage */  void stage_set_alpha(stage_t *stage, float alpha)  { +	assert(stage); +  	stage->alpha = alpha;  } @@ -167,6 +188,8 @@ void stage_set_alpha(stage_t *stage, float alpha)  /* set a stage's active state (participates in rendering) */  void stage_set_active(stage_t *stage, int active)  { +	assert(stage); +  	stage->active = active;  } @@ -174,6 +197,8 @@ void stage_set_active(stage_t *stage, int active)  /* set a stage's locked state (doesn't get freed by clears) */  void stage_set_locked(stage_t *stage, int locked)  { +	assert(stage); +  	stage->locked = locked;  } @@ -182,11 +207,11 @@ void stage_set_locked(stage_t *stage, int locked)  /* TODO: maybe support supplying a parent here for switching parents? */  void stage_set_layer(stage_t *stage, int layer)  { -	/* TODO: assert parent, and layer sanity */ -	if (stage->parent) { -		(void) dll_del(&stage->layer); -		(void) dll_add_pre(&stage->parent->layers[layer], &stage->layer); -	} +	assert(stage); +	assert(stage->parent); + +	(void) dll_del(&stage->layer); +	(void) dll_add_pre(&stage->parent->layers[layer], &stage->layer);  } @@ -226,6 +251,8 @@ static void _render_stage(const stage_t *stage, float alpha)  {  	float	a = alpha * stage->alpha; +	assert(stage); +  	if (stage->render)  		stage->render(stage, stage->object, a); @@ -245,6 +272,8 @@ static void _render_stage(const stage_t *stage, float alpha)  /* recursively render the supplied stage tree, skipping inactive branches */  void stage_render(const stage_t *stage)  { +	assert(stage); +  	if (!stage->active)  		return; @@ -255,6 +284,9 @@ void stage_render(const stage_t *stage)  /* lookup a stage from a name, returns first match */  stage_t * stage_lookup_name(stage_t *stage, const char *name)  { +	assert(stage); +	assert(name); +  	if (!strncmp(stage->name, name, sizeof(stage->name)))  		return stage; | 
