void cut(int lr,int lc,int ur,int uc,int color,int j) { int i, tmp; int tlr=tab[j].lr, tlc=tab[j].lc, tur=tab[j].ur, tuc=tab[j].uc , tcolor=tab[j].color; if(tlr < lr && tuc>tlc){ tmp = (lr<tur) ? lr : tur; add_tab(tlr, tlc, tmp, tuc, tcolor); tlr = tmp; } if(tur > ur && tuc>tlc){ tmp = (ur>tlr) ? ur : tlr; add_tab(tmp, tlc, tur, tuc, tcolor); tur = tmp; } if(tlc < lc && tur>tlr){ tmp = (lc<tuc) ? lc : tuc; add_tab(tlr, tlc, tur, tmp, tcolor); tlc = tmp; } if(tuc > uc && tur>tlr){ tmp = (uc>tlc) ? uc : tlc; add_tab(tlr, tmp, tur, tuc, tcolor); tuc = tmp; } }
t_command *tab_contain(t_parse *list, int i) { char **tab; glob_t globlist; t_command *result; int j; result = NULL; while (list) { i = 0; tab = (char **)ft_memalloc(sizeof(char *) * 1024); while (list != NULL && (ft_strcmp(list->str, ";")) && i < 1024) { j = -1; glob(list->str, GLOB_NOCHECK, 0, &globlist); while (globlist.gl_pathv[++j]) tab[i++] = ft_strdup(globlist.gl_pathv[j]); globfree(&globlist); list = list->next; } tab[i] = NULL; result = add_tab(result, tab); if (list) list = list->next; } return (result); }
int main(void) { int n, i; int tlr, tlc, tur, tuc, tcolor; int j, tlim; int k; freopen("rect1.in", "r", stdin); freopen("rect1.out", "w", stdout); while(scanf("%d%d%d", &row_max, &col_max, &n) != EOF){ initial(); for(i=0; i<n; i++){ scanf("%d%d%d%d%d", &tlr, &tlc, &tur, &tuc, &tcolor); tlim = lim; add_tab(tlr, tlc, tur, tuc, tcolor); for(j=0; j<tlim; j++) cut(tlr, tlc, tur, tuc, tcolor, j); for(j=0; j<tlim; j++) del_tab(j); } for(i=0; i<=2500; i++) if(area[i]) printf("%d %d\n", i, area[i]); } return 0; }
void local_array2(int start)//获取局部数组,并定义 { char op[expr_size],fuc1[expr_size],fuc2[expr_size]; int i=0,size=0; num_v=0; for(i=start;i<num_inst;i++) { sscanf(inst[i],"%s",op); if(strcmp(op,"ret")==0) break; if(strcmp(op,"array2")==0)//检测到辅助指令array { sscanf(inst[i],"%s %s %s %d",op,op,fuc1,&size);//array2 name type size if(strcmp(fuc1,"FP")==0) { asize[num_v]=size; strcpy(var_name[num_v++],op); } } } int list[expr_size],num=0; define_var(var_name,num_v,list,num); for(i=0;i<num;i++) { add_tab(); fprintf(fw,"long %s[%d][%d]; \n",var_name[list[i]],array_size,asize[list[i]]); } }
t_bool exec_sh(char *sh, t_menu *menu) { char **temp; char *path; int status; if ((temp = add_tab(menu->list[menu->cur]->name, menu->path)) == NULL) return (FALSE); if ((path = creat_path(temp)) == NULL) return (FALSE); def_prog_mode(); if (fork() == 0) { if (my_strcmp(sh, "emacs") == 0) execlp(sh, sh, "-nw", path); else execlp(sh, sh, path); } else { wait(&status); reset_prog_mode(); clear(); init_aff(); wrefresh(g_ctrl.menu[0].win); wrefresh(g_ctrl.menu[1].win); refresh(); } return (TRUE); }
int main(int argc, char* argv[]) { int ret = 0, val = 0, i = 0; int* tab = (int*)malloc(sizeof(int) * 10); int* tab_modif = 0; // On ouvre le fichier FILE* file = fopen ("tenvalues.txt", "r"); // Vérifie si il est bien ouvert if (!file) { printf("Impossible d'ouvrir 'tenvalues.txt' !"); exit(-1); } // On lit chaque ligne while (!feof(file)) { ret = fscanf(file, "%d", &val); // Si fscanf n'est pas valide, ou si on est aux bornes de notre tableau, on s'arrête. if (ret != 1 || i == 10) break; // Sinon on assigne la valeur dans notre tableau tab[i++] = val; } // On ferme le fichier fclose(file); // On demande la valeur à ajouter ret = 0; while (ret != 1) { printf("Valeur a ajouter: "); ret = scanf("%d", &val); CLRBUF; } // On ajoute la valeur tab_modif = add_tab(tab, 10, val); // On affiche les tableaux printf("Original: \n"); afficheTab(tab, 10); printf("\nModif: \n"); afficheTab(tab_modif, 11); printf("\n"); // On libère la mémoire free(tab); free(tab_modif); return 0; }
//if和while的检测 void cmp_inst(char op[],char fuc1[],char fuc2[],char op1[],char op2[],int &i) { char temp[expr_size]; char v1[expr_size],v2[expr_size]; int t1=0,t2=0,reg2=0,reg1=0;//flag用于指示是否为常数 if(get_op(fuc1,v1,reg1)==2) get_expr(reg1,v1); if(get_op(fuc2,v2,reg2)==2) get_expr(reg2,v2);//获取判断语言的两个变量,或者是常数。如果是变量需要加到变量表中。 sscanf(inst[i+1],"%s %s %s",op,fuc1,fuc2); int jump=0; sscanf(fuc2,"[%d]",&jump); bool flag_while=judge_while(i,jump);//判断是否可能为while循环 if(strcmp(op,"blbc")==0)//正常的等于 { if(flag_while) sprintf(temp,"while(%s%s%s) \n",v1,op1,v2); else sprintf(temp,"if(%s%s%s) \n",v1,op1,v2); } else if(strcmp(op,"blbs")==0)//等于的相反情况 { if(flag_while) sprintf(temp,"while(%s%s%s) \n",v1,op2,v2); else sprintf(temp,"if(%s%s%s) \n",v1,op2,v2); } else { fprintf(fw,"cmpeq is wrong struct! \n"); } extra[jump]++;//跳转的目的指令需要补全 } i++;//增加一条指令 add_tab();//添加tab键 fprintf(fw,"%s",temp);//放入缓存区 add_tab(); fprintf(fw,"{\n"); num_big++;//{的个数增加一个 }
void translate_fuc(int &now)//函数调用解析 { char op[expr_size],fuc1[expr_size],fuc2[expr_size]; int i=0,end=0; for(i=now+1;i<num_inst;i++)//找到参数定义结束后的call指令 { sscanf(inst[i],"%s %s %s",op,fuc1,fuc2); if(strcmp(op,"call")==0) { end=i; int reg=0; sscanf(fuc1,"[%d]",®); add_tab(); fprintf(fw,"fuction_%d(",reg); break; } else if(strcmp(op,"load")==0) { int reg=0; sscanf(fuc1,"(%d)",®); transform_load(reg,i);//load指令的转化,转化为一个简单的表达式,用于之后的使用 } } char v1[expr_size]; int reg=0; int t=0; for(i=now;i<end;i++)//添加调用参数 { sscanf(inst[i],"%s %s %s",op,fuc1,fuc2); if(strcmp(op,"param")==0) { t=get_op(fuc1,v1,reg); if(t==2) get_expr(reg,v1); fprintf(fw,"%s",v1); if(i==end-1) fprintf(fw,");\n"); else fprintf(fw,","); } } now=end; }
void TabWidget::add_tab(const std::string &name, Widget *tab) { add_tab(tab_count(), name, tab); }
Widget* TabWidget::create_tab(int index, const std::string &label) { Widget* tab = new Widget(nullptr); add_tab(index, label, tab); return tab; }
void initial(void) { lim = 0; memset(area, 0, sizeof(area)); add_tab(0, 0, row_max, col_max, 1); }
void select_open_files(){ auto file_paths = QFileDialog::getOpenFileNames(this, "Select one or more files", QDir::homePath()); for(const auto& fp : file_paths) add_tab(fp.toStdString()); }
void open_files(const std::vector<std::string>& file_paths){ for(const auto& file : file_paths) add_tab(file); }
void global_struct_array()//结构体定义 { int i=0; char op[expr_size],fuc1[expr_size],type[expr_size],fuc2[expr_size],dst[expr_size]; for(i=2;i<num_inst-1;i++)//遍历所有指令,找到结构体的结构进行转换 结构体都变为单个变量 { sscanf(inst[i-1],"%s %s %s",fuc2,op,op); sscanf(inst[i+1],"%s %s %s",dst,op,op); sscanf(inst[i],"%s %s %s",op,fuc1,type); if(strcmp(fuc2,"mul")==0&&strcmp(dst,"add")==0&&strcmp(op,"add")==0&&find_base(fuc1,dst))//找到base,结构体的标志1 { char temp[200]; strcpy(temp,dst); int now=i; for(i=i+2;i<num_inst;i++)//offset代表结构体的进一步访问 { sscanf(inst[i],"%s %s %s",op,fuc1,fuc2); int reg=0; get_op(fuc2,dst,reg); if(strcmp(op,"add")==0&&judge_offset(dst,fuc2)) { strcat(temp,"_"); strcat(temp,fuc2); } else if(i>now+2)//如果有offset,则说明为结构体,使用辅助指令struct,指明是结构体 { if(strcmp(type,"GP")==0) strcpy(var_name[num_v++],temp);//将全局结构体保存下来 sscanf(inst[now-1],"%s %s %s",op,fuc1,fuc2); int reg=0; int t=get_op(fuc1,dst,reg); if(t==1) sprintf(inst[i-1]," array %s[%s] %s %s ",temp,dst,temp,type); else if(t==3) { sprintf(inst[now-1]," var %s ",fuc1); sprintf(inst[i-1]," array %s[%s] %s %s ",temp,dst,temp,type); } else if(t==2) { sprintf(inst[i-1]," array %s[(%s)] %s %s %s %d",temp,fuc1,temp,type,"reg",reg); } i--; for(now;now<i;now++) sprintf(inst[now],"nop "); break; } else break; } } } int list[1000],num=0; define_var(var_name,num_v,list,num);//局部变量定义 for(i=0;i<num;i++) { add_tab(); fprintf(fw,"long %s[%d]; \n",var_name[list[i]],array_size); } }
void local_define(int start)//局部变量定义,变量,数组,结构体 { char op[expr_size],fuc1[expr_size],fuc2[expr_size]; int i=0; num_p=0; num_v=0; char v1[expr_size],v2[expr_size]; int t1,t2,reg1,reg2; for(i=start;i<num_inst;i++) { sscanf(inst[i],"%s %s %s",op,fuc1,fuc2); if(strcmp(op,"ret")==0) break; if(judge_two_op(op))//双操作数,其中也可能包含变量,需要检测是否有局部变量 { t1=get_op(fuc1,v1,reg1); t2=get_op(fuc2,v2,reg2); if(t1==3) { if(reg1>0) { param_place[num_p]=reg1; strcpy(param_name[num_p++],v1); } else strcpy(var_name[num_v++],v1); } if(t2==3) { if(reg2>0) { param_place[num_p]=reg1; strcpy(param_name[num_p++],v2); } else strcpy(var_name[num_v++],v2); } } else if(strcmp(op,"neg")==0||strcmp(op,"var")==0||strcmp(op,"param")==0||strcmp(op,"write")==0)//单操作数,其中可能包含变量,需要检测 { t1=get_op(fuc1,v1,reg1); if(t1==3) { if(reg1>0) { param_place[num_p]=reg1; strcpy(param_name[num_p++],v1); } else strcpy(var_name[num_v++],v1); } if(strcmp(op,"var")==0) sprintf(inst[i]," nop "); } else if(strcmp(op,"struct")==0&&strcmp(fuc2,"FP")==0)//结构体定义 { strcpy(var_name[num_v++],fuc1); } } int list[1000],num=0; define_var(param_name,num_p,list,num);//定义函数调用参数 sort_list(list,num); for(i=0;i<num-1;i++) fprintf(fw,"long %s,",param_name[list[i]]); if(num-1>=0) fprintf(fw,"long %s",param_name[list[num-1]]); fprintf(fw,") \n{ \n"); num_big++; num=0; define_var(var_name,num_v,list,num);//局部变量定义 for(i=0;i<num;i++) { add_tab(); fprintf(fw,"long %s; \n",var_name[list[i]]); } local_array2(start); local_array(start);//局部数组定义 }
//反编译 void recompiler() { int i=0; char op[expr_size],fuc1[expr_size],fuc2[expr_size]; for(i=1;i<num_inst;i++) { extra_judge(i);//额外的判断,目前为增加 } sscanf(inst[i],"%s %s %s",op,fuc1,fuc2); //cout <<"run "<<i<<": "<<inst[i]<<endl; if(strcmp(op,"nop")==0)//空指令 continue; else if(strcmp(op,"entrypc")==0)//指示main函数 { fprintf(fw,"void main("); local_define(i+1);//局部变量检测与定义 i++; } else if(strcmp(op,"enter")==0)//函数的定义 { fprintf(fw,"void fuction_%d(",i); local_define(i+1);//函数的局部变量检测 continue; } else if(strcmp(op,"cmpeq")==0)//比较相等 { cmp_inst(op,fuc1,fuc2,"==","!=",i);//判断语句的识别,包括了while } else if(strcmp(op,"cmple")==0)//比较小于等于 { cmp_inst(op,fuc1,fuc2,"<=",">",i); } else if(strcmp(op,"cmplt")==0)//比较小于 { cmp_inst(op,fuc1,fuc2,"<",">=",i); } else if(strcmp(op,"load")==0)//加载内存数据,全局变量,结构体,数组 { int reg=0; sscanf(fuc1,"(%d)",®); transform_load(reg,i);//load指令的转化,转化为一个简单的表达式,用于之后的使用 } else if(strcmp(op,"store")==0)//存储内存数据,全局变量,结构体,数组 { char v1[expr_size],v2[expr_size]; int reg1,reg2=0; int t1=get_op(fuc1,v1,reg1);//获取当前参数是 常数,变量(全局/局部),表达式 int t2=get_op(fuc2,v2,reg2); if(t1==2) get_expr(reg1,v1);//获取表达式 if(t2==2) get_expr(reg2,v2); sprintf(inst[i]," %s=%s",v2,v1); add_tab();//添加tab fprintf(fw,"%s=%s;\n",v2,v1); } else if(strcmp(op,"expr")==0) { int n=0; sscanf(fuc1,"%d",&n); get_expr(n,fuc1); } else if(strcmp(op,"param")==0)//参数,用于函数调用 { translate_fuc(i);//函数调用转化,带参数,返回时为call指令 } else if(strcmp(op,"call")==0)//无参数的函数调用 { int reg=0; sscanf(fuc1,"[%d]",®); add_tab(); fprintf(fw,"fuction_%d();\n"); } else if(strcmp(op,"else")==0)//辅助指令,用于else { add_tab(); fprintf(fw,"else\n"); add_tab(); fprintf(fw,"{\n"); num_big++; int t=0; sscanf(fuc1,"%d",&t); extra[t]++; } else if(strcmp(op,"write")==0)//输出 { char v1[expr_size]; int reg=0; int t=get_op(fuc1,v1,reg); if(t==2) get_expr(reg,v1); add_tab(); fprintf(fw,"WriteLong(%s);\n",v1); } else if(strcmp(op,"wrl")==0)//换行 { add_tab(); fprintf(fw,"WriteLine();\n"); } else if(simple_expr(op))//简单的表达式,add,sub,mul,div,mod,neg,move { char dst[expr_size]; get_expr(i,dst); if(strcmp(op,"move")==0) { add_tab(); fprintf(fw,"%s;\n",dst); } } else if(strcmp(op,"ret")==0)//函数返回指令 { num_big--; add_tab(); fprintf(fw,"}\n"); } } }