summaryrefslogtreecommitdiff
path: root/sway/stringop.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/stringop.c')
-rw-r--r--sway/stringop.c91
1 files changed, 65 insertions, 26 deletions
diff --git a/sway/stringop.c b/sway/stringop.c
index 00cc32b8..c39e2c34 100644
--- a/sway/stringop.c
+++ b/sway/stringop.c
@@ -1,38 +1,38 @@
+#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>
+#include <log.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') {
@@ -41,13 +41,14 @@ void strip_comments(char *str) {
} else if (str[i] == '\'' && !in_string) {
in_character = !in_character;
} else if (!in_character && !in_string) {
- if (str[i] == '#') {
+ if (str[i] == '#' && i == 0) {
str[i] = '\0';
break;
}
}
++i;
}
+ return str;
}
list_t *split_string(const char *str, const char *delims) {
@@ -197,3 +198,41 @@ char *join_args(char **argv, int argc) {
res[len - 1] = '\0';
return res;
}
+
+/*
+ * Join a list of strings, adding separator in between. Separator can be NULL.
+ */
+char *join_list(list_t *list, char *separator) {
+ if (!sway_assert(list != NULL, "list != NULL") || list->length == 0) {
+ return NULL;
+ }
+
+ size_t len = 1; // NULL terminator
+ size_t sep_len = 0;
+ if (separator != NULL) {
+ sep_len = strlen(separator);
+ len += (list->length - 1) * sep_len;
+ }
+
+ for (int i = 0; i < list->length; i++) {
+ len += strlen(list->items[i]);
+ }
+
+ char *res = malloc(len);
+
+ char *p = res + strlen(list->items[0]);
+ strcpy(res, list->items[0]);
+
+ for (int i = 1; i < list->length; i++) {
+ if (sep_len) {
+ memcpy(p, separator, sep_len);
+ p += sep_len;
+ }
+ strcpy(p, list->items[i]);
+ p += strlen(list->items[i]);
+ }
+
+ *p = '\0';
+
+ return res;
+}