1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#include "pipe.h"
#include <ctype.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include "bardata.h"
FILE *named_pipe;
void init_pipe(void) {
mkfifo(PIPE_PATH, 0666);
named_pipe = fopen(PIPE_PATH, "r");
}
void await_change(void) {
char buff[1024];
while (true) {
if (!fgets(buff, sizeof(buff), named_pipe)) {
fclose(named_pipe);
named_pipe = fopen(PIPE_PATH, "r"); // This blocks, 0% CPU, yay
continue;
}
break;
}
printf("Received: %s\n", buff);
int argc = 0, chr_on = 0, i = 0;
char argv[MAX_ARGS][MAX_ARG_LEN];
while (argc < MAX_ARGS) {
char chr = buff[i];
if (chr == '\0') {
break;
}
// octal 201 is an unused ascii character, so it's safe to use as a
// delimiter
if (chr == '\201') {
if (chr_on == 0) {
i++;
continue;
}
argv[argc][chr_on] = '\0';
argc++;
chr_on = 0;
} else {
argv[argc][chr_on] = chr;
chr_on++;
}
i++;
}
make_change(argv, argc);
}
void make_change(char argv[MAX_ARGS][MAX_ARG_LEN], int argc) {
printf("Making change with:\n");
for (int i = 0; i < argc; i++) {
printf("Arg %d: %s\n", i + 1, argv[i]);
}
char *cmd = argv[0];
if (strcmp(cmd, "create") == 0) {
new_component(argv[1]);
return;
}
if (strcmp(cmd, "layout") == 0) {
set_layout(argv, argc);
}
if (strcmp(cmd, "set") == 0) {
set_var(argv, argc);
}
}
|