📄 main.c
字号:
mvwprintw(parent_window,LINES-1,65,"UnDo "); mvwprintw(parent_window,LINES-1,73,"Exit "); wattrset(parent_window,attrs[COLOR_MENU_HOTKEY]); mvwprintw(parent_window,LINES-1,0,"1"); mvwprintw(parent_window,LINES-1,8,"2"); mvwprintw(parent_window,LINES-1,16,"3"); mvwprintw(parent_window,LINES-1,24,"4"); mvwprintw(parent_window,LINES-1,32,"5"); mvwprintw(parent_window,LINES-1,40,"6"); mvwprintw(parent_window,LINES-1,48,"7"); mvwprintw(parent_window,LINES-1,56,"8"); mvwprintw(parent_window,LINES-1,64,"9"); mvwprintw(parent_window,LINES-1,72,"0"); }void exit_yesno(WINDOW* parent_window,char* filename){ int wtop; int wbot; int wleft; int wright; int m,i; wtop=LINES/2-2; wbot=wtop+4; wleft=COLS/2-16; wright=wleft+33; new_menu(0); menu_item(1,wtop+3,wleft+1,"<%%Yes>",'y','Y',0); menu_item(2,wtop+3,wleft+15,"<%%No>",'n','N',0); menu_item(0,wtop+3,wleft+25,"<%%Cancel>",'d','D',0); if (LINES>9 && COLS>32) { draw_frame(parent_window,wtop,wleft,wbot,wright,' '); wattrset(parent_window,attrs[COLOR_TEXT]); mvwprintw(parent_window,wtop+1,wleft+1,"Do you want to save the changes?"); headline(parent_window,wtop,wleft,"EXIT"); m=menu_show(parent_window); if (m==2) finish(0); if (m==1) { fclose(inputfile); inputfile=fopen(filename,"r+"); for (i=0;i<chnum;i++) { fseek(inputfile,chpos[i],SEEK_SET); fprintf(inputfile,"%c",change[i]); } fclose(inputfile); finish(0); } wattrset(parent_window,attrs[COLOR_HEXFIELD]); erase_frame(parent_window,wtop,wleft,wbot,wright,' '); }}void printsearchstring3(WINDOW* parent_window,int y,int x,int offset){ unsigned int i; for (i=0;i<10 ;i++) { if ((i+offset)<searchstring3len) { mvwprintw(parent_window,y,x+i*3,tohex(searchstring3[i+offset]&255)); mvwprintw(parent_window,y,x+2+i*3," "); if ((searchstring3[i+offset]&256)==256) mvwprintw(parent_window,y,x+i*3,"."); if ((searchstring3[i+offset]&512)==512) mvwprintw(parent_window,y,x+1+i*3,"."); } else mvwprintw(parent_window,y,x+i*3," "); }}void kmpPreprocesshex(){ unsigned int i=0; int j=-1; kmp[i]=j; while ( i < searchstring2len) { while (j>=0 && searchstring2[i]!=searchstring2[j]) { j=kmp[j]; } i++; j++; kmp[i]=j; } }void kmpPreprocesshexback(){ int i=searchstring2len-1; int j=-1; kmpback[i]=j; while (i>=0) { while (j>=0 && searchstring2[i]!=searchstring2[j]) { j=kmpback[j]; } i--; j++; kmpback[i]=j; } }file_position_t searchforwardhex( file_position_t cursorpos, file_position_t filesize){ unsigned char buffer[524288]; FILE *writesearchfile = NULL; file_position_t cp=cursorpos; file_position_t ocp=cursorpos; file_position_t t = 0; int i=0; int j=0; int k=sizeof(buffer); kmpPreprocesshex(); if (writesearch==1) { writesearchfile=fopen(writesearchfilename,"w"); fprintf(writesearchfile,"#DHEXSEARCHFILE\n#VERSION 0\n"); cp=0; ocp=0; } fseek(inputfile,cp,0); while (cp<filesize) { if (k==sizeof(buffer)) { if (!feof(inputfile)) fread(buffer,sizeof(buffer),1,inputfile); for (i=0;i<chnum;i++) { if (chpos[i]>=ocp && chpos[i]<=ocp+sizeof(buffer)) { buffer[chpos[i]-ocp]=change[i]; } } ocp=cp; k=0; } while (j>=0 && buffer[k]!=searchstring2[j]) j=kmp[j]; k++; j++; cp++; if ((unsigned int) j == searchstring2len && t!=ocp+k-j) { //GEFUNDEN t=ocp+k-j; if (writesearch==1) { fprintf( writesearchfile,"%04X%04X%04X%04X\n", ((int)((t>>48)&65535)), ((int)((t>>32)&65535)), ((int)((t>>16)&65535)), ((int)(t&65535))); } else { return t; } j=kmp[j]; } } if (writesearch==1) fclose(writesearchfile); return cursorpos;}file_position_t searchbackwardhex(file_position_t cursorpos,file_position_t filesize,int hexnotasc){ /* remove me */ filesize = 0; /* remove me */ hexnotasc = 0; kmpPreprocesshexback(); return cursorpos;}file_position_t searchbackwardhex2(file_position_t cursorpos,file_position_t filesize){ /* remove me */ filesize = 0; return cursorpos;}file_position_t searchforwardhex2(file_position_t cursorpos){ file_position_t cp; file_position_t ocp = cursorpos; unsigned char buffer[256]; unsigned char p[524288]; FILE *writesearchfile = NULL; unsigned int i; int mismatch; if (obenanfangen==1 || writesearch==1 || cursorpos==0) readsearchfile=fopen(readsearchfilename,"r"); obenanfangen=0; if (writesearch==1) { writesearchfile=fopen(writesearchfilename,"w"); fprintf(writesearchfile,"#DHEXSEARCHFILE\n#VERSION 0\n"); } while (!feof(readsearchfile)) { fgets(p,sizeof(p),readsearchfile); if (p[0]!='#') { cp=stohex(p); fseek(inputfile,cp,SEEK_SET); fread(buffer,sizeof(buffer),1,inputfile); mismatch=0; for (i=0;mismatch==0 && i<searchstring2len;i++) if (buffer[i]!=searchstring2[i]) mismatch=1; if (mismatch==0 && cp!=ocp) { ocp=cp; if (writesearch==1) fprintf(writesearchfile,"%04X%04X%04X%04X\n",((int)((cp>>48)&65535)),((int)((cp>>32)&65535)),((int)((cp>>16)&65535)),((int)(cp&65535))); else return cp; } } } if (writesearch==1) fclose(writesearchfile); if (feof(readsearchfile)) { fclose(readsearchfile); obenanfangen=1; } return cursorpos; }int searchfor(WINDOW* parent_window,int hexnotasc){ int wtop; int wbot; int wleft; int wright; int ch; char* s; int m; unsigned int i; int cursor; unsigned int offset; int doit=0; wtop=LINES/2-6; wbot=wtop+12; wleft=COLS/2-16; wright=wleft+33; m=0; new_menu(1); if(hexnotasc==1) menu_item(0,wtop+1,wleft+1,"%%Searchstring (Hex)",'s','S',0); else menu_item(0,wtop+1,wleft+1,"%%Searchstring (Asc)",'s','S',0); menu_item(1,wtop+4,wleft+1,"Search %Forward",'f','F',0); menu_item(2,wtop+5,wleft+1,"Search %Backwards",'b','B',0); menu_item(3,wtop+6,wleft+5,"%Write Result to file",'w','W',0); menu_item(4,wtop+7,wleft+1," ",0,0,0); menu_item(5,wtop+8,wleft+5,"%Read Searchpos. from file",'r','R',0); menu_item(6,wtop+9,wleft+1," ",0,0,0); menu_item(7,wtop+11,wleft+1,"%%Cancel",0,0,0); if (LINES>10 && COLS>32) { draw_frame(parent_window,wtop,wleft,wbot,wright,' '); if (hexnotasc==1) headline(parent_window,wtop,wleft,"SEARCH HEXSTRING"); else headline(parent_window,wtop,wleft,"SEARCH ASCIISTRING"); while (m!=1 && m!=2 && m!=7) { wattrset(parent_window,attrs[COLOR_BRACKETS]); mvwprintw(parent_window,wtop+2,wleft+1,"[ ]"); mvwprintw(parent_window,wtop+7,wleft+2,"[ ]"); mvwprintw(parent_window,wtop+9,wleft+2,"[ ]"); mvwprintw(parent_window,wtop+6,wleft+1,"( )"); mvwprintw(parent_window,wtop+8,wleft+1,"( )"); wattrset(parent_window,attrs[COLOR_TEXT]); if (hexnotasc==1) { printsearchstring3(parent_window,wtop+2,wleft+2,0); } else if (strlen(searchstring)<=30) { mvwprintw(parent_window,wtop+2,wleft+2,"%s",searchstring); } else { for (i=0;i<30;i++) { mvwprintw(parent_window,wtop+2,wright-2-i,"%c",searchstring[strlen(searchstring)-1-i]); } } if (writesearch==1) mvwprintw(parent_window,wtop+6,wleft+2,"X"); else { wattrset(parent_window,attrs[COLOR_BRACKETS]); mvwprintw(parent_window,wtop+6,wleft+2," "); } if (strlen(writesearchfilename)<=29) { mvwprintw(parent_window,wtop+7,wleft+3,"%s",writesearchfilename); } else { for (i=0;i<29;i++) { mvwprintw(parent_window,wtop+7,wright-2-i,"%c",writesearchfilename[strlen(writesearchfilename)-1-i]); } } wattrset(parent_window,attrs[COLOR_TEXT]); if (readsearch==1) mvwprintw(parent_window,wtop+8,wleft+2,"X"); else { wattrset(parent_window,attrs[COLOR_BRACKETS]); mvwprintw(parent_window,wtop+8,wleft+2," "); } if (strlen(readsearchfilename)<=29) { mvwprintw(parent_window,wtop+9,wleft+3,"%s",readsearchfilename); } else { for (i=0;i<29;i++) { mvwprintw(parent_window,wtop+9,wright-2-i,"%c",readsearchfilename[strlen(readsearchfilename)-1-i]); } } m=menu_show(parent_window); if (m==7 || m==1 || m==2) { wattrset(parent_window,attrs[COLOR_HEXFIELD]); erase_frame(parent_window,wtop,wleft,wbot,wright,' '); if (hexnotasc==1 && searchstring2len>0) { for (i=searchstring3len-1;i>0;i--) { if (searchstring3[i]>=768) { searchstring3len--; } else i=0; } } } if (m==7) return 0; if (m==0) { if (hexnotasc==1) { cursor=0; offset=0; wattrset(parent_window,attrs[COLOR_CURSOR]); ch=0; while (ch!=13) { printsearchstring3(parent_window,wtop+2,wleft+2,offset); wmove(parent_window,wtop+2,wleft+2+cursor); ch=0; while ((ch!=8) && (ch!=KEY_BACKSPACE) && (ch!='.') && (ch!=13) && (ch!=KEY_RIGHT) && (ch!=KEY_LEFT) && ((ch<'0') || (ch>'9')) && ((ch<'A') || (ch>'F')) && ((ch<'a') || (ch>'f'))) ch=getch2(); if (ch=='.') ch=0; // TODO: how do i handle wildcards with kmp? if ((ch==8) || (ch==KEY_BACKSPACE)) { if (cursor/3+offset>0) { for (i=(cursor/3+offset);i<searchstring3len;i++) { searchstring3[i]=searchstring3[i+1]; } cursor=cursor-2; searchstring3len--; ch=KEY_LEFT; } } if (((ch>='0') && (ch<='9')) || ((ch>='a') && (ch<='f')) || ((ch>='A') && (ch<='F'))) { if ((ch>='0') && (ch<='9')) ch=ch-48; if ((ch>='A') && (ch<='F')) ch=ch-55; if ((ch>='a') && (ch<='f')) ch=ch-87; i=cursor/3+offset; if ((cursor%3)==0) { searchstring3[i]=(searchstring3[i]&527)+(ch<<4); if ((unsigned int) (cursor/3+offset)==searchstring3len) { searchstring3[i]=searchstring3[i]&240; searchstring3len++; } } if ((cursor%3)==1) searchstring3[i]=(searchstring3[i]&496)+ch; ch=KEY_RIGHT; } if (ch=='.') { i=cursor/3+offset; if ((cursor%3)==0) { if ((searchstring3[i]&256)!=256) searchstring3[i]=searchstring3[i]|256; if ((unsigned int) (cursor/3+offset)==searchstring3len) { searchstring3[i]=768; searchstring3len++; } } if ((cursor%3)==1) if ((searchstring3[i]&512)!=512) searchstring3[i]=searchstring3[i]|512; ch=KEY_RIGHT; } if ((ch==KEY_RIGHT) && ((((unsigned int)cursor/3+offset) <searchstring3len))) { cursor++; if ((cursor%3)==2) cursor++; } if ((ch==KEY_LEFT)) { cursor--; if ((cursor%3)==2) cursor--; } if (cursor>=30) { cursor=27; offset=offset+1; if ( offset >= searchstring3len-9) { if (searchstring3len>9) { offset=searchstring3len-9; } else { offset=0; } } } if (cursor<0) { cursor=0; if (offset) { offset--; } } } } else { s=malloc(strlen(searchstring)+1); strncpy(s,searchstring,strlen(searchstring)+1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -