157257Sdufault/* $FreeBSD$ */
257257Sdufault#include <stdio.h>
357257Sdufault
457257Sdufaultint fifo(int argc, char *argv[]);
557257Sdufaultint memlock(int argc, char *argv[]);
657257Sdufaultint p26(int argc, char *argv[]);
757257Sdufaultint sched(int argc, char *argv[]);
857257Sdufaultint yield(int argc, char *argv[]);
957257Sdufault
1057257Sdufaultstatic struct {
1157257Sdufault	const char *t;
1257257Sdufault	int (*f)(int, char *[]);
1357257Sdufault	int works;
1457257Sdufault} tab[] = {
1557257Sdufault	{ "fifo", fifo, 1 },
1657257Sdufault	{ "memlock", memlock, 0 },
1757257Sdufault	{ "p26", p26, 1 },
1857257Sdufault	{ "sched", sched, 1 },
1957257Sdufault	{ "yield", yield, 1 },
2057257Sdufault};
2157257Sdufault
2257257Sdufault#define N(T) (sizeof (T)/ sizeof(T[0]))
2357257Sdufault
2457257Sdufaultstatic int usage(int argc, char *argv[])
2557257Sdufault{
2657257Sdufault	int i;
2757257Sdufault	if (argc > 1)
2857257Sdufault		fprintf(stderr, "%s is unknown\n", argv[1]);
2957257Sdufault
3057257Sdufault	fprintf(stderr, "usage: %s [-a] or one of [", argv[0]);
3157257Sdufault	for (i = 0; i < (sizeof(tab) / sizeof(tab[0])); i++)
3257257Sdufault		fprintf(stderr, "%s%s", (i)? " | " : "", tab[i].t);
3357257Sdufault	fprintf(stderr, "]\n");
3457257Sdufault
3557257Sdufault	return -1;
3657257Sdufault}
3757257Sdufault
3857257Sdufaultint main(int argc, char *argv[])
3957257Sdufault{
4057257Sdufault	int i;
4157257Sdufault
4257257Sdufault	if (argc == 2 && strcmp(argv[1], "-a") == 0) {
4357257Sdufault#if 1
4457257Sdufault		fprintf(stderr,
4557257Sdufault			"-a should but doesn't really work"
4657257Sdufault			" (my notes say \"because things detach\");\n"
4757257Sdufault			"meanwhile do these individual tests and look"
4857257Sdufault			" for a non-zero exit code:\n");
4957257Sdufault		for (i = 0; i < N(tab); i++)
5057257Sdufault			if (tab[i].works)
5157257Sdufault				fprintf(stderr, "p1003_1b %s\n", tab[i].t);
5257257Sdufault		return -1;
5357257Sdufault#else
5457257Sdufault		{
5557257Sdufault			int r;
5657257Sdufault			for (i = 0; i < N(tab); i++) {
5757257Sdufault				if (tab[i].works) {
5857257Sdufault					if ( (r =
5957257Sdufault					(*tab[i].f)(argc - 1, argv + 1)) ) {
6057257Sdufault						fprintf(stderr,
6157257Sdufault						"%s failed\n", tab[i].t);
6257257Sdufault						return r;
6357257Sdufault					}
6457257Sdufault				}
6557257Sdufault			}
6657257Sdufault			return 0;
6757257Sdufault		}
6857257Sdufault#endif
6957257Sdufault	}
7057257Sdufault
7157257Sdufault	if (argc > 1) {
7257257Sdufault		for (i = 0; i < N(tab); i++)
7357257Sdufault			if (strcmp(tab[i].t, argv[1]) == 0)
7457257Sdufault				return (*tab[i].f)(argc - 1, argv + 1);
7557257Sdufault	}
7657257Sdufault
7757257Sdufault	return usage(argc, argv);
7857257Sdufault}
79