📄 httag.cc
字号:
statictag_str += 2+8+8+8+8+2+len; break; } case HT_STATICTAG_FLAGS: { ofs = hexd(statictag_str+2); id = hexd(statictag_str+2+8); tag_str = tag_make_flags(tag_str, tag_str_end-tag_str, id, ofs+relocation); statictag_str += 2+8+8; break; } case HT_STATICTAG_GROUP: tag_str = tag_make_group(tag_str, tag_str_end-tag_str); statictag_str += 2; break; case HT_STATICTAG_COLOR: { byte color = hexb(statictag_str+2); tag_str = tag_make_color(tag_str, tag_str_end-tag_str, color); statictag_str += 2+2; break; } default: HT_ERROR("error in statictag string!"); } } else { if (tag_str < tag_str_end) { *tag_str++ = *statictag_str; } statictag_str++; } } *tag_str = 0;}TAGSTRING *tag_findnext(const TAGSTRING *tagstring){ return strchr(tagstring, '\e');}int tag_get_len(const TAGSTRING *tagstring){ assert(tagstring && tagstring[0] == '\e'); switch (tagstring[1]) { case HT_TAG_EDIT_BYTE: return HT_TAG_EDIT_BYTE_LEN; case HT_TAG_EDIT_WORD_LE: return HT_TAG_EDIT_WORD_LE_LEN; case HT_TAG_EDIT_DWORD_LE: return HT_TAG_EDIT_DWORD_LE_LEN; case HT_TAG_EDIT_QWORD_LE: return HT_TAG_EDIT_QWORD_LE_LEN; case HT_TAG_EDIT_WORD_BE: return HT_TAG_EDIT_WORD_BE_LEN; case HT_TAG_EDIT_DWORD_BE: return HT_TAG_EDIT_DWORD_BE_LEN; case HT_TAG_EDIT_QWORD_BE: return HT_TAG_EDIT_QWORD_BE_LEN; case HT_TAG_EDIT_WORD_VE: return HT_TAG_EDIT_WORD_VE_LEN; case HT_TAG_EDIT_DWORD_VE: return HT_TAG_EDIT_DWORD_VE_LEN; case HT_TAG_EDIT_QWORD_VE: return HT_TAG_EDIT_QWORD_VE_LEN; case HT_TAG_EDIT_TIME_LE: return HT_TAG_EDIT_TIME_LE_LEN; case HT_TAG_EDIT_TIME_BE: return HT_TAG_EDIT_TIME_BE_LEN; case HT_TAG_EDIT_TIME_VE: return HT_TAG_EDIT_TIME_VE_LEN; case HT_TAG_EDIT_CHAR: return HT_TAG_EDIT_CHAR_LEN; case HT_TAG_EDIT_BIT: return HT_TAG_EDIT_BIT_LEN; case HT_TAG_EDIT_SELVIS: return HT_TAG_EDIT_SELVIS_LEN; case HT_TAG_SEL: return HT_TAG_SEL_LEN(((ht_tag_sel*)tagstring)->strlen); case HT_TAG_FLAGS: return HT_TAG_FLAGS_LEN; case HT_TAG_COLOR: return HT_TAG_COLOR_LEN; case HT_TAG_GROUP: return HT_TAG_GROUP_LEN; case HT_TAG_DESC_BYTE: return HT_TAG_DESC_BYTE_LEN; case HT_TAG_DESC_WORD_LE: return HT_TAG_DESC_WORD_LE_LEN; case HT_TAG_DESC_DWORD_LE: return HT_TAG_DESC_DWORD_LE_LEN; case HT_TAG_DESC_QWORD_LE: return HT_TAG_DESC_QWORD_LE_LEN; case HT_TAG_DESC_WORD_BE: return HT_TAG_DESC_WORD_BE_LEN; case HT_TAG_DESC_DWORD_BE: return HT_TAG_DESC_DWORD_BE_LEN; case HT_TAG_DESC_QWORD_BE: return HT_TAG_DESC_QWORD_BE_LEN; case HT_TAG_DESC_WORD_VE: return HT_TAG_DESC_WORD_VE_LEN; case HT_TAG_DESC_DWORD_VE: return HT_TAG_DESC_DWORD_VE_LEN; case HT_TAG_DESC_QWORD_VE: return HT_TAG_DESC_QWORD_VE_LEN; } assert(0); return -1;}int tag_get_vlen(const TAGSTRING *tagstring){ assert(tagstring && tagstring[0] == '\e'); switch (tagstring[1]) { case HT_TAG_EDIT_BYTE: return HT_TAG_EDIT_BYTE_VLEN; case HT_TAG_EDIT_WORD_LE: return HT_TAG_EDIT_WORD_LE_VLEN; case HT_TAG_EDIT_DWORD_LE: return HT_TAG_EDIT_DWORD_LE_VLEN; case HT_TAG_EDIT_QWORD_LE: return HT_TAG_EDIT_QWORD_LE_VLEN; case HT_TAG_EDIT_WORD_BE: return HT_TAG_EDIT_WORD_BE_VLEN; case HT_TAG_EDIT_DWORD_BE: return HT_TAG_EDIT_DWORD_BE_VLEN; case HT_TAG_EDIT_QWORD_BE: return HT_TAG_EDIT_QWORD_BE_VLEN; case HT_TAG_EDIT_WORD_VE: return HT_TAG_EDIT_WORD_VE_VLEN; case HT_TAG_EDIT_DWORD_VE: return HT_TAG_EDIT_DWORD_VE_VLEN; case HT_TAG_EDIT_QWORD_VE: return HT_TAG_EDIT_QWORD_VE_VLEN; case HT_TAG_EDIT_TIME_LE: return HT_TAG_EDIT_TIME_LE_VLEN; case HT_TAG_EDIT_TIME_BE: return HT_TAG_EDIT_TIME_BE_VLEN; case HT_TAG_EDIT_TIME_VE: return HT_TAG_EDIT_TIME_VE_VLEN; case HT_TAG_EDIT_CHAR: return HT_TAG_EDIT_CHAR_VLEN; case HT_TAG_EDIT_BIT: return HT_TAG_EDIT_BIT_VLEN; case HT_TAG_EDIT_SELVIS: return HT_TAG_EDIT_SELVIS_VLEN; case HT_TAG_SEL: return HT_TAG_SEL_VLEN(((ht_tag_sel*)tagstring)->strlen); default: return 0; }}static int time_mp[14] = {0,1,3,4,6,7,9,10,12,13,15,16,17,18};int tag_get_micropos(const TAGSTRING *tagstring, int i){ switch (tagstring[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: case HT_TAG_EDIT_WORD_VE: case HT_TAG_EDIT_DWORD_VE: case HT_TAG_EDIT_QWORD_VE: case HT_TAG_EDIT_CHAR: case HT_TAG_EDIT_BIT: return i; case HT_TAG_EDIT_TIME_LE: case HT_TAG_EDIT_TIME_BE: case HT_TAG_EDIT_TIME_VE: return time_mp[i]; }// assert(0); return -1;}int tag_get_microsize(const TAGSTRING *tagstring){ switch (tagstring[1]) { case HT_TAG_EDIT_BYTE: return HT_TAG_EDIT_BYTE_VLEN; case HT_TAG_EDIT_WORD_LE: return HT_TAG_EDIT_WORD_LE_VLEN; case HT_TAG_EDIT_DWORD_LE: return HT_TAG_EDIT_DWORD_LE_VLEN; case HT_TAG_EDIT_QWORD_LE: return HT_TAG_EDIT_QWORD_LE_VLEN; case HT_TAG_EDIT_WORD_BE: return HT_TAG_EDIT_WORD_BE_VLEN; case HT_TAG_EDIT_DWORD_BE: return HT_TAG_EDIT_DWORD_BE_VLEN; case HT_TAG_EDIT_QWORD_BE: return HT_TAG_EDIT_QWORD_BE_VLEN; case HT_TAG_EDIT_WORD_VE: return HT_TAG_EDIT_WORD_VE_VLEN; case HT_TAG_EDIT_DWORD_VE: return HT_TAG_EDIT_DWORD_VE_VLEN; case HT_TAG_EDIT_QWORD_VE: return HT_TAG_EDIT_QWORD_VE_VLEN; case HT_TAG_EDIT_TIME_LE: case HT_TAG_EDIT_TIME_BE: case HT_TAG_EDIT_TIME_VE: return 14; case HT_TAG_EDIT_CHAR: return HT_TAG_EDIT_CHAR_VLEN; case HT_TAG_EDIT_BIT: return HT_TAG_EDIT_BIT_VLEN; default: return 1; }}int tag_get_size(const TAGSTRING *tagstring){ switch (tagstring[1]) { case HT_TAG_EDIT_BYTE: return HT_TAG_EDIT_BYTE_SIZE; case HT_TAG_EDIT_WORD_LE: return HT_TAG_EDIT_WORD_LE_SIZE; case HT_TAG_EDIT_DWORD_LE: return HT_TAG_EDIT_DWORD_LE_SIZE; case HT_TAG_EDIT_QWORD_LE: return HT_TAG_EDIT_QWORD_LE_SIZE; case HT_TAG_EDIT_WORD_BE: return HT_TAG_EDIT_WORD_BE_SIZE; case HT_TAG_EDIT_DWORD_BE: return HT_TAG_EDIT_DWORD_BE_SIZE; case HT_TAG_EDIT_QWORD_BE: return HT_TAG_EDIT_QWORD_BE_SIZE; case HT_TAG_EDIT_WORD_VE: return HT_TAG_EDIT_WORD_VE_SIZE; case HT_TAG_EDIT_DWORD_VE: return HT_TAG_EDIT_DWORD_VE_SIZE; case HT_TAG_EDIT_QWORD_VE: return HT_TAG_EDIT_QWORD_VE_SIZE; case HT_TAG_EDIT_TIME_LE: return HT_TAG_EDIT_TIME_LE_SIZE; case HT_TAG_EDIT_TIME_BE: return HT_TAG_EDIT_TIME_BE_SIZE; case HT_TAG_EDIT_TIME_VE: return HT_TAG_EDIT_TIME_VE_SIZE; case HT_TAG_EDIT_CHAR: return HT_TAG_EDIT_CHAR_SIZE; case HT_TAG_EDIT_BIT: return HT_TAG_EDIT_BIT_SIZE; default: return 0; }}FileOfs tag_get_offset(const TAGSTRING *tagstring){ FileOfs f; switch (tagstring[1]) { case HT_TAG_EDIT_BYTE: { UNALIGNED_MOVE(f, ((ht_tag_edit_byte*)tagstring)->offset); return f; } case HT_TAG_EDIT_WORD_LE: case HT_TAG_EDIT_WORD_BE: case HT_TAG_EDIT_WORD_VE: { UNALIGNED_MOVE(f, ((ht_tag_edit_word_generic*)tagstring)->offset); return f; } case HT_TAG_EDIT_DWORD_LE: case HT_TAG_EDIT_DWORD_BE: case HT_TAG_EDIT_DWORD_VE: { UNALIGNED_MOVE(f, ((ht_tag_edit_dword_generic*)tagstring)->offset); return f; } case HT_TAG_EDIT_QWORD_LE: case HT_TAG_EDIT_QWORD_BE: case HT_TAG_EDIT_QWORD_VE: { UNALIGNED_MOVE(f, ((ht_tag_edit_qword_generic*)tagstring)->offset); return f; } case HT_TAG_EDIT_TIME_LE: case HT_TAG_EDIT_TIME_BE: case HT_TAG_EDIT_TIME_VE: { UNALIGNED_MOVE(f, ((ht_tag_edit_time*)tagstring)->offset); return f; } case HT_TAG_EDIT_CHAR: { UNALIGNED_MOVE(f, ((ht_tag_edit_char*)tagstring)->offset); return f; } case HT_TAG_EDIT_BIT: { UNALIGNED_MOVE(f, ((ht_tag_edit_bit*)tagstring)->offset); return f; } case HT_TAG_EDIT_SELVIS: { UNALIGNED_MOVE(f, ((ht_tag_edit_selvis*)tagstring)->offset); return f; } case HT_TAG_DESC_BYTE: { UNALIGNED_MOVE(f, ((ht_tag_desc_byte*)tagstring)->offset); return f; } case HT_TAG_DESC_WORD_LE: case HT_TAG_DESC_WORD_BE: case HT_TAG_DESC_WORD_VE: { UNALIGNED_MOVE(f, ((ht_tag_desc_word_generic*)tagstring)->offset); return f; } case HT_TAG_DESC_DWORD_LE: case HT_TAG_DESC_DWORD_BE: case HT_TAG_DESC_DWORD_VE: { UNALIGNED_MOVE(f, ((ht_tag_desc_dword_generic*)tagstring)->offset); return f; } case HT_TAG_DESC_QWORD_LE: case HT_TAG_DESC_QWORD_BE: case HT_TAG_DESC_QWORD_VE: { UNALIGNED_MOVE(f, ((ht_tag_desc_qword_generic*)tagstring)->offset); return f; } case HT_TAG_FLAGS: UNALIGNED_MOVE(f, ((ht_tag_flags*)tagstring)->offset); return f; } assert(0); return 0;}void tag_get_id(const TAGSTRING *tagstring, uint32 *id128_1, uint32 *id128_2, uint32 *id128_3, uint32 *id128_4){ if (tagstring[1] == HT_TAG_SEL) { UNALIGNED_MOVE(*id128_1, ((ht_tag_sel*)tagstring)->id128_1); UNALIGNED_MOVE(*id128_2, ((ht_tag_sel*)tagstring)->id128_2); UNALIGNED_MOVE(*id128_3, ((ht_tag_sel*)tagstring)->id128_3); UNALIGNED_MOVE(*id128_4, ((ht_tag_sel*)tagstring)->id128_4); }}TAGSTRING *tag_get_seltext(const TAGSTRING *tagstring){ return (TAGSTRING *)(tagstring + sizeof(ht_tag_sel));}int tag_get_seltextlen(const TAGSTRING *tagstring){ if (tagstring[1] == HT_TAG_SEL) { return ((ht_tag_sel*)tagstring)->strlen; } return -1;}vcp tag_get_color(const TAGSTRING *tagstring){ vcp c; UNALIGNED_MOVE(c, ((ht_tag_color*)tagstring)->color); return c;}bool tag_get_desc_id(const TAGSTRING *tagstring, uint32 *id){ switch (tagstring[1]) { case HT_TAG_DESC_BYTE: UNALIGNED_MOVE(*id, ((ht_tag_desc_byte*)tagstring)->id); return true; case HT_TAG_DESC_WORD_LE: case HT_TAG_DESC_WORD_BE: case HT_TAG_DESC_WORD_VE: UNALIGNED_MOVE(*id, ((ht_tag_desc_word_generic*)tagstring)->id); return true; case HT_TAG_DESC_DWORD_LE: case HT_TAG_DESC_DWORD_BE: case HT_TAG_DESC_DWORD_VE: UNALIGNED_MOVE(*id, ((ht_tag_desc_dword_generic*)tagstring)->id); return true; case HT_TAG_DESC_QWORD_LE: case HT_TAG_DESC_QWORD_BE: case HT_TAG_DESC_QWORD_VE: UNALIGNED_MOVE(*id, ((ht_tag_desc_qword_generic*)tagstring)->id); return true; } return false;}void tag_set_offset(const TAGSTRING *tagstring, FileOfs offset){ switch (tagstring[1]) { case HT_TAG_EDIT_BYTE: UNALIGNED_MOVE(((ht_tag_edit_byte*)tagstring)->offset, offset); break; case HT_TAG_EDIT_WORD_LE: case HT_TAG_EDIT_WORD_BE: case HT_TAG_EDIT_WORD_VE: UNALIGNED_MOVE(((ht_tag_edit_word_generic*)tagstring)->offset, offset); break; case HT_TAG_EDIT_DWORD_LE: case HT_TAG_EDIT_DWORD_BE: case HT_TAG_EDIT_DWORD_VE: UNALIGNED_MOVE(((ht_tag_edit_dword_generic*)tagstring)->offset, offset); break; case HT_TAG_EDIT_QWORD_LE: case HT_TAG_EDIT_QWORD_BE: case HT_TAG_EDIT_QWORD_VE: UNALIGNED_MOVE(((ht_tag_edit_qword_generic*)tagstring)->offset, offset); break; case HT_TAG_EDIT_TIME_LE: case HT_TAG_EDIT_TIME_BE: case HT_TAG_EDIT_TIME_VE: UNALIGNED_MOVE(((ht_tag_edit_time*)tagstring)->offset, offset); break; case HT_TAG_EDIT_CHAR: UNALIGNED_MOVE(((ht_tag_edit_char*)tagstring)->offset, offset); break; case HT_TAG_EDIT_BIT: UNALIGNED_MOVE(((ht_tag_edit_bit*)tagstring)->offset, offset); break; }}bool tag_is_editable(const TAGSTRING *tagstring){ switch (tagstring[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: case HT_TAG_EDIT_WORD_VE: case HT_TAG_EDIT_DWORD_VE: case HT_TAG_EDIT_QWORD_VE: case HT_TAG_EDIT_TIME_LE: case HT_TAG_EDIT_TIME_BE: case HT_TAG_EDIT_TIME_VE: case HT_TAG_EDIT_CHAR: case HT_TAG_EDIT_BIT: return true; default: return false; } assert(0); return false;}void tag_strcat(TAGSTRING *dest, int maxlen, const TAGSTRING *src){ int l = tag_strlen(dest); tag_strcpy(dest+l, maxlen-l, src);}void tag_strcpy(TAGSTRING *dest, int maxlen, const TAGSTRING *src){ if (maxlen > 0) { maxlen--; while (*src && maxlen) { if (*src == '\e') { int l = tag_get_len(src); if (l > maxlen) { tag_error(dest, maxlen); return; } else { memcpy(dest, src, l); dest += l; src += l; maxlen -= l; } } else { *dest++ = *src++; maxlen--; } } *dest = 0; }}TAGSTRING *tag_strdup(const TAGSTRING *tagstring){ if (!tagstring) return NULL; int l = tag_strlen(tagstring); TAGSTRING *s = ht_malloc(l + 1); memcpy(s, tagstring, l); s[l] = 0; return s;}int tag_strlen(const TAGSTRING *tagstring){ int c = 0, r; while (*tagstring) { if (tagstring[0] == '\e') { r = tag_get_len(tagstring); } else { r = 1; } tagstring += r; c += r; } return c;}int tag_strvlen(const TAGSTRING *tagstring){ int c=0, r, v; while (*tagstring) { if (tagstring[0] == '\e') { r = tag_get_len(tagstring); v = tag_get_vlen(tagstring); } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -