From: Michael D. Lowis Date: Fri, 25 Nov 2016 19:16:29 +0000 (-0500) Subject: Added logic for command execution. Segfaults galore, but it's on the right track X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=f435da00803216103cecf5c59fb87852b57b7db9;p=projs%2Ftide.git Added logic for command execution. Segfaults galore, but it's on the right track --- diff --git a/inc/edit.h b/inc/edit.h index bf7b8a9..299d8cd 100644 --- a/inc/edit.h +++ b/inc/edit.h @@ -186,6 +186,7 @@ void detach(Process* proc); void terminate(Process* proc, int sig); char* cmdread(char** cmd); void cmdwrite(char** cmd, char* text); +char* cmdwriteread(char** cmd, char* text); /* Color Scheme Handling *****************************************************************************/ diff --git a/libedit/exec.c b/libedit/exec.c index 8f1b6c0..1bd0c1e 100644 --- a/libedit/exec.c +++ b/libedit/exec.c @@ -80,3 +80,19 @@ void cmdwrite(char** cmd, char* text) { detach(&proc); waitpid(proc.pid, NULL, 0); } + +char* cmdwriteread(char** cmd, char* text) { + Process proc; + if (execute(cmd, &proc) < 0) { + perror("failed to execute"); + return NULL; + } + if (write(proc.in, text, strlen(text)) < 0) { + perror("failed to write"); + return NULL; + } + char* str = fdgets(proc.out); + detach(&proc); + waitpid(proc.pid, NULL, 0); + return str; +} diff --git a/xedit.c b/xedit.c index 1ff626d..5e7e7a9 100644 --- a/xedit.c +++ b/xedit.c @@ -444,7 +444,40 @@ static void tag_exec(Tag* tag, char* arg) { } static void cmd_exec(char* cmd) { - printf("exec cmd: '%s'\n", cmd); + char op = '\0'; + if (*cmd == '!' || *cmd == '<' || *cmd == '|' || *cmd == '>') + op = *cmd, cmd++; + /* convert the command to an array */ + size_t len = 0; + char **cmdary = NULL, *part = NULL; + while (true) { + part = strtok((!part ? cmd : NULL), " "); + cmdary = realloc(cmdary, len+1 * sizeof(char*)); + cmdary[len++] = part; + if (!part) break; + } + /* execute the command */ + char *input = NULL, *output = NULL; + enum RegionId dest = EDIT; + input = view_getstr(getview(EDIT), NULL); + if (op == '!') { + printf("null: '%s' argc: %lu\n", cmd, len); + } else if (op == '>') { + cmdwrite(cmdary, input); + } else if (op == '|') { + output = cmdwriteread(cmdary, input); + } else { + if (op != '<') dest = Focused; + output = cmdread(cmdary); + } + if (output) { + view_putstr(getview(dest), output); + view_selprev(getview(dest)); + } + /* cleanup */ + free(input); + free(output); + free(cmdary); } static void exec(char* cmd) {