天天看點

進行指令處理的典型程式架構

進行指令處理的典型程式架構

     今天翻看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);  //
}