baum

diff actions.c @ 57:21ff1783f640

using function pointers now, instead of a large if-else
author meillo@marmaro.de
date Wed, 25 Jun 2008 09:20:16 +0200
parents 6279e5b14d9e
children
line diff
     1.1 --- a/actions.c	Sun Mar 16 20:11:02 2008 +0100
     1.2 +++ b/actions.c	Wed Jun 25 09:20:16 2008 +0200
     1.3 @@ -11,9 +11,26 @@
     1.4  unsigned char action_if(struct Node* node);
     1.5  unsigned char action_while(struct Node* node);
     1.6  
     1.7 +struct action {
     1.8 +	char* name;
     1.9 +	unsigned char (*func)(struct Node* node);
    1.10 +};
    1.11 +
    1.12 +struct action actions[] = {
    1.13 +	{"print", action_print},
    1.14 +	{"sum", action_sum},
    1.15 +	{"number", action_number},
    1.16 +	{"create", action_create},
    1.17 +	{"times", action_times},
    1.18 +	{"if", action_if},
    1.19 +	{"while", action_while},
    1.20 +};
    1.21 +
    1.22  
    1.23  
    1.24  unsigned char action(struct Node* node) {
    1.25 +	int i;
    1.26 +
    1.27  	if (node == NULL) {
    1.28  		if (option_verbose) {
    1.29  			fprintf(stderr, "warning: action of non existing node\n");
    1.30 @@ -21,31 +38,14 @@
    1.31  		return 0;
    1.32  	}
    1.33  
    1.34 -	if (strcmp(node->name, "print") == 0) {
    1.35 -		return action_print(node);
    1.36 +	for (i = 0; i < (sizeof(actions)/sizeof(actions[0])); i++) {
    1.37 +		if (strcmp(actions[i].name, node->name) == 0) {
    1.38 +			return (actions[i].func)(node);
    1.39 +		}
    1.40 +	}
    1.41  
    1.42 -	} else if (strcmp(node->name, "sum") == 0) {
    1.43 -		return action_sum(node);
    1.44 -
    1.45 -	} else if (strcmp(node->name, "number") == 0) {
    1.46 -		return action_number(node);
    1.47 -
    1.48 -	} else if (strcmp(node->name, "create") == 0) {
    1.49 -		return action_create(node);
    1.50 -
    1.51 -	} else if (strcmp(node->name, "times") == 0) {
    1.52 -		return action_times(node);
    1.53 -
    1.54 -	} else if (strcmp(node->name, "if") == 0) {
    1.55 -		return action_if(node);
    1.56 -
    1.57 -	} else if (strcmp(node->name, "while") == 0) {
    1.58 -		return action_while(node);
    1.59 -
    1.60 -	} else {
    1.61  		fprintf(stderr, "unknown kind of node\n");
    1.62  		exit(4);
    1.63 -	}
    1.64  }
    1.65  
    1.66