📄 main.c
字号:
#include <stdio.h>#include <sys/types.h> // uint64_t#include <stdlib.h>#include <ncurses.h>#include "gpl.h"#include "ui.h"#ifdef FREEBSD #define file_position_t uint64_t#endif#ifdef LINUX #include <stdint.h> #define file_position_t uint64_t#endif#ifdef IRIX #define file_position_t fpos_t#endif#ifdef SOLARIS #define file_position_t fpos64_t#endif#ifdef HPUX #define file_position_t fpos64_t#endifFILE* inputfile;FILE* inputfile2;int obenanfangen=1;file_position_t cursorpos;unsigned int cols;int rows;FILE *inputfile;file_position_t chpos[524288];unsigned char change[524288];int chnum=0;char* searchstring;int searchstring2[255];unsigned int searchstring2len=0;int searchstring3[255];unsigned int searchstring3len=0;char* writesearchfilename;char* readsearchfilename;FILE *readsearchfile;int writesearch=0;int readsearch=0;int kmp[256];int kmpback[256];int diffnotedit=0;char* tohex(char x){ char ziffern[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; char* ch; int z=(int)x; if (z<0) z=256+z; ch=malloc(3); ch[0]=ziffern[z/16]; ch[1]=ziffern[z%16]; ch[2]=0; return ch; }void print_pos(WINDOW *parent_window, file_position_t p,int y){ mvwprintw(parent_window,y,0,"%10X",(unsigned long) p); }void print_hex(WINDOW *parent_window,file_position_t p,file_position_t cursorpos,file_position_t filesize,file_position_t rfilesize,int hexnotasc,int ch2){ unsigned char buffer[2]; float f; unsigned int i; int j; int x; int y; int c; file_position_t ap=p; f=(float)COLS-10; f=f/4.125; cols=(int)f; x=COLS-10-((int)((float)cols*4.125)); rows=LINES-2; wattrset(parent_window,attrs[COLOR_BRACKETS]); mvwprintw(parent_window,0,1,"[ / ]"); wattrset(parent_window,attrs[COLOR_TEXT]); mvwprintw(parent_window,0,2,"%10X",(unsigned long)cursorpos); mvwprintw(parent_window,0,13,"%10X",(unsigned long)(filesize-1)); wattrset(parent_window,attrs[COLOR_HEXFIELD]); fseek(inputfile,p,SEEK_SET); for (y=1;y<LINES-1;y++) { wattrset(parent_window,attrs[COLOR_HEXFIELD]); print_pos(parent_window,p+(y-1)*cols,y); for (i=0;i<cols;i++) { if (!feof(inputfile)) fgets(buffer,sizeof(buffer),inputfile); c=buffer[0]; if (chnum!=0) for (j=0;j<chnum;j++) if (ap==chpos[j]) c=change[j]; f=(float)i; f=f*3.125; if (ap==cursorpos && hexnotasc==1 && ap<=filesize) { if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_CURSOR]); else wattrset(parent_window,attrs[COLOR_DIFF_CURSOR]); if (ap>=rfilesize) wattrset(parent_window,attrs[COLOR_DIFF_CURSOR]); } else { if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_HEXFIELD]); else wattrset(parent_window,attrs[COLOR_DIFF]); if (ap>=rfilesize) wattrset(parent_window,attrs[COLOR_DIFF]); } if (ch2==0 || ap!=cursorpos) if (ap<filesize) mvwprintw(parent_window,y,(int)f+10+x/2,"%s",tohex(c)); else mvwprintw(parent_window,y,(int)f+10+x/2," "); else if (ch2!=0 && ap==cursorpos) { mvwprintw(parent_window,y,(int)f+10+x/2,"%c ",ch2); } wattrset(parent_window,attrs[COLOR_HEXFIELD]); mvwprintw(parent_window,y,(int)f+12+x/2," "); if (ap==cursorpos && hexnotasc==0 && ap<=filesize) { if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_CURSOR]); else wattrset(parent_window,attrs[COLOR_DIFF_CURSOR]); } else { if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_HEXFIELD]); else wattrset(parent_window,attrs[COLOR_DIFF]); } if (ap<filesize) if (c>=32 && c<=127) mvwprintw(parent_window,y,(int)i+(COLS-cols),"%c",(char)c); else mvwprintw(parent_window,y,(int)i+(COLS-cols),"."); else mvwprintw(parent_window,y,(int)i+(COLS-cols)," "); ap++; } } }void print_hex_diff( WINDOW *parent_window, file_position_t p, file_position_t cursorpos, file_position_t filesize1, file_position_t filesize2, char* filename2){ unsigned char buffer[2]; unsigned char buffer2[2]; float f; unsigned int i; int x; int y; int b; file_position_t ap=p; f=(float)COLS-10; f=f/4.125; cols=(int)f; x=COLS-10-((int)((float)cols*4.125)); rows=LINES-2; b=(LINES-1)/2; draw_mainheadline(parent_window,b,filename2); wattrset(parent_window,attrs[COLOR_BRACKETS]); mvwprintw(parent_window,0,1,"[ / ]"); mvwprintw(parent_window,b,1,"[ / ]"); wattrset(parent_window,attrs[COLOR_TEXT]); mvwprintw(parent_window,0,2,"%10X",(unsigned long)cursorpos); mvwprintw(parent_window,0,13,"%10X",(unsigned long)(filesize1-1)); mvwprintw(parent_window,b,2,"%10X",(unsigned long)cursorpos); mvwprintw(parent_window,b,13,"%10X",(unsigned long)(filesize2-1)); wattrset(parent_window,attrs[COLOR_HEXFIELD]); fseek(inputfile,p,SEEK_SET); fseek(inputfile2,p,SEEK_SET); for (y=1;y<b;y++) { wattrset(parent_window,attrs[COLOR_HEXFIELD]); print_pos(parent_window,p+(y-1)*cols,y); print_pos(parent_window,p+(y-1)*cols,y+b); for (i=0;i<cols;i++) { if (!feof(inputfile)) fgets(buffer,sizeof(buffer),inputfile); if (!feof(inputfile2)) fgets(buffer2,sizeof(buffer2),inputfile2); // TODO: find a nice and satisfactional way to edit two files at once!/* c=buffer[0]; if (chnum!=0) for (j=0;j<chnum;j++) if (ap==chpos[j]) c=change[j]; f=(float)i; f=f*3.125; if (ap==cursorpos && hexnotasc==1 && ap<=filesize) { if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_CURSOR]); else wattrset(parent_window,attrs[COLOR_MENU_HOTKEY_HI]); if (ap>=rfilesize) wattrset(parent_window,attrs[COLOR_MENU_HOTKEY_HI]); } else { if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_BRACKETS]); else wattrset(parent_window,attrs[COLOR_MENU_HOTKEY]); if (ap>=rfilesize) wattrset(parent_window,attrs[COLOR_MENU_HOTKEY]); } if (ch2==0 || ap!=cursorpos) if (ap<filesize) mvwprintw(parent_window,y,(int)f+10+x/2,"%s",tohex(c)); else mvwprintw(parent_window,y,(int)f+10+x/2," "); else if (ch2!=0 && ap==cursorpos) { mvwprintw(parent_window,y,(int)f+10+x/2,"%c ",ch2); } wattrset(parent_window,attrs[COLOR_BRACKETS]); mvwprintw(parent_window,y,(int)f+12+x/2," "); if (ap==cursorpos && hexnotasc==0 && ap<=filesize) { if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_CURSOR]); else wattrset(parent_window,attrs[COLOR_MENU_HOTKEY_HI]); } else { if (c==buffer[0]) wattrset(parent_window,attrs[COLOR_BRACKETS]); else wattrset(parent_window,attrs[COLOR_MENU_HOTKEY]); } if (ap<filesize) if (c>=32 && c<=127) mvwprintw(parent_window,y,(int)i+(COLS-cols),"%c",(char)c); else mvwprintw(parent_window,y,(int)i+(COLS-cols),"."); else mvwprintw(parent_window,y,(int)i+(COLS-cols)," "); */ f=(float)i; f=f*3.125; if (buffer[0]!=buffer2[0] || ap>=filesize1 || ap>=filesize2) wattrset(parent_window,attrs[COLOR_DIFF]); else wattrset(parent_window,attrs[COLOR_HEXFIELD]); if (ap<filesize1) mvwprintw(parent_window,y,(int)f+10+x/2,"%s",tohex(buffer[0])); else mvwprintw(parent_window,y,(int)f+10+x/2," "); if (ap<filesize2) mvwprintw(parent_window,y+b,(int)f+10+x/2,"%s",tohex(buffer2[0])); else mvwprintw(parent_window,y+b,(int)f+10+x/2," "); if (ap<filesize1) if (buffer[0]>=32 && buffer[0]<=127) mvwprintw(parent_window,y,(int)i+(COLS-cols),"%c",(char)buffer[0]); else mvwprintw(parent_window,y,(int)i+(COLS-cols),"."); else mvwprintw(parent_window,y,(int)i+(COLS-cols)," "); if (ap<filesize2) if (buffer2[0]>=32 && buffer2[0]<=127) mvwprintw(parent_window,y+b,(int)i+(COLS-cols),"%c",(char)buffer2[0]); else mvwprintw(parent_window,y+b,(int)i+(COLS-cols),"."); else mvwprintw(parent_window,y+b,(int)i+(COLS-cols)," "); wattrset(parent_window,attrs[COLOR_HEXFIELD]); mvwprintw(parent_window,y,(int)f+12+x/2," "); mvwprintw(parent_window,y+b,(int)f+12+x/2," "); ap++; } } wrefresh(parent_window); }char* tobin(unsigned int value){ char* s; unsigned int i; s=malloc(20); s[19]=0; for (i=0;i<19;i++) { if (value & (1<<i)) { s[18-i]='1'; } else { s[18-i]='0'; } } for (i=0;i<18;i++) { if (s[i]=='0') s[i]=' '; else i=18; } return s;}char* tooct(unsigned int value){ char *s; int i; s=malloc(20); s[19]=0; for (i=0;i<19;i++) { s[18-i]=48+(value%8); value=value/8; } for (i=0;i<18;i++) { if (s[i]=='0') s[i]=' '; else i=18; } return s;}char* toint(unsigned int value){ char *s; int i; s=malloc(20); s[19]=0; for (i=0;i<19;i++) { s[18-i]=48+(value%10); value=value/10; } for (i=0;i<18;i++) { if (s[i]=='0') s[i]=' '; else i=18; } return s;}char* tohex2(unsigned int value,int maxlen){ char *s; int i; s=malloc(maxlen+1); for (i=0;i<maxlen;i++) { s[maxlen-1-i]=48+(value%16); value=value/16; if (s[maxlen-1-i]>=58) s[maxlen-1-i]=s[maxlen-1-i]+7; } for (i=0;i<maxlen-1;i++) { if (s[i]=='0') s[i]=' '; else i=18; } return s;}int stobin(const char* s){ unsigned int i; int v=0; for (i=0;i<strlen(s);i++) { if (s[i]=='0') v=v<<1; if (s[i]=='1') v=(v<<1)+1; } return v;}int stooct(const char* s){ unsigned int i; int v=0; for (i=0;i<strlen(s);i++) { if (s[i]>='0' && s[i]<='7') v=v*8+(s[i]-48); } return v;}int stoint(const char* s){ unsigned int i; int v=0; for (i=0;i<strlen(s);i++) { if (s[i]>='0' && s[i]<='9') v=v*10+(s[i]-48); } return v;}file_position_t stohex(const char* s){ file_position_t i; file_position_t v=0; for (i=0;i<strlen(s);i++) { if (s[i]>='0' && s[i]<='9') v=v*16+(s[i]-48); if (s[i]>='A' && s[i]<='F') v=v*16+(s[i]-55); if (s[i]>='a' && s[i]<='f') v=v*16+(s[i]-87); } return v;}void hexcalc(WINDOW* parent_window){ int wtop; int wbot; int wleft; int wright; int m=0; long value=45054; char* s; wtop=LINES/2-3; wbot=wtop+7; wleft=COLS/2-15; wright=wleft+30; new_menu(1); menu_item(0,wtop+1,wleft+1,"%Binary",'b','B',0); menu_item(1,wtop+2,wleft+1,"%%Octal",'o','O',0); menu_item(2,wtop+3,wleft+1,"%%Decimal",'d','D',0); menu_item(3,wtop+4,wleft+1,"%%Hexadec",'h','H',0); menu_item(4,wtop+6,wleft+1,"E%%xit Hexcalc",'x','X',0); m=0; if (LINES>9 && COLS>30) { draw_frame(parent_window,wtop,wleft,wbot,wright,' '); headline(parent_window,wtop,wleft,"HEXCALC"); while (m!=4) { wattrset(parent_window,attrs[COLOR_BRACKETS]); mvwprintw(parent_window,wtop+1,wleft+9,"[ ]"); mvwprintw(parent_window,wtop+2,wleft+9,"[ ]"); mvwprintw(parent_window,wtop+3,wleft+9,"[ ]"); mvwprintw(parent_window,wtop+4,wleft+9,"[ ]"); wattrset(parent_window,attrs[COLOR_TEXT]); mvwprintw(parent_window,wtop+1,wleft+10,"%s",tobin(value)); mvwprintw(parent_window,wtop+2,wleft+10,"%19o",value); mvwprintw(parent_window,wtop+3,wleft+10,"%19i",value); mvwprintw(parent_window,wtop+4,wleft+10,"%19X",value); m=menu_show(parent_window); if (m==0) { s=input2(parent_window,wtop+1,wleft+10,19,tobin(value),19,0,0); value=stobin(s); free(s); } if (m==1) { s=input2(parent_window,wtop+2,wleft+10,19,tooct(value),19,0,0); value=stooct(s); free(s); } if (m==2) { s=input2(parent_window,wtop+3,wleft+10,19,toint(value),19,0,0); value=stoint(s); free(s); } if (m==3) { s=input2(parent_window,wtop+4,wleft+10,19,tohex2(value,19),19,0,0); value=(int)stohex(s); free(s); } } wattrset(parent_window,attrs[COLOR_HEXFIELD]); erase_frame(parent_window,wtop,wleft,wbot,wright,' '); }}void draw_menu(WINDOW* parent_window){ wattrset(parent_window,attrs[COLOR_MENU]); mvwprintw(parent_window,LINES-1,1 ,"Search "); mvwprintw(parent_window,LINES-1,9 ,"Goto "); mvwprintw(parent_window,LINES-1,17,"HexCalc"); mvwprintw(parent_window,LINES-1,25," "); mvwprintw(parent_window,LINES-1,33,"Next "); mvwprintw(parent_window,LINES-1,41,"Previou"); mvwprintw(parent_window,LINES-1,49," "); mvwprintw(parent_window,LINES-1,57," ");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -