Last active
May 6, 2018 23:44
-
-
Save MCJack123/68a91b2b4f6c225a88b6b85d328340f1 to your computer and use it in GitHub Desktop.
A simple ncurses-based hex editor supporting files up to 4GB
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// compile with: g++ -o hexedit -std=c++11 hexedit.cpp -lncurses | |
#include <iostream> | |
#include <fstream> | |
#include <sstream> | |
#include <string> | |
#include <utility> | |
#include <iomanip> | |
#include <stdint.h> | |
#include <math.h> | |
#include <ncurses.h> | |
#define ZERO byte(0) // quick 0x00 access | |
#include <vector> // for cache vector | |
#include <bitset> // for byte type | |
#include <map> // for memory map | |
class byte: public std::bitset<8> { | |
public: | |
using std::bitset<8>::bitset; | |
bool operator <(const byte &rhs) const { | |
return to_ulong() < rhs.to_ulong(); | |
} | |
bool operator >(const byte &rhs) const { | |
return to_ulong() > rhs.to_ulong(); | |
} | |
}; | |
class byte16: public std::bitset<32> { | |
public: | |
using std::bitset<32>::bitset; | |
bool operator <(const byte16 &rhs) const { | |
return to_ulong() < rhs.to_ulong(); | |
} | |
bool operator >(const byte16 &rhs) const { | |
return to_ulong() > rhs.to_ulong(); | |
} | |
}; | |
std::string intToHex( unsigned long i , size_t width ) | |
{ | |
std::stringstream stream; | |
stream << std::setfill ('0') << std::setw(width) << std::hex << i; | |
return stream.str(); | |
} | |
char makeChar(unsigned long l) { | |
if (l >= 32 && l < 128) return (char)l; | |
else return '.'; | |
} | |
int resize(int previous) { | |
//echo(); | |
WINDOW * win = newwin(4 - (LINES % 2), 14 + (COLS % 2), (LINES - 4 + (LINES % 2)) / 2, (COLS - 14 - (COLS % 2)) / 2); | |
keypad(win, TRUE); | |
int h, w; | |
getmaxyx(win, h, w); | |
//nodelay(win, TRUE); | |
bool odd = (LINES % 2) == 1; | |
int textx, texty, cursorpos; | |
std::vector<int> text; | |
if (odd) { | |
textx = 8; | |
texty = 1; | |
} else { | |
textx = 2; | |
texty = 2; | |
} | |
std::string previoustext = std::to_string(previous); | |
for (int i = 0; i < previoustext.size(); i++) text.push_back(previoustext[i] - 48); | |
cursorpos = text.size(); | |
if (cursorpos > 10) cursorpos = 10; | |
for (int j = 0; j < w; j++) { | |
mvwaddch(win, 0, j, '-'); | |
mvwaddch(win, h-1, j, '-'); | |
} | |
mvwaddch(win, 1, 0, '|'); | |
mvwaddch(win, 1, w - 1, '|'); | |
if (!odd) { | |
mvwaddch(win, 2, 0, '|'); | |
mvwaddch(win, 2, w - 1, '|'); | |
} | |
mvwaddstr(win, 1, 2, "Size:"); | |
mvwaddstr(win, texty, textx, std::to_string(previous).c_str()); | |
wrefresh(win); | |
bool done = false; | |
while (!done) { | |
int ch = wgetch(win); | |
switch (ch) { | |
case KEY_BACKSPACE: | |
if (cursorpos > 0) { | |
text.pop_back(); | |
mvwaddch(win, texty, textx + --cursorpos, ' '); | |
wmove(win, texty, textx + cursorpos); | |
} | |
break; | |
case 127: | |
if (cursorpos > 0) { | |
text.pop_back(); | |
mvwaddch(win, texty, textx + --cursorpos, ' '); | |
wmove(win, texty, textx + cursorpos); | |
} | |
break; | |
case KEY_ENTER: | |
done = true; | |
break; | |
case 10: | |
done = true; | |
break; | |
case '0': | |
if (cursorpos < 10) {text.push_back(0); mvwaddch(win, texty, textx + cursorpos++, '0');} | |
break; | |
case '1': | |
if (cursorpos < 10) {text.push_back(1); mvwaddch(win, texty, textx + cursorpos++, '1');} | |
break; | |
case '2': | |
if (cursorpos < 10) {text.push_back(2); mvwaddch(win, texty, textx + cursorpos++, '2');} | |
break; | |
case '3': | |
if (cursorpos < 10) {text.push_back(3); mvwaddch(win, texty, textx + cursorpos++, '3');} | |
break; | |
case '4': | |
if (cursorpos < 10) {text.push_back(4); mvwaddch(win, texty, textx + cursorpos++, '4');} | |
break; | |
case '5': | |
if (cursorpos < 10) {text.push_back(5); mvwaddch(win, texty, textx + cursorpos++, '5');} | |
break; | |
case '6': | |
if (cursorpos < 10) {text.push_back(6); mvwaddch(win, texty, textx + cursorpos++, '6');} | |
break; | |
case '7': | |
if (cursorpos < 10) {text.push_back(7); mvwaddch(win, texty, textx + cursorpos++, '7');} | |
break; | |
case '8': | |
if (cursorpos < 10) {text.push_back(8); mvwaddch(win, texty, textx + cursorpos++, '8');} | |
break; | |
case '9': | |
if (cursorpos < 10) {text.push_back(9); mvwaddch(win, texty, textx + cursorpos++, '9');} | |
break; | |
} | |
wrefresh(win); | |
} | |
int finalnum = 0; | |
for (int i = 0; i < text.size(); i++) finalnum += pow(10, i) * text[text.size()-i-1]; | |
wrefresh(win); | |
delwin(win); | |
//noecho(); | |
return finalnum; | |
} | |
std::pair<std::map<byte16, byte>, int> memEdit(std::map<byte16, byte> mem, int mapsize) { | |
//mapsize--; | |
initscr(); | |
cbreak(); | |
noecho(); | |
keypad(stdscr, TRUE); | |
nodelay(stdscr, TRUE); | |
if (COLS < 47) { | |
nodelay(stdscr, FALSE); | |
keypad(stdscr, FALSE); | |
echo(); | |
nocbreak(); | |
endwin(); | |
std::cout << "The terminal is too narrow for the editor! Exiting.\n"; | |
return std::make_pair(mem, mapsize); | |
} | |
int mode; | |
bool bars; | |
if (COLS < 50) {mode = 0; bars = false;} | |
else if (COLS >= 50 && COLS < 70) {mode = 0; bars = true;} | |
else if (COLS >= 70 && COLS < 80) {mode = 1; bars = true;} | |
else if (COLS >= 80 && COLS < 83) {mode = 2; bars = false;} | |
else {mode = 2; bars = true;} | |
for (int x = 0; x < COLS; x++) { | |
mvaddch(0, x, '-'); | |
mvaddch(LINES-1, x, '-'); | |
} | |
for (int y = 1; y < LINES - 1; y++) { | |
if (bars) mvaddch(y, 0, '|'); | |
if (mode == 2) mvaddch(y, 11+((int)bars*2), '|'); | |
if (bars) mvaddch(y, COLS-1, '|'); | |
if (mode > 0) mvaddch(y, COLS-18-((int)bars*2), '|'); | |
if (mode == 2) mvaddch(y, (int)bars * 2, '0'); | |
if (mode == 2) mvaddch(y, (int)bars * 2 + 1, 'x'); | |
refresh(); | |
} | |
unsigned int current_offset = 0x0000; | |
int typing = -1; | |
unsigned int top_offset = 0x0000; | |
unsigned int bottom_offset = 0x0010 * (LINES - 3); | |
while (true) { | |
for (int y = 1; y < LINES - 1; y++) { | |
if (mode == 2) mvaddstr(y, 2 + ((int)bars * 2), intToHex(0x0010 * (y - 1) + top_offset, 8).c_str()); | |
for (int off = 0; off < 16; off++) { | |
mvaddstr(y, (13 * (mode == 2)) + (3*off) + ((int)bars * 2), intToHex((uint8_t)mem[byte16((0x0010 * (y - 1)) + off + top_offset)].to_ulong(), 2).c_str()); | |
if (mode > 0) mvaddch(y, COLS - ((int)bars * 2) - (16-off), makeChar(mem[byte16((0x0010 * (y - 1)) + off + top_offset)].to_ulong())); | |
} | |
} | |
refresh(); | |
while (true) { | |
bool exit = false; | |
const char * curhex = intToHex((uint8_t)mem[byte16(current_offset)].to_ulong(), 2).c_str(); | |
//mvaddstr(0, 0, intToHex(bottom_offset, 4).c_str()); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), curhex[0] | A_STANDOUT); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), curhex[1] | A_STANDOUT); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong()) | A_STANDOUT); | |
refresh(); | |
Loop: | |
move(0, 0); | |
int ch = getch(); | |
switch (ch) { | |
case KEY_UP: | |
if (current_offset >= 0x0010) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), curhex[0]); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), curhex[1]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
current_offset -= 0x0010; | |
} else break; | |
if (top_offset > current_offset) { | |
top_offset -= 0x0010; | |
bottom_offset -= 0x0010; | |
int oldx, oldy; | |
getyx(stdscr, oldy, oldx); | |
move(LINES - 1, oldx); | |
exit = true; | |
} | |
break; | |
case KEY_DOWN: | |
if (current_offset < mapsize - 0x0010) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), curhex[0]); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), curhex[1]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
current_offset += 0x0010; | |
} else break; | |
if (bottom_offset < current_offset) { | |
bottom_offset += 0x0010; | |
top_offset += 0x0010; | |
int oldx, oldy; | |
getyx(stdscr, oldy, oldx); | |
move(LINES - 1, oldx); | |
refresh(); | |
exit = true; | |
} | |
break; | |
case KEY_LEFT: | |
if (current_offset > 0x0000 && current_offset % 0x0010 > 0) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), curhex[0]); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), curhex[1]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
current_offset--; | |
} | |
break; | |
case KEY_RIGHT: | |
if (current_offset < mapsize - 1 && current_offset % 16 < 15) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), curhex[0]); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), curhex[1]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
current_offset++; | |
} | |
break; | |
case 'r': { | |
int newSize = resize(mapsize); | |
if (newSize > mapsize) for (unsigned long i = mapsize; i < newSize; i++) mem[byte16(i)] = ZERO; | |
if (newSize < current_offset) { | |
current_offset = newSize - 1; | |
if (top_offset > current_offset) { | |
top_offset -= 0x0010; | |
bottom_offset -= 0x0010; | |
int oldx, oldy; | |
getyx(stdscr, oldy, oldx); | |
move(LINES - 1, oldx); | |
} | |
if (bottom_offset < current_offset) { | |
bottom_offset += 0x0010; | |
top_offset += 0x0010; | |
int oldx, oldy; | |
getyx(stdscr, oldy, oldx); | |
move(LINES - 1, oldx); | |
refresh(); | |
} | |
} | |
mapsize = newSize; | |
exit = true; | |
break; | |
} | |
case '0': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), ch | A_STANDOUT); | |
typing = 0; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 0); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), ch); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case '1': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), ch | A_STANDOUT); | |
typing = 1; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 1); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), ch); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case '2': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), ch | A_STANDOUT); | |
typing = 2; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 2); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), ch); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case '3': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), ch | A_STANDOUT); | |
typing = 3; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 3); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), ch); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case '4': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), ch | A_STANDOUT); | |
typing = 4; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 4); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), ch); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case '5': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), ch | A_STANDOUT); | |
typing = 5; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 5); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), ch); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case '6': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), ch | A_STANDOUT); | |
typing = 6; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 6); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), ch); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case '7': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), ch | A_STANDOUT); | |
typing = 7; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 7); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), ch); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case '8': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), ch | A_STANDOUT); | |
typing = 8; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 8); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), ch); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case '9': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), ch | A_STANDOUT); | |
typing = 9; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 9); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), ch); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case 'a': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), 'a' | A_STANDOUT); | |
typing = 10; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 10); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), 'a'); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case 'b': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), 'b' | A_STANDOUT); | |
typing = 11; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 11); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), 'b'); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case 'c': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), 'c' | A_STANDOUT); | |
typing = 12; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 12); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), 'c'); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case 'd': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), 'd' | A_STANDOUT); | |
typing = 13; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 13); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), 'd'); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case 'e': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), 'e' | A_STANDOUT); | |
typing = 14; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 14); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), 'e'); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case 'f': | |
if (typing == -1) { | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), 'f' | A_STANDOUT); | |
typing = 15; | |
refresh(); | |
goto Loop; | |
} else { | |
mem[byte16(current_offset)] = byte((typing * 16) + 15); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + 1 + ((int)bars * 2) + ((mode == 2) * 13), 'f'); | |
mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, ((current_offset % 0x0010) * 3) + ((mode == 2) * 13) + ((int)bars * 2), intToHex(typing, 1).c_str()[0]); | |
if (mode > 0) mvaddch(floor(current_offset / 0x0010) - (top_offset / 0x0010) + 1, COLS - ((int)bars * 2) - (16-(current_offset % 0x0010)), makeChar(mem[byte16(current_offset)].to_ulong())); | |
typing = -1; | |
if (current_offset < mapsize - 1) current_offset++; | |
} | |
break; | |
case 'q': | |
nodelay(stdscr, FALSE); | |
keypad(stdscr, FALSE); | |
echo(); | |
nocbreak(); | |
endwin(); | |
return std::make_pair(mem, mapsize); | |
default: | |
goto Loop; | |
} | |
if (exit) break; | |
} | |
} | |
nodelay(stdscr, FALSE); | |
keypad(stdscr, FALSE); | |
echo(); | |
nocbreak(); | |
endwin(); | |
return std::make_pair(mem, mapsize); | |
} | |
int main(int argc, const char * argv[]) { | |
if (argc < 2) { | |
std::cout << "Usage: " << argv[0] << " <file>\n"; | |
return 1; | |
} | |
std::ifstream in(argv[1], std::ios::in | std::ios::binary | std::ios::ate); | |
int size = in.tellg(); | |
if (size > pow(2, 32)) { | |
in.close(); | |
std::cout << "The file is too big to be read by this program.\n"; | |
return 2; | |
} | |
in.seekg(0); | |
std::map<byte16, byte> data; | |
while (!in.eof() && in.good()) data[byte16((unsigned long)in.tellg() - 1)] = byte((unsigned long)in.get()); | |
in.close(); | |
std::pair<std::map<byte16, byte>, int> retval; | |
retval = memEdit(data, size); | |
data = std::get<0>(retval); | |
std::ofstream out(argv[1], std::ios::out | std::ios::trunc); | |
for (unsigned long i = 0; i < std::get<1>(retval); i++) out.put((char)data[byte16(i)].to_ulong()); | |
out.close(); | |
return 0; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mode = 0, bars = false (COLS = 47-49) | |
----------------------------------------------- | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | |
----------------------------------------------- | |
mode = 0, bars = true (COLS = 50-69) | |
-------------------------------------------------- | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F| | |
-------------------------------------------------- | |
mode = 1, bars = true (COLS = 70-79) | |
---------------------------------------------------------------------- | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
---------------------------------------------------------------------- | |
mode = 2, bars = false (COLS = 80-82) | |
-------------------------------------------------------------------------------- | |
0x00000000 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000010 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000020 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000030 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000040 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000050 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000060 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000070 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000080 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000090 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000100 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000110 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000120 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000130 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000140 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000150 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000160 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000170 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000180 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000190 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000200 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
0x00000210 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | |
-------------------------------------------------------------------------------- | |
mode = 2, bars = true (COLS = 83+) | |
----------------------------------------------------------------------------------- | |
| 0x00000000 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000010 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000020 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000030 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000040 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000050 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000060 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000070 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000080 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000090 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000100 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000110 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000120 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000130 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000140 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000150 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000160 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000170 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000180 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000190 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000200 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
| 0x00000210 | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................ | | |
----------------------------------------------------------------------------------- |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment