diff options
Diffstat (limited to 'src/core/common')
| -rw-r--r-- | src/core/common/SourceContextReader.cpp | 18 | ||||
| -rw-r--r-- | src/core/common/SourceContextReader.hpp | 20 | 
2 files changed, 31 insertions, 7 deletions
diff --git a/src/core/common/SourceContextReader.cpp b/src/core/common/SourceContextReader.cpp index 65a6281..d5d379c 100644 --- a/src/core/common/SourceContextReader.cpp +++ b/src/core/common/SourceContextReader.cpp @@ -56,8 +56,8 @@ SourceContext SourceContextReader::readContext(CharReader &reader,  	size_t offs = 0;  	auto it = std::lower_bound(cache.begin(), cache.end(), start);  	if (it != cache.begin()) { -		it--;  // Go to the previous entry -		offs = *it; // Read the corresponding byte offset +		it--;        // Go to the previous entry +		offs = *it;  // Read the corresponding byte offset  		size_t line = it - cache.begin() + 1;  		ctx.startLine = line;  		ctx.endLine = line; @@ -182,17 +182,23 @@ SourceContext SourceContextReader::readContext(CharReader &reader,  		}  		// Update the relative position and length, set the "truncated" flags -		size_t us = static_cast<size_t>(s), ue = static_cast<size_t>(e); -		ctx.relPos = start - lineBufStart - us; -		ctx.relLen = std::min(ctx.relLen, ue - us); +		ctx.relPos = std::max<ssize_t>(0, start - lineBufStart - s); +		ctx.relLen = std::min<ssize_t>(ctx.relLen, e - s);  		ctx.truncatedStart = s > ts || lastLineStart < lineBufStart;  		ctx.truncatedEnd = e < te;  		// Copy the selected area to the output string -		ctx.text = std::string{&lineBuf[s], ue - us}; +		ctx.text = std::string{&lineBuf[s], static_cast<size_t>(e - s)};  	}  	return ctx;  } + +SourceContext SourceContextReader::readContext(CharReader &reader, +                                               const SourceRange &range, +                                               const std::string &filename) +{ +	return readContext(reader, range, MAX_MAX_CONTEXT_LENGTH, filename); +}  } diff --git a/src/core/common/SourceContextReader.hpp b/src/core/common/SourceContextReader.hpp index 35e71b3..cd29880 100644 --- a/src/core/common/SourceContextReader.hpp +++ b/src/core/common/SourceContextReader.hpp @@ -82,7 +82,25 @@ public:  	 * @return a SourceContext instance describing the  	 */  	SourceContext readContext(CharReader &reader, const SourceRange &range, -	                          size_t maxContextLength = MAX_MAX_CONTEXT_LENGTH, +	                          size_t maxContextLength, +	                          const std::string &filename = ""); + +	/** +	 * Returns the context for the char reader and the given SourceRange. +	 * Returns an invalid source context if either the given range is invalid +	 * or the byte offset described in the SourceRange cannot be reached because +	 * the CharReader cannot be seeked back to this position. Does not limit +	 * the output context. +	 * +	 * @param reader is the CharReader instance from which the context should be +	 * read. +	 * @param range describes the Range within the source file for which the +	 * context should be extraced. +	 * @param filename is the filename that should be stored in the returned +	 * context. +	 * @return a SourceContext instance describing the +	 */ +	SourceContext readContext(CharReader &reader, const SourceRange &range,  	                          const std::string &filename = "");  };  }  | 
