112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <stdio.h> 212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <string.h> 312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <signal.h> 412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <sys/wait.h> 512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <err.h> 612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <ctype.h> 712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <stdlib.h> 812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <unistd.h> 912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <dirent.h> 1012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <limits.h> 1112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <locale.h> 1212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 1312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <histedit.h> 1412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 1512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 1612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic int continuation; 1712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavolatile sig_atomic_t gotsig; 1812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic const char hfile[] = ".whistory"; 1912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 2012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic wchar_t * 2112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprompt(EditLine *el) 2212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{ 2312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala static wchar_t a[] = L"\1\033[7m\1Edit$\1\033[0m\1 "; 2412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala static wchar_t b[] = L"Edit> "; 2512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 2612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala return continuation ? b : a; 2712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala} 2812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 2912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 3012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic void 3112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialasig(int i) 3212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{ 3312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala gotsig = i; 3412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala} 3512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 3612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaconst char * 3712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialamy_wcstombs(const wchar_t *wstr) 3812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{ 3912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala static struct { 4012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala char *str; 4112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int len; 4212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } buf; 4312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 4412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int needed = wcstombs(0, wstr, 0) + 1; 4512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (needed > buf.len) { 4612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala buf.str = malloc(needed); 4712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala buf.len = needed; 4812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 4912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala wcstombs(buf.str, wstr, needed); 5012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala buf.str[needed - 1] = 0; 5112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 5212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala return buf.str; 5312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala} 5412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 5512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 5612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic unsigned char 5712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialacomplete(EditLine *el, int ch) 5812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{ 5912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala DIR *dd = opendir("."); 6012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala struct dirent *dp; 6112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala const wchar_t *ptr; 6212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala char *buf, *bptr; 6312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala const LineInfoW *lf = el_wline(el); 6412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int len, mblen, i; 6512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala unsigned char res = 0; 6612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala wchar_t dir[1024]; 6712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 6812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* Find the last word */ 6912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala for (ptr = lf->cursor -1; !iswspace(*ptr) && ptr > lf->buffer; --ptr) 7012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continue; 7112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala len = lf->cursor - ++ptr; 7212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 7312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* Convert last word to multibyte encoding, so we can compare to it */ 7412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala wctomb(NULL, 0); /* Reset shift state */ 7512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala mblen = MB_LEN_MAX * len + 1; 7612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala buf = bptr = malloc(mblen); 7712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (buf == NULL) 7812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala err(1, "malloc"); 7912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala for (i = 0; i < len; ++i) { 8012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* Note: really should test for -1 return from wctomb */ 8112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala bptr += wctomb(bptr, ptr[i]); 8212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 8312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *bptr = 0; /* Terminate multibyte string */ 8412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala mblen = bptr - buf; 8512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 8612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* Scan directory for matching name */ 8712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala for (dp = readdir(dd); dp != NULL; dp = readdir(dd)) { 8812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (mblen > strlen(dp->d_name)) 8912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continue; 9012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (strncmp(dp->d_name, buf, mblen) == 0) { 9112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala mbstowcs(dir, &dp->d_name[mblen], 9212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala sizeof(dir) / sizeof(*dir)); 9312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (el_winsertstr(el, dir) == -1) 9412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala res = CC_ERROR; 9512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala else 9612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala res = CC_REFRESH; 9712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 9812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 9912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 10012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 10112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala closedir(dd); 10212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala free(buf); 10312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala return res; 10412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala} 10512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 10612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 10712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint 10812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialamain(int argc, char *argv[]) 10912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{ 11012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala EditLine *el = NULL; 11112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int numc, ncontinuation; 11212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala const wchar_t *line; 11312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala TokenizerW *tok; 11412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala HistoryW *hist; 11512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala HistEventW ev; 11612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef DEBUG 11712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int i; 11812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif 11912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 12012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala setlocale(LC_ALL, ""); 12112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 12212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)signal(SIGINT, sig); 12312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)signal(SIGQUIT, sig); 12412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)signal(SIGHUP, sig); 12512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)signal(SIGTERM, sig); 12612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 12712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala hist = history_winit(); /* Init built-in history */ 12812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history_w(hist, &ev, H_SETSIZE, 100); /* Remember 100 events */ 12912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history_w(hist, &ev, H_LOAD, hfile); 13012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 13112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala tok = tok_winit(NULL); /* Init the tokenizer */ 13212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 13312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el = el_init(argv[0], stdin, stdout, stderr); 13412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 13512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_wset(el, EL_EDITOR, L"vi"); /* Default editor is vi */ 13612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_wset(el, EL_SIGNAL, 1); /* Handle signals gracefully */ 13712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_wset(el, EL_PROMPT_ESC, prompt, '\1'); /* Set the prompt function */ 13812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 13912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_wset(el, EL_HIST, history_w, hist); /* FIXME - history_w? */ 14012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 14112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* Add a user-defined function */ 14212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_wset(el, EL_ADDFN, L"ed-complete", L"Complete argument", complete); 14312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 14412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* Bind <tab> to it */ 14512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_wset(el, EL_BIND, L"^I", L"ed-complete", NULL); 14612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 14712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* 14812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Bind j, k in vi command mode to previous and next line, instead 14912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * of previous and next history. 15012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */ 15112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_wset(el, EL_BIND, L"-a", L"k", L"ed-prev-line", NULL); 15212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_wset(el, EL_BIND, L"-a", L"j", L"ed-next-line", NULL); 15312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 15412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* Source the user's defaults file. */ 15512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_source(el, NULL); 15612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 15712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala while((line = el_wgets(el, &numc)) != NULL && numc != 0) { 15812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int ac, cc, co, rc; 15912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala const wchar_t **av; 16012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 16112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala const LineInfoW *li; 16212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala li = el_wline(el); 16312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 16412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef DEBUG 16512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)fwprintf(stderr, L"==> got %d %ls", numc, line); 16612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)fwprintf(stderr, L" > li `%.*ls_%.*ls'\n", 16712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (li->cursor - li->buffer), li->buffer, 16812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (li->lastchar - 1 - li->cursor), 16912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (li->cursor >= li->lastchar) ? L"" : li->cursor); 17012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif 17112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 17212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (gotsig) { 17312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)fprintf(stderr, "Got signal %d.\n", gotsig); 17412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala gotsig = 0; 17512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_reset(el); 17612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 17712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 17812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if(!continuation && numc == 1) 17912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continue; /* Only got a linefeed */ 18012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 18112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala ac = cc = co = 0; 18212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala ncontinuation = tok_wline(tok, li, &ac, &av, &cc, &co); 18312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (ncontinuation < 0) { 18412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) fprintf(stderr, "Internal error\n"); 18512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continuation = 0; 18612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continue; 18712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 18812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 18912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef DEBUG 19012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)fprintf(stderr, " > nc %d ac %d cc %d co %d\n", 19112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala ncontinuation, ac, cc, co); 19212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif 19312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history_w(hist, &ev, continuation ? H_APPEND : H_ENTER, line); 19412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 19512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continuation = ncontinuation; 19612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala ncontinuation = 0; 19712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if(continuation) 19812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continue; 19912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 20012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef DEBUG 20112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala for (i = 0; i < ac; ++i) { 20212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)fwprintf(stderr, L" > arg# %2d ", i); 20312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (i != cc) 20412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)fwprintf(stderr, L"`%ls'\n", av[i]); 20512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala else 20612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)fwprintf(stderr, L"`%.*ls_%ls'\n", 20712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala co, av[i], av[i] + co); 20812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 20912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif 21012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 21112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (wcscmp (av[0], L"history") == 0) { 21212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala switch(ac) { 21312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala case 1: 21412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala for(rc = history_w(hist, &ev, H_LAST); 21512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala rc != -1; 21612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala rc = history_w(hist, &ev, H_PREV)) 21712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)fwprintf(stdout, L"%4d %ls", 21812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala ev.num, ev.str); 21912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 22012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala case 2: 22112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (wcscmp(av[1], L"clear") == 0) 22212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history_w(hist, &ev, H_CLEAR); 22312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala else 22412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala goto badhist; 22512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 22612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala case 3: 22712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (wcscmp(av[1], L"load") == 0) 22812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history_w(hist, &ev, H_LOAD, 22912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala my_wcstombs(av[2])); 23012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala else if (wcscmp(av[1], L"save") == 0) 23112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history_w(hist, &ev, H_SAVE, 23212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala my_wcstombs(av[2])); 23312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala else 23412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala goto badhist; 23512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 23612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala badhist: 23712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala default: 23812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)fprintf(stderr, 23912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala "Bad history arguments\n"); 24012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 24112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 24212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } else if (el_wparse(el, ac, av) == -1) { 24312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala switch (fork()) { 24412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala case 0: { 24512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala Tokenizer *ntok = tok_init(NULL); 24612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int nargc; 24712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala const char **nav; 24812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala tok_str(ntok, my_wcstombs(line), &nargc, &nav); 24912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala execvp(nav[0],(char **)nav); 25012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala perror(nav[0]); 25112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala _exit(1); 25212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* NOTREACHED */ 25312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 25412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 25512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala case -1: 25612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala perror("fork"); 25712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 25812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala default: 25912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (wait(&rc) == -1) 26012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala perror("wait"); 26112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void)fprintf(stderr, "Exit %x\n", rc); 26212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 26312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 26412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 26512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 26612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala tok_wreset(tok); 26712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 26812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 26912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_end(el); 27012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala tok_wend(tok); 27112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history_w(hist, &ev, H_SAVE, hfile); 27212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history_wend(hist); 27312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 27412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala fprintf(stdout, "\n"); 27512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala return 0; 27612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala} 27712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 27812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 279