diff options
author | Ian Fan <ianfan0@gmail.com> | 2018-12-31 23:00:49 +0000 |
---|---|---|
committer | Ian Fan <ianfan0@gmail.com> | 2019-01-01 09:01:25 +0000 |
commit | a9c5158a77cc53a526ea0b16d99e476bd960e4a5 (patch) | |
tree | 7c67e55278820a2d8c0032f49403044a3c87349a | |
parent | Remove readline.c (diff) | |
download | sway-a9c5158a77cc53a526ea0b16d99e476bd960e4a5.tar.gz sway-a9c5158a77cc53a526ea0b16d99e476bd960e4a5.tar.zst sway-a9c5158a77cc53a526ea0b16d99e476bd960e4a5.zip |
config.c: re-enable backslash continuation in config file
-rw-r--r-- | sway/config.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/sway/config.c b/sway/config.c index 4afa09b3..4177ea10 100644 --- a/sway/config.c +++ b/sway/config.c | |||
@@ -569,6 +569,36 @@ bool load_include_configs(const char *path, struct sway_config *config, | |||
569 | return true; | 569 | return true; |
570 | } | 570 | } |
571 | 571 | ||
572 | // get line, with backslash continuation | ||
573 | static ssize_t getline_with_cont(char **lineptr, size_t *line_size, FILE *file) { | ||
574 | char *next_line = NULL; | ||
575 | size_t next_line_size = 0; | ||
576 | ssize_t nread = getline(lineptr, line_size, file); | ||
577 | while (nread >= 2) { | ||
578 | if (strcmp(&(*lineptr)[nread - 2], "\\\n") != 0) { | ||
579 | break; | ||
580 | } | ||
581 | |||
582 | ssize_t next_nread = getline(&next_line, &next_line_size, file); | ||
583 | if (next_nread == -1) { | ||
584 | break; | ||
585 | } | ||
586 | |||
587 | nread += next_nread - 2; | ||
588 | if ((ssize_t) *line_size < nread + 1) { | ||
589 | *line_size = nread + 1; | ||
590 | *lineptr = realloc(*lineptr, *line_size); | ||
591 | if (!lineptr) { | ||
592 | nread = -1; | ||
593 | break; | ||
594 | } | ||
595 | } | ||
596 | strcpy(&(*lineptr)[nread - next_nread], next_line); | ||
597 | } | ||
598 | free(next_line); | ||
599 | return nread; | ||
600 | } | ||
601 | |||
572 | static int detect_brace(FILE *file) { | 602 | static int detect_brace(FILE *file) { |
573 | int lines = 0; | 603 | int lines = 0; |
574 | long pos = ftell(file); | 604 | long pos = ftell(file); |
@@ -633,7 +663,7 @@ bool read_config(FILE *file, struct sway_config *config, | |||
633 | ssize_t nread; | 663 | ssize_t nread; |
634 | list_t *stack = create_list(); | 664 | list_t *stack = create_list(); |
635 | size_t read = 0; | 665 | size_t read = 0; |
636 | while ((nread = getline(&line, &line_size, file)) != -1) { | 666 | while ((nread = getline_with_cont(&line, &line_size, file)) != -1) { |
637 | if (reading_main_config) { | 667 | if (reading_main_config) { |
638 | if (read + nread > config_size) { | 668 | if (read + nread > config_size) { |
639 | wlr_log(WLR_ERROR, "Config file changed during reading"); | 669 | wlr_log(WLR_ERROR, "Config file changed during reading"); |