aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt1
-rw-r--r--sway/config.c27
-rw-r--r--sway/config.h26
-rw-r--r--sway/list.c37
-rw-r--r--sway/list.h16
-rw-r--r--sway/main.c39
-rw-r--r--sway/readline.c36
-rw-r--r--sway/readline.h8
-rw-r--r--sway/stringop.c150
-rw-r--r--sway/stringop.h13
10 files changed, 351 insertions, 2 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 66879422..3ce94d9b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,6 +7,7 @@ set(CMAKE_BUILD_TYPE Debug)
7set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMake) 7set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMake)
8 8
9find_package(XKBCommon REQUIRED) 9find_package(XKBCommon REQUIRED)
10find_package(WLC REQUIRED)
10 11
11if (UNIX) 12if (UNIX)
12 find_library(DL_LIBRARY dl) 13 find_library(DL_LIBRARY dl)
diff --git a/sway/config.c b/sway/config.c
new file mode 100644
index 00000000..3ad1bcf9
--- /dev/null
+++ b/sway/config.c
@@ -0,0 +1,27 @@
1#include <stdio.h>
2#include <stdlib.h>
3#include "readline.h"
4#include "stringop.h"
5#include "list.h"
6#include "config.h"
7
8struct sway_config *read_config(FILE *file) {
9 struct sway_config *config = malloc(sizeof(struct sway_config));
10 config->symbols = create_list();
11 config->modes = create_list();
12
13 while (!feof(file)) {
14 int _;
15 char *line = read_line(file);
16 line = strip_whitespace(line, &_);
17 line = strip_comments(line);
18 if (!line[0]) {
19 goto _continue;
20 }
21 printf("Parsing config line %s\n", line);
22_continue:
23 free(line);
24 }
25
26 return config;
27}
diff --git a/sway/config.h b/sway/config.h
new file mode 100644
index 00000000..2fe566f0
--- /dev/null
+++ b/sway/config.h
@@ -0,0 +1,26 @@
1#ifndef _SWAY_CONFIG_H
2#define _SWAY_CONFIG_H
3
4#include <stdint.h>
5#include <wlc/wlc.h>
6#include "list.h"
7
8struct sway_binding {
9 list_t *keys;
10 struct wlc_modifiers modifiers;
11 char *command;
12};
13
14struct sway_mode {
15 char *name;
16 list_t *bindings;
17};
18
19struct sway_config {
20 list_t *symbols;
21 list_t *modes;
22};
23
24struct sway_config *read_config(FILE *file);
25
26#endif
diff --git a/sway/list.c b/sway/list.c
new file mode 100644
index 00000000..120cfbcd
--- /dev/null
+++ b/sway/list.c
@@ -0,0 +1,37 @@
1#include "list.h"
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5
6list_t *create_list() {
7 list_t *list = malloc(sizeof(list_t));
8 list->capacity = 10;
9 list->length = 0;
10 list->items = malloc(sizeof(void*) * list->capacity);
11 return list;
12}
13
14void list_free(list_t *list) {
15 free(list->items);
16 free(list);
17}
18
19void list_add(list_t *list, void *item) {
20 if (list->length == list->capacity) {
21 list->capacity += 10;
22 list->items = realloc(list->items, sizeof(void*) * list->capacity);
23 }
24 list->items[list->length++] = item;
25}
26
27void list_del(list_t *list, int index) {
28 list->length--;
29 memmove(&list->items[index], &list->items[index + 1], sizeof(void*) * (list->capacity - index - 1));
30}
31
32void list_cat(list_t *list, list_t *source) {
33 int i;
34 for (i = 0; i < source->length; ++i) {
35 list_add(list, source->items[i]);
36 }
37}
diff --git a/sway/list.h b/sway/list.h
new file mode 100644
index 00000000..2f60b0df
--- /dev/null
+++ b/sway/list.h
@@ -0,0 +1,16 @@
1#ifndef _SWAY_LIST_H
2#define _SWAY_LIST_H
3
4typedef struct {
5 int capacity;
6 int length;
7 void **items;
8} list_t;
9
10list_t *create_list();
11void list_free(list_t *list);
12void list_add(list_t *list, void *item);
13void list_del(list_t *list, int index);
14void list_cat(list_t *list, list_t *source);
15
16#endif
diff --git a/sway/main.c b/sway/main.c
index e6a5b851..ab687b17 100644
--- a/sway/main.c
+++ b/sway/main.c
@@ -1,6 +1,41 @@
1#include <stdio.h> 1#include <stdio.h>
2#include <stdlib.h>
3#include <stdbool.h>
4#include <wlc/wlc.h>
5#include "config.h"
2 6
3int main() { 7struct sway_config *config;
4 printf("Hello world\n"); 8
9bool load_config() {
10 // TODO: Allow use of more config file locations
11 const char *name = "/.i3/config";
12 const char *home = getenv("HOME");
13 char *temp = malloc(strlen(home) + strlen(name) + 1);
14 strcpy(temp, home);
15 strcat(temp, name);
16 FILE *f = fopen(temp, "r");
17 if (!f) {
18 fprintf(stderr, "Unable to open %s for reading", temp);
19 free(temp);
20 exit(1);
21 }
22 free(temp);
23 config = read_config(f);
24 fclose(f);
25 return true;
26}
27
28int main(int argc, char **argv) {
29 if (!load_config()) {
30 return 0;
31 }
32 return 0;
33 // TODO:
34
35 static struct wlc_interface interface = { };
36 if (!wlc_init(&interface, argc, argv)) {
37 return 1;
38 }
39 wlc_run();
5 return 0; 40 return 0;
6} 41}
diff --git a/sway/readline.c b/sway/readline.c
new file mode 100644
index 00000000..be8c35cc
--- /dev/null
+++ b/sway/readline.c
@@ -0,0 +1,36 @@
1#include "readline.h"
2#include <stdlib.h>
3#include <stdio.h>
4
5char *read_line(FILE *file) {
6 int i = 0, length = 0, size = 128;
7 char *string = malloc(size);
8 if (!string) {
9 return NULL;
10 }
11 while (1) {
12 int c = getc(file);
13 if (c == EOF || c == '\n' || c == '\0') {
14 break;
15 }
16 if (c == '\r') {
17 continue;
18 }
19 if (i == size) {
20 string = realloc(string, length *= 2);
21 if (!string) {
22 return NULL;
23 }
24 }
25 string[i++] = (char)c;
26 length++;
27 }
28 if (i + 1 != size) {
29 string = realloc(string, length + 1);
30 if (!string) {
31 return NULL;
32 }
33 }
34 string[i] = '\0';
35 return string;
36}
diff --git a/sway/readline.h b/sway/readline.h
new file mode 100644
index 00000000..dbe937c1
--- /dev/null
+++ b/sway/readline.h
@@ -0,0 +1,8 @@
1#ifndef _SWAY_READLINE_H
2#define _SWAY_READLINE_H
3
4#include <stdio.h>
5
6char *read_line(FILE *file);
7
8#endif
diff --git a/sway/stringop.c b/sway/stringop.c
new file mode 100644
index 00000000..0e7ad6a9
--- /dev/null
+++ b/sway/stringop.c
@@ -0,0 +1,150 @@
1#include "stringop.h"
2#include <stdlib.h>
3#include <stdio.h>
4#include "string.h"
5#include "list.h"
6#include <strings.h>
7
8/* Note: This returns 8 characters for trimmed_start per tab character. */
9char *strip_whitespace(char *_str, int *trimmed_start) {
10 *trimmed_start = 0;
11 if (*_str == '\0')
12 return _str;
13 char *strold = _str;
14 while (*_str == ' ' || *_str == '\t') {
15 if (*_str == '\t') {
16 *trimmed_start += 8;
17 } else {
18 *trimmed_start += 1;
19 }
20 _str++;
21 }
22 char *str = malloc(strlen(_str) + 1);
23 strcpy(str, _str);
24 free(strold);
25 int i;
26 for (i = 0; str[i] != '\0'; ++i);
27 do {
28 i--;
29 } while (i >= 0 && (str[i] == ' ' || str[i] == '\t'));
30 str[i + 1] = '\0';
31 return str;
32}
33
34char *strip_comments(char *str) {
35 int in_string = 0, in_character = 0;
36 int i = 0;
37 while (str[i] != '\0') {
38 if (str[i] == '"' && !in_character) {
39 in_string = !in_string;
40 } else if (str[i] == '\'' && !in_string) {
41 in_character = !in_character;
42 } else if (!in_character && !in_string) {
43 if (str[i] == '#') {
44 str[i] = '\0';
45 break;
46 }
47 }
48 ++i;
49 }
50 return str;
51}
52
53list_t *split_string(const char *str, const char *delims) {
54 list_t *res = create_list();
55 int i, j;
56 for (i = 0, j = 0; i < strlen(str) + 1; ++i) {
57 if (strchr(delims, str[i]) || i == strlen(str)) {
58 if (i - j == 0) {
59 continue;
60 }
61 char *left = malloc(i - j + 1);
62 memcpy(left, str + j, i - j);
63 left[i - j] = 0;
64 list_add(res, left);
65 j = i + 1;
66 while (j <= strlen(str) && str[j] && strchr(delims, str[j])) {
67 j++;
68 i++;
69 }
70 }
71 }
72 return res;
73}
74
75void free_flat_list(list_t *list) {
76 int i;
77 for (i = 0; i < list->length; ++i) {
78 free(list->items[i]);
79 }
80 list_free(list);
81}
82
83char *code_strstr(const char *haystack, const char *needle) {
84 /* TODO */
85 return strstr(haystack, needle);
86}
87
88char *code_strchr(const char *str, char delimiter) {
89 int in_string = 0, in_character = 0;
90 int i = 0;
91 while (str[i] != '\0') {
92 if (str[i] == '"' && !in_character) {
93 in_string = !in_string;
94 } else if (str[i] == '\'' && !in_string) {
95 in_character = !in_character;
96 } else if (!in_character && !in_string) {
97 if (str[i] == delimiter) {
98 return (char *)str + i;
99 }
100 }
101 ++i;
102 }
103 return NULL;
104}
105
106int unescape_string(char *string) {
107 /* TODO: More C string escapes */
108 int len = strlen(string);
109 int i;
110 for (i = 0; string[i]; ++i) {
111 if (string[i] == '\\') {
112 --len;
113 switch (string[++i]) {
114 case '0':
115 string[i - 1] = '\0';
116 memmove(string + i, string + i + 1, len - i);
117 break;
118 case 'a':
119 string[i - 1] = '\a';
120 memmove(string + i, string + i + 1, len - i);
121 break;
122 case 'b':
123 string[i - 1] = '\b';
124 memmove(string + i, string + i + 1, len - i);
125 break;
126 case 't':
127 string[i - 1] = '\t';
128 memmove(string + i, string + i + 1, len - i);
129 break;
130 case 'n':
131 string[i - 1] = '\n';
132 memmove(string + i, string + i + 1, len - i);
133 break;
134 case 'v':
135 string[i - 1] = '\v';
136 memmove(string + i, string + i + 1, len - i);
137 break;
138 case 'f':
139 string[i - 1] = '\f';
140 memmove(string + i, string + i + 1, len - i);
141 break;
142 case 'r':
143 string[i - 1] = '\r';
144 memmove(string + i, string + i + 1, len - i);
145 break;
146 }
147 }
148 }
149 return len;
150}
diff --git a/sway/stringop.h b/sway/stringop.h
new file mode 100644
index 00000000..74f34ebf
--- /dev/null
+++ b/sway/stringop.h
@@ -0,0 +1,13 @@
1#ifndef _SWAY_STRINGOP_H
2#define _SWAY_STRINGOP_H
3#include "list.h"
4
5char *strip_whitespace(char *str, int *trimmed_start);
6char *strip_comments(char *str);
7list_t *split_string(const char *str, const char *delims);
8void free_flat_list(list_t *list);
9char *code_strchr(const char *string, char delimiter);
10char *code_strstr(const char *haystack, const char *needle);
11int unescape_string(char *string);
12
13#endif