为提高性能,改用c替换原本的flask
This commit is contained in:
196
c/interpreter/interpreter.c
Normal file
196
c/interpreter/interpreter.c
Normal file
@ -0,0 +1,196 @@
|
||||
#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("runing\n");
|
||||
return 1;
|
||||
|
||||
case QUIT:
|
||||
printf("shuting down\n");
|
||||
all_ctx->statue = -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)
|
||||
{
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user