197 lines
4.2 KiB
C
197 lines
4.2 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <stddef.h>
|
|
#include <string.h>
|
|
#include <termios.h>
|
|
#include <stddef.h>
|
|
#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 <CMD_DIR_LENGTH)
|
|
{
|
|
if(strcmp(cmd_dic[cmd_index].name,cmd_buf)==0)
|
|
return cmd_dic[cmd_index].cmd;
|
|
cmd_index++;
|
|
}
|
|
return BAD_INPUT;
|
|
}
|
|
|
|
|
|
int exce(const int command,ctx *all_ctx)
|
|
{
|
|
|
|
switch (command)
|
|
{
|
|
case BAD_INPUT:
|
|
printf("SYS:bad input,try again\n");
|
|
return BAD_INPUT;
|
|
|
|
case INSTALL:
|
|
if(all_ctx->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)
|
|
{
|
|
}
|
|
} |