source: trunk/third/tcsh/sh.err.c @ 22036

Revision 22036, 17.6 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r22035, which included commits to RCS files with non-trunk default branches.
Line 
1/* $Header: /afs/dev.mit.edu/source/repository/third/tcsh/sh.err.c,v 1.1.1.3 2005-06-03 14:35:23 ghudson Exp $ */
2/*
3 * sh.err.c: Error printing routines.
4 */
5/*-
6 * Copyright (c) 1980, 1991 The Regents of the University of California.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the University nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33#define _h_sh_err               /* Don't redefine the errors     */
34#include "sh.h"
35
36RCSID("$Id: sh.err.c,v 1.1.1.3 2005-06-03 14:35:23 ghudson Exp $")
37
38/*
39 * C Shell
40 */
41
42#ifdef lint
43#undef va_arg
44#define va_arg(a, b) (a ? (b) 0 : (b) 0)
45#endif
46
47char   *seterr = NULL;  /* Holds last error if there was one */
48
49#define ERR_FLAGS       0xf0000000
50#define ERR_NAME        0x10000000
51#define ERR_SILENT      0x20000000
52#define ERR_OLD         0x40000000
53
54#define ERR_SYNTAX      0
55#define ERR_NOTALLOWED  1
56#define ERR_WTOOLONG    2
57#define ERR_LTOOLONG    3
58#define ERR_DOLZERO     4
59#define ERR_INCBR       5
60#define ERR_EXPORD      6
61#define ERR_BADMOD      7
62#define ERR_SUBSCRIPT   8
63#define ERR_BADNUM      9
64#define ERR_NOMORE      10
65#define ERR_FILENAME    11
66#define ERR_GLOB        12
67#define ERR_COMMAND     13
68#define ERR_TOOFEW      14
69#define ERR_TOOMANY     15
70#define ERR_DANGER      16
71#define ERR_EMPTYIF     17
72#define ERR_IMPRTHEN    18
73#define ERR_NOPAREN     19
74#define ERR_NOTFOUND    20
75#define ERR_MASK        21
76#define ERR_LIMIT       22
77#define ERR_TOOLARGE    23
78#define ERR_SCALEF      24
79#define ERR_UNDVAR      25
80#define ERR_DEEP        26
81#define ERR_BADSIG      27
82#define ERR_UNKSIG      28
83#define ERR_VARBEGIN    29
84#define ERR_VARTOOLONG  30
85#define ERR_VARALNUM    31
86#define ERR_JOBCONTROL  32
87#define ERR_EXPRESSION  33
88#define ERR_NOHOMEDIR   34
89#define ERR_CANTCHANGE  35
90#define ERR_NULLCOM     36
91#define ERR_ASSIGN      37
92#define ERR_UNKNOWNOP   38
93#define ERR_AMBIG       39
94#define ERR_EXISTS      40
95#define ERR_ARGC        41
96#define ERR_INTR        42
97#define ERR_RANGE       43
98#define ERR_OVERFLOW    44
99#define ERR_NOSUCHJOB   45
100#define ERR_TERMINAL    46
101#define ERR_NOTWHILE    47
102#define ERR_NOPROC      48
103#define ERR_NOMATCH     49
104#define ERR_MISSING     50
105#define ERR_UNMATCHED   51
106#define ERR_NOMEM       52
107#define ERR_PIPE        53
108#define ERR_SYSTEM      54
109#define ERR_STRING      55
110#define ERR_JOBS        56
111#define ERR_JOBARGS     57
112#define ERR_JOBCUR      58
113#define ERR_JOBPREV     59
114#define ERR_JOBPAT      60
115#define ERR_NESTING     61
116#define ERR_JOBCTRLSUB  62
117#define ERR_SYNC        63
118#define ERR_STOPPED     64
119#define ERR_NODIR       65
120#define ERR_EMPTY       66
121#define ERR_BADDIR      67
122#define ERR_DIRUS       68
123#define ERR_HFLAG       69
124#define ERR_NOTLOGIN    70
125#define ERR_DIV0        71
126#define ERR_MOD0        72
127#define ERR_BADSCALE    73
128#define ERR_SUSPLOG     74
129#define ERR_UNKUSER     75
130#define ERR_NOHOME      76
131#define ERR_HISTUS      77
132#define ERR_SPDOLLT     78
133#define ERR_NEWLINE     79
134#define ERR_SPSTAR      80
135#define ERR_DIGIT       81
136#define ERR_VARILL      82
137#define ERR_NLINDEX     83
138#define ERR_EXPOVFL     84
139#define ERR_VARSYN      85
140#define ERR_BADBANG     86
141#define ERR_NOSUBST     87
142#define ERR_BADSUBST    88
143#define ERR_LHS         89
144#define ERR_RHSLONG     90
145#define ERR_BADBANGMOD  91
146#define ERR_MODFAIL     92
147#define ERR_SUBOVFL     93
148#define ERR_BADBANGARG  94
149#define ERR_NOSEARCH    95
150#define ERR_NOEVENT     96
151#define ERR_TOOMANYRP   97
152#define ERR_TOOMANYLP   98
153#define ERR_BADPLP      99
154#define ERR_MISRED      100
155#define ERR_OUTRED      101
156#define ERR_REDPAR      102
157#define ERR_INRED       103
158#define ERR_BADPLPS     104
159#define ERR_ALIASLOOP   105
160#define ERR_NOWATCH     106
161#define ERR_NOSCHED     107
162#define ERR_SCHEDUSAGE  108
163#define ERR_SCHEDEV     109
164#define ERR_SCHEDCOM    110
165#define ERR_SCHEDTIME   111
166#define ERR_SCHEDREL    112
167#define ERR_TCNOSTR     113
168#define ERR_SETTCUS     114
169#define ERR_TCCAP       115
170#define ERR_TCPARM      116
171#define ERR_TCARGS      117
172#define ERR_TCNARGS     118
173#define ERR_TCUSAGE     119
174#define ERR_ARCH        120
175#define ERR_HISTLOOP    121
176#define ERR_FILEINQ     122
177#define ERR_SELOVFL     123
178#define ERR_TCSHUSAGE   124
179#define ERR_COMPCOM     125
180#define ERR_COMPINV     126
181#define ERR_COMPMIS     127
182#define ERR_COMPINC     128
183#define ERR_MFLAG       129
184#define ERR_ULIMUS      130
185#define ERR_READONLY    131
186#define ERR_BADJOB      132
187#define ERR_INVALID     133
188#define ERR_BADCOLORVAR 134
189#define NO_ERRORS       135
190
191static const char *elst[NO_ERRORS] INIT_ZERO_STRUCT;
192
193/*
194 * Init the elst depending on the locale
195 */
196void
197errinit()
198{
199#ifdef NLS_CATALOGS
200    int i;
201
202    for (i = 0; i < NO_ERRORS; i++)
203        xfree((ptr_t) elst[i]);
204#  if defined(__FreeBSD__) || defined(hpux)
205#  define NLS_MAXSET 30
206    for (i = 1; i <= NLS_MAXSET; i++)
207        CGETS(i, 1, "" );
208#  endif
209#endif
210
211    elst[ERR_SYNTAX] = CSAVS(1, 1, "Syntax Error");
212    elst[ERR_NOTALLOWED] = CSAVS(1, 2, "%s is not allowed");
213    elst[ERR_WTOOLONG] = CSAVS(1, 3, "Word too long");
214    elst[ERR_LTOOLONG] = CSAVS(1, 4, "$< line too long");
215    elst[ERR_DOLZERO] = CSAVS(1, 5, "No file for $0");
216    elst[ERR_INCBR] = CSAVS(1, 6, "Incomplete [] modifier");
217    elst[ERR_EXPORD] = CSAVS(1, 7, "$ expansion must end before ]");
218    elst[ERR_BADMOD] = CSAVS(1, 8, "Bad : modifier in $ (%c)");
219    elst[ERR_SUBSCRIPT] = CSAVS(1, 9, "Subscript error");
220    elst[ERR_BADNUM] = CSAVS(1, 10, "Badly formed number");
221    elst[ERR_NOMORE] = CSAVS(1, 11, "No more words");
222    elst[ERR_FILENAME] = CSAVS(1, 12, "Missing file name");
223    elst[ERR_GLOB] = CSAVS(1, 13, "Internal glob error");
224    elst[ERR_COMMAND] = CSAVS(1, 14, "Command not found");
225    elst[ERR_TOOFEW] = CSAVS(1, 15, "Too few arguments");
226    elst[ERR_TOOMANY] = CSAVS(1, 16, "Too many arguments");
227    elst[ERR_DANGER] = CSAVS(1, 17, "Too dangerous to alias that");
228    elst[ERR_EMPTYIF] = CSAVS(1, 18, "Empty if");
229    elst[ERR_IMPRTHEN] = CSAVS(1, 19, "Improper then");
230    elst[ERR_NOPAREN] = CSAVS(1, 20, "Words not parenthesized");
231    elst[ERR_NOTFOUND] = CSAVS(1, 21, "%s not found");
232    elst[ERR_MASK] = CSAVS(1, 22, "Improper mask");
233    elst[ERR_LIMIT] = CSAVS(1, 23, "No such limit");
234    elst[ERR_TOOLARGE] = CSAVS(1, 24, "Argument too large");
235    elst[ERR_SCALEF] = CSAVS(1, 25, "Improper or unknown scale factor");
236    elst[ERR_UNDVAR] = CSAVS(1, 26, "Undefined variable");
237    elst[ERR_DEEP] = CSAVS(1, 27, "Directory stack not that deep");
238    elst[ERR_BADSIG] = CSAVS(1, 28, "Bad signal number");
239    elst[ERR_UNKSIG] = CSAVS(1, 29, "Unknown signal; kill -l lists signals");
240    elst[ERR_VARBEGIN] = CSAVS(1, 30, "Variable name must begin with a letter");
241    elst[ERR_VARTOOLONG] = CSAVS(1, 31, "Variable name too long");
242    elst[ERR_VARALNUM] = CSAVS(1, 32,
243        "Variable name must contain alphanumeric characters");
244    elst[ERR_JOBCONTROL] = CSAVS(1, 33, "No job control in this shell");
245    elst[ERR_EXPRESSION] = CSAVS(1, 34, "Expression Syntax");
246    elst[ERR_NOHOMEDIR] = CSAVS(1, 35, "No home directory");
247    elst[ERR_CANTCHANGE] = CSAVS(1, 36, "Can't change to home directory");
248    elst[ERR_NULLCOM] = CSAVS(1, 37, "Invalid null command");
249    elst[ERR_ASSIGN] = CSAVS(1, 38, "Assignment missing expression");
250    elst[ERR_UNKNOWNOP] = CSAVS(1, 39, "Unknown operator");
251    elst[ERR_AMBIG] = CSAVS(1, 40, "Ambiguous");
252    elst[ERR_EXISTS] = CSAVS(1, 41, "%s: File exists");
253    elst[ERR_ARGC] = CSAVS(1, 42, "Argument for -c ends in backslash");
254    elst[ERR_INTR] = CSAVS(1, 43, "Interrupted");
255    elst[ERR_RANGE] = CSAVS(1, 44, "Subscript out of range");
256    elst[ERR_OVERFLOW] = CSAVS(1, 45, "Line overflow");
257    elst[ERR_NOSUCHJOB] = CSAVS(1, 46, "No such job");
258    elst[ERR_TERMINAL] = CSAVS(1, 47, "Can't from terminal");
259    elst[ERR_NOTWHILE] = CSAVS(1, 48, "Not in while/foreach");
260    elst[ERR_NOPROC] = CSAVS(1, 49, "No more processes");
261    elst[ERR_NOMATCH] = CSAVS(1, 50, "No match");
262    elst[ERR_MISSING] = CSAVS(1, 51, "Missing %c");
263    elst[ERR_UNMATCHED] = CSAVS(1, 52, "Unmatched %c");
264    elst[ERR_NOMEM] = CSAVS(1, 53, "Out of memory");
265    elst[ERR_PIPE] = CSAVS(1, 54, "Can't make pipe");
266    elst[ERR_SYSTEM] = CSAVS(1, 55, "%s: %s");
267    elst[ERR_STRING] = CSAVS(1, 56, "%s");
268    elst[ERR_JOBS] = CSAVS(1, 57, "Usage: jobs [ -l ]");
269    elst[ERR_JOBARGS] = CSAVS(1, 58, "Arguments should be jobs or process id's");
270    elst[ERR_JOBCUR] = CSAVS(1, 59, "No current job");
271    elst[ERR_JOBPREV] = CSAVS(1, 60, "No previous job");
272    elst[ERR_JOBPAT] = CSAVS(1, 61, "No job matches pattern");
273    elst[ERR_NESTING] = CSAVS(1, 62, "Fork nesting > %d; maybe `...` loop");
274    elst[ERR_JOBCTRLSUB] = CSAVS(1, 63, "No job control in subshells");
275    elst[ERR_SYNC] = CSAVS(1, 64, "Sync fault: Process %d not found");
276    elst[ERR_STOPPED] =
277#ifdef SUSPENDED
278        CSAVS(1, 65, "%sThere are suspended jobs");
279#else
280        CSAVS(1, 66, "%sThere are stopped jobs");
281#endif /* SUSPENDED */
282    elst[ERR_NODIR] = CSAVS(1, 67, "No other directory");
283    elst[ERR_EMPTY] = CSAVS(1, 68, "Directory stack empty");
284    elst[ERR_BADDIR] = CSAVS(1, 69, "Bad directory");
285    elst[ERR_DIRUS] = CSAVS(1, 70, "Usage: %s [-%s]%s");
286    elst[ERR_HFLAG] = CSAVS(1, 71, "No operand for -h flag");
287    elst[ERR_NOTLOGIN] = CSAVS(1, 72, "Not a login shell");
288    elst[ERR_DIV0] = CSAVS(1, 73, "Division by 0");
289    elst[ERR_MOD0] = CSAVS(1, 74, "Mod by 0");
290    elst[ERR_BADSCALE] = CSAVS(1, 75, "Bad scaling; did you mean \"%s\"?");
291    elst[ERR_SUSPLOG] = CSAVS(1, 76, "Can't suspend a login shell (yet)");
292    elst[ERR_UNKUSER] = CSAVS(1, 77, "Unknown user: %s");
293    elst[ERR_NOHOME] = CSAVS(1, 78, "No $home variable set");
294    elst[ERR_HISTUS] = CSAVS(1, 79,
295        "Usage: history [-%s] [# number of events]");
296    elst[ERR_SPDOLLT] = CSAVS(1, 80, "$, ! or < not allowed with $# or $?");
297    elst[ERR_NEWLINE] = CSAVS(1, 81, "Newline in variable name");
298    elst[ERR_SPSTAR] = CSAVS(1, 82, "* not allowed with $# or $?");
299    elst[ERR_DIGIT] = CSAVS(1, 83, "$?<digit> or $#<digit> not allowed");
300    elst[ERR_VARILL] = CSAVS(1, 84, "Illegal variable name");
301    elst[ERR_NLINDEX] = CSAVS(1, 85, "Newline in variable index");
302    elst[ERR_EXPOVFL] = CSAVS(1, 86, "Expansion buffer overflow");
303    elst[ERR_VARSYN] = CSAVS(1, 87, "Variable syntax");
304    elst[ERR_BADBANG] = CSAVS(1, 88, "Bad ! form");
305    elst[ERR_NOSUBST] = CSAVS(1, 89, "No previous substitute");
306    elst[ERR_BADSUBST] = CSAVS(1, 90, "Bad substitute");
307    elst[ERR_LHS] = CSAVS(1, 91, "No previous left hand side");
308    elst[ERR_RHSLONG] = CSAVS(1, 92, "Right hand side too long");
309    elst[ERR_BADBANGMOD] = CSAVS(1, 93, "Bad ! modifier: %c");
310    elst[ERR_MODFAIL] = CSAVS(1, 94, "Modifier failed");
311    elst[ERR_SUBOVFL] = CSAVS(1, 95, "Substitution buffer overflow");
312    elst[ERR_BADBANGARG] = CSAVS(1, 96, "Bad ! arg selector");
313    elst[ERR_NOSEARCH] = CSAVS(1, 97, "No prev search");
314    elst[ERR_NOEVENT] = CSAVS(1, 98, "%s: Event not found");
315    elst[ERR_TOOMANYRP] = CSAVS(1, 99, "Too many )'s");
316    elst[ERR_TOOMANYLP] = CSAVS(1, 100, "Too many ('s");
317    elst[ERR_BADPLP] = CSAVS(1, 101, "Badly placed (");
318    elst[ERR_MISRED] = CSAVS(1, 102, "Missing name for redirect");
319    elst[ERR_OUTRED] = CSAVS(1, 103, "Ambiguous output redirect");
320    elst[ERR_REDPAR] = CSAVS(1, 104, "Can't << within ()'s");
321    elst[ERR_INRED] = CSAVS(1, 105, "Ambiguous input redirect");
322    elst[ERR_BADPLPS] = CSAVS(1, 106, "Badly placed ()'s");
323    elst[ERR_ALIASLOOP] = CSAVS(1, 107, "Alias loop");
324    elst[ERR_NOWATCH] = CSAVS(1, 108, "No $watch variable set");
325    elst[ERR_NOSCHED] = CSAVS(1, 109, "No scheduled events");
326    elst[ERR_SCHEDUSAGE] = CSAVS(1, 110,
327        "Usage: sched -<item#>.\nUsage: sched [+]hh:mm <command>");
328    elst[ERR_SCHEDEV] = CSAVS(1, 111, "Not that many scheduled events");
329    elst[ERR_SCHEDCOM] = CSAVS(1, 112, "No command to run");
330    elst[ERR_SCHEDTIME] = CSAVS(1, 113, "Invalid time for event");
331    elst[ERR_SCHEDREL] = CSAVS(1, 114, "Relative time inconsistent with am/pm");
332    elst[ERR_TCNOSTR] = CSAVS(1, 115, "Out of termcap string space");
333    elst[ERR_SETTCUS] = CSAVS(1, 116, "Usage: settc %s [yes|no]");
334    elst[ERR_TCCAP] = CSAVS(1, 117, "Unknown capability `%s'");
335    elst[ERR_TCPARM] = CSAVS(1, 118, "Unknown termcap parameter `%%%c'");
336    elst[ERR_TCARGS] = CSAVS(1, 119, "Too many arguments for `%s' (%d)");
337    elst[ERR_TCNARGS] = CSAVS(1, 120, "`%s' requires %d arguments");
338    elst[ERR_TCUSAGE] = CSAVS(1, 121,
339        "Usage: echotc [-v|-s] [<capability> [<args>]]");
340    elst[ERR_ARCH] = CSAVS(1, 122, "%s: %s. Binary file not executable");
341    elst[ERR_HISTLOOP] = CSAVS(1, 123, "!# History loop");
342    elst[ERR_FILEINQ] = CSAVS(1, 124, "Malformed file inquiry");
343    elst[ERR_SELOVFL] = CSAVS(1, 125, "Selector overflow");
344#ifdef apollo
345    elst[ERR_TCSHUSAGE] = CSAVS(1, 126,
346"Unknown option: `-%s'\nUsage: %s [ -bcdefilmnqstvVxX -Dname[=value] ] [ argument ... ]");
347#else /* !apollo */
348# ifdef convex
349    elst[ERR_TCSHUSAGE] = CSAVS(1, 127,
350"Unknown option: `-%s'\nUsage: %s [ -bcdefFilmnqstvVxX ] [ argument ... ]");
351# else /* rest */
352    elst[ERR_TCSHUSAGE] = CSAVS(1, 128,
353"Unknown option: `-%s'\nUsage: %s [ -bcdefilmnqstvVxX ] [ argument ... ]");
354# endif /* convex */
355#endif /* apollo */
356    elst[ERR_COMPCOM] = CSAVS(1, 129, "\nInvalid completion: \"%s\"");
357    elst[ERR_COMPINV] = CSAVS(1, 130, "\nInvalid %s: '%c'");
358    elst[ERR_COMPMIS] = CSAVS(1, 131,
359        "\nMissing separator '%c' after %s \"%s\"");
360    elst[ERR_COMPINC] = CSAVS(1, 132, "\nIncomplete %s: \"%s\"");
361    elst[ERR_MFLAG] = CSAVS(1, 133, "No operand for -m flag");
362    elst[ERR_ULIMUS] = CSAVS(1, 134, "Usage: unlimit [-fh] [limits]");
363    elst[ERR_READONLY] = CSAVS(1, 135, "$%S is read-only");
364    elst[ERR_BADJOB] = CSAVS(1, 136, "No such job (badjob)");
365    elst[ERR_BADCOLORVAR] = CSAVS(1, 137, "Unknown colorls variable `%c%c'");
366}
367/*
368 * The parser and scanner set up errors for later by calling seterr,
369 * which sets the variable err as a side effect; later to be tested,
370 * e.g. in process.
371 */
372void
373/*VARARGS1*/
374#ifdef PROTOTYPES
375seterror(unsigned int id, ...)
376#else
377seterror(va_alist)
378    va_dcl
379#endif
380{
381
382    if (seterr == 0) {
383        va_list va;
384        char    berr[BUFSIZE];
385#ifdef PROTOTYPES
386        va_start(va, id);
387#else
388        unsigned int id;
389        va_start(va);
390        id = va_arg(va, unsigned int);
391#endif
392
393        if (id >= sizeof(elst) / sizeof(elst[0]))
394            id = ERR_INVALID;
395        xvsnprintf(berr, sizeof(berr), elst[id], va);
396        va_end(va);
397
398        seterr = strsave(berr);
399    }
400}
401
402/*
403 * Print the error with the given id.
404 *
405 * Special ids:
406 *      ERR_SILENT: Print nothing.
407 *      ERR_OLD: Print the previously set error if one was there.
408 *               otherwise return.
409 *      ERR_NAME: If this bit is set, print the name of the function
410 *                in bname
411 *
412 * This routine always resets or exits.  The flag haderr
413 * is set so the routine who catches the unwind can propogate
414 * it if they want.
415 *
416 * Note that any open files at the point of error will eventually
417 * be closed in the routine process in sh.c which is the only
418 * place error unwinds are ever caught.
419 */
420void
421/*VARARGS*/
422#ifdef PROTOTYPES
423stderror(unsigned int id, ...)
424#else
425stderror(va_alist)
426    va_dcl
427#endif
428{
429    va_list va;
430    Char **v;
431    int flags;
432    int vareturn;
433
434#ifdef PROTOTYPES
435    va_start(va, id);
436#else
437    unsigned int id;
438
439    va_start(va);
440    id = va_arg(va, unsigned int);
441#endif
442
443    /*
444     * Reset don't free flag for buggy os's
445     */
446    dont_free = 0;
447
448    flags = (int) id & ERR_FLAGS;
449    id &= ~ERR_FLAGS;
450
451    /* Pyramid's OS/x has a subtle bug in <varargs.h> which prevents calling
452     * va_end more than once in the same function. -- sterling@netcom.com
453     */
454    if (!((flags & ERR_OLD) && seterr == NULL)) {
455        vareturn = 0;   /* Don't return immediately after va_end */
456        if (id >= sizeof(elst) / sizeof(elst[0]))
457            id = ERR_INVALID;
458
459        /*
460         * Must flush before we print as we wish output before the error to go
461         * on (some form of) standard output, while output after goes on (some
462         * form of) diagnostic output. If didfds then output will go to 1/2
463         * else to FSHOUT/FSHDIAG. See flush in sh.print.c.
464         */
465        flush();
466        haderr = 1;                     /* Now to diagnostic output */
467        timflg = 0;                     /* This isn't otherwise reset */
468
469
470        if (!(flags & ERR_SILENT)) {
471            if (flags & ERR_NAME)
472                xprintf("%s: ", bname);
473            if ((flags & ERR_OLD)) {
474                /* Old error. */
475                xprintf("%s.\n", seterr);
476                } else {
477                   xvprintf(elst[id], va);
478                    xprintf(".\n");
479                }
480        }
481    } else {
482        vareturn = 1;   /* Return immediately after va_end */
483    }
484    va_end(va);
485    if (vareturn)
486        return;
487
488    if (seterr) {
489        xfree((ptr_t) seterr);
490        seterr = NULL;
491    }
492
493    if ((v = pargv) != 0)
494        pargv = 0, blkfree(v);
495    if ((v = gargv) != 0)
496        gargv = 0, blkfree(v);
497
498    inheredoc = 0;              /* Not anymore in a heredoc */
499    didfds = 0;                 /* Forget about 0,1,2 */
500    /*
501     * Go away if -e or we are a child shell
502     */
503    if (!exitset || exiterr || child)
504        xexit(1);
505
506    /*
507     * Reset the state of the input. This buffered seek to end of file will
508     * also clear the while/foreach stack.
509     */
510    btoeof();
511
512    set(STRstatus, Strsave(STR1), VAR_READWRITE);
513#ifdef BSDJOBS
514    if (tpgrp > 0)
515        (void) tcsetpgrp(FSHTTY, tpgrp);
516#endif
517    reset();                    /* Unwind */
518}
Note: See TracBrowser for help on using the repository browser.