レポジトリ種類: SVN

#pragma once

#ifdef _WIN32
#include <pdcurses.h>
#else
#include <ncurses.h>
#endif

#include <cstdint>
#include <cstdlib>
#include <string>
#include <vector>

class HexEditor {
  private:
    enum StatusMode {
      Status_Normal,
      Status_Command,
      Status_Search,
      Status_Replace,
      Status_Error,
    };

    enum SearchDirection {
      Direction_Forward,
      Direction_Reverse,
    };

    struct Edit {
      size_t offset;
      uint8_t oldByte;
      uint8_t newByte;
    };

    WINDOW *hexPanel;
    WINDOW *asciiPanel;
    std::vector<uint8_t> buf;
    size_t curPos;
    size_t dpOffset;
    size_t bpr;
    std::string fname;
    int rows, cols;
    StatusMode statusMode;
    std::string statusText;
    std::string lastSearch;
    std::vector<uint8_t> lastHexSearch;
    SearchDirection lastSearchDir;
    std::vector<size_t> matchOff;
    bool modified;
    bool running;
    std::vector<Edit> undoStack;
    std::vector<Edit> redoStack;

    void render();
    void input();
    void highlightcol(size_t i, size_t row, uint8_t byte);
    void statusbar();
    void handleCommand();
    void handleSave();
    void handleQuit(bool force);
    void handleSearch();
    void handleReverseSearch();
    void findNextMatch();
    void findPrevMatch();
    void handleReplace();
    void undo();
    void redo();

  public:
    HexEditor(const std::string &filename);
    ~HexEditor();

    void run();
};