進行指令處理的典型程式架構
今天翻看APUE中非局部goto的時候,看到了這個處理指令行的代碼架構,是以就想簡單的實作一個功能進行調試,花了大概2個小時,才完全看的過去,記錄下,雖然看起來還是不夠層次清晰。裡面牽扯到的知識點注意有:業務要學會分層;枚舉值和對應字元串的轉換;字元串的解析(分詞)。
#include "util.h"
void do_line(char *);
#define FOREACH_CMD(CMD) \
CMD(CMD_UNSPEC) \
CMD(CMD_ADD) \
CMD(CMD_SUB) \
CMD(CMD_MULTI) \
CMD(CMD_LIMIT) \
#define GENERATE_ENUM(ENUM) ENUM,
#define GENERATE_STRING(STRING) #STRING,
enum CMD_ENUM {
FOREACH_CMD(GENERATE_ENUM)
};
static const char *CMD_STRING[] = {
FOREACH_CMD(GENERATE_STRING)
};
int main(void){
char line[MAXLINE];
//printf("%s\n", CMD_STRING[CMD_ADD]);
if (fgets(line, MAXLINE, stdin) != NULL)
do_line(line);
exit(0);
}
void do_line(char *ptr) /* process one line of input */
{
int cmd, i;
int count , result = 0;
char **words = tokenize(ptr, &count);
if(count < 2){
//至少有一個加數,這裡假設輸入時合法的
}
// C 語言不能用字元串做索引,是以需要找到字元串指令對應的枚舉值
for(i = 0; i < CMD_LIMIT; i++)
if(strcmp(words[0], CMD_STRING[i]) == 0)
break;
switch(i){
case CMD_ADD:
// cmd_add 應該單獨分離出一個函數
for(i = 1; i < count ; i++){
result += atoi(words[i]);
}
printf("ADD Result is %d\n", result);
break;
default:
printf("Invalid\n");
break;
}
//printf("CMD is %d\n", i);
//printf("words count : %d\n", count);
//最後統一釋放記憶體
for(i = 0; i < count ; i++)
free(words[i]);
free(words); //
}