Myshell解析器

来源:互联网 发布:java图片上传下载 编辑:程序博客网 时间:2024/04/28 00:37

功能:实现shell命令的解析,能够将命令行输入内容进行解析。获取命令名称、参数并对重定向符进行解析

例如:

若命令行输入为:ls -al

则应解析出:命令为-ls,参数为--al

若命令行输入内容为:ls - al > out

则应该解析出:命令行为-ls,参数为---al,重定向输出文件为:out

#include <stdio.h>#include <string.h>#define MAXARG 8//参数最多包含的字符数#define MAX 1024//用来接收用户输入的数组大小#define MAXCMD 16//命令最多包含的字符数typedef struct command{char *argv[MAXARG];char *in,*out;}cmd_t;int parse(char *buf,cmd_t *cmdp){char *tmp = buf;char *curcmd = NULL;int cmdnum = 0, i = 0, j = 0;if((cmdp[i].argv[0] = strtok(tmp,"|"))){cmdnum++;}while((cmdp[cmdnum].argv[0] = strtok(NULL,"|"))){cmdnum++;}for(i = 0; i < cmdnum; i++){curcmd = cmdp[i].argv[0];cmdp[i].in = cmdp[i].out = NULL;while(*curcmd){if(*curcmd == ' '){*curcmd++ =  '\0';continue;}if(*curcmd == '<'){*curcmd = '\0';while(*(++curcmd) == ' ');cmdp[i].in = curcmd;if(*curcmd == '\0')return -1;continue;}if(*curcmd == '>'){*curcmd = '\0';while(*(++curcmd) == ' ');cmdp[i].out = curcmd;if(*curcmd == '\0')return -1;continue;}if(*curcmd != ' ' &&((curcmd == cmdp[i].argv[0]) || (*(curcmd - 1) == '\0'))){cmdp[i].argv[j++] = curcmd++;continue;}curcmd++;}cmdp[i].argv[j] = NULL;j = 0;}return cmdnum;}void show(cmd_t *cmdp,int cmdnum){int i,j;for(i = 0; i < cmdnum; i++){printf("cmd_show:%s",cmdp[i].argv[0]);for(j = 1;cmdp[i].argv[j]; j++)printf("argv: %s",cmdp[i].argv[j]);printf("\nin: %s,out: %s\n",cmdp[i].in,cmdp[i].out);}}int main(void){char buf[MAX];int cmdnum;cmd_t cmd[MAXCMD];while(1){printf("sh%%");fflush(stdout);fgets(buf,MAX,stdin);if('\n' == buf[strlen(buf) - 1])buf[strlen(buf) - 1] = '\0';if(!strcmp(buf,"exit"))break;cmdnum = parse(buf,cmd);show(cmd,cmdnum);}return 0;}


原创粉丝点击