Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
J
json
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
json
Commits
661a44d1
Commit
661a44d1
authored
Jan 09, 2015
by
Niels
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #18 from Teemperor/fix_quote_escaping
Fixed escaped quotes (issue #17)
parents
46474010
4a39bfb1
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
38 additions
and
25 deletions
+38
-25
src/json.cc
src/json.cc
+37
-25
test/json_unit.cc
test/json_unit.cc
+1
-0
No files found.
src/json.cc
View file @
661a44d1
...
...
@@ -2042,34 +2042,46 @@ Parses a string after opening quotes (\p ") where read.
*/
std
::
string
json
::
parser
::
parseString
()
{
// get position of closing quotes
auto
quotepos_
=
buffer_
.
find_first_of
(
"
\"
"
,
pos_
);
// remember the position where the first character of the string was
const
auto
startPos
=
pos_
;
// true if and only if the amount of backslashes before the current
// character is even
bool
evenAmountOfBackslashes
=
true
;
// iterate with pos_ over the whole string
for
(;
pos_
<
buffer_
.
size
();
pos_
++
)
{
char
currentChar
=
buffer_
[
pos_
];
// currentChar is a quote, so we might have found the end of the string
if
(
currentChar
==
'"'
)
{
// but only if the amount of backslashes before that quote is even
if
(
evenAmountOfBackslashes
)
{
const
auto
stringLength
=
pos_
-
startPos
;
// set pos_ behind the trailing quote
pos_
++
;
// find next char to parse
next
();
// if the closing quotes are escaped (character before the quotes is a
// backslash), we continue looking for the final quotes
while
(
quotepos_
!=
std
::
string
::
npos
and
buffer_
[
quotepos_
-
1
]
==
'\\'
)
{
quotepos_
=
buffer_
.
find_first_of
(
"
\"
"
,
quotepos_
+
1
);
// return string inside the quotes
return
buffer_
.
substr
(
startPos
,
stringLength
);
}
// check if closing quotes were found
if
(
quotepos_
==
std
::
string
::
npos
)
{
error
(
"expected '
\"
'"
);
}
// store the coordinates of the string for the later return value
const
auto
stringBegin
=
pos_
;
const
auto
stringLength
=
quotepos_
-
pos_
;
// set buffer position to the position behind (+1) the closing quote
pos_
=
quotepos_
+
1
;
// read next character
next
();
// remember if we have an even amount of backslashes before the current character
if
(
currentChar
==
'\\'
)
{
// jump between even/uneven for each backslash we encounter
evenAmountOfBackslashes
=
!
evenAmountOfBackslashes
;
}
else
{
// zero backslashes are also an even number, so as soon as we encounter a non-backslash
// the chain of backslashes breaks and we start again from zero
evenAmountOfBackslashes
=
true
;
}
}
// return the string value
return
buffer_
.
substr
(
stringBegin
,
stringLength
);
// we iterated over the whole string without finding a unescaped quote
// so the given string is malformed
error
(
"expected '
\"
'"
);
}
/*!
...
...
test/json_unit.cc
View file @
661a44d1
...
...
@@ -1621,6 +1621,7 @@ TEST_CASE("Parser")
// escape characters
CHECK_THROWS_AS
(
json
::
parse
(
"
\"\\\"
"
),
std
::
invalid_argument
);
CHECK_NOTHROW
(
json
::
parse
(
"
\"\\\"\"
"
));
CHECK_NOTHROW
(
json
::
parse
(
"
\"\\\\\"
"
));
// quotes must be closed
CHECK_THROWS_AS
(
json
::
parse
(
"
\"
"
),
std
::
invalid_argument
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment