struct strbuf err;
strbuf_init(&err, 0);
if (ws & WS_TRAILING_SPACE)
- strbuf_addstr(&err, "Adds trailing whitespace");
+ strbuf_addstr(&err, "trailing whitespace");
if (ws & WS_SPACE_BEFORE_TAB) {
if (err.len)
strbuf_addstr(&err, ", ");
- strbuf_addstr(&err, "Space in indent is followed by a tab");
+ strbuf_addstr(&err, "space before tab in indent");
}
if (ws & WS_INDENT_WITH_NON_TAB) {
if (err.len)
strbuf_addstr(&err, ", ");
- strbuf_addstr(&err, "Indent more than 8 places with spaces");
+ strbuf_addstr(&err, "indent with spaces");
}
return strbuf_detach(&err, NULL);
}
const char *reset, const char *ws)
{
unsigned result = 0;
- int leading_space = -1;
+ int written = 0;
int trailing_whitespace = -1;
int trailing_newline = 0;
int i;
/* Check for space before tab in initial indent. */
for (i = 0; i < len; i++) {
- if (line[i] == '\t') {
- if ((ws_rule & WS_SPACE_BEFORE_TAB) &&
- (leading_space != -1))
- result |= WS_SPACE_BEFORE_TAB;
- break;
- }
- else if (line[i] == ' ')
- leading_space = i;
- else
+ if (line[i] == ' ')
+ continue;
+ if (line[i] != '\t')
break;
+ if ((ws_rule & WS_SPACE_BEFORE_TAB) && written < i) {
+ result |= WS_SPACE_BEFORE_TAB;
+ if (stream) {
+ fputs(ws, stream);
+ fwrite(line + written, i - written, 1, stream);
+ fputs(reset, stream);
+ }
+ } else if (stream)
+ fwrite(line + written, i - written, 1, stream);
+ if (stream)
+ fwrite(line + i, 1, 1, stream);
+ written = i + 1;
}
/* Check for indent using non-tab. */
- if ((ws_rule & WS_INDENT_WITH_NON_TAB) && leading_space >= 8)
+ if ((ws_rule & WS_INDENT_WITH_NON_TAB) && i - written >= 8) {
result |= WS_INDENT_WITH_NON_TAB;
-
- if (stream) {
- /* Highlight errors in leading whitespace. */
- if ((result & WS_SPACE_BEFORE_TAB) ||
- (result & WS_INDENT_WITH_NON_TAB)) {
+ if (stream) {
fputs(ws, stream);
- fwrite(line, leading_space + 1, 1, stream);
+ fwrite(line + written, i - written, 1, stream);
fputs(reset, stream);
- leading_space++;
}
- else
- leading_space = 0;
+ written = i;
+ }
- /* Now the rest of the line starts at leading_space.
+ if (stream) {
+ /* Now the rest of the line starts at written.
* The non-highlighted part ends at trailing_whitespace. */
if (trailing_whitespace == -1)
trailing_whitespace = len;
/* Emit non-highlighted (middle) segment. */
- if (trailing_whitespace - leading_space > 0) {
+ if (trailing_whitespace - written > 0) {
fputs(set, stream);
- fwrite(line + leading_space,
- trailing_whitespace - leading_space, 1, stream);
+ fwrite(line + written,
+ trailing_whitespace - written, 1, stream);
fputs(reset, stream);
}