diff options
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | sway/config.c | 27 | ||||
-rw-r--r-- | sway/config.h | 26 | ||||
-rw-r--r-- | sway/list.c | 37 | ||||
-rw-r--r-- | sway/list.h | 16 | ||||
-rw-r--r-- | sway/main.c | 39 | ||||
-rw-r--r-- | sway/readline.c | 36 | ||||
-rw-r--r-- | sway/readline.h | 8 | ||||
-rw-r--r-- | sway/stringop.c | 150 | ||||
-rw-r--r-- | sway/stringop.h | 13 |
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) | |||
7 | set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMake) | 7 | set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMake) |
8 | 8 | ||
9 | find_package(XKBCommon REQUIRED) | 9 | find_package(XKBCommon REQUIRED) |
10 | find_package(WLC REQUIRED) | ||
10 | 11 | ||
11 | if (UNIX) | 12 | if (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 | |||
8 | struct 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 | |||
8 | struct sway_binding { | ||
9 | list_t *keys; | ||
10 | struct wlc_modifiers modifiers; | ||
11 | char *command; | ||
12 | }; | ||
13 | |||
14 | struct sway_mode { | ||
15 | char *name; | ||
16 | list_t *bindings; | ||
17 | }; | ||
18 | |||
19 | struct sway_config { | ||
20 | list_t *symbols; | ||
21 | list_t *modes; | ||
22 | }; | ||
23 | |||
24 | struct 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 | |||
6 | list_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 | |||
14 | void list_free(list_t *list) { | ||
15 | free(list->items); | ||
16 | free(list); | ||
17 | } | ||
18 | |||
19 | void 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 | |||
27 | void 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 | |||
32 | void 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 | |||
4 | typedef struct { | ||
5 | int capacity; | ||
6 | int length; | ||
7 | void **items; | ||
8 | } list_t; | ||
9 | |||
10 | list_t *create_list(); | ||
11 | void list_free(list_t *list); | ||
12 | void list_add(list_t *list, void *item); | ||
13 | void list_del(list_t *list, int index); | ||
14 | void 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 | ||
3 | int main() { | 7 | struct sway_config *config; |
4 | printf("Hello world\n"); | 8 | |
9 | bool 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 | |||
28 | int 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 | |||
5 | char *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 | |||
6 | char *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. */ | ||
9 | char *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 | |||
34 | char *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 | |||
53 | list_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 | |||
75 | void 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 | |||
83 | char *code_strstr(const char *haystack, const char *needle) { | ||
84 | /* TODO */ | ||
85 | return strstr(haystack, needle); | ||
86 | } | ||
87 | |||
88 | char *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 | |||
106 | int 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 | |||
5 | char *strip_whitespace(char *str, int *trimmed_start); | ||
6 | char *strip_comments(char *str); | ||
7 | list_t *split_string(const char *str, const char *delims); | ||
8 | void free_flat_list(list_t *list); | ||
9 | char *code_strchr(const char *string, char delimiter); | ||
10 | char *code_strstr(const char *haystack, const char *needle); | ||
11 | int unescape_string(char *string); | ||
12 | |||
13 | #endif | ||