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
0cd2ecf4
Commit
0cd2ecf4
authored
Jan 09, 2015
by
Niels
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
minor style adjustments
parent
3fa2e900
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
121 additions
and
35 deletions
+121
-35
header_only/json.h
header_only/json.h
+65
-9
src/json.cc
src/json.cc
+56
-26
No files found.
header_only/json.h
View file @
0cd2ecf4
...
...
@@ -2482,35 +2482,91 @@ Parses a string after opening quotes (\p ") where read.
@post The character after the closing quote \p " is the current character @ref
current_. Whitespace is skipped.
@todo Unicode escapes such as \uxxxx are missing - see
https://github.com/nlohmann/json/issues/12
*/
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_
++
)
{
char
currentChar
=
buffer_
[
pos_
];
//
currentChar is a quote, so we might have found the end of the str
ing
if
(
currentChar
==
'"'
)
//
uneven amount of backslashes means the user wants to escape someth
ing
if
(
!
evenAmountOfBackslashes
)
{
// but only if the amount of backslashes before that quote is even
if
(
evenAmountOfBackslashes
)
// slash, backslash and quote are copied as is
if
(
currentChar
==
'/'
or
currentChar
==
'\\'
or
currentChar
==
'"'
)
{
result
+=
currentChar
;
}
else
{
// all other characters are replaced by their respective
// special character
switch
(
currentChar
)
{
case
't'
:
{
result
+=
'\t'
;
break
;
}
case
'b'
:
{
result
+=
'\b'
;
break
;
}
case
'f'
:
{
result
+=
'\f'
;
break
;
}
case
'n'
:
{
result
+=
'\n'
;
break
;
}
case
'r'
:
{
result
+=
'\r'
;
break
;
}
default:
{
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
;
}
}
...
...
src/json.cc
View file @
0cd2ecf4
...
...
@@ -2039,6 +2039,9 @@ Parses a string after opening quotes (\p ") where read.
@post The character after the closing quote \p " is the current character @ref
current_. Whitespace is skipped.
@todo Unicode escapes such as \uxxxx are missing - see
https://github.com/nlohmann/json/issues/12
*/
std
::
string
json
::
parser
::
parseString
()
{
...
...
@@ -2050,39 +2053,63 @@ std::string json::parser::parseString()
std
::
string
result
;
// iterate with pos_ over the whole string
for
(;
pos_
<
buffer_
.
size
();
pos_
++
)
{
for
(;
pos_
<
buffer_
.
size
();
pos_
++
)
{
char
currentChar
=
buffer_
[
pos_
];
// uneven amount of backslashes means the user wants to escape something
if
(
!
evenAmountOfBackslashes
)
{
if
(
!
evenAmountOfBackslashes
)
{
// slash, backslash and quote are copied as is
if
(
currentChar
==
'/'
||
currentChar
==
'\\'
||
currentChar
==
'"'
)
{
if
(
currentChar
==
'/'
or
currentChar
==
'\\'
or
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."
);
}
else
{
// all other characters are replaced by their respective
// special character
switch
(
currentChar
)
{
case
't'
:
{
result
+=
'\t'
;
break
;
}
case
'b'
:
{
result
+=
'\b'
;
break
;
}
case
'f'
:
{
result
+=
'\f'
;
break
;
}
case
'n'
:
{
result
+=
'\n'
;
break
;
}
case
'r'
:
{
result
+=
'\r'
;
break
;
}
default:
{
error
(
"expected one of
\\
, /, b, f, n, r, t behind backslash."
);
}
}
// TODO implement \uXXXX
}
}
else
{
if
(
currentChar
==
'"'
)
{
}
else
{
if
(
currentChar
==
'"'
)
{
// currentChar is a quote, so we found the end of the string
// set pos_ behind the trailing quote
pos_
++
;
// find next char to parse
...
...
@@ -2090,9 +2117,12 @@ std::string json::parser::parseString()
// 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).
}
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
;
}
}
...
...
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