mirror of
https://github.com/ascii-boxes/boxes.git
synced 2025-03-03 16:51:46 +01:00
Improve handling of partial lines
When boxes is fed text selected in a visual editor, this often means that the final line of input text has no terminating newline (it's a "partial line"). This caused an extra blank line to appear in the editor after running boxes. #57 This commit changes the behavior of boxes so that a newline is only added at the very end of the output, if there also was one at the very end of the input.
This commit is contained in:
parent
6315c5ede5
commit
056a497cc8
30
src/boxes.c
30
src/boxes.c
@ -1328,6 +1328,32 @@ static int apply_substitutions (const int mode)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int has_linebreak (const char *s, const int len)
|
||||||
|
/*
|
||||||
|
* Determine if the given line of raw text is ended by a line break.
|
||||||
|
*
|
||||||
|
* s: the string to check
|
||||||
|
* len: length of s
|
||||||
|
*
|
||||||
|
* RETURNS: != 0 line break found
|
||||||
|
* == 0 line break not found
|
||||||
|
*
|
||||||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
if (s != NULL && len > 0) {
|
||||||
|
char the_last = s[len - 1];
|
||||||
|
result = the_last == '\r' || the_last == '\n';
|
||||||
|
#if defined(DEBUG)
|
||||||
|
fprintf(stderr, "has_linebreak: (%d) %d\n", the_last, result);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int read_all_input (const int use_stdin)
|
static int read_all_input (const int use_stdin)
|
||||||
/*
|
/*
|
||||||
* Read entire input (possibly from stdin) and store it in 'input' array.
|
* Read entire input (possibly from stdin) and store it in 'input' array.
|
||||||
@ -1375,6 +1401,7 @@ static int read_all_input (const int use_stdin)
|
|||||||
}
|
}
|
||||||
|
|
||||||
input.lines[input.anz_lines].len = strlen (buf);
|
input.lines[input.anz_lines].len = strlen (buf);
|
||||||
|
input.final_newline = has_linebreak(buf, input.lines[input.anz_lines].len);
|
||||||
|
|
||||||
if (opt.r) {
|
if (opt.r) {
|
||||||
input.lines[input.anz_lines].len -= 1;
|
input.lines[input.anz_lines].len -= 1;
|
||||||
@ -1488,8 +1515,9 @@ static int read_all_input (const int use_stdin)
|
|||||||
}
|
}
|
||||||
fprintf (stderr, "] (%d)\n", input.lines[i].tabpos_len);
|
fprintf (stderr, "] (%d)\n", input.lines[i].tabpos_len);
|
||||||
}
|
}
|
||||||
fprintf (stderr, "\nLongest line: %d characters.\n", input.maxline);
|
fprintf (stderr, "\n Longest line: %d characters.\n", input.maxline);
|
||||||
fprintf (stderr, " Indentation: %2d spaces.\n", input.indent);
|
fprintf (stderr, " Indentation: %2d spaces.\n", input.indent);
|
||||||
|
fprintf (stderr, "Final newline: %d.\n", input.final_newline);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -154,9 +154,10 @@ typedef struct {
|
|||||||
size_t anz_lines; /* number of entries in input */
|
size_t anz_lines; /* number of entries in input */
|
||||||
size_t maxline; /* length of longest input line */
|
size_t maxline; /* length of longest input line */
|
||||||
size_t indent; /* number of leading spaces found */
|
size_t indent; /* number of leading spaces found */
|
||||||
|
int final_newline; /* true if the last line of input ends with newline */
|
||||||
} input_t;
|
} input_t;
|
||||||
|
|
||||||
#define INPUT_INITIALIZER {NULL, 0, 0, LINE_MAX}
|
#define INPUT_INITIALIZER {NULL, 0, 0, LINE_MAX, 0}
|
||||||
|
|
||||||
extern input_t input;
|
extern input_t input;
|
||||||
#endif /*!FILE_LEXER_L*/
|
#endif /*!FILE_LEXER_L*/
|
||||||
|
@ -1043,7 +1043,7 @@ int output_box (const sentry_t *thebox)
|
|||||||
BFREE (restored_indent);
|
BFREE (restored_indent);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf (opt.outfile, "%s\n", obuf);
|
fprintf (opt.outfile, "%s%s", obuf, (input.final_newline || j < nol-skip_end-1 ? "\n" : ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
BFREE (indentspc);
|
BFREE (indentspc);
|
||||||
|
@ -1051,7 +1051,8 @@ void output_input (const int trim_only)
|
|||||||
indent = 0;
|
indent = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf (opt.outfile, "%s%s\n", indentspc, input.lines[j].text + indent);
|
fprintf (opt.outfile, "%s%s%s", indentspc, input.lines[j].text + indent,
|
||||||
|
(input.final_newline || j < input.anz_lines-1 ? "\n" : ""));
|
||||||
BFREE (indentspc);
|
BFREE (indentspc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user