summaryrefslogtreecommitdiff
path: root/tree/src/vi/ex-070224/ex_vget.c
diff options
context:
space:
mode:
Diffstat (limited to 'tree/src/vi/ex-070224/ex_vget.c')
-rw-r--r--tree/src/vi/ex-070224/ex_vget.c879
1 files changed, 0 insertions, 879 deletions
diff --git a/tree/src/vi/ex-070224/ex_vget.c b/tree/src/vi/ex-070224/ex_vget.c
deleted file mode 100644
index 868c843..0000000
--- a/tree/src/vi/ex-070224/ex_vget.c
+++ /dev/null
@@ -1,879 +0,0 @@
-/*
- * This code contains changes by
- * Gunnar Ritter, Freiburg i. Br., Germany, 2002. All rights reserved.
- *
- * Conditions 1, 2, and 4 and the no-warranty notice below apply
- * to these changes.
- *
- *
- * Copyright (c) 1980, 1993
- * 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. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. 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.
- *
- *
- * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * Redistributions of source code and documentation must retain the
- * above copyright notice, this list of conditions and the following
- * disclaimer.
- * 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.
- * All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed or owned by Caldera
- * International, Inc.
- * Neither the name of Caldera International, Inc. nor the names of
- * other contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
- * INTERNATIONAL, INC. 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 CALDERA INTERNATIONAL, INC. 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.
- */
-
-#ifndef lint
-#ifdef DOSCCS
-static char sccsid[] = "@(#)ex_vget.c 1.31 (gritter) 8/6/05";
-#endif
-#endif
-
-/* from ex_vget.c 6.8.1 (2.11BSD GTE) 12/9/94 */
-
-#include "ex.h"
-#include "ex_tty.h"
-#include "ex_vis.h"
-
-/*
- * Input routines for open/visual.
- * We handle reading from the echo area here as well as notification on
- * large changes which appears in the echo area.
- */
-
-/*
- * Return the key.
- */
-void
-ungetkey (
- int c /* mjm: char --> int */
-)
-{
-
- if (Peekkey != ATTN)
- Peekkey = c;
-}
-
-/*
- * Return a keystroke, but never a ^@.
- */
-int
-getkey(void)
-{
- register int c; /* mjm: char --> int */
-
- do {
- c = getbr();
- if (c==0)
- beep();
- } while (c == 0);
- return (c);
-}
-
-/*
- * Tell whether next keystroke would be a ^@.
- */
-int
-peekbr(void)
-{
-
- Peekkey = getbr();
- return (Peekkey == 0);
-}
-
-short precbksl;
-JMP_BUF readbuf;
-int doingread = 0;
-
-static int
-readwc(int fd, int *cp)
-{
- int c;
- char b;
-
-#ifdef MB
- if (mb_cur_max > 1) {
- static char pbuf[2][MB_LEN_MAX], *pend[2], *pcur[2];
- static mbstate_t state[2];
- static int incompl[2];
- int i, rest;
- int idx = fd ? 1 : 0;
- wchar_t wc;
- size_t sz;
-
- i = 0;
- rest = pend[idx] - pcur[idx];
- if (rest && pcur[idx] > pbuf[idx]) {
- do
- pbuf[idx][i] = pcur[idx][i];
- while (i++, --rest);
- } else if (incompl[idx]) {
- pend[idx] = pcur[idx] = NULL;
- return -1;
- }
- if (i == 0) {
- if ((c = read(fd, &b, 1)) <= 0) {
- pend[idx] = pcur[idx] = NULL;
- return c;
- }
- pbuf[idx][i++] = b;
- }
- if (pbuf[idx][0] & 0200) {
- sz = 1;
- while ((sz = mbrtowc(&wc, pbuf[idx], i, &state[idx]))
- == (size_t)-2 && i < mb_cur_max) {
- if ((c = read(fd, &b, 1)) <= 0) {
- incompl[idx] = 1;
- break;
- } else
- pbuf[idx][i++] = b;
- memset(&state[idx], 0, sizeof state[idx]);
- }
- if (sz == (size_t)-2 || sz == (size_t)-1 ||
- !widthok(wc)) {
- memset(&state[idx], 0, sizeof state[idx]);
- c = 1;
- *cp = pbuf[idx][0] | INVBIT;
- } else if (sz == 0) {
- c = 1;
- *cp = wc;
- } else {
- c = sz;
- *cp = wc;
- }
- } else {
- c = 1;
- *cp = pbuf[idx][0];
- }
- pcur[idx] = &pbuf[idx][c];
- pend[idx] = &pcur[idx][i-c];
- return c;
- } else
-#endif /* MB */
- {
- c = read(fd, &b, 1);
- *cp = b;
- return c;
- }
-}
-
-/*
- * Get a keystroke, including a ^@.
- * If an key was returned with ungetkey, that
- * comes back first. Next comes unread input (e.g.
- * from repeating commands with .), and finally new
- * keystrokes.
- */
-int
-getbr(void)
-{
- int ch;
- register int c;
-#ifdef UCVISUAL
- register int d;
- register char *colp;
-#endif
-#ifdef BEEHIVE
- int cnt;
- static char Peek2key;
-#endif
- extern short slevel, ttyindes;
-
-getATTN:
- if (Peekkey) {
- c = Peekkey;
- Peekkey = 0;
- return (c);
- }
-#ifdef BEEHIVE
- if (Peek2key) {
- c = Peek2key;
- Peek2key = 0;
- return (c);
- }
-#endif
- if (vglobp) {
- if (*vglobp)
- return (lastvgk = *vglobp++);
- lastvgk = 0;
- return (ESCAPE);
- }
- if (vmacp) {
- if (*vmacp) {
- int n;
- nextc(ch, vmacp, n);
- vmacp += n;
- return (ch);
- }
- /* End of a macro or set of nested macros */
- vmacp = 0;
- if (inopen == -1) /* don't screw up undo for esc esc */
- vundkind = VMANY;
- inopen = 1; /* restore old setting now that macro done */
- vch_mac = VC_NOTINMAC;
- }
- flusho();
- for (c =0; abbrevs[c].mapto; c++)
- abbrevs[c].hadthis = 0;
-#ifdef UCVISUAL
-again:
-#endif
- if (SETJMP(readbuf))
- goto getATTN;
- doingread = 1;
- c = readwc(slevel == 0 ? 0 : ttyindes, &ch);
- doingread = 0;
- if (c < 1) {
- if (errno == EINTR)
- goto getATTN;
- error(catgets(catd, 1, 222, "Input read error"));
- }
- c = ch & TRIM;
-#ifdef BEEHIVE
- if (XB && slevel==0 && c == ESCAPE) {
- if (readwc(0, &Peek2key) < 1)
- goto getATTN;
- Peek2key &= TRIM;
- switch (Peek2key) {
- case 'C': /* SPOW mode sometimes sends \EC for space */
- c = ' ';
- Peek2key = 0;
- break;
- case 'q': /* f2 -> ^C */
- c = CTRL('c');
- Peek2key = 0;
- break;
- case 'p': /* f1 -> esc */
- Peek2key = 0;
- break;
- }
- }
-#endif
-
-#ifdef UCVISUAL
- /*
- * The algorithm here is that of the UNIX kernel.
- * See the description in the programmers manual.
- */
- if (UPPERCASE) {
- if (xisupper(c))
- c = xtolower(c);
- if (c == '\\') {
- if (precbksl < 2)
- precbksl++;
- if (precbksl == 1)
- goto again;
- } else if (precbksl) {
- d = 0;
- if (xislower(c))
- d = xtoupper(c);
- else {
- colp = "({)}!|^~'~";
- while (d = *colp++)
- if (d == c) {
- d = *colp++;
- break;
- } else
- colp++;
- }
- if (precbksl == 2) {
- if (!d) {
- Peekkey = c;
- precbksl = 0;
- c = '\\';
- }
- } else if (d)
- c = d;
- else {
- Peekkey = c;
- precbksl = 0;
- c = '\\';
- }
- }
- if (c != '\\')
- precbksl = 0;
- }
-#endif
-
-#ifdef TRACE
- if (trace) {
- if (!techoin) {
- tfixnl();
- techoin = 1;
- fprintf(trace, "*** Input: ");
- }
- tracec(c);
- }
-#endif
- lastvgk = 0;
- return (c);
-}
-
-/*
- * Get a key, but if a delete, quit or attention
- * is typed return 0 so we will abort a partial command.
- */
-int
-getesc(void)
-{
- register int c;
-
- c = getkey();
- if (c == ATTN)
- goto case_ATTN;
- switch (c) {
-
- case CTRL('v'):
- case CTRL('q'):
- c = getkey();
- return (c);
-
- case QUIT:
-case_ATTN:
- ungetkey(c);
- return (0);
-
- case ESCAPE:
- return (0);
- }
- return (c);
-}
-
-/*
- * Peek at the next keystroke.
- */
-int
-peekkey(void)
-{
-
- Peekkey = getkey();
- return (Peekkey);
-}
-
-/*
- * Read a line from the echo area, with single character prompt c.
- * A return value of 1 means the user blewit or blewit away.
- */
-int
-readecho(int c)
-{
- register char *sc = cursor;
- register int (*OP)(int, int);
- bool waste;
- register int OPeek;
-
- if (WBOT == WECHO)
- vclean();
- else
- vclrech(0);
- splitw++;
- vgoto(WECHO, 0);
- putchar(c);
- vclreol();
- vgoto(WECHO, 1);
- cursor = linebuf; linebuf[0] = 0; genbuf[0] = c;
- if (peekbr()) {
- if (!INS[0] || (INS[0] & (QUOTE|TRIM)) == OVERBUF)
- goto blewit;
- vglobp = INS;
- }
- OP = Pline; Pline = normline;
- ignore(vgetline(0, genbuf + 1, &waste, c));
- if (Outchar == termchar)
- putchar('\n');
- vscrap();
- Pline = OP;
- if (Peekkey != ATTN && Peekkey != QUIT && Peekkey != CTRL('h')) {
- cursor = sc;
- vclreol();
- return (0);
- }
-blewit:
- OPeek = Peekkey==CTRL('h') ? 0 : Peekkey; Peekkey = 0;
- splitw = 0;
- vclean();
- vshow(dot, NOLINE);
- vnline(sc);
- Peekkey = OPeek;
- return (1);
-}
-
-/*
- * A complete command has been defined for
- * the purposes of repeat, so copy it from
- * the working to the previous command buffer.
- */
-void
-setLAST(void)
-{
-
- if (vglobp || vmacp)
- return;
- lastreg = vreg;
- lasthad = Xhadcnt;
- lastcnt = Xcnt;
- *lastcp = 0;
- cellcpy(lastcmd, workcmd);
-}
-
-/*
- * Gather up some more text from an insert.
- * If the insertion buffer oveflows, then destroy
- * the repeatability of the insert.
- */
-void
-addtext(char *cp)
-{
-
- if (vglobp)
- return;
- addto(INS, cp);
- if ((INS[0] & (QUOTE|TRIM)) == OVERBUF)
- lastcmd[0] = 0;
-}
-
-void
-setDEL(void)
-{
-
- setBUF(DEL);
-}
-
-/*
- * Put text from cursor upto wcursor in BUF.
- */
-void
-setBUF(register cell *BUF)
-{
- register int c;
- register char *wp = wcursor;
-
- c = *wp;
- *wp = 0;
- BUF[0] = 0;
- addto(BUF, cursor);
- *wp = c;
-}
-
-void
-addto(register cell *buf, register char *str)
-{
-
- if ((buf[0] & (QUOTE|TRIM)) == OVERBUF)
- return;
- if (cellen(buf) + strlen(str) + 1 >= VBSIZE) {
- buf[0] = OVERBUF;
- return;
- }
- while (*buf)
- buf++;
- str2cell(buf, str);
-}
-
-/*
- * Note a change affecting a lot of lines, or non-visible
- * lines. If the parameter must is set, then we only want
- * to do this for open modes now; return and save for later
- * notification in visual.
- */
-int
-noteit(int must)
-{
- register int sdl = destline, sdc = destcol;
-
- if (notecnt < 2 || !must && state == VISUAL)
- return (0);
- splitw++;
- if (WBOT == WECHO)
- vmoveitup(1, 1);
- vigoto(WECHO, 0);
- printf(catgets(catd, 1, 223, "%d %sline"), notecnt, notesgn);
- if (notecnt > 1)
- putchar('s');
- if (*notenam) {
- printf(" %s", notenam);
- if (*(strend(notenam) - 1) != 'e')
- putchar('e');
- putchar('d');
- }
- vclreol();
- notecnt = 0;
- if (state != VISUAL)
- vcnt = vcline = 0;
- splitw = 0;
- if (state == ONEOPEN || state == CRTOPEN)
- vup1();
- destline = sdl; destcol = sdc;
- return (1);
-}
-
-/*
- * Rrrrringgggggg.
- * If possible, use flash (VB).
- */
-void
-beep(void)
-{
-
- if (VB && value(FLASH))
- vputp(VB, 0);
- else
- vputc(CTRL('g'));
-}
-
-/*
- * Push an integer string as a macro.
- */
-static void
-imacpush(int *ip, int canundo)
-{
- char buf[BUFSIZ], *bp = buf;
-
-#ifdef MB
- do {
- int n;
- n = wctomb(bp, *ip&TRIM);
- bp += n;
- } while (*ip++);
-#else /* !MB */
- while (*bp++ = *ip++);
-#endif /* !MB */
- macpush(buf, canundo);
-}
-
-/*
- * Map the command input character c,
- * for keypads and labelled keys which do cursor
- * motions. I.e. on an adm3a we might map ^K to ^P.
- * DM1520 for example has a lot of mappable characters.
- */
-
-int
-map(register int c, register struct maps *maps)
-{
- register int d;
- register int *p, *q;
- int b[10+MB_LEN_MAX]; /* Assumption: no keypad sends string longer than 10 */
-
- /*
- * Mapping for special keys on the terminal only.
- * BUG: if there's a long sequence and it matches
- * some chars and then misses, we lose some chars.
- *
- * For this to work, some conditions must be met.
- * 1) Keypad sends SHORT (2 or 3 char) strings
- * 2) All strings sent are same length & similar
- * 3) The user is unlikely to type the first few chars of
- * one of these strings very fast.
- * Note: some code has been fixed up since the above was laid out,
- * so conditions 1 & 2 are probably not required anymore.
- * However, this hasn't been tested with any first char
- * that means anything else except escape.
- */
-#ifdef MDEBUG
- if (trace)
- fprintf(trace,"map(%c): ",c);
-#endif
- /*
- * If c==0, the char came from getesc typing escape. Pass it through
- * unchanged. 0 messes up the following code anyway.
- */
- if (c==0)
- return(0);
-
- b[0] = c;
- b[1] = 0;
- for (d=0; maps[d].mapto; d++) {
-#ifdef MDEBUG
- if (trace)
- fprintf(trace,"\ntry '%s', ",maps[d].cap);
-#endif
- if (p = maps[d].icap) {
- for (q=b; *p; p++, q++) {
-#ifdef MDEBUG
- if (trace)
- fprintf(trace,"q->b[%d], ",q-b);
-#endif
- if (*q==0) {
- /*
- * Is there another char waiting?
- *
- * This test is oversimplified, but
- * should work mostly. It handles the
- * case where we get an ESCAPE that
- * wasn't part of a keypad string.
- */
- if ((c=='#' ? peekkey() : fastpeekkey()) == 0) {
-#ifdef MDEBUG
- if (trace)
- fprintf(trace,"fpk=0: will return '%c'",c);
-#endif
- /*
- * Nothing waiting. Push back
- * what we peeked at & return
- * failure (c).
- *
- * We want to be able to undo
- * commands, but it's nonsense
- * to undo part of an insertion
- * so if in input mode don't.
- */
-#ifdef MDEBUG
- if (trace)
- fprintf(trace, "Call macpush, b %d %d %d\n", b[0], b[1], b[2]);
-#endif
- imacpush(&b[1],maps == arrows);
-#ifdef MDEBUG
- if (trace)
- fprintf(trace, "return %d\n", c);
-#endif
- return(c);
- }
- *q = getkey();
- q[1] = 0;
- }
- if (*p != *q)
- goto contin;
- }
- macpush(maps[d].mapto,maps == arrows);
- c = getkey();
-#ifdef MDEBUG
- if (trace)
- fprintf(trace,"Success: push(%s), return %c",maps[d].mapto, c);
-#endif
- return(c); /* first char of map string */
- contin:;
- }
- }
-#ifdef MDEBUG
- if (trace)
- fprintf(trace,"Fail: push(%s), return %c", &b[1], c);
-#endif
- imacpush(&b[1],0);
- return(c);
-}
-
-/*
- * Push st onto the front of vmacp. This is tricky because we have to
- * worry about where vmacp was previously pointing. We also have to
- * check for overflow (which is typically from a recursive macro)
- * Finally we have to set a flag so the whole thing can be undone.
- * canundo is 1 iff we want to be able to undo the macro. This
- * is false for, for example, pushing back lookahead from fastpeekkey(),
- * since otherwise two fast escapes can clobber our undo.
- */
-void
-macpush(char *st, int canundo)
-{
- char tmpbuf[BUFSIZ];
-
- if (st==0 || *st==0)
- return;
-#ifdef MDEBUG
- if (trace)
- fprintf(trace, "macpush(%s), canundo=%d\n",st,canundo);
-#endif
- if ((vmacp ? strlen(vmacp) : 0) + strlen(st) > BUFSIZ)
- error(catgets(catd, 1, 224,
- "Macro too long@ - maybe recursive?"));
- if (vmacp) {
- strcpy(tmpbuf, vmacp);
- if (!FIXUNDO)
- canundo = 0; /* can't undo inside a macro anyway */
- }
- strcpy(vmacbuf, st);
- if (vmacp)
- strcat(vmacbuf, tmpbuf);
- vmacp = vmacbuf;
- /* arrange to be able to undo the whole macro */
- if (canundo) {
-#ifdef notdef
- otchng = tchng;
- vsave();
- saveall();
- inopen = -1; /* no need to save since it had to be 1 or -1 before */
- vundkind = VMANY;
-#endif
- vch_mac = VC_NOCHANGE;
- }
-}
-
-#ifdef TRACE
-void
-visdump(char *s)
-{
- register int i;
-
- if (!trace) return;
-
- fprintf(trace, "\n%s: basWTOP=%d, basWLINES=%d, WTOP=%d, WBOT=%d, WLINES=%d, WCOLS=%d, WECHO=%d\n",
- s, basWTOP, basWLINES, WTOP, WBOT, WLINES, WCOLS, WECHO);
- fprintf(trace, " vcnt=%d, vcline=%d, cursor=%d, wcursor=%d, wdot=%d\n",
- vcnt, vcline, cursor-linebuf, wcursor-linebuf, wdot-zero);
- for (i=0; i<TUBELINES; i++)
- if (vtube[i] && *vtube[i])
- fprintf(trace, "%d: '%s'\n", i, vtube[i]);
- tvliny();
-}
-
-void
-vudump(char *s)
-{
- register line *p;
- char savelb[1024];
-
- if (!trace) return;
-
- fprintf(trace, "\n%s: undkind=%d, vundkind=%d, unddel=%d, undap1=%d, undap2=%d,\n",
- s, undkind, vundkind, lineno(unddel), lineno(undap1), lineno(undap2));
- fprintf(trace, " undadot=%d, dot=%d, dol=%d, unddol=%d, truedol=%d\n",
- lineno(undadot), lineno(dot), lineno(dol), lineno(unddol), lineno(truedol));
- fprintf(trace, " [\n");
- CP(savelb, linebuf);
- fprintf(trace, "linebuf = '%s'\n", linebuf);
- for (p=zero+1; p<=truedol; p++) {
- fprintf(trace, "%o ", *p);
- getline(*p);
- fprintf(trace, "'%s'\n", linebuf);
- }
- fprintf(trace, "]\n");
- CP(linebuf, savelb);
-}
-#endif
-
-/*
- * Get a count from the keyed input stream.
- * A zero count is indistinguishable from no count.
- */
-int
-vgetcnt(void)
-{
- register int c, cnt;
-
- cnt = 0;
- for (;;) {
- c = getkey();
- if (!xisdigit(c))
- break;
- cnt *= 10, cnt += c - '0';
- }
- ungetkey(c);
- Xhadcnt = 1;
- Xcnt = cnt;
- return(cnt);
-}
-
-void
-trapalarm(int signum) {
- alarm(0);
- if (vcatch)
- LONGJMP(vreslab,1);
-}
-
-/*
- * fastpeekkey is just like peekkey but insists the character come in
- * fast (within 1 second). This will succeed if it is the 2nd char of
- * a machine generated sequence (such as a function pad from an escape
- * flavor terminal) but fail for a human hitting escape then waiting.
- */
-int
-fastpeekkey(void)
-{
- shand Oint;
- register int c;
-
- /*
- * If the user has set notimeout, we wait forever for a key.
- * If we are in a macro we do too, but since it's already
- * buffered internally it will return immediately.
- * In other cases we force this to die in 1 second.
- * This is pretty reliable (VMUNIX rounds it to .5 - 1.5 secs,
- * but UNIX truncates it to 0 - 1 secs) but due to system delays
- * there are times when arrow keys or very fast typing get counted
- * as separate. notimeout is provided for people who dislike such
- * nondeterminism.
- */
-#ifdef MDEBUG
- if (trace)
- fprintf(trace,"\nfastpeekkey: ",c);
-#endif
- Oint = signal(SIGINT, trapalarm);
- if (value(TIMEOUT) && inopen >= 0) {
- signal(SIGALRM, trapalarm);
-#ifdef MDEBUG
- alarm(10);
- if (trace)
- fprintf(trace, "set alarm ");
-#else
- alarm(1);
-#endif
- }
- CATCH
- c = peekkey();
-#ifdef MDEBUG
- if (trace)
- fprintf(trace,"[OK]",c);
-#endif
- alarm(0);
- ONERR
- c = 0;
-#ifdef MDEBUG
- if (trace)
- fprintf(trace,"[TIMEOUT]",c);
-#endif
- ENDCATCH
-#ifdef MDEBUG
- if (trace)
- fprintf(trace,"[fpk:%o]",c);
-#endif
- signal(SIGINT,Oint);
- return(c);
-}