aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/stringop.h4
-rw-r--r--sway/commands.c6
-rw-r--r--sway/config.c5
-rw-r--r--sway/stringop.c50
4 files changed, 33 insertions, 32 deletions
diff --git a/include/stringop.h b/include/stringop.h
index 03387345..a5346829 100644
--- a/include/stringop.h
+++ b/include/stringop.h
@@ -2,8 +2,8 @@
#define _SWAY_STRINGOP_H
#include "list.h"
-void strip_whitespace(char *str);
-void strip_comments(char *str);
+char *strip_whitespace(char *str, int *trimmed_start);
+char *strip_comments(char *str);
list_t *split_string(const char *str, const char *delims);
void free_flat_list(list_t *list);
char *code_strchr(const char *string, char delimiter);
diff --git a/sway/commands.c b/sway/commands.c
index 51de7a50..ae0bdbe4 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -506,7 +506,7 @@ static char **split_directive(char *line, int *argc) {
if (!*line) return parts;
int in_string = 0, in_character = 0;
- int i, j;
+ int i, j, _;
for (i = 0, j = 0; line[i]; ++i) {
if (line[i] == '\\') {
++i;
@@ -519,7 +519,7 @@ static char **split_directive(char *line, int *argc) {
char *item = malloc(i - j + 1);
strncpy(item, line + j, i - j);
item[i - j] = '\0';
- strip_whitespace(item);
+ item = strip_whitespace(item, &_);
if (item[0] == '\0') {
free(item);
} else {
@@ -537,7 +537,7 @@ static char **split_directive(char *line, int *argc) {
char *item = malloc(i - j + 1);
strncpy(item, line + j, i - j);
item[i - j] = '\0';
- strip_whitespace(item);
+ item = strip_whitespace(item, &_);
if (*argc == capacity) {
capacity++;
parts = realloc(parts, sizeof(char *) * capacity);
diff --git a/sway/config.c b/sway/config.c
index 6d39839d..f1de6080 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -186,9 +186,10 @@ bool read_config(FILE *file, bool is_active) {
int temp_depth = 0; // Temporary: skip all config sections with depth
while (!feof(file)) {
+ int _;
char *line = read_line(file);
- strip_comments(line);
- strip_whitespace(line);
+ line = strip_comments(line);
+ line = strip_whitespace(line, &_);
if (!line[0]) {
goto _continue;
}
diff --git a/sway/stringop.c b/sway/stringop.c
index 624c8401..1dff97bf 100644
--- a/sway/stringop.c
+++ b/sway/stringop.c
@@ -1,38 +1,37 @@
+#include "stringop.h"
#include <stdlib.h>
#include <stdio.h>
-#include <strings.h>
-#include <ctype.h>
-#include "stringop.h"
#include "string.h"
#include "list.h"
+#include <strings.h>
/* Note: This returns 8 characters for trimmed_start per tab character. */
-void strip_whitespace(char *str) {
- int shift = 0;
- int bpair = 1;
- int in_str = 0, in_ch = 0;
- while (*str) {
- str[-shift] = str[0];
- if (*str == '"' && !in_ch) {
- in_str = !in_str;
- } else if (*str == '\'' && !in_str) {
- in_ch = !in_ch;
- } else if (!in_ch && !in_str) {
- if (isblank(*str)) {
- if (bpair) {
- ++shift;
- }
- bpair=1;
- } else {
- bpair = 0;
- }
+char *strip_whitespace(char *_str, int *trimmed_start) {
+ *trimmed_start = 0;
+ if (*_str == '\0')
+ return _str;
+ char *strold = _str;
+ while (*_str == ' ' || *_str == '\t') {
+ if (*_str == '\t') {
+ *trimmed_start += 8;
+ } else {
+ *trimmed_start += 1;
}
- ++str;
+ _str++;
}
- str[-shift-bpair] = 0;
+ char *str = malloc(strlen(_str) + 1);
+ strcpy(str, _str);
+ free(strold);
+ int i;
+ for (i = 0; str[i] != '\0'; ++i);
+ do {
+ i--;
+ } while (i >= 0 && (str[i] == ' ' || str[i] == '\t'));
+ str[i + 1] = '\0';
+ return str;
}
-void strip_comments(char *str) {
+char *strip_comments(char *str) {
int in_string = 0, in_character = 0;
int i = 0;
while (str[i] != '\0') {
@@ -48,6 +47,7 @@ void strip_comments(char *str) {
}
++i;
}
+ return str;
}
list_t *split_string(const char *str, const char *delims) {