/* +----------------+ | Ascii View | +----------------+ */ #include #include #include "hexdiff.h" /*----------------------------------------------------------------*/ static void av_sauve_contexte(void) { /* code to be defined ? */ } /*----------------------------------------------------------------*/ static void av_restaure_contexte(void) { /* code to be defined ? */ } /*----------------------------------------------------------------*/ static char * ascii_name(int code) { static char static_buffer[20]; /* XXX this big switch must be audited.... */ switch (code) { case 0: return "NUL"; case 1: return "SOH ^a"; case 2: return "STX ^b"; case 3: return "ETX ^c"; case 4: return "EOT ^d"; case 5: return "ENQ ^e"; case 6: return "ACQ ^f"; case 7: return "BEL ^g"; case 8: return "BS ^h"; case 9: return "HT ^i"; case 10: return "LF ^j"; case 11: return "VT ^k"; case 12: return "FF ^l"; case 13: return "CR ^m"; case 14: return "SO ^n"; case 15: return "SI ^o"; case 16: return "DLE ^p"; case 17: return "DC1 ^q"; case 18: return "DC2 ^r"; case 19: return "DC3 ^s"; case 20: return "DC4 ^t"; case 21: return "NAK ^u"; case 22: return "SYN ^v"; case 23: return "ETB ^w"; case 24: return "CAN ^x"; case 25: return "EM ^y"; case 26: return "SUB ^z"; case 27: return "ESC"; case 28: return "FS "; case 29: return "GS "; case 30: return "RS "; case 31: return "US "; case 32: return "SPACE"; case 127: return "DEL"; } if (code < 128) { sprintf(static_buffer, "'%c'", code); return static_buffer; } /* may be for code > 127, we can put the "html" code &blabla; ? */ return ""; } /*----------------------------------------------------------------*/ #define ASCV_I2LIG(idx) ((idx)>>6) #define ASCV_I2COL(idx) ((idx)&63) static int av_affiche(Fichier *fic, WINDOW *pop, int clig, int ccol) { int foo, lig, col, car; char chaine[100]; long depl; unsigned char octet; wstandout(pop); for (foo=1; foo<65; foo++) mvwaddch(pop, 1, foo, ' '); mvwaddstr(pop, 1, 2, fic->nom); depl = (clig*64)+ccol; octet = fic->buffer[depl]; sprintf(chaine, "%7ld : %3d 0x%02x 0%03o", fic->offset+depl, octet, octet, octet); mvwaddstr(pop, 18, 1, chaine); mvwaddstr(pop, 18, 33, " "); mvwaddstr(pop, 18, 33, ascii_name(fic->buffer[depl])); wstandend(pop); for (foo=0; foo<16*64; foo++) { lig = ASCV_I2LIG(foo); col = ASCV_I2COL(foo); car = fic->buffer[foo]; car = is_printable(car) ? car : ' '; if (clig==lig && ccol==col) wstandout(pop); mvwaddch(pop, lig+2, col+1, car); if (clig==lig && ccol==col) wstandend(pop); } /* put the cursor at the current location */ /* this was a really bad idea for Xterm users, because * current pos char was written in "standout", and the * text cursor of xterm re-reverse it. * XXX wmove(pop, clig+2, ccol+1); */ wmove(pop,1,64); wrefresh(pop); return 0; } /*----------------------------------------------------------------*/ /* new: 2004 Nov. * still in developement. */ int asciiview(void) { WINDOW * popup; int foo, key, flag_exit; int clig, ccol; /* position du curseur */ Fichier * fic; av_sauve_contexte(); popup = newwin(21, 66, 3, 5); bordure(popup); wstandout(popup); for (foo=1; foo<65; foo++) mvwaddch(popup, 19, foo, ' '); mvwaddstr(popup, 19, 1, " 'Q' quit, see other file"); for (foo=1; foo<65; foo++) mvwaddch(popup, 18, foo, ' '); wstandend(popup); wrefresh(popup); flag_exit = 0; clig = ccol = 0; do { if (fenetre_active==0) fic = &f1; else fic = &f2; av_affiche(fic, popup, clig, ccol); key = getch(); switch (key) { case 'q': case 'Q': flag_exit = 1; break; case '\t': fenetre_active ^= 1; break; case KEY_UP: if (clig>0) clig--; break; case KEY_DOWN: if (clig<15) clig++; break; case KEY_LEFT: if (ccol>0) ccol--; else if (clig>0) { /* go to the previous line */ ccol=63; clig--; } break; case KEY_RIGHT: if (ccol<63) ccol++; else if (clig<15) { /* go to the next line */ ccol=0; clig++; } break; case KEY_HOME: ccol = clig = 0; break; case KEY_END: ccol = 63; clig = 15; break; default: flash(); break; } } while ( ! flag_exit ); delwin(popup); av_restaure_contexte(); return 42; } /*----------------------------------------------------------------*/ /*----------------------------------------------------------------*/