From aaf34171219453112f376cab1f594d6e5b14beec Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Fri, 21 Dec 2018 10:05:12 -0500 Subject: [PATCH] clean up build a bit --- Makefile | 2 +- config.mk | 7 +- plumber.c | 280 ----------------------------------------------------- src/arg.h | 48 --------- src/term.c | 12 ++- 5 files changed, 11 insertions(+), 338 deletions(-) delete mode 100644 plumber.c delete mode 100644 src/arg.h diff --git a/Makefile b/Makefile index 9a805de..53e605a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ INCS = -Iinc/ -BINS = bin/tide bin/registrar bin/edit bin/fetch bin/pick +BINS = bin/tide bin/registrar bin/edit bin/fetch MAN1 = docs/tide.1 LIBEDIT_OBJS = \ diff --git a/config.mk b/config.mk index b5ca15e..feefa5f 100644 --- a/config.mk +++ b/config.mk @@ -21,12 +21,11 @@ CC = cc CFLAGS = -g -MMD $(INCS) CFLAGS += --std=c99 -pedantic CFLAGS += -Wall -Wextra -CFLAGS += -Werror -CFLAGS += -Wno-missing-field-initializers - +#CFLAGS += -Werror +CFLAGS += -Wno-missing-field-initializers -Wno-implicit-fallthrough # Linker Setup LD = $(CC) -LDFLAGS = $(LIBS) -lX11 -lXft -lfontconfig -lXinerama -lutil +LDFLAGS = $(LIBS) -lX11 -lXft -lfontconfig -lXinerama -lutil -lm # Archive Setup AR = ar diff --git a/plumber.c b/plumber.c deleted file mode 100644 index 48beb12..0000000 --- a/plumber.c +++ /dev/null @@ -1,280 +0,0 @@ -#define _XOPEN_SOURCE 700 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __MACH__ - #define OPENCMD "open" -#else - #define OPENCMD "xdg-open" -#endif - -Atom XA_PLUMB; - -typedef struct { - enum { - COMPLETE=0, MATCHES, IS, ISSET, ISDIR, ISFILE, - SET, UNSET, EXEC, LAUNCH, NTYPES - } type; - char* arg1; - char* arg2; -} Rule; - -char* TypeNames[NTYPES] = { - "complete", "matches", "is", "isset", "isdir", "isfile", "set", - "unset", "exec", "launch" -}; - -char* Matches[10]; - -Rule* BuiltinRules[] = { - (Rule[]){ // Look up .c or .h files in Code/ - { ISSET, "EDITOR", NULL }, - { MATCHES, "data", "\\.[ch]$" }, - { ISDIR, "Code", NULL }, - { EXEC, "[[ $(find Code -type f -name '*$data') ]]", NULL }, - { LAUNCH, "find Code -type f -name '*$data' | xargs -r $EDITOR", NULL }, - { COMPLETE, NULL, NULL } - }, - (Rule[]){ // Match URLS and open them with the browser - { ISSET, "BROWSER", NULL }, - { MATCHES, "data", "^(https?|ftp)://.*" }, - { LAUNCH, "$BROWSER $0", NULL }, - { COMPLETE, NULL, NULL } - }, - (Rule[]){ // Open files with addresses in the editor - { ISSET, "EDITOR", NULL }, - { MATCHES, "data", "^([^:]+):([0-9]+)" }, - { ISFILE, "$1", NULL }, - { LAUNCH, "tctl $0", NULL }, - { COMPLETE, NULL, NULL } - }, - (Rule[]){ // If it's an existing text file, open it with editor - { ISSET, "EDITOR", NULL }, - { ISFILE, "$data", NULL }, - { EXEC, "file --mime '$file' | grep -q 'text/'", NULL }, - { LAUNCH, "$EDITOR '$file'", NULL }, - { COMPLETE, NULL, NULL } - }, - (Rule[]){ // Look it up in ctags database - { ISSET, "EDITOR", NULL }, - { ISFILE, "tags", NULL }, - { EXEC, "grep -q '^$data\\s\\+' tags", NULL }, - { LAUNCH, "picktag fetch tags '$data' | xargs -r tide", NULL }, - { COMPLETE, NULL, NULL } - }, - (Rule[]){ // If it's an existing directory, open it with system default - { ISDIR, "$data", NULL }, - { LAUNCH, OPENCMD " $data", NULL }, - { COMPLETE, NULL, NULL } - }, -}; - -char* getvar(char* val) { - if (strlen(val) == 1 && isdigit(*val)) - val = Matches[*val - '0']; - else - val = getenv(val); - return (val ? val : ""); -} - -char* strappend(char* rs, size_t* sz, char c) { - *sz += 1; - rs = realloc(rs, *sz); - rs[*sz - 1] = c; - return rs; -} - -char* eval(char* s) { - size_t sz = 0; - char* rs = NULL; - while (s && *s) { - char c = *s++; - if ('$' == c && '$' == *s) { - rs = strappend(rs, &sz, *s++); - } else if ('$' == c) { - size_t vsz = 0; - char* var = calloc(1,1); - while (*s && (isalnum(*s) || *s == '_')) - var = strappend(var, &vsz, *s++); - char* val = getvar(var); - while (val && *val) - rs = strappend(rs, &sz, *val++); - free(var); - } else { - rs = strappend(rs, &sz, c); - } - } - rs = strappend(rs, &sz, '\0'); - return rs; -} - -bool matches(char* var, char* patt) { - regex_t regex = {0}; - regmatch_t matches[10] = {0}; - if (regcomp(®ex, patt, REG_EXTENDED) == 0) { - var = getvar(var); - memset(Matches, 0, sizeof(Matches)); - int err = regexec(®ex, var, nelem(matches), matches, 0); - for (int i = 0; i < 10 && matches[i].rm_so >= 0; i++) { - Matches[i] = strndup(var+matches[i].rm_so, matches[i].rm_eo-matches[i].rm_so); - } - return (err == 0); - } - return false; -} - -bool var_is(char* var, char* val) { - return (strcmp(getvar(var), eval(val)) == 0); -} - -bool var_isset(char* var) { - return (getenv(var) != NULL); -} - -bool var_isdir(char* var) { - struct stat st = {0}; - char* path = eval(var); - if ((stat(path, &st) < 0) && (errno == ENOENT)) { - return false; - } else if (S_ISDIR(st.st_mode)) { - setenv("dir", var, 1); - return true; - } else { - return false; - } -} - -bool var_isfile(char* var) { - struct stat st = {0}; - char* path = eval(var); - if ((stat(eval(var), &st) < 0) && (errno == ENOENT)) { - return false; - } else if (!S_ISDIR(st.st_mode)) { - setenv("file", path, 1); - return true; - } else { - return false; - } -} - -bool var_set(char* var, char* val) { - return (setenv(var, eval(val), 1) == 0); -} - -bool var_unset(char* var) { - return (unsetenv(var) == 0); -} - -void runcmd(char* cmd) { - char* shellcmd[] = { getvar("SHELL"), "-c", NULL, NULL }; - if (!shellcmd[0]) shellcmd[0] = "/bin/sh"; - shellcmd[2] = eval(cmd); - _exit(execvp(shellcmd[0], shellcmd)); -} - -bool exec(char* cmd) { - int pid, status, outpipe[2]; - if ((pid = fork()) < 0) return false; - if (pid == 0) { - runcmd(cmd); - } else { - waitpid(pid, &status, 0); - return (status == 0); - } - return false; -} - -bool launch(char* cmd) { - int pid = fork(); - if (pid > 0) - return true; - else if (pid == 0) - runcmd(cmd); - return false; -} - -bool apply_rule(Rule* rule) { - switch (rule->type) { - case COMPLETE: exit(0); - case MATCHES: return matches(rule->arg1, rule->arg2); - case IS: return var_is(rule->arg1, rule->arg2); - case ISSET: return var_isset(rule->arg1); - case ISDIR: return var_isdir(rule->arg1); - case ISFILE: return var_isfile(rule->arg1); - case SET: return var_set(rule->arg1, rule->arg2); - case UNSET: return var_unset(rule->arg1); - case EXEC: return exec(rule->arg1); - case LAUNCH: return launch(rule->arg1); - default: return false; - } -} - -void plumb(char* str) { - if (!str || !str[0]) return; - char* path = str; - for (; *str && *str != '\n'; str++); - *str = '\0', str++; - char* data = str; - if (fork() == 0) { - chdir(path); - setenv("data", str, 1); - for (int i = 0; i < nelem(BuiltinRules); i++) { - Rule* rule = BuiltinRules[i]; - for (; rule->type != COMPLETE; rule++) { - printf("%s '%s' '%s'\n", TypeNames[rule->type], rule->arg1, rule->arg2); - if (!apply_rule(rule)) - break; - } - puts(""); - if (rule->type == COMPLETE) - exit(0); - } - exit(1); - } -} - -void selclear(XConf* x, XEvent* e) { - exit(0); -} - -void propnotify(XConf* x, XEvent* e) { - int success = 0, nreturn = 0; - unsigned long nleft; - XTextProperty prop = {0}; - if (e->xproperty.atom != XA_PLUMB) return; - success = XGetWindowProperty( - x->display, x->self, XA_PLUMB, 0, -1, True, AnyPropertyType, - &prop.encoding, &prop.format, &prop.nitems, &nleft, &prop.value - ); - if (Success == success) { - char** strlist = NULL; - if (Success == XmbTextPropertyToTextList(x->display, &prop, &strlist, &nreturn)) - for (int i = 0; i < nreturn; i++) - plumb(strlist[i]); - if (strlist) XFreeStringList(strlist); - } - if (prop.value) XFree(prop.value); -} - -int main(int argc, char** argv) { - XConf x; - x11_init(&x); - x11_mkwin(&x, 1, 1, PropertyChangeMask); - XA_PLUMB = XInternAtom(x.display, "PLUMB", 0); - x.eventfns[SelectionClear] = selclear; - x.eventfns[PropertyNotify] = propnotify; - if (None == XGetSelectionOwner(x.display, XA_PLUMB)) { - XSetSelectionOwner(x.display, XA_PLUMB, x.self, CurrentTime); - if (x.self == XGetSelectionOwner(x.display, XA_PLUMB)) { - x11_event_loop(&x); - } - } - return 1; -} diff --git a/src/arg.h b/src/arg.h deleted file mode 100644 index ba3fb3f..0000000 --- a/src/arg.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copy me if you can. - * by 20h - */ - -#ifndef ARG_H__ -#define ARG_H__ - -extern char *argv0; - -/* use main(int argc, char *argv[]) */ -#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ - argv[0] && argv[0][0] == '-'\ - && argv[0][1];\ - argc--, argv++) {\ - char argc_;\ - char **argv_;\ - int brk_;\ - if (argv[0][1] == '-' && argv[0][2] == '\0') {\ - argv++;\ - argc--;\ - break;\ - }\ - for (brk_ = 0, argv[0]++, argv_ = argv;\ - argv[0][0] && !brk_;\ - argv[0]++) {\ - if (argv_ != argv)\ - break;\ - argc_ = argv[0][0];\ - switch (argc_) -#define ARGEND }\ - } - -#define ARGC() argc_ - -#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ - ((x), abort(), (char *)0) :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ - (char *)0 :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#endif diff --git a/src/term.c b/src/term.c index 9f31b37..2b415d1 100644 --- a/src/term.c +++ b/src/term.c @@ -1,3 +1,9 @@ +#define _DEFAULT_SOURCE +#define _BSD_SOURCE +#define _XOPEN_SOURCE 700 +#define _POSIX_C_SOURCE 20080 +#define XINERAMA + /* See LICENSE for license details. */ #include #include @@ -4148,8 +4154,6 @@ xdrawcursor(void) /* draw the new one */ if (xw.state & WIN_FOCUSED) { switch (xw.cursor) { - case 7: /* st extension: snowman */ - utf8decode("☃", &g.u, UTF_SIZ); case 0: /* Blinking Block */ case 1: /* Blinking Block (Default) */ case 2: /* Steady Block */ @@ -4592,9 +4596,7 @@ run(void) } } -int -main(int argc, char *argv[]) -{ +int main(void) { uint cols = 80, rows = 24; xw.l = xw.t = 0; xw.isfixed = False; -- 2.52.0