diff --git a/include/json/value.h b/include/json/value.h index b274688..efc34ac 100644 --- a/include/json/value.h +++ b/include/json/value.h @@ -432,9 +432,11 @@ Json::Value obj_value(Json::objectValue); // {} // EnumValues enumValues() const; //# endif - /// Comments must be //... or /* ... */ + /// \deprecated Always pass len. void setComment(const char* comment, CommentPlacement placement); /// Comments must be //... or /* ... */ + void setComment(const char* comment, size_t len, CommentPlacement placement); + /// Comments must be //... or /* ... */ void setComment(const std::string& comment, CommentPlacement placement); bool hasComment(CommentPlacement placement) const; /// Include delimiters and embedded newlines. @@ -477,7 +479,7 @@ private: CommentInfo(); ~CommentInfo(); - void setComment(const char* text); + void setComment(const char* text, size_t len); char* comment_; }; diff --git a/src/lib_json/json_reader.cpp b/src/lib_json/json_reader.cpp index 9e6d161..d2cff9a 100644 --- a/src/lib_json/json_reader.cpp +++ b/src/lib_json/json_reader.cpp @@ -135,9 +135,6 @@ bool Reader::readValue() { bool successful = true; if (collectComments_ && !commentsBefore_.empty()) { - // Remove newline at the end of the comment - if (commentsBefore_[commentsBefore_.size() - 1] == '\n') - commentsBefore_.resize(commentsBefore_.size() - 1); currentValue().setComment(commentsBefore_, commentBefore); commentsBefore_ = ""; } diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp index 150eff9..ed5aafe 100644 --- a/src/lib_json/json_value.cpp +++ b/src/lib_json/json_value.cpp @@ -141,7 +141,7 @@ Value::CommentInfo::~CommentInfo() { releaseStringValue(comment_); } -void Value::CommentInfo::setComment(const char* text) { +void Value::CommentInfo::setComment(const char* text, size_t len) { if (comment_) { releaseStringValue(comment_); comment_ = 0; @@ -151,7 +151,7 @@ void Value::CommentInfo::setComment(const char* text) { text[0] == '\0' || text[0] == '/', "in Json::Value::setComment(): Comments must start with /"); // It seems that /**/ style comments are acceptable as well. - comment_ = duplicateStringValue(text); + comment_ = duplicateStringValue(text, len); } // ////////////////////////////////////////////////////////////////// @@ -369,7 +369,8 @@ Value::Value(const Value& other) for (int comment = 0; comment < numberOfCommentPlacement; ++comment) { const CommentInfo& otherComment = other.comments_[comment]; if (otherComment.comment_) - comments_[comment].setComment(otherComment.comment_); + comments_[comment].setComment( + otherComment.comment_, strlen(otherComment.comment_)); } } } @@ -1227,14 +1228,22 @@ bool Value::isArray() const { return type_ == arrayValue; } bool Value::isObject() const { return type_ == objectValue; } -void Value::setComment(const char* comment, CommentPlacement placement) { +void Value::setComment(const char* comment, size_t len, CommentPlacement placement) { if (!comments_) comments_ = new CommentInfo[numberOfCommentPlacement]; - comments_[placement].setComment(comment); + if ((len > 0) && (comment[len-1] == '\n')) { + // Always discard trailing newline, to aid indentation. + len -= 1; + } + comments_[placement].setComment(comment, len); +} + +void Value::setComment(const char* comment, CommentPlacement placement) { + setComment(comment, strlen(comment), placement); } void Value::setComment(const std::string& comment, CommentPlacement placement) { - setComment(comment.c_str(), placement); + setComment(comment.c_str(), comment.length(), placement); } bool Value::hasComment(CommentPlacement placement) const {