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