#include #include #include #include // TODO: Skip repeating lines #define BYTES 1024 //#define BYTES_PER_LINE 10 #define round(x) (int)(x < 0 ? (x -0.5) : x + 0.5) void print_hex(unsigned char* buf, int byteno, int pos, int BYTES_PER_LINE) { for (int i=0; i\nInline commands:\n\tpX - print position X\n\teX - edit position X\n\ts - save modified buffer\n\tq - quit\n", argv[0]); return -1; } struct winsize w; ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); int BYTES_PER_LINE = round((w.ws_col-14)/4); FILE* f = fopen(argv[1], "rb+"); if (!f) { printf("Error opening file %s\n", argv[1]); return -1; } unsigned char buf[BYTES]; int byteno = fread(buf, 1, BYTES, f); print_hex(buf, byteno, 0, BYTES_PER_LINE); for (;;) { char cmd; int loc; scanf(" %c", &cmd); if (cmd == 'p' || cmd == 'e') scanf("%d", &loc); switch(cmd) { case 'p': print_hex(buf + loc, BYTES_PER_LINE, loc, BYTES_PER_LINE); break; case 'e': int value; scanf("%x", &value); if (loc < byteno) buf[loc] = (unsigned char)value; break; case 's': fseek(f, 0, SEEK_SET); fwrite(buf, 1, byteno, f); fclose(f); return 0; break; case 'q': return 0; } } }