@@ -22,50 +22,42 @@ bash_toml.do_parse() {
22
22
case " $mode " in
23
23
# State in which parser starts, and before any given TOML construct
24
24
MODE_DEFAULT)
25
- if bash_toml.is.whitespace " $char " ; then
26
- :
27
- elif bash_toml.is.newline " $char " ; then
28
- :
29
- elif bash_toml.is.octothorp " $char " ; then
25
+ if bash_toml.is.octothorp " $char " ; then
30
26
mode=' MODE_IN_COMMENT'
31
- elif bash_toml.is.table " $char " ; then
32
- bash_toml.parse_fail ' NOT_IMPLEMENTED' " Tables are not supported"
33
- return 1
27
+
34
28
elif bash_toml.is.double_quote " $char " ; then
35
29
bash_toml.init_key_string ' '
36
30
mode=' MODE_QUOTEDKEY_DURING_KEY'
31
+
37
32
elif bash_toml.is.valid_bare_key_char " $char " ; then
38
33
bash_toml.init_key_string " $char "
39
34
mode=" MODE_BAREKEY_DURING_KEY"
40
- else
41
- # If after only gobbling up whitespace, and there is nothign left,
42
- # we are done
43
- return 0
35
+
36
+ elif bash_toml.is.table " $char " ; then
37
+ bash_toml.parse_fail ' NOT_IMPLEMENTED ' " Tables are not supported "
38
+ return 1
44
39
fi
45
40
;;
46
41
MODE_IN_COMMENT)
47
42
if bash_toml.is.newline " $char " ; then
48
43
mode=' MODE_DEFAULT'
49
- elif bash_toml.is.empty " $char " ; then
50
- mode=' MODE_DEFAULT'
51
- else
52
- :
53
44
fi
54
45
;;
55
46
MODE_ANY_BEFORE_VALUE)
56
47
if bash_toml.is.whitespace " $char " ; then
57
48
:
58
- elif bash_toml.is.double_quote " $char " ; then
59
- mode=' MODE_DOUBLEQUOTE_DURING_VALUE'
60
- bash_toml.init_value_string
49
+
61
50
elif bash_toml.is.single_quote " $char " ; then
62
51
mode=' MODE_SINGLEQUOTE_DURING_VALUE'
63
52
bash_toml.init_value_string
53
+
54
+ elif bash_toml.is.double_quote " $char " ; then
55
+ mode=' MODE_DOUBLEQUOTE_DURING_VALUE'
56
+ bash_toml.init_value_string
57
+
64
58
elif bash_toml.is.newline " $char " ; then
65
59
bash_toml.parse_fail ' UNEXPECTED_NEWLINE' ' Expected to find value on the same line'
66
- elif bash_toml.is.empty " $char " ; then
67
- bash_toml.parse_fail ' UNEXPECTED_EOF' ' Expected to find value on the same line'
68
- return 1
60
+
69
61
else
70
62
bash_toml.parse_fail ' NOT_IMPLEMENTED' " Construct is not valid or not yet implemented"
71
63
return 1
@@ -74,16 +66,17 @@ bash_toml.do_parse() {
74
66
MODE_BAREKEY_DURING_KEY)
75
67
if bash_toml.is.whitespace " $char " ; then
76
68
mode=" MODE_EQUALS_BEFORE"
69
+
77
70
elif bash_toml.is.equals_sign " $char " ; then
78
71
mode=' MODE_ANY_BEFORE_VALUE'
72
+
79
73
elif bash_toml.is.newline " $char " ; then
80
- bash_toml.parse_fail ' KEY_INVALID' " Key name found without value"
74
+ bash_toml.parse_fail ' KEY_INVALID' " Key does not have a value"
81
75
return 1
76
+
82
77
elif bash_toml.is.valid_bare_key_char " $char " ; then
83
78
bash_toml.append_key_string " $char "
84
- elif bash_toml.is.empty " $char " ; then
85
- bash_toml.parse_fail ' KEY_INVALID'
86
- return 1
79
+
87
80
else
88
81
bash_toml.parse_fail ' UNEXPECTED_CHARACTER' " Char '$char ' is not valid in toml bare keys"
89
82
return 1
@@ -92,24 +85,22 @@ bash_toml.do_parse() {
92
85
MODE_QUOTEDKEY_DURING_KEY)
93
86
if bash_toml.is.double_quote " $char " ; then
94
87
mode=" MODE_EQUALS_BEFORE"
88
+
95
89
elif bash_toml.is.newline " $char " ; then
96
- bash_toml.parse_fail ' KEY_INVALID' ' Quoted key was not finished on the same line'
97
- return 1
98
- elif bash_toml.is.empty " $char " ; then
99
- bash_toml.parse_fail ' KEY_INVALID' ' Quoted key was not finished on the same line'
90
+ bash_toml.parse_fail ' KEY_INVALID' ' Key does not have a value'
100
91
return 1
92
+
101
93
else
102
94
bash_toml.append_key_string " $char "
103
95
fi
104
96
;;
105
97
MODE_EQUALS_BEFORE)
106
98
if bash_toml.is.whitespace " $char " ; then
107
99
:
100
+
108
101
elif bash_toml.is.equals_sign " $char " ; then
109
102
mode=" MODE_ANY_BEFORE_VALUE"
110
- elif bash_toml.is.empty " $char " ; then
111
- bash_toml.parse_fail ' UNEXPECTED_EOF' " No equals sign found"
112
- return 1
103
+
113
104
else
114
105
bash_toml.parse_fail ' KEY_INVALID'
115
106
return 1
@@ -119,11 +110,14 @@ bash_toml.do_parse() {
119
110
MODE_DOUBLEQUOTE_DURING_VALUE)
120
111
if bash_toml.is.double_quote " $char " ; then
121
112
mode=' MODE_DEFAULT_END'
113
+
122
114
elif bash_toml.is.backslash " $char " ; then
123
115
mode=' MODE_DOUBLEQUOTE_DURING_ESCAPE_SEQUENCE'
116
+
124
117
elif bash_toml.is.newline " $char " ; then
125
118
bash_toml.parse_fail ' UNEXPECTED_NEWLINE' " Literal newlines must not be present in double quotes"
126
119
return 1
120
+
127
121
elif bash_toml.is.control_character " $char " ; then
128
122
# TODO: this code path won't get activated
129
123
:
@@ -168,18 +162,22 @@ bash_toml.do_parse() {
168
162
MODE_DOUBLEQUOTE_DURING_ESCAPE_SEQUENCE_UNICODE_START)
169
163
local -i unicode_nth_digit=1
170
164
local unicode_code_point=
165
+
171
166
if bash_toml.is.hex_digit " $char " ; then
172
167
unicode_code_point+=" $char "
173
168
mode=' MODE_DOUBLEQUOTE_DURING_ESCAPE_SEQUENCE_UNICODE_DURING'
169
+
174
170
else
175
171
bash_toml.parse_fail ' UNEXPECTED_CHARACTER' " Encountered character '$char ', which is not a valid hex digit as part of a unicode scalar value"
176
172
return 1
177
173
fi
178
174
;;
179
175
MODE_DOUBLEQUOTE_DURING_ESCAPE_SEQUENCE_UNICODE_DURING)
180
176
unicode_nth_digit=$(( unicode_nth_digit+ 1 ))
177
+
181
178
if bash_toml.is.hex_digit " $char " ; then
182
179
unicode_code_point+=" $char "
180
+
183
181
else
184
182
bash_toml.parse_fail ' UNEXPECTED_CHARACTER' " Encountered character '$char ', which is not a valid hex digit as part of a unicode scalar value"
185
183
return 1
@@ -223,25 +221,25 @@ bash_toml.do_parse() {
223
221
MODE_SINGLEQUOTE_DURING_VALUE)
224
222
if bash_toml.is.single_quote " $char " ; then
225
223
mode=' MODE_DEFAULT_END'
224
+
226
225
elif bash_toml.is.newline " $char " ; then
227
226
bash_toml.parse_fail ' UNEXPECTED_NEWLINE' " Newlines are not valid in single quote"
228
227
return 1
229
- elif bash_toml.is.empty " $char " ; then
230
- bash_toml.parse_fail ' UNEXPECTED_EOF' " Must complete the literal string with a single quote"
231
- return 1
228
+
232
229
else
233
230
bash_toml.append_value_string " $char "
234
231
fi
235
232
;;
236
233
MODE_DEFAULT_END)
237
234
if bash_toml.is.whitespace " $char " ; then
238
235
:
236
+
239
237
elif bash_toml.is.newline " $char " ; then
240
238
mode=' MODE_DEFAULT'
241
- elif bash_toml.is.empty " $char " ; then
242
- mode=' MODE_DEFAULT'
239
+
243
240
elif bash_toml.is.octothorp " $char " ; then
244
241
mode=' MODE_IN_COMMENT'
242
+
245
243
else
246
244
bash_toml.parse_fail ' UNEXPECTED_CHARACTER' " Encountered character '$char ' when a newline was expected"
247
245
return 1
@@ -251,13 +249,14 @@ bash_toml.do_parse() {
251
249
done
252
250
253
251
case " $mode " in
254
- MODE_DEFAULT|MODE_DEFAULT_END)
252
+ MODE_DEFAULT|MODE_IN_COMMENT| MODE_DEFAULT_END)
255
253
;;
256
254
* )
257
255
bash_toml.parse_fail ' UNEXPECTED_EOF' ' Did not finish parsing construct'
258
256
return 1
259
257
;;
260
258
esac
259
+
261
260
# If we try to set an empty key with a value, then later on,
262
261
# we can access any value (using a non-integer key), and we
263
262
# will get a result that equals the original value value
0 commit comments