def extract_item(viewer, stripped=False): cnt = ida_kernwin.get_custom_viewer_place(viewer, True)[1] line = ida_kernwin.get_custom_viewer_curline(viewer, True) tags = [ida_lines.SCOLOR_ON, ida_lines.SCOLOR_OFF] expr = re.compile("[A-Z0-9_]") def find_pos(line, pos, inc): while 0 <= pos < len(line): if not stripped and line[pos] in tags: break if stripped and not expr.match(line[pos]): break pos += inc return pos pos = ida_lines.tag_advance(line, cnt) if pos < 0 or pos >= len(line): return while line[pos] in [ida_lines.SCOLOR_ON, ida_lines.SCOLOR_OFF]: pos += 2 if pos < 0 or pos >= len(line): return prev_pos, next_pos = find_pos(line, pos, -1), find_pos(line, pos, +1) if stripped: return None, line[prev_pos + 1:next_pos].strip() return line[prev_pos + 1], line[prev_pos + 2:next_pos].strip()
def _process(self): cf = self.vu.cfunc ci = ida_hexrays.ctree_item_t() ccode = cf.get_pseudocode() for ypos in range(cf.hdrlines, len(ccode)): tline = ccode.at(ypos).line # TODO: optimize the following loop idx = 0 while idx < len(tline): citem_len = 0 # get all items on a line if cf.get_line_item(tline, idx, True, None, ci, None): iea = ci.it.ea if iea != BADADDR: # generate color-tagged/addr-tagged text of current item citem = ci.it.print1(None) citem_len = len(ida_lines.tag_remove(citem)) # find (tagged) item text in current line pos = tline.find(citem) while pos != -1: # calculate x position of item text in line # by subtracting the number of color tag # characters up to position "pos" xpos = len(ida_lines.tag_remove(tline[:pos])) self._add_item(iea, xpos, ypos, citem_len) pos = tline.find(citem, pos + citem_len) idx += ida_lines.tag_advance(tline[idx], 1) return
def remove_spaces(sl): dbg("*" * 80) l = sl.line out = [] def push(c): dbg("Appending '%s'" % c) out.append(c) # skip initial spaces, do not compress them while True: l = my_tag_skipcodes(l, out) if not l: break c = l[0] if not c.isspace(): break push(c) l = l[1:] # remove all spaces except in string and char constants delim = None # if not None, then we are skipping until 'delim' last = None # last seen character while True: # go until comments dbg("-" * 60) nchars = ida_lines.tag_advance(l, 1) push(l[0:nchars]) l = l[nchars:] l = my_tag_skipcodes(l, out) if not l: break if l.startswith("//"): push(l) break c = l[0] dbg("c: '%s', last: '%s', l: '%s'" % (c, last, l)) if delim: # we're inside a literal. if c == delim: delim = None # literal ended elif c == '"' or c == "'": delim = c # string/char literal started elif c.isspace(): end = l.lstrip() nptr = my_tag_skipcodes(end, out) dbg("end: '%s', nptr: '%s'" % (end, nptr)) # do not concatenate idents if not is_cident_char(last) or not is_cident_char(nptr[0]): l = end c = l[0] if l else '' dbg("new l: '%s'" % l) last = l[0] if l else '' sl.line = "".join(out)
def remove_spaces(sl): dbg("*" * 80) l = sl.line out = [] def push(c): dbg("Appending '%s'" % c) out.append(c) # skip initial spaces, do not compress them while True: l = my_tag_skipcodes(l, out) if not l: break c = l[0] if not c.isspace(): break push(c) l = l[1:] # remove all spaces except in string and char constants delim = None # if not None, then we are skipping until 'delim' last = None # last seen character while True: # go until comments dbg("-" * 60) nchars = ida_lines.tag_advance(l, 1) push(l[0:nchars]) l = l[nchars:] l = my_tag_skipcodes(l, out) if not l: break if l.startswith("//"): push(l) break c = l[0] dbg("c: '%s', last: '%s', l: '%s'" % (c, last, l)) if delim: # we're inside a literal. if c == delim: delim = None # literal ended elif c == '"' or c == "'": delim = c # string/char literal started elif c.isspace(): end = l.lstrip() nptr = my_tag_skipcodes(end, out) dbg("end: '%s', nptr: '%s'" % (end, nptr)) # do not concatenate idents if not is_cident_char(last) or not is_cident_char(nptr[0]): l = end c = l[0] if l else '' dbg("new l: '%s'" % l) last = l[0] if l else '' sl.line = "".join(out)