📄 htformat.cc
字号:
c_tag_idx = s-1; r = 1; break; } } else { s = tag_count_selectable_tags_in_group(c_line, c_tag_group); if (s) { if (c_tag_idx >= s) c_tag_idx = s-1; r = 1; break; } } } if (r) { cursor = c; memcpy(cursor_line, c_line, sizeof cursor_line); cursorline_dirty(); cursor_ypos = c_ypos; cursor.tag_idx = c_tag_idx; cursor.tag_group = c_tag_group; if (cursor_ypos <= -1) scroll_up(-cursor_ypos); update_misc_info(); update_visual_info(); if (edit()) update_micropos(); } else { scroll_up(n); } return r; } else { int r=0; char c_line[1024]; int c_tag_idx = cursor.tag_idx; int c_tag_group = cursor.tag_group; int d_tag_group = cursor.tag_group; uformat_viewer_pos c; int c_ypos; if (cursor_state == cursor_state_invisible) { c = top; c_ypos = 0; } else { c = cursor; c_ypos = cursor_ypos; } int nc = prev_line(&c, n); c_ypos -= nc; while (nc--) { c.sub->getline(c_line, sizeof c_line, c.line_id); int g = tag_count_groups(c_line); if (d_tag_group < g) c_tag_group=d_tag_group; int s; if (c_tag_group >= g) { c_tag_group = g-1; s = tag_count_selectable_tags_in_group(c_line, c_tag_group); if (s) { c_tag_idx = s-1; r = 1; break; } } s = tag_count_selectable_tags_in_group(c_line, c_tag_group); if (s) { if (c_tag_idx >= s) c_tag_idx = s-1; r=1; break; } if (!next_line(&c, 1)) break; c_ypos++; } if (r) { cursor = c; memcpy(cursor_line, c_line, sizeof cursor_line); cursorline_dirty(); cursor_ypos = c_ypos; cursor.tag_idx = c_tag_idx; cursor.tag_group = c_tag_group; if (-cursor_ypos+n-nc-1 > 0) scroll_up(-cursor_ypos+n-nc-1); update_misc_info(); update_visual_info(); if (edit()) update_micropos(); } else { if (cursor_state == cursor_state_invisible) cursor_ypos=-0x80000000; scroll_up(n); } // FIXME: wrong value return 1; } } case cursor_state_disabled:// scroll_up(n);// return n; break; } return 0;}int ht_uformat_viewer::cursor_down(int n){ switch (cursor_state) { case cursor_state_invisible: case cursor_state_visible: { if (n == 1 && cursor_state == cursor_state_visible) { int r=0; uformat_viewer_pos c; c = cursor; char c_line[1024]; int c_ypos=cursor_ypos; int c_tag_idx=cursor.tag_idx; int c_tag_group=cursor.tag_group; int d_tag_group=cursor.tag_group; int nls; /* controls scrolling beyond end */ while ((nls = next_line(&c, 1)) && c_ypos <= size.h-1) { c_ypos++; c.sub->getline(c_line, sizeof c_line, c.line_id); int g = tag_count_groups(c_line); if (d_tag_group < g) c_tag_group = d_tag_group; int s; if (c_tag_group >= g) { c_tag_group = g-1; s=tag_count_selectable_tags_in_group(c_line, c_tag_group); if (s) { c_tag_idx = s-1; r = 1; break; } } s = tag_count_selectable_tags_in_group(c_line, c_tag_group); if (s) { if (c_tag_idx >= s) c_tag_idx = s-1; r = 1; break; } } if (r) { cursor = c; memcpy(cursor_line, c_line, sizeof cursor_line); cursorline_dirty(); cursor_ypos = c_ypos; cursor.tag_idx = c_tag_idx; cursor.tag_group = c_tag_group; if (cursor_ypos >= size.h) scroll_down(cursor_ypos-size.h+1); update_misc_info(); update_visual_info(); if (edit()) update_micropos(); } else if (nls) scroll_down(1); return r; } else { int r=0; char c_line[1024]; int c_tag_idx=cursor.tag_idx; int c_tag_group=cursor.tag_group; int d_tag_group=cursor.tag_group; uformat_viewer_pos c; int c_ypos; if (cursor_state==cursor_state_invisible) { c = top; c_ypos = next_line(&c, size.h-1); } else { c = cursor; c_ypos = cursor_ypos; } int nc=next_line(&c, n); int onc=c_ypos+nc-size.h+1; c_ypos+=nc; while (nc--) { c.sub->getline(c_line, sizeof c_line, c.line_id); int g=tag_count_groups(c_line); if (d_tag_group<g) c_tag_group=d_tag_group; int s; if (c_tag_group>=g) { c_tag_group=g-1; s=tag_count_selectable_tags_in_group(c_line, c_tag_group); if (s) { c_tag_idx=s-1; r=1; break; } } else { s=tag_count_selectable_tags_in_group(c_line, c_tag_group); if (s) { if (c_tag_idx>=s) c_tag_idx=s-1; r=1; break; } } if (nc) if (!prev_line(&c, 1)) break; c_ypos--; } if (r) { cursor = c; memcpy(cursor_line, c_line, sizeof cursor_line); cursorline_dirty(); cursor_ypos=c_ypos; cursor.tag_idx=c_tag_idx; cursor.tag_group=c_tag_group; if (cursor_ypos-size.h+1>0) scroll_down(cursor_ypos-size.h+1); update_misc_info(); update_visual_info(); if (edit()) update_micropos(); } else if (onc>0) { if (cursor_state==cursor_state_invisible) cursor_ypos=-0x80000000; scroll_down(onc); } // FIXME: wrong value return 1; } } case cursor_state_disabled:// scroll_down(n);// return n; break; } return 0;}int ht_uformat_viewer::cursor_home(){ cursor.tag_idx=0; if (edit()) cursor_tag_micropos=0; update_visual_info(); update_misc_info(); return 1;}int ht_uformat_viewer::cursor_end(){ cursorline_get(); int c = tag_count_selectable_tags_in_group(cursor_line, cursor.tag_group); cursor.tag_idx = c-1; if (edit()) { char *e = tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group); if (e) cursor_tag_micropos = tag_get_microsize(e) - 1; } update_visual_info(); update_misc_info(); return 1;}void ht_uformat_viewer::cursor_tab(){ cursor.tag_group++; adjust_cursor_group();}void ht_uformat_viewer::cursorline_dirty(){ isdirty_cursor_line = true;}void ht_uformat_viewer::cursorline_get(){ if (isdirty_cursor_line) { if (cursor.sub) cursor.sub->getline(cursor_line, sizeof cursor_line, cursor.line_id); isdirty_cursor_line = false; }}int ht_uformat_viewer::cursormicroedit_forward(){ cursorline_get(); uformat_viewer_pos p; p = top; p.tag_group = cursor.tag_group; uint cursor_tag_bitidx = 0; cursorline_get(); char *e=tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group); if (e) { if (((byte*)e)[1] == HT_TAG_EDIT_BIT) { cursor_tag_bitidx = ((ht_tag_edit_bit*)e)->bitidx; } } bool cursor_found = false; char c_line[1024]; for (int y=0; y < size.h+16; y++) { if (!p.sub->getline(c_line, sizeof c_line, p.line_id)) break; int c=tag_count_selectable_tags_in_group(c_line, p.tag_group); while (p.tag_idx<c) { char *t=tag_get_selectable_tag(c_line, p.tag_idx, p.tag_group); if (t && (tag_get_class(t) == tag_class_edit)) { if (cursor_found) { cursor_tag_micropos=0; set_cursor(p); cursorline_dirty(); update_misc_info(); update_visual_info(); return 1; } else if (tag_get_offset(t) == cursor_tag_offset) { byte *tb = (byte*)t; if ( ( tb[1] == HT_TAG_EDIT_BIT && ((ht_tag_edit_bit*)t)->bitidx == cursor_tag_bitidx ) || tb[1] != HT_TAG_EDIT_BIT) { cursor_found = true; char *t = tag_get_selectable_tag(c_line, p.tag_idx, p.tag_group); int s = tag_get_microsize(t); if (cursor_tag_micropos+1 < s) { cursor_tag_micropos++; set_cursor(p); cursorline_dirty(); update_misc_info(); update_visual_info(); return 1; } } } } p.tag_idx++; } p.tag_idx = 0; if (!next_line(&p, 1)) break; } if (cursor_right()) cursor_tag_micropos = 0; return 0;}int ht_uformat_viewer::cursormicro_forward(){ cursorline_get(); char *t = tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group); int s = tag_get_microsize(t); if (cursor_tag_micropos+1 >= s) { if (cursor_right()) cursor_tag_micropos=0; else return 0; } else { cursor_tag_micropos++; } return 1;}int ht_uformat_viewer::cursormicro_backward(){ if (cursor_tag_micropos>0) { cursor_tag_micropos--; } else { if (cursor_left()) { cursorline_get(); char *t=tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group); cursor_tag_micropos=tag_get_microsize(t)-1; } else { return 0; } } return 1;}void ht_uformat_viewer::draw(){ int sdown_count=0; if (!uf_initialized) HT_ERROR("complete_init() not called!");restart: clear(getcolor(palidx_generic_body)); if (!first_sub) return; uformat_viewer_pos p = top; uformat_viewer_pos sp; clear_viewer_pos(&sp); char line[1024]; bool cursor_in_line; int cursor_found=-1; if (focused) hidecursor(); if (!p.sub->getline(line, sizeof line, p.line_id)) { if (p.sub->closest_line_id(&p.line_id)) { top = p; } else return; if (!p.sub->getline(line, sizeof line, p.line_id)) return; } for (int y=0; y < size.h; y++) { if (y == cursor_ypos) sp = p; if (!p.sub->getline(line, sizeof line, p.line_id)) break;/**//* char test[128]; tag_striptags(test+sprintf(test, "%08x,%08x: ", id1, id2), line); fprintf(stdout, "%s\n", test); fflush(stdout);*//**/// FIXME: revision if (cursor_state == cursor_state_visible && p.sub == cursor.sub && compeq_line_id(p.line_id, cursor.line_id)) { cursor_found = y; cursorline_dirty(); update_misc_info(); int c = tag_count_selectable_tags_in_group(line, cursor.tag_group); if (cursor.tag_idx >= c) cursor.tag_idx = c-1; if (cursor_tag_class == tag_class_edit && edit()) { char *t = tag_get_selectable_tag(line, cursor.tag_idx, cursor.tag_group); if (t) { int x = cursor_visual_xpos + tag_get_micropos(t, cursor_tag_micropos) - xscroll; if (focused && x >= 0) setcursor(x, y); } } cursor_in_line = true; } else cursor_in_line = false; print_tagstring(0, y, size.w, xscroll, line, cursor_in_line); if (xscroll > 0) buf->printChar(0, y, VCP(VC_GREEN, VC_TRANSPARENT), '<'); if (!next_line(&p, 1)) break; } if (cursor_state == cursor_state_visible && cursor_found == -1) {#if 1 if (!sp.sub) sp = top; cursor = sp;#else top = cursor;#endif cursorline_dirty(); update_misc_info(); int c = tag_count_selectable_tags_in_group(line, cursor.tag_group); if (cursor.tag_idx > c-1) cursor.tag_idx=c-1; if (sdown_count++ > 0) goto restart; } if (cursor_found != -1) cursor_ypos = cursor_found;// buf_printf(1, 1, VCP(VC_GREEN, VC_BLACK), "%s", focused ? "focused" : "unfocused");// if (cursor_select) printf(20, 1, VCP(VC_GREEN, VC_BLACK), "start=%08x, l=%08x", cursor_select_start, cursor_select_cursor_length);// buf_printf(20, 6, 7, "csize.x=%2d, csize.y=%2d, csize.w=%2d, csize.h=%2d", csize.x, csize.y, csize.w, csize.h);// buf_printf(2, 3, 7, "size.x=%2d, size.y=%2d, size.w=%2d, size.h=%2d", size.x, size.y, size.w, size.h);// buf_printf(2, 4, 7, "vsize.x=%2d, vsize.y=%2d, vsize.w=%2d, vsize.h=%2d", vsize.x, vsize.y, vsize.w, vsize.h);// buf_printf(2, 5, 7, "bsize.x=%2d, bsize.y=%2d, bsize.w=%2d, bsize.h=%2d", buf->size.x, buf->size.y, buf->size.w, buf->size.h);// buf_printf(20, 7, 7, "size.x=%2d, size.y=%2d, size.w=%2d, size.h=%2d", group->group->size.x, group->group->size.y, group->group->size.w, group->group->size.h);// buf_printf(20, 8, 7, "vsize.x=%2d, vsize.y=%2d, vsize.w=%2d, vsize.h=%2d", group->group->vsize.x, group->group->vsize.y, group->group->vsize.w, group->group->vsize.h);// buf_printf(0, 7, 7, "vx=%2d, vl=%2d, ypos=%2d", cursor_visual_xpos, cursor_visual_length, cursor_ypos);// buf->printf(0, 2, 7, CP_DEVICE, "cursor_micropos=%d", cursor_tag_micropos);// buf_printf(0, 2, 7, "%x, %x, %x, %x, %x, c_tagidx", cursor.line_id.id1, cursor.line_id.id2, cursor.line_id.id3, cursor.line_id.id4, cursor.line_id.id5, cursor.tag_idx);// buf_printf(0, 3, 7, "(%c)", "vid"[cursor_state]);// buf_printf(0, 6, 7, "cursor.tag_idx=%d", cursor.tag_idx);/* if (cursor_tag_class==tag_class_edit) { buf_printf(30, 7, 7, "class=edit, addr=%08x", cursor_tag_offset); } else { buf_printf(30, 7, 7, "class=sel, id_low=%08x, id_high=%08x", 0,0); }*/}bool ht_uformat_viewer::edit(){ return (file && (file->getAccessMode() & IOAM_WRITE));}bool ht_uformat_viewer::edit_end(){ if (!edit()) { hidecursor(); set_cursor(cursor);#if 0 uformat_viewer_pos p = cursor; if (find_first_tag(&p, size.h)) { set_cursor(p); } else {// if (cursor_state!=cursor_state_disabled) {/* is that all we have to do ??? testing needed */// cursor_state=cursor_state_invisible;// assert(0); /* FIXME: not yet implemented */// } }#endif cursorline_dirty(); adjust_cursor_idx(); update_visual_info(); update_misc_info(); dirtyview(); return true; } return false;}bool ht_uformat_viewer::edit_input(byte b){ cursorline_get(); char *t = tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group); switch (t[1]) { case HT_TAG_EDIT_BYTE: case HT_TAG_EDIT_WORD_LE: case HT_TAG_EDIT_DWORD_LE: case HT_TAG_EDIT_QWORD_LE: case HT_TAG_EDIT_WORD_BE: case HT_TAG_EDIT_DWORD_BE: case HT_TAG_EDIT_QWORD_BE: { int nibval = edit_input_c2h(b); if (nibval == -1) break; int size = 0; bool bigendian = true; switch (t[1]) { case HT_TAG_EDIT_BYTE: size = 1; break; case HT_TAG_EDIT_WORD_LE: size = 2; bigendian=false; break; case HT_TAG_EDIT_DWORD_LE: size = 4; bigendian=false; break; case HT_TAG_EDIT_QWORD_LE: size = 8; bigendian=false; break; case HT_TAG_EDIT_WORD_BE: size = 2; bigendian=true; break; case HT_TAG_EDIT_DWORD_BE: size = 4; bigendian=true; break; case HT_TAG_EDIT_QWORD_BE: size = 8; bigendian=true; break; } uint shift = 4 - (cursor_tag_micropos&1)*4; uint m = ~(0xf << shift); uint o = nibval << shift; int b; if (bigendian) { b = cursor_tag_micropos/2; } else { b = size - cursor_tag_micropos/2 - 1; } byte buf; pread(cursor_tag_offset + b, &buf, 1); buf &= m; buf |= o; pwrite(cursor_tag_offset + b, &buf, 1); cursormicroedit_forward(); return true; } case HT_TAG_EDIT_CHAR: { if (b >= 32 && b < 128) { pwrite(cursor_tag_offset, &b, 1); cursormicroedit_forward(); return true; } break; } case HT_TAG_EDIT_BIT: { if (b == '1' || b == '0' || b == ' ') { byte d; cursorline_get(); char *t = tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group); int shift = ((ht_tag_edit_bit*)t)->bitidx; uint32 mask = 1 << (shift%8); int op = shift/8; pread(cursor_tag_offset+op, &d, 1); switch (b) { case '0': d &= ~mask; break; case '1': d |= mask; break; case K_Space: d ^= mask; break; } pwrite(cursor_tag_offset+op, &d, 1); cursormicroedit_forward(); return true; } break; } case HT_TAG_EDIT_TIME_BE: case HT_TAG_EDIT_TIME_LE: { uint32 d; int h = edit_input_c2d(b); byte buf[4]; if (pread(cursor_tag_offset, &buf, 4)==4 && h!=-1) { if (t[1] == HT_TAG_EDIT_TIME_LE) { d=(buf[3]<<24) | (buf[2]<<16) | (buf[1]<<8) | buf[0]; } else { d=(buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3]; } time_t tt = d; tm *ti = gmtime(&tt); tm q = *ti; int k; bool worked = false; #define DEC_MASK(value, mask) ((value) - (value) / (mask) % 10 * (mask)) switch (cursor_tag_micropos) { case 0: k = q.tm_hour % 10 + h * 10; if (k < 24) { q.tm_hour = k; worked = true; } break; case 1: k = q.tm_hour - q.tm_hour % 10 + h; if (k < 24) { q.tm_hour = k; worked = true; } break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -