#include #include #include struct data { struct data* plast; struct data* pnext; char vals[16][16]; }; WINDOW *stdscr,*woffs,*whex, *wascii, *wtop, *wbot; const char *topline= " Offset Hex ASCII"; char xoffs[] = "12345678",*soffs; char xhex[] = " 14 15 16 32 32 34 20 54 61 67 65 73 61 6D 74 0D ",*shex; char xascii[] = "1234567890123456",*sascii; int result; char *ptv="12345678"; FILE *fp; int ipoint; data daten,*pdaten,*pfirst, *phelp; void initvar() { pfirst=&daten; (*pfirst).plast=NULL; (*pfirst).pnext=NULL; soffs=xoffs; shex=xhex; sascii=xascii; } int screeninit() { int retval=0; stdscr= initscr(); if(start_color()) retval=1; nonl(); intrflush(stdscr, FALSE); keypad(stdscr, TRUE); // Zwei Fenster woffs =newwin(18,10,3 ,0 ); whex =newwin(18,52,3 ,10); wascii=newwin(18,18,3 ,62); wtop =newwin(3 ,80,0 ,0 ); wbot =newwin(4 ,80,21,0 ); // Scrollen erlauben scrollok(woffs,1); scrollok(whex,1); scrollok(wascii,1); // Color-Pairs anlegen (Farbkombinationen) if(init_pair(1,COLOR_BLUE,COLOR_BLACK)) retval=1; if(init_pair(2,COLOR_CYAN,COLOR_BLACK)) retval=1; wattrset(woffs,COLOR_PAIR(1)); wattrset(whex,COLOR_PAIR(1)); wattrset(wascii,COLOR_PAIR(1)); wattrset(wbot,COLOR_PAIR(1)); wattrset(wtop,COLOR_PAIR(1)); box(woffs,0,0); box(whex,0,0); box(wascii,0,0); box(wtop,0,0); box(wbot,0,0); wattrset(woffs,COLOR_PAIR(2)); wattrset(whex,COLOR_PAIR(2)); wattrset(wascii,COLOR_PAIR(2)); wattrset(wtop,COLOR_PAIR(2)); wattrset(wbot,COLOR_PAIR(2)); return(retval); } char* tohex(int base10) { int newbase=16; int erg; int rest=0; int pos=0; int i; static char swap[9]; char c[9]; swap="********"; c[pos]='0'+rest; while (base10 > 0) { erg=base10/newbase; rest=base10%newbase; if (rest <= 9) c[pos]='0'+rest; else c[pos]='A'+(rest-10); base10=erg; pos++; c[pos]='\0'; } while(pos < 8) { c[pos]='0'; pos++; } pos--; for (i=0;i<=pos;i++) { swap[i]=c[pos-i]; } return(swap); } int loadcontents() { int retval=0; int x,y; char ch; int k=0; pdaten=pfirst; ch=fgetc(fp); while (!(ch==EOF)) { k++; for(x=0;x<16;x++) for(y=0;y<16;y++) { ((*pdaten).vals[y][x])=ch; if ((*pdaten).vals[y][x]==EOF) (*pdaten).vals[y][x]=0; ch=fgetc(fp); } if(!(ch==EOF)) { phelp=pdaten; printf("Vorher:%p\n",pdaten); pdaten=((*pdaten).pnext)=(malloc(sizeof(daten))); printf("Nachher:%p\n" ,pdaten); (*pdaten).plast=phelp; (*pdaten).pnext=NULL; } } /* D E B U G O N L Y getchar(); pdaten=pfirst; while (k--) { for(x=0;x<16;x++) for(y=0;y<16;y++) { printf("%c-",(*pdaten).vals[y][x]); } pdaten=(*pdaten).pnext; } getchar(); --- END DEBUG ---*/ return (retval); } void endscr() { delwin(woffs); delwin(whex); delwin(wascii); delwin(wtop); delwin(wbot); endwin(); } void unallocmem() { int zv; pdaten=pfirst; for(;(*pdaten).pnext;pdaten=(*pdaten).pnext) ; while((*pdaten).plast) { phelp=(*pdaten).plast; free(pdaten); pdaten=phelp; } } int main(int argc, char *argv[]) { //Variablen unsigned int i,z; unsigned long zeile=0,pos=0; printf("%s\n",tohex(0)); printf("%s\n",tohex(10)); printf("%s\n",tohex(20)); printf("%s\n",tohex(30)); printf("%s\n",tohex(40)); printf("%s\n",tohex(50)); //Vorbereitung //Parameter angegeben? if(argc < 2) { fprintf(stderr,"THX-MESSAGE:\n\nUSAGE: %s \n",argv[0]); exit(1); } //Datei öffnen fp=fopen(argv[1],"r"); if (fp == NULL) { fprintf(stderr,"THX-MESSAGE:\n\nERROR opening file: %s \n",argv[1]); exit(2); } // pointer setzen initvar(); //Datei -> Speicher if(loadcontents()) { fprintf(stderr,"THX-MESSAGE:\n\nERROR reading %s (too less RAM?)\n",argv[1]); exit(3); } // Terminal initialisieren if(screeninit()) { endscr(); fprintf(stderr,"!!!Terminal not supported!!! -> Abort \n"); exit(5); } mvwaddstr(wtop,1,1,topline); mvwaddstr(wbot,1,1,argv[1]); //Hauptprogramm for (i=1;i<17;i++) { ptv = tohex(i-1); for(z=0;z<9;z++) { xoffs[z] = *(ptv+z); } mvwaddstr(woffs,i,1,soffs); for (z=0;z<16;z++) { ptv = tohex(daten.vals[z][i-1]); xhex[z*3+1] = *(ptv+6); xhex[z*3+2] = *(ptv+7); } mvwaddstr(whex,i,1,shex); for (z=0;z<16;z++) { xascii[z] = ((daten.vals[z][i-1]) > 33)?(daten.vals[z][i-1]):254; } mvwaddstr(wascii,i,1,sascii); } wrefresh(woffs); wrefresh(whex); wrefresh(wascii); wrefresh(wtop); wrefresh(wbot); sleep(1); endscr(); unallocmem(); return (fclose(fp)); }