summaryrefslogtreecommitdiffstats
path: root/contrib/tcsh/ed.inputl.c
diff options
context:
space:
mode:
authormp <mp@FreeBSD.org>2009-07-10 21:00:38 +0000
committermp <mp@FreeBSD.org>2009-07-10 21:00:38 +0000
commit5c3d0e09d7926f4fe8b7ca838a2ed52b6e33e4b5 (patch)
treedae2d3ff4ed630baaed92bc0340cb55a8c9b01cd /contrib/tcsh/ed.inputl.c
parente863b68dceedacef4fea511d5f1e2c5666b2b2ee (diff)
downloadFreeBSD-src-5c3d0e09d7926f4fe8b7ca838a2ed52b6e33e4b5.zip
FreeBSD-src-5c3d0e09d7926f4fe8b7ca838a2ed52b6e33e4b5.tar.gz
Flatten vendor/tcsh/dist.
Diffstat (limited to 'contrib/tcsh/ed.inputl.c')
-rw-r--r--contrib/tcsh/ed.inputl.c947
1 files changed, 0 insertions, 947 deletions
diff --git a/contrib/tcsh/ed.inputl.c b/contrib/tcsh/ed.inputl.c
deleted file mode 100644
index a97058e..0000000
--- a/contrib/tcsh/ed.inputl.c
+++ /dev/null
@@ -1,947 +0,0 @@
-/* $Header: /p/tcsh/cvsroot/tcsh/ed.inputl.c,v 3.66 2006/11/29 22:32:24 christos Exp $ */
-/*
- * ed.inputl.c: Input line handling.
- */
-/*-
- * Copyright (c) 1980, 1991 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-#include "sh.h"
-
-RCSID("$tcsh: ed.inputl.c,v 3.66 2006/11/29 22:32:24 christos Exp $")
-
-#include "ed.h"
-#include "ed.defns.h" /* for the function names */
-#include "tw.h" /* for twenex stuff */
-
-#define OKCMD INT_MAX
-
-/* ed.inputl -- routines to get a single line from the input. */
-
-extern int MapsAreInited;
-
-/* mismatched first character */
-static Char mismatch[] =
- {'!', '^' , '\\', '-', '%', '\0', '"', '\'', '`', '\0' };
-
-static int Repair (void);
-static int GetNextCommand (KEYCMD *, Char *);
-static int SpellLine (int);
-static int CompleteLine (void);
-static void RunCommand (Char *);
-static void doeval1 (Char **);
-
-static int rotate = 0;
-
-
-static int
-Repair(void)
-{
- if (NeedsRedraw) {
- ClearLines();
- ClearDisp();
- NeedsRedraw = 0;
- }
- Refresh();
- Argument = 1;
- DoingArg = 0;
- curchoice = -1;
- return (int) (LastChar - InputBuf);
-}
-
-/* CCRETVAL */
-int
-Inputl(void)
-{
- CCRETVAL retval;
- KEYCMD cmdnum = 0;
- unsigned char tch; /* the place where read() goes */
- Char ch;
- int num; /* how many chars we have read at NL */
- int expnum;
- struct varent *crct = inheredoc ? NULL : adrof(STRcorrect);
- struct varent *autol = adrof(STRautolist);
- struct varent *matchbeep = adrof(STRmatchbeep);
- struct varent *imode = adrof(STRinputmode);
- Char *SaveChar, *CorrChar;
- int matchval; /* from tenematch() */
- COMMAND fn;
- int curlen = 0;
- int newlen;
- int idx;
-
- if (!MapsAreInited) /* double extra just in case */
- ed_InitMaps();
-
- ClearDisp(); /* reset the display stuff */
- ResetInLine(0); /* reset the input pointers */
- if (GettingInput)
- MacroLvl = -1; /* editor was interrupted during input */
-
- if (imode && imode->vec != NULL) {
- if (!Strcmp(*(imode->vec), STRinsert))
- inputmode = MODE_INSERT;
- else if (!Strcmp(*(imode->vec), STRoverwrite))
- inputmode = MODE_REPLACE;
- }
-
-#if defined(FIONREAD) && !defined(OREO)
- if (!Tty_raw_mode && MacroLvl < 0) {
-# ifdef SUNOS4
- long chrs = 0;
-# else /* !SUNOS4 */
- /*
- * *Everyone* else has an int, but SunOS wants long!
- * This breaks where int != long (alpha)
- */
- int chrs = 0;
-# endif /* SUNOS4 */
-
- (void) ioctl(SHIN, FIONREAD, (ioctl_t) & chrs);
- if (chrs == 0) {
- if (Rawmode() < 0)
- return 0;
- }
- }
-#endif /* FIONREAD && !OREO */
-
- GettingInput = 1;
- NeedsRedraw = 0;
- tellwhat = 0;
-
- if (RestoreSaved) {
- copyn(InputBuf, SavedBuf.s, INBUFSIZE);/*FIXBUF*/
- LastChar = InputBuf + LastSaved;
- Cursor = InputBuf + CursSaved;
- Hist_num = HistSaved;
- HistSaved = 0;
- RestoreSaved = 0;
- }
- if (HistSaved) {
- Hist_num = HistSaved;
- GetHistLine();
- HistSaved = 0;
- }
- if (Expand) {
- (void) e_up_hist(0);
- Expand = 0;
- }
- Refresh(); /* print the prompt */
-
- for (num = OKCMD; num == OKCMD;) { /* while still editing this line */
-#ifdef DEBUG_EDIT
- if (Cursor > LastChar)
- xprintf("Cursor > LastChar\r\n");
- if (Cursor < InputBuf)
- xprintf("Cursor < InputBuf\r\n");
- if (Cursor > InputLim)
- xprintf("Cursor > InputLim\r\n");
- if (LastChar > InputLim)
- xprintf("LastChar > InputLim\r\n");
- if (InputLim != &InputBuf[INBUFSIZE - 2])/*FIXBUF*/
- xprintf("InputLim != &InputBuf[INBUFSIZE-2]\r\n");
- if ((!DoingArg) && (Argument != 1))
- xprintf("(!DoingArg) && (Argument != 1)\r\n");
- if (CcKeyMap[0] == 0)
- xprintf("CcKeyMap[0] == 0 (maybe not inited)\r\n");
-#endif
-
- /* if EOF or error */
- if ((num = GetNextCommand(&cmdnum, &ch)) != OKCMD) {
- break;
- }
-
- if (cmdnum >= NumFuns) {/* BUG CHECK command */
-#ifdef DEBUG_EDIT
- xprintf(CGETS(6, 1, "ERROR: illegal command from key 0%o\r\n"), ch);
-#endif
- continue; /* try again */
- }
-
- /* now do the real command */
- retval = (*CcFuncTbl[cmdnum]) (ch);
-
- /* save the last command here */
- LastCmd = cmdnum;
-
- /* make sure fn is initialized */
- fn = (retval == CC_COMPLETE_ALL) ? LIST_ALL : LIST;
-
- /* use any return value */
- switch (retval) {
-
- case CC_REFRESH:
- Refresh();
- /*FALLTHROUGH*/
- case CC_NORM: /* normal char */
- Argument = 1;
- DoingArg = 0;
- /*FALLTHROUGH*/
- case CC_ARGHACK: /* Suggested by Rich Salz */
- /* <rsalz@pineapple.bbn.com> */
- curchoice = -1;
- curlen = (int) (LastChar - InputBuf);
- break; /* keep going... */
-
- case CC_EOF: /* end of file typed */
- curchoice = -1;
- curlen = (int) (LastChar - InputBuf);
- num = 0;
- break;
-
- case CC_WHICH: /* tell what this command does */
- tellwhat = 1;
- *LastChar++ = '\n'; /* for the benifit of CSH */
- num = (int) (LastChar - InputBuf); /* number characters read */
- break;
-
- case CC_NEWLINE: /* normal end of line */
- curlen = 0;
- curchoice = -1;
- matchval = 1;
- if (crct && crct->vec != NULL && (!Strcmp(*(crct->vec), STRcmd) ||
- !Strcmp(*(crct->vec), STRall))) {
- Char *Origin;
-
- PastBottom();
- Origin = Strsave(InputBuf);
- cleanup_push(Origin, xfree);
- SaveChar = LastChar;
- if (SpellLine(!Strcmp(*(crct->vec), STRcmd)) == 1) {
- Char *Change;
-
- PastBottom();
- Change = Strsave(InputBuf);
- cleanup_push(Change, xfree);
- *Strchr(Change, '\n') = '\0';
- CorrChar = LastChar; /* Save the corrected end */
- LastChar = InputBuf; /* Null the current line */
- SoundBeep();
- printprompt(2, short2str(Change));
- cleanup_until(Change);
- Refresh();
- if (xread(SHIN, &tch, 1) < 0) {
-#ifdef convex
- /*
- * need to print error message in case file
- * is migrated
- */
- if (errno)
- stderror(ERR_SYSTEM, progname, strerror(errno));
-#else
- cleanup_until(Origin);
- break;
-#endif
- }
- ch = tch;
- if (ch == 'y' || ch == ' ') {
- LastChar = CorrChar; /* Restore the corrected end */
- xprintf(CGETS(6, 2, "yes\n"));
- }
- else {
- Strcpy(InputBuf, Origin);
- LastChar = SaveChar;
- if (ch == 'e') {
- xprintf(CGETS(6, 3, "edit\n"));
- *LastChar-- = '\0';
- Cursor = LastChar;
- printprompt(3, NULL);
- ClearLines();
- ClearDisp();
- Refresh();
- cleanup_until(Origin);
- break;
- }
- else if (ch == 'a') {
- xprintf(CGETS(6, 4, "abort\n"));
- LastChar = InputBuf; /* Null the current line */
- Cursor = LastChar;
- printprompt(0, NULL);
- Refresh();
- cleanup_until(Origin);
- break;
- }
- xprintf(CGETS(6, 5, "no\n"));
- }
- flush();
- }
- cleanup_until(Origin);
- } else if (crct && crct->vec != NULL &&
- !Strcmp(*(crct->vec), STRcomplete)) {
- if (LastChar > InputBuf && LastChar[-1] == '\n') {
- LastChar[-1] = '\0';
- LastChar--;
- Cursor = LastChar;
- }
- match_unique_match = 1; /* match unique matches */
- matchval = CompleteLine();
- match_unique_match = 0;
- curlen = (int) (LastChar - InputBuf);
- if (matchval != 1) {
- PastBottom();
- }
- if (matchval == 0) {
- xprintf(CGETS(6, 6, "No matching command\n"));
- } else if (matchval == 2) {
- xprintf(CGETS(6, 7, "Ambiguous command\n"));
- }
- if (NeedsRedraw) {
- ClearLines();
- ClearDisp();
- NeedsRedraw = 0;
- }
- Refresh();
- Argument = 1;
- DoingArg = 0;
- if (matchval == 1) {
- PastBottom();
- *LastChar++ = '\n';
- *LastChar = '\0';
- }
- curlen = (int) (LastChar - InputBuf);
- }
- else
- PastBottom();
-
- if (matchval == 1) {
- tellwhat = 0; /* just in case */
- Hist_num = 0; /* for the history commands */
- /* return the number of chars read */
- num = (int) (LastChar - InputBuf);
- /*
- * For continuation lines, we set the prompt to prompt 2
- */
- printprompt(1, NULL);
- }
- break;
-
- case CC_CORRECT:
- if (tenematch(InputBuf, Cursor - InputBuf, SPELL) < 0)
- SoundBeep(); /* Beep = No match/ambiguous */
- curlen = Repair();
- break;
-
- case CC_CORRECT_L:
- if (SpellLine(FALSE) < 0)
- SoundBeep(); /* Beep = No match/ambiguous */
- curlen = Repair();
- break;
-
-
- case CC_COMPLETE:
- case CC_COMPLETE_ALL:
- case CC_COMPLETE_FWD:
- case CC_COMPLETE_BACK:
- switch (retval) {
- case CC_COMPLETE:
- fn = RECOGNIZE;
- curlen = (int) (LastChar - InputBuf);
- curchoice = -1;
- rotate = 0;
- break;
- case CC_COMPLETE_ALL:
- fn = RECOGNIZE_ALL;
- curlen = (int) (LastChar - InputBuf);
- curchoice = -1;
- rotate = 0;
- break;
- case CC_COMPLETE_FWD:
- fn = RECOGNIZE_SCROLL;
- curchoice++;
- rotate = 1;
- break;
- case CC_COMPLETE_BACK:
- fn = RECOGNIZE_SCROLL;
- curchoice--;
- rotate = 1;
- break;
- default:
- abort();
- }
- if (InputBuf[curlen] && rotate) {
- newlen = (int) (LastChar - InputBuf);
- for (idx = (int) (Cursor - InputBuf);
- idx <= newlen; idx++)
- InputBuf[idx - newlen + curlen] =
- InputBuf[idx];
- LastChar = InputBuf + curlen;
- Cursor = Cursor - newlen + curlen;
- }
- curlen = (int) (LastChar - InputBuf);
-
-
- if (adrof(STRautoexpand))
- (void) e_expand_history(0);
- /*
- * Modified by Martin Boyer (gamin@ireq-robot.hydro.qc.ca):
- * A separate variable now controls beeping after
- * completion, independently of autolisting.
- */
- expnum = (int) (Cursor - InputBuf);
- switch (matchval = tenematch(InputBuf, Cursor-InputBuf, fn)){
- case 1:
- if (non_unique_match && matchbeep && matchbeep->vec != NULL &&
- (Strcmp(*(matchbeep->vec), STRnotunique) == 0))
- SoundBeep();
- break;
- case 0:
- if (matchbeep && matchbeep->vec != NULL) {
- if (Strcmp(*(matchbeep->vec), STRnomatch) == 0 ||
- Strcmp(*(matchbeep->vec), STRambiguous) == 0 ||
- Strcmp(*(matchbeep->vec), STRnotunique) == 0)
- SoundBeep();
- }
- else
- SoundBeep();
- break;
- default:
- if (matchval < 0) { /* Error from tenematch */
- curchoice = -1;
- SoundBeep();
- break;
- }
- if (matchbeep && matchbeep->vec != NULL) {
- if ((Strcmp(*(matchbeep->vec), STRambiguous) == 0 ||
- Strcmp(*(matchbeep->vec), STRnotunique) == 0))
- SoundBeep();
- }
- else
- SoundBeep();
- /*
- * Addition by David C Lawrence <tale@pawl.rpi.edu>: If an
- * attempted completion is ambiguous, list the choices.
- * (PWP: this is the best feature addition to tcsh I have
- * seen in many months.)
- */
- if (autol && autol->vec != NULL &&
- (Strcmp(*(autol->vec), STRambiguous) != 0 ||
- expnum == Cursor - InputBuf)) {
- if (adrof(STRhighlight) && MarkIsSet) {
- /* clear highlighting before showing completions */
- MarkIsSet = 0;
- ClearLines();
- ClearDisp();
- Refresh();
- MarkIsSet = 1;
- }
- PastBottom();
- fn = (retval == CC_COMPLETE_ALL) ? LIST_ALL : LIST;
- (void) tenematch(InputBuf, Cursor-InputBuf, fn);
- }
- break;
- }
- if (NeedsRedraw) {
- PastBottom();
- ClearLines();
- ClearDisp();
- NeedsRedraw = 0;
- }
- Refresh();
- Argument = 1;
- DoingArg = 0;
- break;
-
- case CC_LIST_CHOICES:
- case CC_LIST_ALL:
- if (InputBuf[curlen] && rotate) {
- newlen = (int) (LastChar - InputBuf);
- for (idx = (int) (Cursor - InputBuf);
- idx <= newlen; idx++)
- InputBuf[idx - newlen + curlen] =
- InputBuf[idx];
- LastChar = InputBuf + curlen;
- Cursor = Cursor - newlen + curlen;
- }
- curlen = (int) (LastChar - InputBuf);
- if (curchoice >= 0)
- curchoice--;
-
- fn = (retval == CC_LIST_ALL) ? LIST_ALL : LIST;
- /* should catch ^C here... */
- if (tenematch(InputBuf, Cursor - InputBuf, fn) < 0)
- SoundBeep();
- Refresh();
- Argument = 1;
- DoingArg = 0;
- break;
-
-
- case CC_LIST_GLOB:
- if (tenematch(InputBuf, Cursor - InputBuf, GLOB) < 0)
- SoundBeep();
- curlen = Repair();
- break;
-
- case CC_EXPAND_GLOB:
- if (tenematch(InputBuf, Cursor - InputBuf, GLOB_EXPAND) <= 0)
- SoundBeep(); /* Beep = No match */
- curlen = Repair();
- break;
-
- case CC_NORMALIZE_PATH:
- if (tenematch(InputBuf, Cursor - InputBuf, PATH_NORMALIZE) <= 0)
- SoundBeep(); /* Beep = No match */
- curlen = Repair();
- break;
-
- case CC_EXPAND_VARS:
- if (tenematch(InputBuf, Cursor - InputBuf, VARS_EXPAND) <= 0)
- SoundBeep(); /* Beep = No match */
- curlen = Repair();
- break;
-
- case CC_NORMALIZE_COMMAND:
- if (tenematch(InputBuf, Cursor - InputBuf, COMMAND_NORMALIZE) <= 0)
- SoundBeep(); /* Beep = No match */
- curlen = Repair();
- break;
-
- case CC_HELPME:
- xputchar('\n');
- /* should catch ^C here... */
- (void) tenematch(InputBuf, LastChar - InputBuf, PRINT_HELP);
- Refresh();
- Argument = 1;
- DoingArg = 0;
- curchoice = -1;
- curlen = (int) (LastChar - InputBuf);
- break;
-
- case CC_FATAL: /* fatal error, reset to known state */
-#ifdef DEBUG_EDIT
- xprintf(CGETS(7, 8, "*** editor fatal ERROR ***\r\n\n"));
-#endif /* DEBUG_EDIT */
- /* put (real) cursor in a known place */
- ClearDisp(); /* reset the display stuff */
- ResetInLine(1); /* reset the input pointers */
- Refresh(); /* print the prompt again */
- Argument = 1;
- DoingArg = 0;
- curchoice = -1;
- curlen = (int) (LastChar - InputBuf);
- break;
-
- case CC_ERROR:
- default: /* functions we don't know about */
- if (adrof(STRhighlight)) {
- ClearLines();
- ClearDisp();
- Refresh();
- }
- DoingArg = 0;
- Argument = 1;
- SoundBeep();
- flush();
- curchoice = -1;
- curlen = (int) (LastChar - InputBuf);
- break;
- }
- }
- (void) Cookedmode(); /* make sure the tty is set up correctly */
- GettingInput = 0;
- flush(); /* flush any buffered output */
- return num;
-}
-
-void
-PushMacro(Char *str)
-{
- if (str != NULL && MacroLvl + 1 < MAXMACROLEVELS) {
- MacroLvl++;
- KeyMacro[MacroLvl] = str;
- }
- else {
- SoundBeep();
- flush();
- }
-}
-
-struct eval1_state
-{
- Char **evalvec, *evalp;
-};
-
-static void
-eval1_cleanup(void *xstate)
-{
- struct eval1_state *state;
-
- state = xstate;
- evalvec = state->evalvec;
- evalp = state->evalp;
- doneinp = 0;
-}
-
-/*
- * Like eval, only using the current file descriptors
- */
-static void
-doeval1(Char **v)
-{
- struct eval1_state state;
- Char **gv;
- int gflag;
-
- gflag = tglob(v);
- if (gflag) {
- gv = v = globall(v, gflag);
- if (v == 0)
- stderror(ERR_NOMATCH);
- v = copyblk(v);
- }
- else {
- gv = NULL;
- v = copyblk(v);
- trim(v);
- }
- if (gv)
- cleanup_push(gv, blk_cleanup);
-
- state.evalvec = evalvec;
- state.evalp = evalp;
- evalvec = v;
- evalp = 0;
- cleanup_push(&state, eval1_cleanup);
- process(0);
- cleanup_until(&state);
- if (gv)
- cleanup_until(gv);
-}
-
-static void
-RunCommand(Char *str)
-{
- Char *cmd[2];
-
- xputchar('\n'); /* Start on a clean line */
-
- cmd[0] = str;
- cmd[1] = NULL;
-
- (void) Cookedmode();
- GettingInput = 0;
-
- doeval1(cmd);
-
- (void) Rawmode();
- GettingInput = 1;
-
- ClearLines();
- ClearDisp();
- NeedsRedraw = 0;
- Refresh();
-}
-
-static int
-GetNextCommand(KEYCMD *cmdnum, Char *ch)
-{
- KEYCMD cmd = 0;
- int num;
-
- while (cmd == 0 || cmd == F_XKEY) {
- if ((num = GetNextChar(ch)) != 1) { /* if EOF or error */
- return num;
- }
-#ifdef KANJI
- if (
-#ifdef DSPMBYTE
- _enable_mbdisp &&
-#else
- MB_LEN_MAX == 1 &&
-#endif
- !adrof(STRnokanji) && (*ch & META)) {
- MetaNext = 0;
- cmd = F_INSERT;
- break;
- }
- else
-#endif /* KANJI */
- if (MetaNext) {
- MetaNext = 0;
- *ch |= META;
- }
- /* XXX: This needs to be fixed so that we don't just truncate
- * the character, we unquote it.
- */
- if (*ch < NT_NUM_KEYS)
- cmd = CurrentKeyMap[*ch];
- else
-#ifdef WINNT_NATIVE
- cmd = CurrentKeyMap[(unsigned char) *ch];
-#else
- cmd = F_INSERT;
-#endif
- if (cmd == F_XKEY) {
- XmapVal val;
- CStr cstr;
- cstr.buf = ch;
- cstr.len = 1;
- switch (GetXkey(&cstr, &val)) {
- case XK_CMD:
- cmd = val.cmd;
- break;
- case XK_STR:
- PushMacro(val.str.buf);
- break;
- case XK_EXE:
- RunCommand(val.str.buf);
- break;
- default:
- abort();
- break;
- }
- }
- if (!AltKeyMap)
- CurrentKeyMap = CcKeyMap;
- }
- *cmdnum = cmd;
- return OKCMD;
-}
-
-static Char ungetchar;
-static int haveungetchar;
-
-void
-UngetNextChar(Char cp)
-{
- ungetchar = cp;
- haveungetchar = 1;
-}
-
-int
-GetNextChar(Char *cp)
-{
- int num_read;
- int tried = 0;
- char cbuf[MB_LEN_MAX];
- size_t cbp;
-
- if (haveungetchar) {
- haveungetchar = 0;
- *cp = ungetchar;
- return 1;
- }
- for (;;) {
- if (MacroLvl < 0) {
- if (!Load_input_line())
- break;
- }
- if (*KeyMacro[MacroLvl] == 0) {
- MacroLvl--;
- continue;
- }
- *cp = *KeyMacro[MacroLvl]++ & CHAR;
- if (*KeyMacro[MacroLvl] == 0) { /* Needed for QuoteMode On */
- MacroLvl--;
- }
- return (1);
- }
-
- if (Rawmode() < 0) /* make sure the tty is set up correctly */
- return 0; /* oops: SHIN was closed */
-
-#ifdef WINNT_NATIVE
- __nt_want_vcode = 1;
-#endif /* WINNT_NATIVE */
-#ifdef SIG_WINDOW
- if (windowchg)
- (void) check_window_size(0); /* for window systems */
-#endif /* SIG_WINDOW */
- cbp = 0;
- for (;;) {
- while ((num_read = xread(SHIN, cbuf + cbp, 1)) == -1) {
- if (!tried && fixio(SHIN, errno) != -1)
- tried = 1;
- else {
-# ifdef convex
- /* need to print error message in case the file is migrated */
- stderror(ERR_SYSTEM, progname, strerror(errno));
-# endif /* convex */
-# ifdef WINNT_NATIVE
- __nt_want_vcode = 0;
-# endif /* WINNT_NATIVE */
- *cp = '\0'; /* Loses possible partial character */
- return -1;
- }
- }
- if (AsciiOnly) {
- *cp = (unsigned char)*cbuf;
- } else {
- cbp++;
- if (normal_mbtowc(cp, cbuf, cbp) == -1) {
- reset_mbtowc();
- if (cbp < MB_CUR_MAX)
- continue; /* Maybe a partial character */
- /* And drop the following bytes, if any */
- *cp = (unsigned char)*cbuf | INVALID_BYTE;
- }
- }
- break;
- }
-#ifdef WINNT_NATIVE
- /* This is the part that doesn't work with WIDE_STRINGS */
- if (__nt_want_vcode == 2)
- *cp = __nt_vcode;
- __nt_want_vcode = 0;
-#endif /* WINNT_NATIVE */
- return num_read;
-}
-
-/*
- * SpellLine - do spelling correction on the entire command line
- * (which may have trailing newline).
- * If cmdonly is set, only check spelling of command words.
- * Return value:
- * -1: Something was incorrectible, and nothing was corrected
- * 0: Everything was correct
- * 1: Something was corrected
- */
-static int
-SpellLine(int cmdonly)
-{
- int endflag, matchval;
- Char *argptr, *OldCursor, *OldLastChar;
-
- OldLastChar = LastChar;
- OldCursor = Cursor;
- argptr = InputBuf;
- endflag = 1;
- matchval = 0;
- do {
- while (ismetahash(*argptr) || iscmdmeta(*argptr))
- argptr++;
- for (Cursor = argptr;
- *Cursor != '\0' && ((Cursor != argptr && Cursor[-1] == '\\') ||
- (!ismetahash(*Cursor) && !iscmdmeta(*Cursor)));
- Cursor++)
- continue;
- if (*Cursor == '\0') {
- Cursor = LastChar;
- if (LastChar[-1] == '\n')
- Cursor--;
- endflag = 0;
- }
- /* Obey current history character settings */
- mismatch[0] = HIST;
- mismatch[1] = HISTSUB;
- if (!Strchr(mismatch, *argptr) &&
- (!cmdonly || starting_a_command(argptr, InputBuf))) {
-#ifdef WINNT_NATIVE
- /*
- * This hack avoids correcting drive letter changes
- */
- if((Cursor - InputBuf) != 2 || (char)InputBuf[1] != ':')
-#endif /* WINNT_NATIVE */
- {
-#ifdef HASH_SPELL_CHECK
- Char save;
- size_t len = Cursor - InputBuf;
-
- save = InputBuf[len];
- InputBuf[len] = '\0';
- if (find_cmd(InputBuf, 0) != 0) {
- InputBuf[len] = save;
- argptr = Cursor;
- continue;
- }
- InputBuf[len] = save;
-#endif /* HASH_SPELL_CHECK */
- switch (tenematch(InputBuf, Cursor - InputBuf, SPELL)) {
- case 1: /* corrected */
- matchval = 1;
- break;
- case -1: /* couldn't be corrected */
- if (!matchval)
- matchval = -1;
- break;
- default: /* was correct */
- break;
- }
- }
- if (LastChar != OldLastChar) {
- if (argptr < OldCursor)
- OldCursor += (LastChar - OldLastChar);
- OldLastChar = LastChar;
- }
- }
- argptr = Cursor;
- } while (endflag);
- Cursor = OldCursor;
- return matchval;
-}
-
-/*
- * CompleteLine - do command completion on the entire command line
- * (which may have trailing newline).
- * Return value:
- * 0: No command matched or failure
- * 1: One command matched
- * 2: Several commands matched
- */
-static int
-CompleteLine(void)
-{
- int endflag, tmatch;
- Char *argptr, *OldCursor, *OldLastChar;
-
- OldLastChar = LastChar;
- OldCursor = Cursor;
- argptr = InputBuf;
- endflag = 1;
- do {
- while (ismetahash(*argptr) || iscmdmeta(*argptr))
- argptr++;
- for (Cursor = argptr;
- *Cursor != '\0' && ((Cursor != argptr && Cursor[-1] == '\\') ||
- (!ismetahash(*Cursor) && !iscmdmeta(*Cursor)));
- Cursor++)
- continue;
- if (*Cursor == '\0') {
- Cursor = LastChar;
- if (LastChar[-1] == '\n')
- Cursor--;
- endflag = 0;
- }
- if (!Strchr(mismatch, *argptr) && starting_a_command(argptr, InputBuf)) {
- tmatch = tenematch(InputBuf, Cursor - InputBuf, RECOGNIZE);
- if (tmatch <= 0) {
- return 0;
- } else if (tmatch > 1) {
- return 2;
- }
- if (LastChar != OldLastChar) {
- if (argptr < OldCursor)
- OldCursor += (LastChar - OldLastChar);
- OldLastChar = LastChar;
- }
- }
- argptr = Cursor;
- } while (endflag);
- Cursor = OldCursor;
- return 1;
-}
-
OpenPOWER on IntegriCloud