diff options
author | mp <mp@FreeBSD.org> | 2007-03-11 22:33:41 +0000 |
---|---|---|
committer | mp <mp@FreeBSD.org> | 2007-03-11 22:33:41 +0000 |
commit | a40980339b13e3b506c2317b5b4864127039eb2c (patch) | |
tree | 34aefea92d30b614247ef1f2671f2362f4761785 /contrib/tcsh/sh.err.c | |
parent | 32837fb336d4709f0a121130a3a78f29be0db5ed (diff) | |
download | FreeBSD-src-a40980339b13e3b506c2317b5b4864127039eb2c.zip FreeBSD-src-a40980339b13e3b506c2317b5b4864127039eb2c.tar.gz |
Import of tcsh-6.15.00
Diffstat (limited to 'contrib/tcsh/sh.err.c')
-rw-r--r-- | contrib/tcsh/sh.err.c | 233 |
1 files changed, 181 insertions, 52 deletions
diff --git a/contrib/tcsh/sh.err.c b/contrib/tcsh/sh.err.c index d111f30..4da927c 100644 --- a/contrib/tcsh/sh.err.c +++ b/contrib/tcsh/sh.err.c @@ -1,4 +1,4 @@ -/* $Header: /src/pub/tcsh/sh.err.c,v 3.39 2005/01/18 20:43:30 christos Exp $ */ +/* $Header: /p/tcsh/cvsroot/tcsh/sh.err.c,v 3.48 2006/03/02 18:46:44 christos Exp $ */ /* * sh.err.c: Error printing routines. */ @@ -32,8 +32,9 @@ */ #define _h_sh_err /* Don't redefine the errors */ #include "sh.h" +#include <assert.h> -RCSID("$Id: sh.err.c,v 3.39 2005/01/18 20:43:30 christos Exp $") +RCSID("$tcsh: sh.err.c,v 3.48 2006/03/02 18:46:44 christos Exp $") /* * C Shell @@ -194,13 +195,13 @@ static const char *elst[NO_ERRORS] INIT_ZERO_STRUCT; * Init the elst depending on the locale */ void -errinit() +errinit(void) { #ifdef NLS_CATALOGS - int i; + size_t i; for (i = 0; i < NO_ERRORS; i++) - xfree((ptr_t) elst[i]); + xfree((char *)(intptr_t)elst[i]); # if defined(__FreeBSD__) || defined(hpux) # define NLS_MAXSET 30 for (i = 1; i <= NLS_MAXSET; i++) @@ -364,6 +365,170 @@ errinit() elst[ERR_BADJOB] = CSAVS(1, 136, "No such job (badjob)"); elst[ERR_BADCOLORVAR] = CSAVS(1, 137, "Unknown colorls variable `%c%c'"); } + +/* Cleanup data. */ +struct cleanup_entry +{ + void *var; + void (*fn) (void *); +#ifdef CLEANUP_DEBUG + const char *file; + size_t line; +#endif +}; + +static struct cleanup_entry *cleanup_stack; /* = NULL; */ +static size_t cleanup_sp; /* = 0; Next free entry */ +static size_t cleanup_mark; /* = 0; Last entry to handle before unwinding */ +static size_t cleanup_stack_size; /* = 0 */ + +/* fn() will be run with all signals blocked, so it should not do anything + risky. */ +void +cleanup_push_internal(void *var, void (*fn) (void *) +#ifdef CLEANUP_DEBUG + , const char *file, size_t line +#endif +) +{ + struct cleanup_entry *ce; + + if (cleanup_sp == cleanup_stack_size) { + if (cleanup_stack_size == 0) + cleanup_stack_size = 64; /* Arbitrary */ + else + cleanup_stack_size *= 2; + cleanup_stack = xrealloc(cleanup_stack, + cleanup_stack_size * sizeof (*cleanup_stack)); + } + ce = cleanup_stack + cleanup_sp; + ce->var = var; + ce->fn = fn; +#ifdef CLEANUP_DEBUG + ce->file = file; + ce->line = line; +#endif + cleanup_sp++; +} + +static void +cleanup_ignore_fn(void *dummy) +{ + USE(dummy); +} + +void +cleanup_ignore(void *var) +{ + struct cleanup_entry *ce; + + ce = cleanup_stack + cleanup_sp; + while (ce != cleanup_stack) { + ce--; + if (ce->var == var) { + ce->fn = cleanup_ignore_fn; + return; + } + } + abort(); +} + +void +cleanup_until(void *last_var) +{ + while (cleanup_sp != 0) { + struct cleanup_entry ce; + + cleanup_sp--; + ce = cleanup_stack[cleanup_sp]; + ce.fn(ce.var); + if (ce.var == last_var) + return; + } + abort(); +} + +void +cleanup_until_mark(void) +{ + while (cleanup_sp > cleanup_mark) { + struct cleanup_entry ce; + + cleanup_sp--; + ce = cleanup_stack[cleanup_sp]; + ce.fn(ce.var); + } +} + +size_t +cleanup_push_mark(void) +{ + size_t old_mark; + + old_mark = cleanup_mark; + cleanup_mark = cleanup_sp; + return old_mark; +} + +void +cleanup_pop_mark(size_t mark) +{ + assert (mark <= cleanup_sp); + cleanup_mark = mark; +} + +void +sigint_cleanup(void *xsa) +{ + const struct sigaction *sa; + + sa = xsa; + sigaction(SIGINT, sa, NULL); +} + +void +sigprocmask_cleanup(void *xmask) +{ + sigset_t *mask; + + mask = xmask; + sigprocmask(SIG_SETMASK, mask, NULL); +} + +void +open_cleanup(void *xptr) +{ + int *ptr; + + ptr = xptr; + xclose(*ptr); +} + +void +opendir_cleanup(void *xdir) +{ + DIR *dir; + + dir = xdir; + xclosedir(dir); +} + +void +xfree_indirect(void *xptr) +{ + void **ptr; /* This is actually type punning :( */ + + ptr = xptr; + xfree(*ptr); +} + +void +reset(void) +{ + cleanup_until_mark(); + _reset(); +} + /* * The parser and scanner set up errors for later by calling seterr, * which sets the variable err as a side effect; later to be tested, @@ -371,31 +536,16 @@ errinit() */ void /*VARARGS1*/ -#ifdef PROTOTYPES seterror(unsigned int id, ...) -#else -seterror(va_alist) - va_dcl -#endif { - if (seterr == 0) { va_list va; - char berr[BUFSIZE]; -#ifdef PROTOTYPES - va_start(va, id); -#else - unsigned int id; - va_start(va); - id = va_arg(va, unsigned int); -#endif + va_start(va, id); if (id >= sizeof(elst) / sizeof(elst[0])) id = ERR_INVALID; - xvsnprintf(berr, sizeof(berr), elst[id], va); + seterr = xvasprintf(elst[id], va); va_end(va); - - seterr = strsave(berr); } } @@ -419,26 +569,13 @@ seterror(va_alist) */ void /*VARARGS*/ -#ifdef PROTOTYPES stderror(unsigned int id, ...) -#else -stderror(va_alist) - va_dcl -#endif { va_list va; - Char **v; int flags; int vareturn; -#ifdef PROTOTYPES va_start(va, id); -#else - unsigned int id; - - va_start(va); - id = va_arg(va, unsigned int); -#endif /* * Reset don't free flag for buggy os's @@ -462,21 +599,19 @@ stderror(va_alist) * form of) diagnostic output. If didfds then output will go to 1/2 * else to FSHOUT/FSHDIAG. See flush in sh.print.c. */ - flush(); + flush();/*FIXRESET*/ haderr = 1; /* Now to diagnostic output */ - timflg = 0; /* This isn't otherwise reset */ - if (!(flags & ERR_SILENT)) { if (flags & ERR_NAME) - xprintf("%s: ", bname); + xprintf("%s: ", bname);/*FIXRESET*/ if ((flags & ERR_OLD)) { /* Old error. */ - xprintf("%s.\n", seterr); - } else { - xvprintf(elst[id], va); - xprintf(".\n"); - } + xprintf("%s.\n", seterr);/*FIXRESET*/ + } else { + xvprintf(elst[id], va);/*FIXRESET*/ + xprintf(".\n");/*FIXRESET*/ + } } } else { vareturn = 1; /* Return immediately after va_end */ @@ -486,16 +621,10 @@ stderror(va_alist) return; if (seterr) { - xfree((ptr_t) seterr); + xfree(seterr); seterr = NULL; } - if ((v = pargv) != 0) - pargv = 0, blkfree(v); - if ((v = gargv) != 0) - gargv = 0, blkfree(v); - - inheredoc = 0; /* Not anymore in a heredoc */ didfds = 0; /* Forget about 0,1,2 */ /* * Go away if -e or we are a child shell @@ -509,7 +638,7 @@ stderror(va_alist) */ btoeof(); - set(STRstatus, Strsave(STR1), VAR_READWRITE); + setcopy(STRstatus, STR1, VAR_READWRITE);/*FIXRESET*/ #ifdef BSDJOBS if (tpgrp > 0) (void) tcsetpgrp(FSHTTY, tpgrp); |