112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* $NetBSD: tc1.c,v 1.5 2010/04/18 21:17:47 christos Exp $ */ 212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*- 412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Copyright (c) 1992, 1993 512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * The Regents of the University of California. All rights reserved. 612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * This code is derived from software contributed to Berkeley by 812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Christos Zoulas of Cornell University. 912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 1012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Redistribution and use in source and binary forms, with or without 1112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * modification, are permitted provided that the following conditions 1212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * are met: 1312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 1. Redistributions of source code must retain the above copyright 1412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * notice, this list of conditions and the following disclaimer. 1512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 2. Redistributions in binary form must reproduce the above copyright 1612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * notice, this list of conditions and the following disclaimer in the 1712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * documentation and/or other materials provided with the distribution. 1812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 3. Neither the name of the University nor the names of its contributors 1912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * may be used to endorse or promote products derived from this software 2012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * without specific prior written permission. 2112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 2212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * SUCH DAMAGE. 3312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */ 3412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 3512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "config.h" 3612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifndef lint 3712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala__COPYRIGHT("@(#) Copyright (c) 1992, 1993\n\ 3812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala The Regents of the University of California. All rights reserved.\n"); 3912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif /* not lint */ 4012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 4112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if !defined(lint) && !defined(SCCSID) 4212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if 0 4312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char sccsid[] = "@(#)test.c 8.1 (Berkeley) 6/4/93"; 4412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#else 4512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala__RCSID("$NetBSD: tc1.c,v 1.5 2010/04/18 21:17:47 christos Exp $"); 4612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif 4712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif /* not lint && not SCCSID */ 4812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 4912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* from src/sys/sys/cdefs.h */ 5012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifndef __UNCONST 5112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# define __UNCONST(a) ((void *)(unsigned long)(const void *)(a)) 5212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif 5312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 5412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* 5512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * test.c: A little test program 5612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */ 5712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <stdio.h> 5812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <string.h> 5912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <signal.h> 6012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <sys/wait.h> 6112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <ctype.h> 6212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <stdlib.h> 6312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <unistd.h> 6412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <dirent.h> 6512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <locale.h> 6612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 6712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "histedit.h" 6812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 6912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic int continuation = 0; 7012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavolatile sig_atomic_t gotsig = 0; 7112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 7212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic unsigned char complete(EditLine *, int); 7312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int main(int, char **); 7412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char *prompt(EditLine *); 7512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic void sig(int); 7612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 7712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char * 7812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprompt(EditLine *el __attribute__((__unused__))) 7912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{ 8012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala static char a[] = "\1\033[7m\1Edit$\1\033[0m\1 "; 8112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala static char b[] = "Edit> "; 8212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 8312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala return (continuation ? b : a); 8412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala} 8512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 8612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic void 8712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialasig(int i) 8812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{ 8912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala gotsig = i; 9012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala} 9112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 9212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic unsigned char 9312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialacomplete(EditLine *el, int ch __attribute__((__unused__))) 9412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{ 9512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala DIR *dd = opendir("."); 9612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala struct dirent *dp; 9712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala const char* ptr; 9812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala const LineInfo *lf = el_line(el); 9912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala size_t len; 10012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int res = CC_ERROR; 10112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 10212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* 10312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Find the last word 10412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */ 10512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala for (ptr = lf->cursor - 1; 10612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala !isspace((unsigned char)*ptr) && ptr > lf->buffer; ptr--) 10712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continue; 10812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala len = lf->cursor - ++ptr; 10912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 11012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala for (dp = readdir(dd); dp != NULL; dp = readdir(dd)) { 11112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (len > strlen(dp->d_name)) 11212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continue; 11312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (strncmp(dp->d_name, ptr, len) == 0) { 11412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (el_insertstr(el, &dp->d_name[len]) == -1) 11512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala res = CC_ERROR; 11612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala else 11712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala res = CC_REFRESH; 11812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 11912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 12012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 12112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 12212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala closedir(dd); 12312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala return res; 12412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala} 12512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 12612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint 12712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialamain(int argc __attribute__((__unused__)), char *argv[]) 12812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{ 12912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala EditLine *el = NULL; 13012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int num; 13112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala const char *buf; 13212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala Tokenizer *tok; 13312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if 0 13412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int lastevent = 0; 13512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif 13612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int ncontinuation; 13712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala History *hist; 13812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala HistEvent ev; 13912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 14012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) setlocale(LC_CTYPE, ""); 14112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) signal(SIGINT, sig); 14212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) signal(SIGQUIT, sig); 14312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) signal(SIGHUP, sig); 14412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) signal(SIGTERM, sig); 14512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 14612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala hist = history_init(); /* Init the builtin history */ 14712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* Remember 100 events */ 14812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history(hist, &ev, H_SETSIZE, 100); 14912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 15012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala tok = tok_init(NULL); /* Initialize the tokenizer */ 15112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 15212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* Initialize editline */ 15312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el = el_init(*argv, stdin, stdout, stderr); 15412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 15512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_set(el, EL_EDITOR, "vi"); /* Default editor is vi */ 15612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_set(el, EL_SIGNAL, 1); /* Handle signals gracefully */ 15712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_set(el, EL_PROMPT_ESC, prompt, '\1');/* Set the prompt function */ 15812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 15912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* Tell editline to use this history interface */ 16012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_set(el, EL_HIST, history, hist); 16112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 16212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* Add a user-defined function */ 16312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_set(el, EL_ADDFN, "ed-complete", "Complete argument", complete); 16412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 16512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* Bind tab to it */ 16612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_set(el, EL_BIND, "^I", "ed-complete", NULL); 16712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 16812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* 16912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Bind j, k in vi command mode to previous and next line, instead 17012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * of previous and next history. 17112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */ 17212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_set(el, EL_BIND, "-a", "k", "ed-prev-line", NULL); 17312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_set(el, EL_BIND, "-a", "j", "ed-next-line", NULL); 17412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 17512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* 17612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Source the user's defaults file. 17712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */ 17812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_source(el, NULL); 17912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 18012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala while ((buf = el_gets(el, &num)) != NULL && num != 0) { 18112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int ac, cc, co; 18212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef DEBUG 18312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int i; 18412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif 18512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala const char **av; 18612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala const LineInfo *li; 18712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala li = el_line(el); 18812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef DEBUG 18912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) fprintf(stderr, "==> got %d %s", num, buf); 19012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) fprintf(stderr, " > li `%.*s_%.*s'\n", 19112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (li->cursor - li->buffer), li->buffer, 19212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (li->lastchar - 1 - li->cursor), 19312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (li->cursor >= li->lastchar) ? "" : li->cursor); 19412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 19512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif 19612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (gotsig) { 19712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) fprintf(stderr, "Got signal %d.\n", gotsig); 19812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala gotsig = 0; 19912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_reset(el); 20012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 20112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 20212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (!continuation && num == 1) 20312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continue; 20412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 20512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala ac = cc = co = 0; 20612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala ncontinuation = tok_line(tok, li, &ac, &av, &cc, &co); 20712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (ncontinuation < 0) { 20812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) fprintf(stderr, "Internal error\n"); 20912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continuation = 0; 21012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continue; 21112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 21212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef DEBUG 21312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) fprintf(stderr, " > nc %d ac %d cc %d co %d\n", 21412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala ncontinuation, ac, cc, co); 21512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif 21612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if 0 21712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (continuation) { 21812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* 21912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Append to the right event in case the user 22012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * moved around in history. 22112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */ 22212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (history(hist, &ev, H_SET, lastevent) == -1) 22312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala err(1, "%d: %s", lastevent, ev.str); 22412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history(hist, &ev, H_ADD , buf); 22512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } else { 22612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history(hist, &ev, H_ENTER, buf); 22712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala lastevent = ev.num; 22812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 22912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#else 23012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /* Simpler */ 23112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history(hist, &ev, continuation ? H_APPEND : H_ENTER, buf); 23212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif 23312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 23412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continuation = ncontinuation; 23512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala ncontinuation = 0; 23612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (continuation) 23712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala continue; 23812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef DEBUG 23912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala for (i = 0; i < ac; i++) { 24012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) fprintf(stderr, " > arg# %2d ", i); 24112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (i != cc) 24212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) fprintf(stderr, "`%s'\n", av[i]); 24312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala else 24412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) fprintf(stderr, "`%.*s_%s'\n", 24512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala co, av[i], av[i] + co); 24612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 24712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif 24812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 24912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (strcmp(av[0], "history") == 0) { 25012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala int rv; 25112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 25212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala switch (ac) { 25312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala case 1: 25412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala for (rv = history(hist, &ev, H_LAST); rv != -1; 25512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala rv = history(hist, &ev, H_PREV)) 25612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) fprintf(stdout, "%4d %s", 25712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala ev.num, ev.str); 25812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 25912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 26012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala case 2: 26112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (strcmp(av[1], "clear") == 0) 26212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history(hist, &ev, H_CLEAR); 26312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala else 26412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala goto badhist; 26512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 26612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 26712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala case 3: 26812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (strcmp(av[1], "load") == 0) 26912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history(hist, &ev, H_LOAD, av[2]); 27012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala else if (strcmp(av[1], "save") == 0) 27112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history(hist, &ev, H_SAVE, av[2]); 27212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 27312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 27412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala badhist: 27512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala default: 27612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) fprintf(stderr, 27712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala "Bad history arguments\n"); 27812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 27912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 28012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } else if (el_parse(el, ac, av) == -1) { 28112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala switch (fork()) { 28212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala case 0: 28312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala execvp(av[0], (char *const *)__UNCONST(av)); 28412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala perror(av[0]); 28512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala _exit(1); 28612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala /*NOTREACHED*/ 28712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 28812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 28912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala case -1: 29012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala perror("fork"); 29112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 29212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 29312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala default: 29412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala if (wait(&num) == -1) 29512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala perror("wait"); 29612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala (void) fprintf(stderr, "Exit %x\n", num); 29712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala break; 29812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 29912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 30012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 30112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala tok_reset(tok); 30212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala } 30312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 30412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala el_end(el); 30512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala tok_end(tok); 30612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala history_end(hist); 30712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala 30812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala return (0); 30912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala} 310