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
7f4fcc51
Commit
7f4fcc51
authored
Jan 09, 2015
by
Raphael Isemann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implemented the JSON spec for string parsing for everything but the \uXXXX escaping for unicode
parent
2443aa65
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
70 additions
and
15 deletions
+70
-15
src/json.cc
src/json.cc
+39
-13
test/json_unit.cc
test/json_unit.cc
+31
-2
No files found.
src/json.cc
View file @
7f4fcc51
...
...
@@ -2042,32 +2042,58 @@ Parses a string after opening quotes (\p ") where read.
*/
std
::
string
json
::
parser
::
parseString
()
{
// 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
;
// the result of the parse process
std
::
string
result
;
// iterate with pos_ over the whole string
for
(;
pos_
<
buffer_
.
size
();
pos_
++
)
{
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
)
{
// uneven amount of backslashes means the user wants to escape something
if
(
!
evenAmountOfBackslashes
)
{
// slash, backslash and quote are copied as is
if
(
currentChar
==
'/'
||
currentChar
==
'\\'
||
currentChar
==
'"'
)
{
result
+=
currentChar
;
}
else
{
// All other characters are replaced by their respective special character
if
(
currentChar
==
't'
)
{
result
+=
'\t'
;
}
else
if
(
currentChar
==
'b'
)
{
result
+=
'\b'
;
}
else
if
(
currentChar
==
'f'
)
{
result
+=
'\f'
;
}
else
if
(
currentChar
==
'n'
)
{
result
+=
'\n'
;
}
else
if
(
currentChar
==
'r'
)
{
result
+=
'\r'
;
}
else
{
error
(
"expected one of
\\
,/,b,f,n,r,t behind backslash."
);
}
// TODO implement \uXXXX
}
}
else
{
if
(
currentChar
==
'"'
)
{
// currentChar is a quote, so we found the end of the string
const
auto
stringLength
=
pos_
-
startPos
;
// set pos_ behind the trailing quote
pos_
++
;
// find next char to parse
next
();
// return string inside the quotes
return
buffer_
.
substr
(
startPos
,
stringLength
);
// bring the result of the parsing process back to the caller
return
result
;
}
else
if
(
currentChar
!=
'\\'
)
{
// all non-backslash characters are added to the end of the result string.
// the only backslashes we want in the result are the ones that are escaped (which happens above).
result
+=
currentChar
;
}
}
...
...
test/json_unit.cc
View file @
7f4fcc51
...
...
@@ -1618,10 +1618,39 @@ TEST_CASE("Parser")
CHECK
(
json
::
parse
(
"
\"\"
"
)
==
json
(
""
));
CHECK
(
json
::
parse
(
"
\"
foo
\"
"
)
==
json
(
"foo"
));
// escap
e character
s
// escap
ing quote
s
CHECK_THROWS_AS
(
json
::
parse
(
"
\"\\\"
"
),
std
::
invalid_argument
);
CHECK_NOTHROW
(
json
::
parse
(
"
\"\\\"\"
"
));
CHECK_NOTHROW
(
json
::
parse
(
"
\"\\\\\"
"
));
// escaping backslashes
CHECK
(
json
::
parse
(
"
\"
a
\\\\
z
\"
"
)
==
json
(
"a
\\
z"
));
CHECK
(
json
::
parse
(
"
\"\\\\\"
"
)
==
json
(
"
\\
"
));
CHECK
(
json
::
parse
(
"
\"\\\\
a
\\\\\"
"
)
==
json
(
"
\\
a
\\
"
));
CHECK
(
json
::
parse
(
"
\"\\\\\\\\\"
"
)
==
json
(
"
\\\\
"
));
// escaping slash
CHECK
(
json
::
parse
(
"
\"
a
\\
/z
\"
"
)
==
json
(
"a/z"
));
CHECK
(
json
::
parse
(
"
\"\\
/
\"
"
)
==
json
(
"/"
));
// escaping tabs
CHECK
(
json
::
parse
(
"
\"
a
\\
tz
\"
"
)
==
json
(
"a
\t
z"
));
CHECK
(
json
::
parse
(
"
\"\\
t
\"
"
)
==
json
(
"
\t
"
));
// escaping formfeed
CHECK
(
json
::
parse
(
"
\"
a
\\
fz
\"
"
)
==
json
(
"a
\f
z"
));
CHECK
(
json
::
parse
(
"
\"\\
f
\"
"
)
==
json
(
"
\f
"
));
// escaping carriage return
CHECK
(
json
::
parse
(
"
\"
a
\\
rz
\"
"
)
==
json
(
"a
\r
z"
));
CHECK
(
json
::
parse
(
"
\"\\
r
\"
"
)
==
json
(
"
\r
"
));
// escaping backspace
CHECK
(
json
::
parse
(
"
\"
a
\\
bz
\"
"
)
==
json
(
"a
\b
z"
));
CHECK
(
json
::
parse
(
"
\"\\
b
\"
"
)
==
json
(
"
\b
"
));
// escaping newline
CHECK
(
json
::
parse
(
"
\"
a
\\
nz
\"
"
)
==
json
(
"a
\n
z"
));
CHECK
(
json
::
parse
(
"
\"\\
n
\"
"
)
==
json
(
"
\n
"
));
// 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