int hasArg; /* does it take an argument */
void (*func)(int, int); /* routine to call */
} Command;
static Command cmds[] = {
{'P', ARG, doSelectPen},
('V', NO_ARG, doPenUp},
{'D', NO_ARG, doPenDown},
{'N,' ARG, doPenDir},
{'E', ARG, doPenDir},
{'S', ARG, doPenDir},
{'W', ARG, doPenDir}
};
Основная программа довольно проста: считать строку, отыскать команду, при необходимости принять аргумент, затем вызвать функцию обработчика.
while (fgetsfbuff, sizeof(buff), stdin)) {
Command *cmd = findCommand(*buff);
if (cmd) {
int arg = 0;
if (cmd->hasAr&& !getArg(buff+1, &arg)) {
fprintf(stderr,"'%с' needs an argument\n», *buff);
continue;
}
cmd->func(*buff, arg);
}
}
Функция, которая ищет команду, исполняет последовательный перебор таблицы, возвращая либо совпадающий элемент, либо NULL.
Command *findCommand(int cmd) {
int i;