为提高性能,改用c替换原本的flask

This commit is contained in:
2025-09-28 12:02:26 +08:00
parent a0e9bf1b44
commit 3c574e489d
24 changed files with 7240 additions and 0 deletions

196
c/interpreter/interpreter.c Normal file
View 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)
{
}
}