* fix emacs [ tabcompletion bug

XXX it's probably a bug in vi mode too, it just doesn't show
* bring manual page and reality into closer sync'd state
* sort ulimits
This commit is contained in:
tg
2005-05-25 23:31:08 +00:00
parent 1d0c401aa0
commit cd54ef8f51
6 changed files with 87 additions and 74 deletions

17
edit.c
View File

@@ -1,4 +1,4 @@
/** $MirOS: src/bin/mksh/edit.c,v 1.3 2005/05/23 16:23:18 tg Exp $ */ /** $MirOS: src/bin/mksh/edit.c,v 1.4 2005/05/25 23:31:05 tg Exp $ */
/* $OpenBSD: edit.c,v 1.29 2005/04/13 02:33:08 deraadt Exp $ */ /* $OpenBSD: edit.c,v 1.29 2005/04/13 02:33:08 deraadt Exp $ */
/* $OpenBSD: edit.h,v 1.8 2005/03/28 21:28:22 deraadt Exp $ */ /* $OpenBSD: edit.h,v 1.8 2005/03/28 21:28:22 deraadt Exp $ */
/* $OpenBSD: emacs.c,v 1.37 2005/03/30 17:16:37 deraadt Exp $ */ /* $OpenBSD: emacs.c,v 1.37 2005/03/30 17:16:37 deraadt Exp $ */
@@ -10,7 +10,7 @@
#include <ctype.h> #include <ctype.h>
#include <libgen.h> #include <libgen.h>
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.3 2005/05/23 16:23:18 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/edit.c,v 1.4 2005/05/25 23:31:05 tg Exp $");
#define BEL 0x07 #define BEL 0x07
@@ -72,8 +72,7 @@ x_init(void)
if (setsig(&sigtraps[SIGWINCH], x_sigwinch, SS_RESTORE_ORIG|SS_SHTRAP)) if (setsig(&sigtraps[SIGWINCH], x_sigwinch, SS_RESTORE_ORIG|SS_SHTRAP))
sigtraps[SIGWINCH].flags |= TF_SHELL_USES; sigtraps[SIGWINCH].flags |= TF_SHELL_USES;
got_sigwinch = 1; /* force initial check */ check_sigwinch(); /* force initial check */
check_sigwinch();
x_init_emacs(); x_init_emacs();
} }
@@ -88,7 +87,6 @@ x_sigwinch(int sig __attribute__((unused)))
static void static void
check_sigwinch(void) check_sigwinch(void)
{ {
if (got_sigwinch) {
struct winsize ws; struct winsize ws;
got_sigwinch = 0; got_sigwinch = 0;
@@ -112,7 +110,6 @@ check_sigwinch(void)
setint(vp, (long) ws.ws_row); setint(vp, (long) ws.ws_row);
} }
} }
}
/* /*
* read an edited command line * read an edited command line
@@ -426,6 +423,9 @@ x_file_glob(int flags __attribute__((unused)), const char *str,
escaping = 1; escaping = 1;
continue; continue;
} }
/* specially escape escaped [ for globbing */
if (escaping && toglob[i] == '[')
toglob[idx++] = QCHAR;
toglob[idx] = toglob[i]; toglob[idx] = toglob[i];
idx++; idx++;
@@ -440,7 +440,7 @@ x_file_glob(int flags __attribute__((unused)), const char *str,
s = pushs(SWSTR, ATEMP); s = pushs(SWSTR, ATEMP);
s->start = s->str = toglob; s->start = s->str = toglob;
source = s; source = s;
if (yylex(ONEWORD) != LWORD) { if (yylex(ONEWORD|LQCHAR) != LWORD) {
source = sold; source = sold;
internal_errorf(0, "fileglob: substitute error"); internal_errorf(0, "fileglob: substitute error");
return 0; return 0;
@@ -877,7 +877,7 @@ x_escape(const char *s, size_t len, int (*putbuf_func) (const char *, size_t))
int rval=0; int rval=0;
for (add = 0, wlen = len; wlen - add > 0; add++) { for (add = 0, wlen = len; wlen - add > 0; add++) {
if (strchr("\\$()[]{}*&;#|<>\"'`", s[add]) || strchr(ifs, s[add])) { if (strchr("\\$()[{}*&;#|<>\"'`", s[add]) || strchr(ifs, s[add])) {
if (putbuf_func(s, add) != 0) { if (putbuf_func(s, add) != 0) {
rval = -1; rval = -1;
break; break;
@@ -2473,6 +2473,7 @@ x_version(int c __attribute__((unused)))
int lim = x_lastcp() - xbp; int lim = x_lastcp() - xbp;
char *v = strdup(ksh_version + 4); char *v = strdup(ksh_version + 4);
check_sigwinch(); /* mksh hack ;-) */
xbuf = xbp = xcp = v; xbuf = xbp = xcp = v;
xend = xep = v + strlen(v); xend = xep = v + strlen(v);
x_redraw(lim); x_redraw(lim);

42
funcs.c
View File

@@ -1,4 +1,4 @@
/** $MirOS: src/bin/mksh/funcs.c,v 1.8 2005/05/25 13:46:00 tg Exp $ */ /** $MirOS: src/bin/mksh/funcs.c,v 1.9 2005/05/25 23:31:06 tg Exp $ */
/* $OpenBSD: c_ksh.c,v 1.27 2005/03/30 17:16:37 deraadt Exp $ */ /* $OpenBSD: c_ksh.c,v 1.27 2005/03/30 17:16:37 deraadt Exp $ */
/* $OpenBSD: c_sh.c,v 1.29 2005/03/30 17:16:37 deraadt Exp $ */ /* $OpenBSD: c_sh.c,v 1.29 2005/03/30 17:16:37 deraadt Exp $ */
/* $OpenBSD: c_test.c,v 1.17 2005/03/30 17:16:37 deraadt Exp $ */ /* $OpenBSD: c_test.c,v 1.17 2005/03/30 17:16:37 deraadt Exp $ */
@@ -13,7 +13,7 @@
#include <ulimit.h> #include <ulimit.h>
#endif #endif
__RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.8 2005/05/25 13:46:00 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.9 2005/05/25 23:31:06 tg Exp $");
int int
c_cd(char **wp) c_cd(char **wp)
@@ -2822,18 +2822,6 @@ c_ulimit(char **wp)
char option; char option;
} limits[] = { } limits[] = {
/* Do not use options -H, -S or -a */ /* Do not use options -H, -S or -a */
#ifdef RLIMIT_CPU
{ "time(cpu-seconds)", RLIMIT, RLIMIT_CPU, RLIMIT_CPU,
1, 't' },
#endif
#ifdef RLIMIT_TIME
{ "humantime(seconds)", RLIMIT, RLIMIT_TIME, RLIMIT_TIME,
1, 'T' },
#endif
#ifdef RLIMIT_FSIZE
{ "file(blocks)", RLIMIT, RLIMIT_FSIZE, RLIMIT_FSIZE,
512, 'f' },
#endif
#ifdef RLIMIT_CORE #ifdef RLIMIT_CORE
{ "coredump(blocks)", RLIMIT, RLIMIT_CORE, RLIMIT_CORE, { "coredump(blocks)", RLIMIT, RLIMIT_CORE, RLIMIT_CORE,
512, 'c' }, 512, 'c' },
@@ -2842,9 +2830,13 @@ c_ulimit(char **wp)
{ "data(KiB)", RLIMIT, RLIMIT_DATA, RLIMIT_DATA, { "data(KiB)", RLIMIT, RLIMIT_DATA, RLIMIT_DATA,
1024, 'd' }, 1024, 'd' },
#endif #endif
#ifdef RLIMIT_STACK #ifdef RLIMIT_FSIZE
{ "stack(KiB)", RLIMIT, RLIMIT_STACK, RLIMIT_STACK, { "file(blocks)", RLIMIT, RLIMIT_FSIZE, RLIMIT_FSIZE,
1024, 's' }, 512, 'f' },
#endif
#ifdef RLIMIT_LOCKS
{ "flocks", RLIMIT, RLIMIT_LOCKS, RLIMIT_LOCKS,
-1, 'L' },
#endif #endif
#ifdef RLIMIT_MEMLOCK #ifdef RLIMIT_MEMLOCK
{ "lockedmem(KiB)", RLIMIT, RLIMIT_MEMLOCK, RLIMIT_MEMLOCK, { "lockedmem(KiB)", RLIMIT, RLIMIT_MEMLOCK, RLIMIT_MEMLOCK,
@@ -2862,6 +2854,18 @@ c_ulimit(char **wp)
{ "processes", RLIMIT, RLIMIT_NPROC, RLIMIT_NPROC, { "processes", RLIMIT, RLIMIT_NPROC, RLIMIT_NPROC,
1, 'p' }, 1, 'p' },
#endif #endif
#ifdef RLIMIT_STACK
{ "stack(KiB)", RLIMIT, RLIMIT_STACK, RLIMIT_STACK,
1024, 's' },
#endif
#ifdef RLIMIT_TIME
{ "humantime(seconds)", RLIMIT, RLIMIT_TIME, RLIMIT_TIME,
1, 'T' },
#endif
#ifdef RLIMIT_CPU
{ "time(cpu-seconds)", RLIMIT, RLIMIT_CPU, RLIMIT_CPU,
1, 't' },
#endif
#ifdef RLIMIT_VMEM #ifdef RLIMIT_VMEM
{ "vmemory(KiB)", RLIMIT, RLIMIT_VMEM, RLIMIT_VMEM, { "vmemory(KiB)", RLIMIT, RLIMIT_VMEM, RLIMIT_VMEM,
1024, 'v' }, 1024, 'v' },
@@ -2869,10 +2873,6 @@ c_ulimit(char **wp)
#ifdef RLIMIT_SWAP #ifdef RLIMIT_SWAP
{ "swap(KiB)", RLIMIT, RLIMIT_SWAP, RLIMIT_SWAP, { "swap(KiB)", RLIMIT, RLIMIT_SWAP, RLIMIT_SWAP,
1024, 'w' }, 1024, 'w' },
#endif
#ifdef RLIMIT_LOCKS
{ "flocks", RLIMIT, RLIMIT_LOCKS, RLIMIT_LOCKS,
-1, 'L' },
#endif #endif
{ NULL, 0, 0, 0, 0, 0 } { NULL, 0, 0, 0, 0, 0 }
}; };

11
lex.c
View File

@@ -1,11 +1,11 @@
/** $MirOS: src/bin/mksh/lex.c,v 1.1 2005/05/23 03:06:08 tg Exp $ */ /** $MirOS: src/bin/mksh/lex.c,v 1.2 2005/05/25 23:31:07 tg Exp $ */
/* $OpenBSD: lex.c,v 1.36 2005/03/30 17:16:37 deraadt Exp $ */ /* $OpenBSD: lex.c,v 1.36 2005/03/30 17:16:37 deraadt Exp $ */
#include "sh.h" #include "sh.h"
#include <ctype.h> #include <ctype.h>
#include <libgen.h> #include <libgen.h>
__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.1 2005/05/23 03:06:08 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/lex.c,v 1.2 2005/05/25 23:31:07 tg Exp $");
/* Structure to keep track of the lexing state and the various pieces of info /* Structure to keep track of the lexing state and the various pieces of info
* needed for each particular state. * needed for each particular state.
@@ -342,6 +342,13 @@ yylex(int cf)
} }
} }
break; break;
case QCHAR:
if (cf & LQCHAR) {
*wp++ = QCHAR;
*wp++ = getsc();
break;
}
/* FALLTHRU */
default: default:
*wp++ = CHAR, *wp++ = c; *wp++ = CHAR, *wp++ = c;
} }

7
main.c
View File

@@ -1,4 +1,4 @@
/** $MirOS: src/bin/mksh/main.c,v 1.6 2005/05/25 13:46:01 tg Exp $ */ /** $MirOS: src/bin/mksh/main.c,v 1.7 2005/05/25 23:31:07 tg Exp $ */
/* $OpenBSD: main.c,v 1.38 2005/03/30 17:16:37 deraadt Exp $ */ /* $OpenBSD: main.c,v 1.38 2005/03/30 17:16:37 deraadt Exp $ */
/* $OpenBSD: tty.c,v 1.8 2005/03/30 17:16:37 deraadt Exp $ */ /* $OpenBSD: tty.c,v 1.8 2005/03/30 17:16:37 deraadt Exp $ */
/* $OpenBSD: io.c,v 1.21 2005/03/30 17:16:37 deraadt Exp $ */ /* $OpenBSD: io.c,v 1.21 2005/03/30 17:16:37 deraadt Exp $ */
@@ -10,7 +10,7 @@
#include <ctype.h> #include <ctype.h>
#include <pwd.h> #include <pwd.h>
__RCSID("$MirOS: src/bin/mksh/main.c,v 1.6 2005/05/25 13:46:01 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/main.c,v 1.7 2005/05/25 23:31:07 tg Exp $");
extern char **environ; extern char **environ;
@@ -49,8 +49,7 @@ static const char *initcoms [] = {
/* this is what at&t ksh seems to track, with the addition of emacs */ /* this is what at&t ksh seems to track, with the addition of emacs */
"alias", "-tU", "alias", "-tU",
"cat", "cc", "chmod", "cp", "date", "ed", "emacs", "grep", "ls", "cat", "cc", "chmod", "cp", "date", "ed", "emacs", "grep", "ls",
"mail", "make", "mv", "pr", "rm", "sed", "sh", "vi", "who", "make", "mv", "pr", "rm", "sed", "sh", "vi", "who", NULL,
NULL,
NULL NULL
}; };

77
mksh.1
View File

@@ -1,13 +1,11 @@
.\" $MirOS: src/bin/mksh/mksh.1,v 1.4 2005/05/25 14:15:40 tg Exp $ .\" $MirOS: src/bin/mksh/mksh.1,v 1.5 2005/05/25 23:31:07 tg Exp $
.\" $OpenBSD: ksh.1,v 1.98 2005/05/12 09:18:24 jmc Exp $ .\" $OpenBSD: ksh.1,v 1.98 2005/05/12 09:18:24 jmc Exp $
.\" $OpenBSD: sh.1tbl,v 1.53 2004/12/10 01:56:56 jaredy Exp $ .\" $OpenBSD: sh.1tbl,v 1.53 2004/12/10 01:56:56 jaredy Exp $
.\" .\"-
.\" Public Domain
.\"
.Dd May 22, 2005 .Dd May 22, 2005
.Dt MKSH 1 .Dt MKSH 1
.Os MirOS .Os MirOS
.\" define Mx macro for portable mksh, just in case... .\" this macro only exists in MirNroff by default
.de Mx .de Mx
.nr cF \\n(.f .nr cF \\n(.f
.nr cZ \\n(.s .nr cZ \\n(.s
@@ -202,7 +200,8 @@ In the absence of fatal errors,
the exit status is that of the last command executed, or zero, if no the exit status is that of the last command executed, or zero, if no
command is executed. command is executed.
.Ss Command syntax .Ss Command syntax
The shell begins parsing its input by breaking it into The shell begins parsing its input by removing any backslash-newline
combinations, then breaking it into
.Em words . .Em words .
Words, which are sequences of characters, are delimited by unquoted whitespace Words, which are sequences of characters, are delimited by unquoted whitespace
characters (space, tab, and newline) or meta-characters characters (space, tab, and newline) or meta-characters
@@ -1184,6 +1183,10 @@ If
is omitted, the string is omitted, the string
.Dq parameter null or not set .Dq parameter null or not set
is used instead. is used instead.
Currently a bug, if
.Ar word
is a variable which expands to the null string, the
error message is also printed.
.El .El
.Pp .Pp
In the above modifiers, the In the above modifiers, the
@@ -1487,8 +1490,7 @@ colon, or two adjacent colons, is treated as a
.Sq \&. .Sq \&.
(the current directory). (the current directory).
.It Ev PGRP .It Ev PGRP
The current process group, see The current process group (read-only).
.Xr getpgrp 2 .
.It Ev PPID .It Ev PPID
The process ID of the shell's parent (read-only). The process ID of the shell's parent (read-only).
.It Ev PS1 .It Ev PS1
@@ -1916,7 +1918,8 @@ escapes for
.Ql ` , .Ql ` ,
.Ql \e , .Ql \e ,
and and
.Ql \enewline . .Ql \enewline ;
any backslash preceding double quotes is removed.
If multiple here documents are used on the same command line, they are saved in If multiple here documents are used on the same command line, they are saved in
order. order.
.It \*(Lt\*(Lt- Ar marker .It \*(Lt\*(Lt- Ar marker
@@ -2026,11 +2029,13 @@ integers may be prefixed with
.Sq 0X .Sq 0X
or or
.Sq 0x .Sq 0x
(specifying base 16), similar to AT&T ksh, (specifying base 16), similar to AT&T
.Nm ksh ,
or or
.Sq 0 .Sq 0
(base 8), as an mksh extension, (base 8), as an
in all forms of arithmetic expressions, .Nm
extension, in all forms of arithmetic expressions,
except as numeric arguments to the except as numeric arguments to the
.Ic test .Ic test
command. command.
@@ -2165,8 +2170,8 @@ Some notes concerning co-processes:
.It .It
The only way to close the co-process's input (so the co-process reads an The only way to close the co-process's input (so the co-process reads an
end-of-file) is to redirect the input to a numbered file descriptor and then end-of-file) is to redirect the input to a numbered file descriptor and then
close that file descriptor e.g.\& close that file descriptor:
.Ic exec 3\*(Gt&p; exec 3\*(Gt&- . .Ic exec 3\*(Gt&p; exec 3\*(Gt&-
.It .It
In order for co-processes to share a common output, the shell must keep the In order for co-processes to share a common output, the shell must keep the
write portion of the output pipe open. write portion of the output pipe open.
@@ -2470,7 +2475,8 @@ argument to the
.Fl t .Fl t
test may be left out and defaults to 1). test may be left out and defaults to 1).
.It .It
Tilde expansion after equal signs is disabled. Tilde expansion after equal signs (not assignments) is disabled,
although not strictly forbidden by POSIX, for consistency with other shells.
.El .El
.Ss Strict Bourne shell mode .Ss Strict Bourne shell mode
When the When the
@@ -2508,6 +2514,15 @@ Sequences of
.Sq ((...)) .Sq ((...))
are not interpreted as arithmetic expressions. are not interpreted as arithmetic expressions.
.El .El
.Pp
This does not make
.Nm
a real bourne shell emulation, though.
Access to many enhanced features is still available, and
.Ql ^
as synonym for
.Ql |
has probably not been in use since the 1980s anyway.
.Ss Command execution .Ss Command execution
After evaluation of command-line arguments, redirections, and parameter After evaluation of command-line arguments, redirections, and parameter
assignments, the type of command is determined: a special built-in, a assignments, the type of command is determined: a special built-in, a
@@ -3795,7 +3810,7 @@ characters), or if it is a unary operator like
or or
.Sq Fl n . .Sq Fl n .
Use tests like Use tests like
.Dq if \&[ \&"X$foo\&" = Xbar \&] .Dq if \&[ x\&"$foo\&" = x"bar" \&]
instead. instead.
.Pp .Pp
.It Xo .It Xo
@@ -4070,7 +4085,7 @@ except zero padding is used instead of space padding.
.Pp .Pp
.It Xo .It Xo
.Ic ulimit .Ic ulimit
.Op Fl acdfHlmnpSsTtv .Op Fl acdfHLlmnpSsTtvw
.Op Ar value .Op Ar value
.Xc .Xc
Display or set process limits. Display or set process limits.
@@ -4108,6 +4123,8 @@ blocks on files written by the shell and its child processes (files of any
size may be read). size may be read).
.It Fl H .It Fl H
Set the hard limit only (the default is to set both hard and soft limits). Set the hard limit only (the default is to set both hard and soft limits).
.It Fl L Ar n
Control flocks; documentation is missing.
.It Fl l Ar n .It Fl l Ar n
Impose a limit of Impose a limit of
.Ar n .Ar n
@@ -4142,6 +4159,10 @@ CPU seconds spent in user mode to be used by each process.
Impose a limit of Impose a limit of
.Ar n .Ar n
kibibytes on the amount of virtual memory used. kibibytes on the amount of virtual memory used.
.It Fl w Ar n
Impose a limit of
.Ar n
kibibytes on the amount of swap space used.
.El .El
.Pp .Pp
As far as As far as
@@ -4473,7 +4494,7 @@ an
(if the command can be prefixed with a count); and any keys the command is (if the command can be prefixed with a count); and any keys the command is
bound to by default, written using caret notation bound to by default, written using caret notation
e.g. the ASCII ESC character is written as ^[. e.g. the ASCII ESC character is written as ^[.
^[A-Z] sequences are not case sensitive. These control sequences are not case sensitive.
A count prefix for a command is entered using the sequence A count prefix for a command is entered using the sequence
.Pf ^[ Ns Ar n , .Pf ^[ Ns Ar n ,
where where
@@ -4547,11 +4568,6 @@ is appended.
If there is no command or file name with the current partial word If there is no command or file name with the current partial word
as its prefix, a bell character is output (usually causing a beep to be as its prefix, a bell character is output (usually causing a beep to be
sounded). sounded).
.\" XXX
Currently being considered a bug,
if the file name contains \fB[\fR or \fB]\fR, it cannot be completed, even if
the character is escaped, in \fBemacs\fR mode.
This surprisingly works in \fBvi\fR mode; please submit a fix.
.It complete-command: ^X^[ .It complete-command: ^X^[
Automatically completes as much as is unique of the command name having the Automatically completes as much as is unique of the command name having the
partial word up to the cursor as its prefix, as in the partial word up to the cursor as its prefix, as in the
@@ -4569,6 +4585,7 @@ If only one completion is possible,
match as in the match as in the
.Ic complete .Ic complete
command above. command above.
Note that ^I is usually generated by the TAB (tabulator) key.
.It Xo delete-char-backward: .It Xo delete-char-backward:
.Op Ar n .Op Ar n
.No ERASE , ^? , ^H .No ERASE , ^? , ^H
@@ -4826,13 +4843,6 @@ colon
commands). commands).
.El .El
.Pp .Pp
Note that the ^X stands for control-X; also
.Aq esc ,
.Aq space ,
and
.Aq tab
are used for escape, space, and tab, respectively (no kidding).
.Pp
Like Like
.Xr vi 1 , .Xr vi 1 ,
there are two modes: there are two modes:
@@ -5367,6 +5377,7 @@ Shell database.
.Xr dup 2 , .Xr dup 2 ,
.Xr execve 2 , .Xr execve 2 ,
.Xr getgid 2 , .Xr getgid 2 ,
.Xr getpgrp 2 ,
.Xr getuid 2 , .Xr getuid 2 ,
.Xr open 2 , .Xr open 2 ,
.Xr pipe 2 , .Xr pipe 2 ,
@@ -5425,9 +5436,3 @@ The
author is aware of this and there is no need to report it. author is aware of this and there is no need to report it.
This does not work because the last command of a pipe sequence This does not work because the last command of a pipe sequence
is run in a subshell. is run in a subshell.
.Pp
For another known bug, refer to the comment above the
.Em complete-command
paragraph in the section
.Sx Emacs editing mode
above.

3
sh.h
View File

@@ -1,4 +1,4 @@
/** $MirOS: src/bin/mksh/sh.h,v 1.7 2005/05/25 13:46:01 tg Exp $ */ /** $MirOS: src/bin/mksh/sh.h,v 1.8 2005/05/25 23:31:08 tg Exp $ */
/* $OpenBSD: sh.h,v 1.27 2005/03/28 21:33:04 deraadt Exp $ */ /* $OpenBSD: sh.h,v 1.27 2005/03/28 21:33:04 deraadt Exp $ */
/* $OpenBSD: shf.h,v 1.5 2005/03/30 17:16:37 deraadt Exp $ */ /* $OpenBSD: shf.h,v 1.5 2005/03/30 17:16:37 deraadt Exp $ */
/* $OpenBSD: table.h,v 1.6 2004/12/18 20:55:52 millert Exp $ */ /* $OpenBSD: table.h,v 1.6 2004/12/18 20:55:52 millert Exp $ */
@@ -995,6 +995,7 @@ typedef union {
#define ESACONLY BIT(7) /* only accept esac keyword */ #define ESACONLY BIT(7) /* only accept esac keyword */
#define CMDWORD BIT(8) /* parsing simple command (alias related) */ #define CMDWORD BIT(8) /* parsing simple command (alias related) */
#define HEREDELIM BIT(9) /* parsing <<,<<- delimiter */ #define HEREDELIM BIT(9) /* parsing <<,<<- delimiter */
#define LQCHAR BIT(10) /* source string contains QCHAR */
#define HERES 10 /* max << in line */ #define HERES 10 /* max << in line */