LINUX.ORG.RU

История изменений

Исправление beastie, (текущая версия) :

Эту пьянку можно и продолжить:

struct entry {
	int index,
	char *telNo,
	char *name,
}

int caseTel(struct entry *e)		{ /* только телефон */ }
int caseTelName(struct entry *e)	{ /* телефон и имя */ }
int caseIdx(struct entry *e)		{ /* только индекс */ }
int caseIdxTel(struct entry *e)		{ /* индекс и телефон */ }
int caseIdxTelName(struct entry *e)	{ /* индекс, телефон и имя */ }

enum { IDX, TEL, NAME, MAX };

int (*cases)()[1<<MAX] = {
	[1<<TEL]:                   caseTel,
	[1<<TEL | 1<<NAME]:         caseTelName,
	[1<<IDX]:                   caseIdx,
	[1<<IDX | 1<<TEL]:          caseIdxTel,
	[1<<IDX | 1<<TEL | <<NAME]: caseIdxTelName,
};

int check(struct entry *e) {
	int cond = (e->index >= 0) << IDX |
		(!! e->telNo) << TEL |
		(!! e->name) << NAME;
	int (*f)() = cases[cond && ((1<<MAX) - 1)];
	if !f {
		//недопустимое сочетание
		return -1;
	}
	return f(e)
}

Исходная версия beastie, :

Эту пьянку можно и продолжить:

int caseTel(struct entry *e)		{ /* только телефон */ }
int caseTelName(struct entry *e)	{ /* телефон и имя */ }
int caseIdx(struct entry *e)		{ /* только индекс */ }
int caseIdxTel(struct entry *e)		{ /* индекс и телефон */ }
int caseIdxTelName(struct entry *e)	{ /* индекс, телефон и имя */ }

struct entry {
	int index,
	char *telNo,
	char *name,
}

enum { IDX, TEL, NAME, MAX };

int (*cases)()[1<<MAX] = {
	[1<<TEL]:                   caseTel,
	[1<<TEL | 1<<NAME]:         caseTelName,
	[1<<IDX]:                   caseIdx,
	[1<<IDX | 1<<TEL]:          caseIdxTel,
	[1<<IDX | 1<<TEL | <<NAME]: caseIdxTelName,
};

int check(struct entry *e) {
	int cond = (e->index >= 0) << IDX |
		(!! e->telNo) << TEL |
		(!! e->name) << NAME;
	int (*f)() = cases[cond && ((1<<MAX) - 1)];
	if !f {
		//недопустимое сочетание
		return -1;
	}
	return f(e)
}