11import os
22import logging
33import subprocess
4+ import re
45
56from . import util
67from . import constants
@@ -13,13 +14,19 @@ def parse_line(line):
1314 :param line:
1415 """
1516
17+ if len (line .split ("=" )) != 2 :
18+ logging .warning (
19+ "don't know what to do with line '{}', no '='" .format (line ))
20+ return (line , {})
21+
1622 name = line .split ("=" )[0 ]
17- rest = line .split ("=" )[1 ]
23+ rest = line .split ("=" )[1 ]. strip ()
1824
1925 state = {}
2026 state ["name" ] = name
2127
22- if "[" in rest :
28+ # enum case, i.e. off [ off on ]
29+ if re .match ("^[a-zA-Z0-9:-]+\s+\[[a-zA-Z0-9 :-]+\]$" , rest ):
2330 state ["type" ] = "enum"
2431 state ["current" ] = rest .split ("[" )[0 ].strip ()
2532
@@ -30,7 +37,8 @@ def parse_line(line):
3037 else :
3138 state ["possible" ].append (val )
3239
33- elif "{" in rest :
40+ # set case, i.e. hp { spkr hp }
41+ elif re .match ("((^[a-zA-Z0-9,:-]+\s+)|^)\{[a-zA-Z0-9 :-]+\}$" , rest ):
3442 state ["type" ] = "set"
3543 rest = rest .replace ("}" , "" )
3644 state ["current" ] = tuple (rest .split ("{" )[0 ].strip ().split ("," ))
@@ -42,13 +50,30 @@ def parse_line(line):
4250 else :
4351 state ["possible" ].append (val )
4452
45- else :
53+ # value case, single int value
54+ elif re .match ("^[0-9]+$" , rest ):
55+ state ["type" ] = "value"
56+ state ["current" ] = int (rest )
57+
58+ # value case, pair of int values
59+ elif re .match ("^[0-9]+[,][0-9]+$" , rest ):
60+ state ["type" ] = "value"
61+ state ["current" ] = tuple ((int (x ) for x in rest .split ("," )))
62+
63+ # value case, single int value, with annotation
64+ elif re .match ("^[0-9]+\s+[a-zA-Z]+$" , rest ):
4665 state ["type" ] = "value"
47- if "," in rest :
48- state ["current" ] = tuple ((int (x ) for x in rest .split ("," )))
49- else :
50- state ["current" ] = int (rest )
66+ state ["current" ] = int (rest .split (' ' )[0 ])
5167
68+ # value case, pair of int values, with annotation
69+ elif re .match ("^[0-9]+[,][0-9]+\s+[a-zA-Z]+$" , rest ):
70+ state ["type" ] = "value"
71+ rest = rest .split (' ' )[0 ]
72+ state ["current" ] = tuple ((int (x ) for x in rest .split ("," )))
73+
74+ else :
75+ logging .warning ("unhanded format for '{}', giving up" .format (rest ))
76+ return (line , {})
5277
5378 return name , state
5479
@@ -70,6 +95,12 @@ def get_state():
7095 continue
7196
7297 key , val = parse_line (line )
98+
99+ if len (val .keys ()) == 0 :
100+ logging .warning (
101+ "discarding key '{}' due to empty value" .format (key ))
102+ continue
103+
73104 control [key ] = val
74105
75106 return control
0 commit comments