#include #include #include #include #include #include #include #include #include "interpreter.h" #include "tools/pkgmanager/pkginstall.h" int init_interpreter(Cmd *cmd_dic,ctx *self,int fifo[2]) { printf("SYS:prepare env\n"); printf("SYS:env ready\n"); printf("SYS:loading cmd_dic\n"); sprintf(cmd_dic[0].name, "pkginstall"); cmd_dic[0].cmd = INSTALL; sprintf(cmd_dic[1].name,"run"); cmd_dic[1].cmd = RUN; sprintf(cmd_dic[2].name,"quit"); cmd_dic[2].cmd = QUIT; printf("SYS:cmd_dir load complite\n"); for(int i =0;i<10;i++) { self->space_index[i] = 0; } self->arg = NULL; printf("SYS:Creating ctl fifo\n"); memcpy(self->fifofd,fifo,2*sizeof(int)); } int get_args(ctx *self) { int i; if(self->space_index[0]==0) return 0; self->arg = (args*)malloc(sizeof(args)); args* arg = self->arg; size_t len = 0; //抽取参数 for(i =0;i<9;i++) { if(self->space_index[i+1]==0) break; len = self->space_index[i+1]-self->space_index[i]-1; memcpy(arg->name,&self->command[self->space_index[i]+1],len); arg->name[len] = '\0'; //拷贝变量到变量链 if(self->space_index[i+2]!=0){ arg->next = (args*)malloc(sizeof(args)); if(arg->next == NULL){ perror("ERROR:fail to get mem"); return -1; } arg = arg->next; } //访问下一个节点 } if(i<9) { len = self->line-self->space_index[i]-2; memcpy(arg->name,&self->command[self->space_index[i]+1],len); arg->name[len] = '\0'; } arg->next = NULL; return i; } int args_free(ctx *self) { //释放节点使用的空间 if(self->arg == NULL) return 1; args *arg = self->arg; args *buf = arg; while(buf!= NULL&&arg->next!=NULL) { buf = arg; arg = arg->next; free(buf); } return 1; } //分割命令 int split(const char *input,ctx *all_ctx) { int sp_index = 0; char buf = input[0]; int index = 0; while(buf != '\n') { if(buf == ' '){ //记录空格位置 all_ctx->space_index[sp_index] = index; sp_index++; } index++; buf = input[index]; } } //匹配命令 int match_cmd(const Cmd* cmd_dic,char *cmd_buf) { int cmd_index = 0; while(cmd_index arg == NULL){ printf("SYS:Missing args\n"); return 1; } printf("SYS:init pkgmanager\n"); pkger *manager = init_pkginstaller(); printf("SYS:installing\n"); manager->packup(manager); return 1; case RUN: printf("SYS:runing\n"); return 1; case QUIT: printf("SYS:shuting down\n"); all_ctx->statue = -1; write(all_ctx->fifofd[1],"q",1); return 1; } } int interpret(int mod, ctx *all_ctx,Cmd *cmd_dic) { if (mod == SIG_MOD) { // 检查空格位置 split(all_ctx->command,all_ctx); get_args(all_ctx); char *cmd_buf = malloc(MAX_BUF); int len; if(all_ctx->space_index[0]==0) { len = all_ctx->line; } else { len = all_ctx->space_index[0]; } memcpy(cmd_buf,all_ctx->command,len); if(cmd_buf[len-1] == '\n') cmd_buf[len-1] = '\0'; //执行命令 exce(match_cmd(cmd_dic, cmd_buf),all_ctx); //释放所有堆内存 free(cmd_buf); args_free(all_ctx); all_ctx->arg = NULL; for(int i =0;i<10;i++) { all_ctx->space_index[i] = 0; } } if (mod == FILE_MOD) { } }