summaryrefslogtreecommitdiff
path: root/interface/input/parsers.py
diff options
context:
space:
mode:
Diffstat (limited to 'interface/input/parsers.py')
-rwxr-xr-xinterface/input/parsers.py165
1 files changed, 165 insertions, 0 deletions
diff --git a/interface/input/parsers.py b/interface/input/parsers.py
new file mode 100755
index 0000000..5e53e03
--- /dev/null
+++ b/interface/input/parsers.py
@@ -0,0 +1,165 @@
+def parse_interval(s):
+ if not s:
+ return None, s
+ dash = False
+ init_s = s
+ buff = ""
+ r = [-1, -1]
+ i = 0
+ while s:
+ if not dash and s[0] == '-':
+ if buff:
+ r[0] = int(buff)
+ buff = ""
+ dash = True
+ elif s[0] in "0123456789":
+ buff += s[0]
+ else:
+ break
+ s = s[1:]
+ i += 1
+
+ if buff:
+ r[1 if dash else 0] = int(buff)
+ elif not buff and not dash:
+ return None, s, None
+
+ if not dash:
+ r[1] = r[0]
+
+ return tuple(r), s, init_s[:i]
+
+def parse_range(s):
+ if not s:
+ return None, s, None
+
+ rs = []
+ disp = []
+ tc = False
+ while s:
+ r, s, d = parse_interval(s)
+ if r is None:
+ break
+ tc = False
+ rs.append(r)
+ disp.append(d)
+ if s and s[0] == ',':
+ s = s[1:]
+ tc = True
+ else:
+ break
+
+ if not rs:
+ return None, s, None
+ return tuple(rs), s, ", ".join(disp) + (", " if tc else "")
+
+def parse_channelrange(s):
+ if not s:
+ return None, s, None
+
+ f, s, d1 = parse_range(s)
+ if f is None:
+ return None, s, None
+ elif not s or s[0] != ';':
+ return (f, ((-1,-1),)), s, d1
+
+
+ s = s[1:]
+ c, s, d2 = parse_range(s)
+ if c is None:
+ return (f, ((-1, -1),)), s, d1 + "; "
+
+ return (f, c), s, d1+"; "+d2
+
+def parse_value(s):
+ if not s:
+ return None, s
+
+ buff = ""
+ while s:
+ if s[0] in "0123456789" and int(buff+s[0]) < 256:
+ buff += s[0]
+ s = s[1:]
+ else:
+ break
+
+ return (None if not buff else int(buff)), s, buff
+
+def parse_num(s):
+ if not s:
+ return None, s
+
+ buff = ""
+ while s:
+ if s[0] in "0123456789":
+ buff += s[0]
+ s = s[1:]
+ else:
+ break
+
+ return (None if not buff else int(buff)), s, buff
+
+def make_parse_letter(letter, display):
+ def inner(s):
+ if not s or s[0] != letter:
+ return None, s, None
+ return True, s[1:], display
+
+ return inner
+
+def parse_null(s):
+ return True, s, ""
+
+def parse_string(s):
+ if not s:
+ return None, s, None
+
+ buff = ""
+ while s:
+ if s[0] != ' ':
+ buff += s[0]
+ s = s[1:]
+ else:
+ if not buff:
+ return None, s, None
+ break
+
+ return buff, s, buff
+
+def parse_quotedstring(s):
+ if not s:
+ return None, s, None
+
+ if s[0] != "'":
+ return None, s, None
+ s = s[1:]
+
+ buff = ""
+ bs = False
+ while s:
+ if s[0] == '\\':
+ buff += s[0]
+ bs = not bs
+ elif s[0] == "'":
+ if bs:
+ buff += s[0]
+ bs = False
+ else:
+ s = s[1:]
+ break
+ else:
+ buff += s[0]
+ bs = False
+ s = s[1:]
+ else:
+ return buff, s, "'"+buff
+ return buff, s, "'"+buff+"'"
+
+PARSE_MAP = {
+ "$channel_range": parse_channelrange,
+ "$value": parse_value,
+ "$null": parse_null,
+ "$string": parse_string,
+ "$num": parse_num,
+ "$quoted_string": parse_quotedstring,
+}