diff --git a/vint/encodings/decoder.py b/vint/encodings/decoder.py index 375d583..d7d7686 100644 --- a/vint/encodings/decoder.py +++ b/vint/encodings/decoder.py @@ -1,11 +1,11 @@ import sys +import re from typing import Dict, Any from pprint import pformat from pathlib import Path from vint.encodings.decoding_strategy import DecodingStrategy -SCRIPTENCODING_PREFIX = bytearray('scriptencoding', encoding='ascii') @@ -43,22 +43,24 @@ def _split_by_scriptencoding(bytes_seq): start_index = 0 bytes_seq_and_loc_list = [] - while True: - end_index = bytes_seq.find(SCRIPTENCODING_PREFIX, start_index + 1) + for m in re.finditer(b'^\s*(scriptencoding)', bytes_seq, re.MULTILINE): + end_index = m.start(1) - if end_index < 0: - end_index = max_end_index + if end_index == 0: + continue bytes_seq_and_loc_list.append(( "{start_index}:{end_index}".format(start_index=start_index, end_index=end_index), bytes_seq[start_index:end_index] )) + start_index = end_index - if end_index < max_end_index: - start_index = end_index - continue + bytes_seq_and_loc_list.append(( + "{start_index}:{end_index}".format(start_index=start_index, end_index=max_end_index), + bytes_seq[start_index:max_end_index] + )) - return bytes_seq_and_loc_list + return bytes_seq_and_loc_list class EncodingDetectionError(Exception): diff --git a/vint/encodings/decoding_strategy.py b/vint/encodings/decoding_strategy.py index 7290212..abd3e28 100644 --- a/vint/encodings/decoding_strategy.py +++ b/vint/encodings/decoding_strategy.py @@ -86,6 +86,11 @@ def parse_script_encoding(cls, bytes_seq, debug_hint): # type: (bytes, Dict[str, Any]) -> Optional[bytes] try: start_index = bytes_seq.index(SCRIPTENCODING_PREFIX) + + if start_index != 0: + debug_hint['scriptencoding_error'] = '`scriptencoding` is comment or string' + return None + encoding_part_start_index = start_index + len(SCRIPTENCODING_PREFIX) try: