smb02 A state machine in C II

NO pointers - but instead a case switch construction

Based on smb01 but with a data struct that is passed to each state

smb02 raw

smb005.html is based on smb02 buth instead of a case switch a array with function adresses is used

Its more compact and I think its easier to expand

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// state dft

enum states {INIT,LEDON,LEDOFF};

// you just define your need
#define MSGARSIZE 4
typedef struct {
	int data[MSGARSIZE];
} msgTp;

// state functions

enum states init(msgTp *msg)
{
	printf("\ninit\n");
	sleep(1);
	return LEDON; // return next state
}


enum states ledOn(msgTp *msg)
{
	printf("\nledOn\n");

	sleep(1);

	return LEDOFF;
}

enum states ledOff(msgTp *msg)
{
	printf("\nledOff\n");

	sleep(1);

	return LEDON;
}

int main()
{
	msgTp m; // for getting data to from a state

	enum states state = INIT;

	while (1) {
		switch (state) {
			case INIT:
				state = init(&m);
				break;
			case LEDON:
				state = ledOn(&m);
				break;
			case LEDOFF:
				state = ledOff(&m);
				break;
			default:
				state = INIT;
		}
	}
}

/**
 * case-switch considerations
 * Finding of the proper case can be carried out
 * in two ways.
 *
 * 1) if (..) else if (..) ..
 * So if you do have 100 case then in average you
 * will do 50 if (...)
 *
 * 2) if you order your cases in numerical order like
 * case 0:
 * ...
 * break;
 * case 1:
 * ...
 * break;
 * and so forth
 * a jump table will be generated you just jump to the right case entry.
 * so no performance lack even in a case with several 100 entries.
 *
 * By using the enum state above we are guaranteed the states are numbered 0,1,2,..
 * Then you just need to code our case switch in numerical order.
 *
 */