From afb04a529e8351ba7dd517a58b343c65157751d2 Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Mon, 14 Sep 2020 14:03:04 -0700 Subject: Added Plan9 implementation --- tools/build.sh | 16 ++---- tools/main.c | 106 --------------------------------------- tools/themes.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tools/themes9.c | 153 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 301 insertions(+), 117 deletions(-) delete mode 100644 tools/main.c create mode 100644 tools/themes.c create mode 100644 tools/themes9.c diff --git a/tools/build.sh b/tools/build.sh index 256b3c9..a9ed3bc 100755 --- a/tools/build.sh +++ b/tools/build.sh @@ -1,18 +1,12 @@ #!/bin/bash -clang-format -i main.c +clang-format -i themes.c # Linux -cc -std=c89 -DDEBUG -Wall -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined -o main main.c +cc -std=c89 -DDEBUG -Wall -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined -o themes themes.c -# RPi -# tcc -Wall main.c -o main +# ./themes ../themes/apollo.svg -# Plan9 -# pcc main.c -o main +cat ../themes/apollo.svg | ./themes -# ./main ../themes/apollo.svg - -cat ../themes/apollo.svg | ./main - -rm ./main +rm ./themes diff --git a/tools/main.c b/tools/main.c deleted file mode 100644 index 20c92ce..0000000 --- a/tools/main.c +++ /dev/null @@ -1,106 +0,0 @@ -#include - -#define BUFLEN 256 - -int -slen(char* s) -{ - int n = 0; - while(s[n] != '\0' && s[++n]) - ; - return n; -} - -int -cpos(char* s, char c) -{ - int i; - for(i = 0; i < slen(s); i++) - if(s[i] == c) - return i; - return -1; -} - -void -sstr(char* src, char* dest, int from, int to) -{ - int i; - char *a = (char*)src + from, *b = (char*)dest; - for(i = 0; i < to; i++) - b[i] = a[i]; - dest[to] = '\0'; -} - -unsigned char -chex(char c) -{ - if(c >= 'a' && c <= 'f') - return 10 + c - 'a'; - if(c >= 'A' && c <= 'F') - return 10 + c - 'A'; - return (c - '0') & 0xF; -} - -unsigned long -shex(char* s) -{ - int i, n = 0, l = slen(s); - for(i = 0; i < l; ++i) - n |= (chex(s[i]) << ((l - i - 1) * 4)); - return n; -} - -int -error(char* name) -{ - printf("Error: %s\n", name); - return 0; -} - -int -scmp(char* a, char* b) -{ - int i, l = slen(a); - if(l != slen(b)) - return 0; - for(i = 0; i < l; ++i) - if(a[i] != b[i]) - return 0; - return 1; -} - -int -parse(FILE* f) -{ - int i, id = 0; - long theme[9]; - char line[BUFLEN], hexs[BUFLEN]; - while(fgets(line, BUFLEN, f)) { - int split = cpos(line, '#'); - if(split < 0 || id > 9) - continue; - sstr(line, hexs, split, 7); - printf("%s ", hexs); - theme[id] = shex(hexs + 1); - id++; - } - if(id != 9) - return error("Invalid theme"); - for(i = 0; i < 9; ++i) { - printf("%ld ", theme[i]); - } - return 1; -} - -int -main(int argc, char* argv[]) -{ - FILE* input; - if(argc == 2) { - input = fopen(argv[1], "rb"); - if(input == NULL) - return error("Invalid input.\n"); - } else - input = stdin; - return parse(input); -} \ No newline at end of file diff --git a/tools/themes.c b/tools/themes.c new file mode 100644 index 0000000..7866286 --- /dev/null +++ b/tools/themes.c @@ -0,0 +1,143 @@ +#include + +#define BUFLEN 256 + +int +slen(char* s) +{ + int n = 0; + while(s[n] != '\0' && s[++n]) + ; + return n; +} + +int +cpos(char* s, char c) +{ + int i; + for(i = 0; i < slen(s); i++) + if(s[i] == c) + return i; + return -1; +} + +char* +sstr(char* src, char* dest, int from, int to) +{ + int i; + char *a = (char*)src + from, *b = (char*)dest; + for(i = 0; i < to; i++) + b[i] = a[i]; + dest[to] = '\0'; + return dest; +} + +unsigned char +chex(char c) +{ + if(c >= 'a' && c <= 'f') + return 10 + c - 'a'; + if(c >= 'A' && c <= 'F') + return 10 + c - 'A'; + return (c - '0') & 0xF; +} + +unsigned long +shex(char* s) +{ + int i, n = 0, l = slen(s); + for(i = 0; i < l; ++i) + n |= (chex(s[i]) << ((l - i - 1) * 4)); + return n; +} + +int +error(char* name) +{ + printf("Error: %s\n", name); + return 0; +} + +int +scmp(char* a, char* b) +{ + int i, l = slen(a); + if(l != slen(b)) + return 0; + for(i = 0; i < l; ++i) + if(a[i] != b[i]) + return 0; + return 1; +} + +char* +scat(char* dest, const char* src) +{ + char* ptr = dest + slen(dest); + while(*src != '\0') + *ptr++ = *src++; + *ptr = '\0'; + return dest; +} + +int +parse2(FILE* f) +{ + int i, id = 0, next = 0; + long theme[9]; + char line[BUFLEN], hexs[BUFLEN], comb[1024]; + char* ptr; + while(fgets(line, BUFLEN, f)) { + scat(comb, line); + } + + for(i = 0; i < slen(comb); ++i) { + if(comb[i] != '#') + continue; + printf("%s ", sstr(comb, hexs, i, 7)); + id++; + } + + if(id != 9) + return error("Invalid theme"); + for(i = 0; i < 9; ++i) { + printf("%ld ", theme[i]); + } + return 1; +} + +int +parse(FILE* f) +{ + int i, id = 0; + long theme[9]; + char line[BUFLEN], hexs[BUFLEN]; + while(fgets(line, BUFLEN, f)) { + int split = cpos(line, '#'); + if(split < 0 || id > 9) + continue; + sstr(line, hexs, split, 7); + printf("%s ", hexs); + theme[id] = shex(hexs + 1); + id++; + } + if(id != 9) + return error("Invalid theme"); + for(i = 0; i < 9; ++i) { + printf("%ld ", theme[i]); + } + return 1; +} + +int +main(int argc, char* argv[]) +{ + FILE* input; + if(argc == 2) { + input = fopen(argv[1], "rb"); + if(input == NULL) + return error("Invalid input.\n"); + } else + input = stdin; + return parse2(input); +} \ No newline at end of file diff --git a/tools/themes9.c b/tools/themes9.c new file mode 100644 index 0000000..ae3541d --- /dev/null +++ b/tools/themes9.c @@ -0,0 +1,153 @@ +#include +#include +#include +#include + +#define BUFLEN 1024 + +long theme[9]; +Image *bg, + *f_high, *f_med, *f_low, *f_inv, + *b_high, *b_med, *b_low, *b_inv; + +int +slen(char* s) +{ + int n = 0; + while(s[n] != '\0' && s[++n]) + ; + return n; +} + +char* +sstr(char* src, char* dest, int from, int to) +{ + int i; + char *a = (char*)src + from, *b = (char*)dest; + for(i = 0; i < to; i++) + b[i] = a[i]; + dest[to] = '\0'; + return dest; +} + +unsigned char +chex(char c) +{ + if(c >= 'a' && c <= 'f') + return 10 + c - 'a'; + if(c >= 'A' && c <= 'F') + return 10 + c - 'A'; + return (c - '0') & 0xF; +} + +unsigned long +shex(char* s) +{ + int i, n = 0, l = slen(s); + for(i = 0; i < l; ++i) + n |= (chex(s[i]) << ((l - i - 1) * 4)); + return n; +} + +void +parse(int fd) +{ + int i, id = 0; + char buf[BUFLEN], hexs[8]; + + read(fd, buf, BUFLEN); + + for(i = 0; i < BUFLEN; ++i) { + if(buf[i] != '#') + continue; + print("#%s ", sstr(buf, hexs, i + 1, 6)); + theme[id] = (shex(hexs) << 8) + 255; + id++; + } + + if(id != 9) + print("Invalid theme"); + + close(fd); + + bg = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, theme[0]); + f_high = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, theme[1]); + f_med = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, theme[2]); + f_low = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, theme[3]); + f_inv = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, theme[4]); + b_high = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, theme[5]); + b_med = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, theme[6]); + b_low = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, theme[7]); + b_inv = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, theme[8]); +} + +void +redraw(Image* dst) +{ + int size = 20; + Point s = subpt(screen->r.max, screen->r.min); + Point c = divpt(s, 2); + Point m = addpt(screen->r.min, c); + Point o = addpt(m, (Point){-size * 4, -size * 2}); + draw(screen, screen->r, bg, nil, ZP); + + fillellipse(screen, + addpt(o, (Point){size, size}), + size, size, f_high, ZP); + fillellipse(screen, + addpt(o, (Point){size * 3, size}), + size, size, f_med, ZP); + fillellipse(screen, + addpt(o, (Point){size * 5, size}), + size, size, f_low, ZP); + fillellipse(screen, + addpt(o, (Point){size * 7, size}), + size, size, f_inv, ZP); + fillellipse(screen, + addpt(o, (Point){size, size * 3}), + size, size, b_high, ZP); + fillellipse(screen, + addpt(o, (Point){size * 3, size * 3}), + size, size, b_med, ZP); + fillellipse(screen, + addpt(o, (Point){size * 5, size * 3}), + size, size, b_low, ZP); + fillellipse(screen, + addpt(o, (Point){size * 7, size * 3}), + size, size, b_inv, ZP); +} + +void +eresized(int new) +{ + Rectangle r; + r = screen->r; + if(new&& getwindow(display, Refnone) < 0) + fprint(2, "can't reattach to window"); + redraw(screen); +} + +void +main(int argc, char** argv) +{ + int fd; + Mouse m; + + initdraw(0, 0, "Themes"); + + if(argc == 1) + fd = 0; + else if((fd = open(argv[1], OREAD)) < 0) + perror(argv[1]); + parse(fd); + + eresized(0); + einit(Emouse); + + /* Break on mouse3 */ + for(;;) { + m = emouse(); + if(m.buttons & 4) + break; + } +} \ No newline at end of file -- cgit v1.2.3