From 6afdff7fe52b914bf52db306e5ea4526a1b237e1 Mon Sep 17 00:00:00 2001 From: pompolic <pompolic@special-circumstanc.es> Date: Mon, 24 Oct 2022 14:45:39 +0200 Subject: [PATCH] Alternate print_input_chunk() behavior --- gdb-port/top-level-parse.py | 45 ++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/gdb-port/top-level-parse.py b/gdb-port/top-level-parse.py index bbd9a57..b6f1f6f 100644 --- a/gdb-port/top-level-parse.py +++ b/gdb-port/top-level-parse.py @@ -30,6 +30,7 @@ class TopLevelParse: self.current_token_start = 0 # TODO: remove self.current_token_end = 0 #TODO: remove self.printing_tokens = [] # Holds the tokens yet to be printed by print_input_chunk as it walks the AST + self.printing_index = 0 # Tokens have been printed up to this position in the array def init_parser(self): self.vt_types = VTTypes() @@ -397,7 +398,7 @@ class TopLevelParse: # TODO: get_avg_mem_use_all_arenas, get_total_mem_use # TODO: remove first printing loop - def print_input_chunk(self, token, rows, start, end): + def print_input_chunk(self, token, token_list, rows, start, end): #print("print_input_chunk(): start: ", start, "end: ", end) w = end-start if w == 0: @@ -406,7 +407,37 @@ class TopLevelParse: tokenmap_val_list = [dict(token, addr=hex(key)) for key, token in self.input_token_map.items() if (token['start'] >= start and token['start'] <= end)] numrows = min(rows, len(tokenmap_val_list)) h = numrows + charbuf_dynamic = [] + current_row = 0 + info_strings = [] + printing_index = self.printing_index + while printing_index < len(token_list): + token = token_list[printing_index] + tokenmap_entry = self.input_token_map[int(token.address)] + if tokenmap_entry['start'] > end: + break + token_length = tokenmap_entry['end'] - tokenmap_entry['start'] + start_col = max(tokenmap_entry['start'] - start, 0) + end_col = min(tokenmap_entry['end'] - start, w) + charbuf_dynamic.append([' '] * w) + charbuf_dynamic[current_row][start_col:end_col] = ['X'] * min(token_length, end_col-start_col) # TODO: charbuf_dynamic[-1] + hparseresult_addr = tokenmap_entry['hparseresult'] + current_row += 1 + + try: + hpr = HParseResult(int(hparseresult_addr, 16)) + info_strings.append(" ".join([hpr.str_no_deref(), str(tokenmap_entry)])) + except: + info_strings.append(" ".join(["invalid", str(tokenmap_entry)])) + printing_index += 1 + self.printing_index = printing_index + info_dict = dict(enumerate(info_strings)) + charbufrows_token_debug = [ "".join(row) + "\ntokeninfo: " + info_dict.get(index, "no token here") for index, row in enumerate(charbuf_dynamic)] + #charbufrows = ["".join(row) for row in charbuf_dynamic] + #charbuf_final = "\n".join(charbufrows) + charbuf_final = "\n".join(charbufrows_token_debug) + print(charbuf_final) # Print by getting a token, and recursively walking its children if applicable charbuf = [[' '] * w for i in range(0,h)] charbuf_dynamic = [] @@ -459,6 +490,14 @@ class TopLevelParse: print(self.input_token_map) print(ke) end = self.input_token_map[int(addr)]['end'] + i = 0 + printing_tokens = [token] + while i < len(printing_tokens): + tk = printing_tokens[i] + if tk.token_type == HParsedToken.TT_SEQUENCE: + #printing_tokens.extend(tk.children[::-1]) + printing_tokens.extend(tk.children) # No longer using this as a stack, so no reversing is needed + i += 1 fragmentlen = end-start inputfragment = (self.input_ptr+start).string('UTF-8','replace',fragmentlen) #encoded_inputfragment = inputfragment.replace("\n", "<0A>").replace("\r", "<0D>").replace(" ", "<20>").replace("\t", "<09>") @@ -470,12 +509,12 @@ class TopLevelParse: encoded_inputfragment = inputfragment.replace("\n", ".").replace("\r", ".").replace("\t", ".") print(encoded_inputfragment) #print("chunk: ", chunk) # DEBUG - self.print_input_chunk(token, rows, start + w * chunk, (start + w * chunk) + min(w, end-start)) + self.print_input_chunk(token, printing_tokens, rows, start + w * chunk, (start + w * chunk) + min(w, end-start)) #print("last chunk width:", last_chunk_width) # DEBUG inputfragment = (self.input_ptr + (start + w * screens)).string('UTF-8', 'replace', last_chunk_width) encoded_inputfragment = inputfragment.replace("\n", ".").replace("\r", ".").replace("\t", ".") print(encoded_inputfragment) - self.print_input_chunk(token, rows, start + w * screens, (start + w * screens) + min(w, end-start)) + self.print_input_chunk(token, printing_tokens, rows, start + w * screens, (start + w * screens) + min(w, end-start)) #if rec_depth == 0: # print(encoded_inputfragment) -- GitLab