2018-10-09 09:43:42 +00:00
|
|
|
"""
|
|
|
|
Utility functions used for parsing.
|
|
|
|
"""
|
2018-10-27 14:51:30 +00:00
|
|
|
import struct
|
2018-10-09 09:43:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
def can_be_mark(argument):
|
|
|
|
"""
|
|
|
|
The ``argument`` can be interpreted as a Mark.
|
|
|
|
"""
|
|
|
|
a = ord("a")
|
|
|
|
a_z = [chr(a + i) for i in range(26)]
|
|
|
|
A = ord("A")
|
|
|
|
A_Z = [chr(A + i) for i in range(26)]
|
|
|
|
null = ord("0")
|
|
|
|
null_9 = [chr(null + i) for i in range(10)]
|
|
|
|
|
|
|
|
if(not argument[0] in a_z):
|
|
|
|
return False
|
|
|
|
|
|
|
|
for char in argument[1:]:
|
|
|
|
if(not (char in a_z
|
|
|
|
or char in A_Z
|
|
|
|
or char in null_9
|
|
|
|
or char == "_")):
|
|
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def can_convert_to_int(value):
|
|
|
|
"""
|
|
|
|
``value`` can be converted to an integer.
|
|
|
|
|
|
|
|
**Note** that this returns ``True`` if the value is a
|
|
|
|
character definition like ``'a'``.
|
|
|
|
"""
|
|
|
|
if(value.startswith("0x")):
|
|
|
|
try:
|
|
|
|
int(value[2:], 16)
|
|
|
|
return True
|
|
|
|
except:
|
|
|
|
return False
|
|
|
|
|
|
|
|
if(value.startswith("0b")):
|
|
|
|
try:
|
|
|
|
int(value[2:], 2)
|
|
|
|
return True
|
|
|
|
except:
|
|
|
|
return False
|
|
|
|
|
|
|
|
if(value.startswith("'") and value.endswith("'")):
|
|
|
|
if(len(value) == 3):
|
|
|
|
return True
|
|
|
|
if(len(value) == 4):
|
|
|
|
if(value[1:-1] in {"\\n", "\\r", "\\t"}):
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
|
|
|
try:
|
|
|
|
int(value)
|
|
|
|
return True
|
|
|
|
except:
|
|
|
|
return False
|
|
|
|
|
|
|
|
def autoint(value):
|
|
|
|
"""
|
|
|
|
Convert ``value`` to an integer automatically.
|
|
|
|
"""
|
|
|
|
escape_sequences = {"\\n": "\n", "\\r": "\r", "\\t":"\t"}
|
|
|
|
if(value.startswith("0x")):
|
|
|
|
return int(value[2:], 16)
|
|
|
|
|
|
|
|
if(value.startswith("0b")):
|
|
|
|
return int(value[2:], 2)
|
|
|
|
|
|
|
|
if(value.startswith("'") and value.endswith("'")):
|
|
|
|
if(len(value) == 3):
|
|
|
|
return ord(value[1:-1])
|
|
|
|
if(len(value) == 4):
|
|
|
|
if(value[1:-1] in escape_sequences):
|
|
|
|
return ord(escape_sequences[value[1:-1]])
|
|
|
|
|
|
|
|
return int(value)
|
|
|
|
|
|
|
|
|
2018-10-27 14:51:30 +00:00
|
|
|
def int16_2_bytes(value):
|
|
|
|
"""
|
|
|
|
Return the bytes representation of a 16bit unsigned
|
|
|
|
integer in 8bit words.
|
|
|
|
"""
|
|
|
|
if(value < 0):
|
|
|
|
return struct.pack("<h", value)
|
|
|
|
return struct.pack("<H", value)
|