aboutsummaryrefslogtreecommitdiffstats
path: root/sway/config.c
diff options
context:
space:
mode:
authorLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-01-11 20:41:38 -0500
committerLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-01-11 20:41:38 -0500
commitb43345a1a3ccb1c6cf6a836cf64521c5d3bcbb49 (patch)
tree3827236b3deac540ea228d269b84d505aa1c9582 /sway/config.c
parentMerge pull request #3411 from RedSoxFan/fix-brace-detect-seeking (diff)
downloadsway-b43345a1a3ccb1c6cf6a836cf64521c5d3bcbb49.tar.gz
sway-b43345a1a3ccb1c6cf6a836cf64521c5d3bcbb49.tar.zst
sway-b43345a1a3ccb1c6cf6a836cf64521c5d3bcbb49.zip
config: fix line number with continued lines
When the config has continued lines, `get_line_with_cont` may read more than one line of the actual file. When displaying line numbers for error messages, they should be the line number in the file to make it easy to find and fix the issue.
Diffstat (limited to 'sway/config.c')
-rw-r--r--sway/config.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/sway/config.c b/sway/config.c
index 26d22842..b14ebba7 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -571,15 +571,18 @@ bool load_include_configs(const char *path, struct sway_config *config,
571} 571}
572 572
573// get line, with backslash continuation 573// get line, with backslash continuation
574static ssize_t getline_with_cont(char **lineptr, size_t *line_size, FILE *file) { 574static ssize_t getline_with_cont(char **lineptr, size_t *line_size, FILE *file,
575 int *nlines) {
575 char *next_line = NULL; 576 char *next_line = NULL;
576 size_t next_line_size = 0; 577 size_t next_line_size = 0;
577 ssize_t nread = getline(lineptr, line_size, file); 578 ssize_t nread = getline(lineptr, line_size, file);
579 *nlines = nread == -1 ? 0 : 1;
578 while (nread >= 2 && strcmp(&(*lineptr)[nread - 2], "\\\n") == 0) { 580 while (nread >= 2 && strcmp(&(*lineptr)[nread - 2], "\\\n") == 0) {
579 ssize_t next_nread = getline(&next_line, &next_line_size, file); 581 ssize_t next_nread = getline(&next_line, &next_line_size, file);
580 if (next_nread == -1) { 582 if (next_nread == -1) {
581 break; 583 break;
582 } 584 }
585 (*nlines)++;
583 586
584 nread += next_nread - 2; 587 nread += next_nread - 2;
585 if ((ssize_t) *line_size < nread + 1) { 588 if ((ssize_t) *line_size < nread + 1) {
@@ -663,7 +666,8 @@ bool read_config(FILE *file, struct sway_config *config,
663 ssize_t nread; 666 ssize_t nread;
664 list_t *stack = create_list(); 667 list_t *stack = create_list();
665 size_t read = 0; 668 size_t read = 0;
666 while ((nread = getline_with_cont(&line, &line_size, file)) != -1) { 669 int nlines = 0;
670 while ((nread = getline_with_cont(&line, &line_size, file, &nlines)) != -1) {
667 if (reading_main_config) { 671 if (reading_main_config) {
668 if (read + nread > config_size) { 672 if (read + nread > config_size) {
669 wlr_log(WLR_ERROR, "Config file changed during reading"); 673 wlr_log(WLR_ERROR, "Config file changed during reading");
@@ -679,7 +683,7 @@ bool read_config(FILE *file, struct sway_config *config,
679 line[nread - 1] = '\0'; 683 line[nread - 1] = '\0';
680 } 684 }
681 685
682 line_number++; 686 line_number += nlines;
683 wlr_log(WLR_DEBUG, "Read line %d: %s", line_number, line); 687 wlr_log(WLR_DEBUG, "Read line %d: %s", line_number, line);
684 688
685 strip_whitespace(line); 689 strip_whitespace(line);