Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
R
rapidjson
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
rapidjson
Commits
7dddd054
Commit
7dddd054
authored
7 years ago
by
Milo Yip
Committed by
GitHub
7 years ago
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1070 from KaitoHH/line-col
Add feature of locating line and column number of error
parents
93f6cf4e
473553bd
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
242 additions
and
4 deletions
+242
-4
cursorstreamwrapper.h
include/rapidjson/cursorstreamwrapper.h
+78
-0
stream.h
include/rapidjson/stream.h
+48
-4
CMakeLists.txt
test/unittest/CMakeLists.txt
+1
-0
cursorstreamwrappertest.cpp
test/unittest/cursorstreamwrappertest.cpp
+115
-0
No files found.
include/rapidjson/cursorstreamwrapper.h
0 → 100644
View file @
7dddd054
// Tencent is pleased to support the open source community by making RapidJSON available.
//
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
//
// Licensed under the MIT License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// http://opensource.org/licenses/MIT
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
#ifndef RAPIDJSON_CURSORSTREAMWRAPPER_H_
#define RAPIDJSON_CURSORSTREAMWRAPPER_H_
#include "stream.h"
#if defined(__GNUC__)
RAPIDJSON_DIAG_PUSH
RAPIDJSON_DIAG_OFF
(
effc
++
)
#endif
#if defined(_MSC_VER) && _MSC_VER <= 1800
RAPIDJSON_DIAG_PUSH
RAPIDJSON_DIAG_OFF
(
4702
)
// unreachable code
RAPIDJSON_DIAG_OFF
(
4512
)
// assignment operator could not be generated
#endif
RAPIDJSON_NAMESPACE_BEGIN
//! Cursor stream wrapper for counting line and column number if error exists.
/*!
\tparam InputStream Any stream that implements Stream Concept
*/
template
<
typename
InputStream
,
typename
Encoding
=
UTF8
<>
>
class
CursorStreamWrapper
:
public
GenericStreamWrapper
<
InputStream
,
Encoding
>
{
public
:
typedef
typename
Encoding
::
Ch
Ch
;
CursorStreamWrapper
(
InputStream
&
is
)
:
GenericStreamWrapper
<
InputStream
,
Encoding
>
(
is
),
line_
(
1
),
col_
(
0
)
{}
// counting line and column number
Ch
Take
()
{
Ch
ch
=
this
->
is_
.
Take
();
if
(
ch
==
'\n'
)
{
line_
++
;
col_
=
0
;
}
else
{
col_
++
;
}
return
ch
;
}
//! Get the error line number, if error exists.
size_t
GetLine
()
const
{
return
line_
;
}
//! Get the error column number, if error exists.
size_t
GetColumn
()
const
{
return
col_
;
}
private
:
size_t
line_
;
//!< Current Line
size_t
col_
;
//!< Current Column
};
#if defined(_MSC_VER) && _MSC_VER <= 1800
RAPIDJSON_DIAG_POP
#endif
#if defined(__GNUC__)
RAPIDJSON_DIAG_POP
#endif
RAPIDJSON_NAMESPACE_END
#endif // RAPIDJSON_CURSORSTREAMWRAPPER_H_
This diff is collapsed.
Click to expand it.
include/rapidjson/stream.h
View file @
7dddd054
// Tencent is pleased to support the open source community by making RapidJSON available.
//
//
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
//
// Licensed under the MIT License (the "License"); you may not use this file except
...
...
@@ -7,9 +7,9 @@
//
// http://opensource.org/licenses/MIT
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
#include "rapidjson.h"
...
...
@@ -100,6 +100,50 @@ inline void PutN(Stream& stream, Ch c, size_t n) {
PutUnsafe
(
stream
,
c
);
}
///////////////////////////////////////////////////////////////////////////////
// GenericStreamWrapper
//! A Stream Wrapper
/*! \tThis string stream is a wrapper for any stream by just forwarding any
\treceived message to the origin stream.
\note implements Stream concept
*/
#if defined(_MSC_VER) && _MSC_VER <= 1800
RAPIDJSON_DIAG_PUSH
RAPIDJSON_DIAG_OFF
(
4702
)
// unreachable code
RAPIDJSON_DIAG_OFF
(
4512
)
// assignment operator could not be generated
#endif
template
<
typename
InputStream
,
typename
Encoding
=
UTF8
<>
>
class
GenericStreamWrapper
{
public
:
typedef
typename
Encoding
::
Ch
Ch
;
GenericStreamWrapper
(
InputStream
&
is
)
:
is_
(
is
)
{}
Ch
Peek
()
const
{
return
is_
.
Peek
();
}
Ch
Take
()
{
return
is_
.
Take
();
}
size_t
Tell
()
{
return
is_
.
Tell
();
}
Ch
*
PutBegin
()
{
return
is_
.
PutBegin
();
}
void
Put
(
Ch
ch
)
{
is_
.
Put
(
ch
);
}
void
Flush
()
{
is_
.
Flush
();
}
size_t
PutEnd
(
Ch
*
ch
)
{
return
is_
.
PutEnd
(
ch
);
}
// wrapper for MemoryStream
const
Ch
*
Peek4
()
const
{
return
is_
.
Peek4
();
}
// wrapper for AutoUTFInputStream
UTFType
GetType
()
const
{
return
is_
.
GetType
();
}
bool
HasBOM
()
const
{
return
is_
.
HasBOM
();
}
protected
:
InputStream
&
is_
;
};
#if defined(_MSC_VER) && _MSC_VER <= 1800
RAPIDJSON_DIAG_POP
#endif
///////////////////////////////////////////////////////////////////////////////
// StringStream
...
...
This diff is collapsed.
Click to expand it.
test/unittest/CMakeLists.txt
View file @
7dddd054
...
...
@@ -3,6 +3,7 @@ include(CheckCXXCompilerFlag)
set
(
UNITTEST_SOURCES
allocatorstest.cpp
bigintegertest.cpp
cursorstreamwrappertest.cpp
documenttest.cpp
dtoatest.cpp
encodedstreamtest.cpp
...
...
This diff is collapsed.
Click to expand it.
test/unittest/cursorstreamwrappertest.cpp
0 → 100644
View file @
7dddd054
// Tencent is pleased to support the open source community by making RapidJSON available.
//
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
//
// Licensed under the MIT License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// http://opensource.org/licenses/MIT
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
#include "unittest.h"
#include "rapidjson/document.h"
#include "rapidjson/cursorstreamwrapper.h"
using
namespace
rapidjson
;
// static const char json[] = "{\"string\"\n\n:\"my string\",\"array\"\n:[\"1\", \"2\", \"3\"]}";
bool
testJson
(
const
char
*
json
,
size_t
&
line
,
size_t
&
col
)
{
StringStream
ss
(
json
);
CursorStreamWrapper
<
StringStream
>
csw
(
ss
);
Document
document
;
document
.
ParseStream
(
csw
);
bool
ret
=
document
.
HasParseError
();
if
(
ret
)
{
col
=
csw
.
GetColumn
();
line
=
csw
.
GetLine
();
}
return
ret
;
}
TEST
(
CursorStreamWrapper
,
MissingFirstBracket
)
{
const
char
json
[]
=
"
\"
string
\"\n\n
:
\"
my string
\"
,
\"
array
\"\n
:[
\"
1
\"
,
\"
2
\"
,
\"
3
\"
]}"
;
size_t
col
,
line
;
bool
ret
=
testJson
(
json
,
line
,
col
);
EXPECT_TRUE
(
ret
);
EXPECT_EQ
(
line
,
3
);
EXPECT_EQ
(
col
,
0
);
}
TEST
(
CursorStreamWrapper
,
MissingQuotes
)
{
const
char
json
[]
=
"{
\"
string
\n\n
:
\"
my string
\"
,
\"
array
\"\n
:[
\"
1
\"
,
\"
2
\"
,
\"
3
\"
]}"
;
size_t
col
,
line
;
bool
ret
=
testJson
(
json
,
line
,
col
);
EXPECT_TRUE
(
ret
);
EXPECT_EQ
(
line
,
1
);
EXPECT_EQ
(
col
,
8
);
}
TEST
(
CursorStreamWrapper
,
MissingColon
)
{
const
char
json
[]
=
"{
\"
string
\"\n\n\"
my string
\"
,
\"
array
\"\n
:[
\"
1
\"
,
\"
2
\"
,
\"
3
\"
]}"
;
size_t
col
,
line
;
bool
ret
=
testJson
(
json
,
line
,
col
);
EXPECT_TRUE
(
ret
);
EXPECT_EQ
(
line
,
3
);
EXPECT_EQ
(
col
,
0
);
}
TEST
(
CursorStreamWrapper
,
MissingSecondQuotes
)
{
const
char
json
[]
=
"{
\"
string
\"\n\n
:my string
\"
,
\"
array
\"\n
:[
\"
1
\"
,
\"
2
\"
,
\"
3
\"
]}"
;
size_t
col
,
line
;
bool
ret
=
testJson
(
json
,
line
,
col
);
EXPECT_TRUE
(
ret
);
EXPECT_EQ
(
line
,
3
);
EXPECT_EQ
(
col
,
1
);
}
TEST
(
CursorStreamWrapper
,
MissingComma
)
{
const
char
json
[]
=
"{
\"
string
\"\n\n
:
\"
my string
\"\"
array
\"\n
:[
\"
1
\"
,
\"
2
\"
,
\"
3
\"
]}"
;
size_t
col
,
line
;
bool
ret
=
testJson
(
json
,
line
,
col
);
EXPECT_TRUE
(
ret
);
EXPECT_EQ
(
line
,
3
);
EXPECT_EQ
(
col
,
12
);
}
TEST
(
CursorStreamWrapper
,
MissingArrayBracket
)
{
const
char
json
[]
=
"{
\"
string
\"\n\n
:
\"
my string
\"
,
\"
array
\"\n
:
\"
1
\"
,
\"
2
\"
,
\"
3
\"
]}"
;
size_t
col
,
line
;
bool
ret
=
testJson
(
json
,
line
,
col
);
EXPECT_TRUE
(
ret
);
EXPECT_EQ
(
line
,
4
);
EXPECT_EQ
(
col
,
9
);
}
TEST
(
CursorStreamWrapper
,
MissingArrayComma
)
{
const
char
json
[]
=
"{
\"
string
\"\n\n
:
\"
my string
\"
,
\"
array
\"\n
:[
\"
1
\"
\"
2
\"
,
\"
3
\"
]}"
;
size_t
col
,
line
;
bool
ret
=
testJson
(
json
,
line
,
col
);
EXPECT_TRUE
(
ret
);
EXPECT_EQ
(
line
,
4
);
EXPECT_EQ
(
col
,
6
);
}
TEST
(
CursorStreamWrapper
,
MissingLastArrayBracket
)
{
const
char
json8
[]
=
"{
\"
string
\"\n\n
:
\"
my string
\"
,
\"
array
\"\n
:[
\"
1
\"
,
\"
2
\"
,
\"
3
\"
}"
;
size_t
col
,
line
;
bool
ret
=
testJson
(
json8
,
line
,
col
);
EXPECT_TRUE
(
ret
);
EXPECT_EQ
(
line
,
4
);
EXPECT_EQ
(
col
,
15
);
}
TEST
(
CursorStreamWrapper
,
MissingLastBracket
)
{
const
char
json9
[]
=
"{
\"
string
\"\n\n
:
\"
my string
\"
,
\"
array
\"\n
:[
\"
1
\"
,
\"
2
\"
,
\"
3
\"
]"
;
size_t
col
,
line
;
bool
ret
=
testJson
(
json9
,
line
,
col
);
EXPECT_TRUE
(
ret
);
EXPECT_EQ
(
line
,
4
);
EXPECT_EQ
(
col
,
16
);
}
This diff is collapsed.
Click to expand it.
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