aboutsummaryrefslogtreecommitdiffstats
path: root/sway/config.c
diff options
context:
space:
mode:
authorLibravatar Ian Fan <ianfan0@gmail.com>2018-12-31 23:00:49 +0000
committerLibravatar Ian Fan <ianfan0@gmail.com>2019-01-01 09:01:25 +0000
commita9c5158a77cc53a526ea0b16d99e476bd960e4a5 (patch)
tree7c67e55278820a2d8c0032f49403044a3c87349a /sway/config.c
parentRemove readline.c (diff)
downloadsway-a9c5158a77cc53a526ea0b16d99e476bd960e4a5.tar.gz
sway-a9c5158a77cc53a526ea0b16d99e476bd960e4a5.tar.zst
sway-a9c5158a77cc53a526ea0b16d99e476bd960e4a5.zip
config.c: re-enable backslash continuation in config file
Diffstat (limited to 'sway/config.c')
-rw-r--r--sway/config.c32
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
573static 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
572static int detect_brace(FILE *file) { 602static 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");