void execute_cmd(char **cmd, char *cmdp, char **env) { char *tmp; pid_t father; tmp = NULL; tmp = set_tmp(cmdp, tmp, env, cmd); if (access(ft_strjoin(tmp, cmd[0]), X_OK) != -1 && ft_strlen(cmd[0]) > 1) { father = fork(); if (father > 0) wait(0); else if (father == 0) { signal(SIGINT, SIG_DFL); cmdp = ft_strjoin(tmp, cmd[0]); execve(cmdp, cmd, env); ft_strdel(&cmdp); } else ft_putendl("cannot fork"); } else if (access(cmd[0], X_OK) == -1 && exist(env, cmd[0])) ft_putstrstr_fd(cmd[0], ": Permission denied\n", 2); else ft_putendl_fd("command not found", 2); ft_strdel(&tmp); }
static void rt_eval_or ( IL_node *tmp ) { Var *value_a,*value_b; value_a=IL_rt_Evaluate ( tmp->exp->A ); value_b=IL_rt_Evaluate ( tmp->exp->B ); last_tmp_value=var_or ( *value_a, *value_b ); set_tmp(tmp->tmp_index,&last_tmp_value,TMP_ARITH); }
static void rt_eval_less_or_equal ( IL_node *tmp ) { Var *value_a,*value_b; value_a=IL_rt_Evaluate ( tmp->exp->A ); value_b=IL_rt_Evaluate ( tmp->exp->B ); last_tmp_value=var_less_or_equal ( *value_a,*value_b ); set_tmp(tmp->tmp_index,&last_tmp_value,TMP_DEREFER); }
/*在运行时解析下标运算*/ static void rt_eval_subscript(IL_node *tmp) { Var *value_a, *value_b,*result; value_a=IL_rt_Evaluate ( tmp->exp->A ); value_b=IL_rt_Evaluate ( tmp->exp->B ); result=GetListElement (*value_a,var_GetInt (*value_b)); set_tmp(tmp->tmp_index,result,TMP_DEREFER); last_tmp_value=*result; }
/*在运行时解析节点的加法运算*/ static void rt_eval_plus ( IL_node *tmp ) { Var *value_a, * value_b; /*根据栈中的函数调用情况获取栈中绝对定位下的变量*/ value_a=IL_rt_Evaluate ( tmp->exp->A ); value_b=IL_rt_Evaluate ( tmp->exp->B ); last_tmp_value=var_add ( *value_a,*value_b ); set_tmp(tmp->tmp_index,&last_tmp_value,TMP_ARITH); }
static void rt_eval_assign ( IL_node *tmp ,int mode) { if ( tmp->exp->A.type==ELEMENT_VAR /*局部变量*/ ||(tmp->exp->A.type==ELEMENT_TMP)) /*对象成员*/ { } else { printf ( "only var can BE l-value!!%d \n ",tmp->exp->A.type ); exit ( 0 ); } Var * l_value=IL_rt_Evaluate (tmp->exp->A); Var * r_value=IL_rt_Evaluate (tmp->exp->B); (*l_value)= assign_get(*l_value,*r_value,mode); set_tmp(tmp->tmp_index,l_value,TMP_ARITH); last_tmp_value=(*l_value); }
/*在运行时解析对象成员指向运算*/ static void rt_eval_point_to(IL_node *tmp) { if(tmp->exp->A.type!=ELEMENT_VAR && tmp->exp->A.type!=ELEMENT_API && tmp->exp->A.type!=ELEMENT_SELF && tmp->exp->A.type!=ELEMENT_TMP &&tmp->exp->A.type!=ELEMENT_LITERAL) { printf("doesn't support this kind of point operate,A : index %d type %d \n",tmp->tmp_index,tmp->exp->A.type); exit(0); } Var *value_a, *value_b,*result; value_a=IL_rt_Evaluate ( tmp->exp->A ); value_b=IL_rt_Evaluate ( tmp->exp->B ); if(value_a->content.type==VAR_TYPE_STRUCT_NAME) /*类成员*/ { /*判断访问性*/ int acc=get_accessbility_of_member(value_a->content.var_value.struct_id,get_index_of_member(value_a->content.var_value.struct_id,var_GetMsg(*value_b))); if(acc!=STRUCT_PUBLIC && env_index != value_a->content.var_value.struct_id)/*非公有且在外部*/ { printf("private member cannot be assinged outside\n"); exit(0); } result =var_point_to (* value_a,*value_b); /*类成员,self指针失效,同时环境索引变为全局*/ var_SetObjId (&self_ptr,env_index); self_ptr.content.type=VAR_TYPE_NILL; } else /*对象成员*/ { /*判断访问性*/ int acc=get_accessbility_of_member(var_GetObjId(value_a),get_index_of_member(var_GetObjId(value_a),var_GetMsg(*value_b))); if(acc!=STRUCT_PUBLIC && env_index != var_GetObjId(value_a))/*非公有且在外部*/ { printf("private member cannot be assinged outside\n"); exit(0); } result=var_point_to ( *value_a,*value_b ); /*设置self指针*/ self_ptr=* value_a; } set_tmp(tmp->tmp_index,result,TMP_DEREFER); last_tmp_value=(*result); }
/*执行中间代码,输入一张中间代码表*/ Var IL_exec ( Function *func ) { /*记录当前函数所需的变量数量,为计算其嵌套调用函数时,虚拟机变量的偏移量*/ vm_SetLayerVarAmount(vm_GetCurrentLayer() ,func->var_counts); IL_node * tmp; tmp=func->list.head; current_list=&func->list; while ( tmp!=NULL ) { current_node=tmp; switch ( tmp->type ) { case IL_NODE_PRNT: ExecPrintNode(last_tmp_value); break; case IL_NODE_EXP: handle_exp ( tmp ); break; case IL_NODE_RETURN: return last_tmp_value; break; case IL_NODE_NILL: break; case IL_NODE_STRUCT_CREATOR: { IL_node * i=tmp->pre; int c=tmp->struct_creator->init_args; Var init_var[c]; for(;c>0;c--) { init_var[c-1]= (*get_tmp (i->tmp_index)); i=i->pre; } last_tmp_value =struct_Create(tmp->struct_creator->id,init_var,tmp->struct_creator->init_args); set_tmp (tmp->tmp_index,&last_tmp_value,TMP_DEREFER); } break; case IL_NODE_TUPLE_CREATOR: { last_tmp_value= tuple_CreateBySize (var_GetInt (last_tmp_value)); set_tmp (tmp->tmp_index,&last_tmp_value,TMP_DEREFER); } break; case IL_NODE_GOTO: { int label=tmp->jmp->label; IL_node * node = tmp->next; while ( 1 ) { if ( (node->type==IL_NODE_LAB) && (node->jmp->label==label ) ) { break; } node=node->next; } tmp =node; } break; case IL_NODE_JE: { int can_jmp=0; if(var_GetType (last_tmp_value)==VAR_TYPE_BOOL) { if(var_GetBool (last_tmp_value)==0) { can_jmp=1; } } else { STOP(" illegal je"); } if ( can_jmp==1 ) { int label =tmp->jmp->label; IL_node * node= tmp->next; while ( 1 ) { if ( (node->type==IL_NODE_LAB )&& (node->jmp->label==label) ) { break; } node=node->next; } tmp =node; } } break; case IL_NODE_CALL_LIST: { last_tmp_value =IL_CallFunc (tmp->call->args,tmp->call->list_id,FUNC_NORMAL); set_tmp (tmp->tmp_index,&last_tmp_value,TMP_ARITH); } break; case IL_NODE_CALL_API: { last_tmp_value=IL_CallFunc (tmp->call->args,tmp->call->list_id,FUNC_API); set_tmp (tmp->tmp_index,&last_tmp_value,TMP_ARITH); } break; case IL_NODE_CALL_DYNAMIC: { last_tmp_value =IL_CallFunc (tmp->call->args,tmp->call->list_id,FUNC_DYNAMIC); set_tmp (tmp->tmp_index,&last_tmp_value,TMP_ARITH); } break; case IL_NODE_CALL_METHOD: { last_tmp_value =IL_CallFunc (tmp->call->args,tmp->call->list_id,FUNC_METHOD); set_tmp (tmp->tmp_index,&last_tmp_value,TMP_ARITH); } break; case IL_NODE_CARD: { int card=tuple_GetCard(last_tmp_value); var_SetInt (&last_tmp_value,card); set_tmp (tmp->tmp_index,&last_tmp_value,TMP_ARITH); } break; case IL_NODE_TYPE_OF: { int type_of_var=var_GetType (last_tmp_value); var_SetInt (&last_tmp_value,type_of_var); set_tmp (tmp->tmp_index,&last_tmp_value,TMP_ARITH); } break; case IL_NODE_JNE: { int can_jmp=0; if(var_GetType (last_tmp_value)==VAR_TYPE_BOOL) { if(var_GetBool (last_tmp_value)!=0) { can_jmp=1; } } else { STOP("illegal jne"); } if ( can_jmp==1 ) { int label = tmp->jmp->label; IL_node * node=tmp->pre; while ( 1 ) { if ( (node->type==IL_NODE_LAB) &&(node->jmp->label==label)) { break; } node=node->pre; } tmp=node; } } break; } tmp=tmp->next; } { Var result; var_SetInt (&result,0); return result; } }