From 967566e37f93890bd5255725129c929aeeac709e Mon Sep 17 00:00:00 2001 From: Ian Fan Date: Sun, 9 Dec 2018 11:52:55 +0000 Subject: stringop.c: rewrite strip_whitespace --- sway/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sway/config.c') diff --git a/sway/config.c b/sway/config.c index bb7f796d..c71f315a 100644 --- a/sway/config.c +++ b/sway/config.c @@ -580,7 +580,7 @@ static int detect_brace_on_following_line(FILE *file, char *line, free(peeked); peeked = peek_line(file, lines, &position); if (peeked) { - peeked = strip_whitespace(peeked); + strip_whitespace(peeked); } lines++; } while (peeked && strlen(peeked) == 0); @@ -663,7 +663,7 @@ bool read_config(FILE *file, struct sway_config *config, read += length + 1; } - line = strip_whitespace(line); + strip_whitespace(line); if (line[0] == '#') { free(line); continue; -- cgit v1.2.3 From a82b8a3c14e45697708e57f8cb27a8fc6cf31839 Mon Sep 17 00:00:00 2001 From: Ian Fan Date: Sun, 9 Dec 2018 12:09:11 +0000 Subject: Remove readline.c All occurrences of read_line have been replaced by getline. peek_line has been absorbed into detect_brace. --- sway/config.c | 98 +++++++++++++++++++++++++---------------------------------- 1 file changed, 42 insertions(+), 56 deletions(-) (limited to 'sway/config.c') diff --git a/sway/config.c b/sway/config.c index c71f315a..4afa09b3 100644 --- a/sway/config.c +++ b/sway/config.c @@ -1,4 +1,4 @@ -#define _XOPEN_SOURCE 600 // for realpath +#define _XOPEN_SOURCE 700 // for realpath #include #include #include @@ -30,7 +30,6 @@ #include "sway/tree/workspace.h" #include "cairo.h" #include "pango.h" -#include "readline.h" #include "stringop.h" #include "list.h" #include "log.h" @@ -570,28 +569,23 @@ bool load_include_configs(const char *path, struct sway_config *config, return true; } -static int detect_brace_on_following_line(FILE *file, char *line, - int line_number) { +static int detect_brace(FILE *file) { int lines = 0; - if (line[strlen(line) - 1] != '{' && line[strlen(line) - 1] != '}') { - char *peeked = NULL; - long position = 0; - do { - free(peeked); - peeked = peek_line(file, lines, &position); - if (peeked) { - strip_whitespace(peeked); + long pos = ftell(file); + char *line = NULL; + size_t line_size = 0; + while ((getline(&line, &line_size, file)) != -1) { + lines++; + strip_whitespace(line); + if (*line) { + if (strcmp(line, "{") != 0) { + fseek(file, pos, SEEK_SET); + lines = 0; } - lines++; - } while (peeked && strlen(peeked) == 0); - - if (peeked && strlen(peeked) == 1 && peeked[0] == '{') { - fseek(file, position, SEEK_SET); - } else { - lines = 0; + break; } - free(peeked); } + free(line); return lines; } @@ -634,55 +628,47 @@ bool read_config(FILE *file, struct sway_config *config, bool success = true; int line_number = 0; - char *line; + char *line = NULL; + size_t line_size = 0; + ssize_t nread; list_t *stack = create_list(); size_t read = 0; - while (!feof(file)) { - char *block = stack->length ? stack->items[0] : NULL; - line = read_line(file); - if (!line) { - continue; - } - line_number++; - wlr_log(WLR_DEBUG, "Read line %d: %s", line_number, line); - + while ((nread = getline(&line, &line_size, file)) != -1) { if (reading_main_config) { - size_t length = strlen(line); - - if (read + length > config_size) { + if (read + nread > config_size) { wlr_log(WLR_ERROR, "Config file changed during reading"); - list_free_items_and_destroy(stack); - free(line); - return false; + success = false; + break; } - strcpy(this_config + read, line); - if (line_number != 1) { - this_config[read - 1] = '\n'; - } - read += length + 1; + strcpy(&this_config[read], line); + read += nread; } - strip_whitespace(line); - if (line[0] == '#') { - free(line); - continue; + if (line[nread - 1] == '\n') { + line[nread - 1] = '\0'; } - if (strlen(line) == 0) { - free(line); + + line_number++; + wlr_log(WLR_DEBUG, "Read line %d: %s", line_number, line); + + strip_whitespace(line); + if (!*line || line[0] == '#') { continue; } - int brace_detected = detect_brace_on_following_line(file, line, - line_number); - if (brace_detected > 0) { - line_number += brace_detected; - wlr_log(WLR_DEBUG, "Detected open brace on line %d", line_number); + int brace_detected = 0; + if (line[strlen(line) - 1] != '{' && line[strlen(line) - 1] != '}') { + brace_detected = detect_brace(file); + if (brace_detected > 0) { + line_number += brace_detected; + wlr_log(WLR_DEBUG, "Detected open brace on line %d", line_number); + } } + char *block = stack->length ? stack->items[0] : NULL; char *expanded = expand_line(block, line, brace_detected > 0); if (!expanded) { - list_free_items_and_destroy(stack); - free(line); - return false; + success = false; + break; } config->current_config_line_number = line_number; config->current_config_line = line; @@ -742,9 +728,9 @@ bool read_config(FILE *file, struct sway_config *config, default:; } free(expanded); - free(line); free_cmd_results(res); } + free(line); list_free_items_and_destroy(stack); config->current_config_line_number = 0; config->current_config_line = NULL; -- cgit v1.2.3 From a9c5158a77cc53a526ea0b16d99e476bd960e4a5 Mon Sep 17 00:00:00 2001 From: Ian Fan Date: Mon, 31 Dec 2018 23:00:49 +0000 Subject: config.c: re-enable backslash continuation in config file --- sway/config.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'sway/config.c') 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, return true; } +// get line, with backslash continuation +static ssize_t getline_with_cont(char **lineptr, size_t *line_size, FILE *file) { + char *next_line = NULL; + size_t next_line_size = 0; + ssize_t nread = getline(lineptr, line_size, file); + while (nread >= 2) { + if (strcmp(&(*lineptr)[nread - 2], "\\\n") != 0) { + break; + } + + ssize_t next_nread = getline(&next_line, &next_line_size, file); + if (next_nread == -1) { + break; + } + + nread += next_nread - 2; + if ((ssize_t) *line_size < nread + 1) { + *line_size = nread + 1; + *lineptr = realloc(*lineptr, *line_size); + if (!lineptr) { + nread = -1; + break; + } + } + strcpy(&(*lineptr)[nread - next_nread], next_line); + } + free(next_line); + return nread; +} + static int detect_brace(FILE *file) { int lines = 0; long pos = ftell(file); @@ -633,7 +663,7 @@ bool read_config(FILE *file, struct sway_config *config, ssize_t nread; list_t *stack = create_list(); size_t read = 0; - while ((nread = getline(&line, &line_size, file)) != -1) { + while ((nread = getline_with_cont(&line, &line_size, file)) != -1) { if (reading_main_config) { if (read + nread > config_size) { wlr_log(WLR_ERROR, "Config file changed during reading"); -- cgit v1.2.3 From bd35879e1cfda51accc68c9890980dce59eb006a Mon Sep 17 00:00:00 2001 From: Ian Fan Date: Tue, 1 Jan 2019 09:01:09 +0000 Subject: fixup! config.c: re-enable backslash continuation in config file --- sway/config.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'sway/config.c') diff --git a/sway/config.c b/sway/config.c index 4177ea10..9f32d44c 100644 --- a/sway/config.c +++ b/sway/config.c @@ -574,11 +574,7 @@ static ssize_t getline_with_cont(char **lineptr, size_t *line_size, FILE *file) char *next_line = NULL; size_t next_line_size = 0; ssize_t nread = getline(lineptr, line_size, file); - while (nread >= 2) { - if (strcmp(&(*lineptr)[nread - 2], "\\\n") != 0) { - break; - } - + while (nread >= 2 && strcmp(&(*lineptr)[nread - 2], "\\\n") == 0) { ssize_t next_nread = getline(&next_line, &next_line_size, file); if (next_nread == -1) { break; @@ -588,7 +584,7 @@ static ssize_t getline_with_cont(char **lineptr, size_t *line_size, FILE *file) if ((ssize_t) *line_size < nread + 1) { *line_size = nread + 1; *lineptr = realloc(*lineptr, *line_size); - if (!lineptr) { + if (!*lineptr) { nread = -1; break; } -- cgit v1.2.3