Verification of programs using Code Segments and Data Segments |
Yasutaka Higa
|
typedef struct phils {
int id;
struct fork *right_fork;
struct fork *left_fork;
struct phils *right;
struct phils *left;
__code (*next)(struct phils *);
} Phils, *PhilsPtr;
goto list->phils->next(list->phils,list);
goto do_action(list->phils, list);
typedef struct phils {
int id;
struct fork *right_fork;
struct fork *left_fork;
struct phils *right;
struct phils *left;
enum Action next;
} Phils, *PhilsPtr;
enum Action {
PutDownLeftFork,
PutDownRightFork,
/* ...... */
PutDownFork
};
__code do_action(PhilsPtr phils, TaskPtr list)
{
switch (phils->next) {
case PutDownLeftFork:
goto putdown_lfork(phils, list);
case PutDownRightFork:
goto putdown_rfork(phils, list);
/* ....... */
default:
printf("invalid action\n");
exit(1);
}
__code (*action) (PhilsPtr, TaskPtr) = thinking;
goto action(phils, list);
}