diff options
Diffstat (limited to 'usr/src/cmd/csh/sh.err.c')
| -rw-r--r-- | usr/src/cmd/csh/sh.err.c | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/usr/src/cmd/csh/sh.err.c b/usr/src/cmd/csh/sh.err.c new file mode 100644 index 0000000000..ee4ebfbb89 --- /dev/null +++ b/usr/src/cmd/csh/sh.err.c @@ -0,0 +1,211 @@ +/* + * Copyright 1997 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + +/* + * Copyright (c) 1980 Regents of the University of California. + * All rights reserved. The Berkeley Software License Agreement + * specifies the terms and conditions for redistribution. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include "sh.h" +#include <locale.h> +#include <dirent.h> +/* + * #include <sys/ioctl.h> + * #include <stdlib.h> + */ +#include "sh.tconst.h" +/* + * C Shell + */ + + +bool errspl; /* Argument to error was spliced by seterr2 */ +tchar one[2] = { '1', 0 }; +tchar *onev[2] = { one, NOSTR }; +/* + * contains DIR * for last opendir_(), its left open if an error + * longjmp (reset) occurs before it gets closed via closedir. + * if its not null in the error handler, then closedir it. + */ +DIR *Dirp = NULL; + +/* + * Print error string s with optional argument arg. + * This routine always resets or exits. The flag haderr + * is set so the routine who catches the unwind can propogate + * it if they want. + * + * Note that any open files at the point of error will eventually + * be closed in the routine process in sh.c which is the only + * place error unwinds are ever caught. + */ +/*VARARGS1*/ +error(s, a1, a2) + char *s; +{ + register tchar **v; + register char *ep; + + /* + * Must flush before we print as we wish output before the error + * to go on (some form of) standard output, while output after + * goes on (some form of) diagnostic output. + * If didfds then output will go to 1/2 else to FSHOUT/FSHDIAG. + * See flush in sh.print.c. + */ + flush(); + haderr = 1; /* Now to diagnostic output */ + timflg = 0; /* This isn't otherwise reset */ + if (v = pargv) + pargv = 0, blkfree(v); + if (v = gargv) + gargv = 0, blkfree(v); + + /* + * A zero arguments causes no printing, else print + * an error diagnostic here. + */ + if (s) { + printf(s, a1, a2), printf("\n"); + } + + + didfds = 0; /* Forget about 0,1,2 */ + if ((ep = err) && errspl) { + errspl = 0; + xfree(ep); + } + errspl = 0; + + if ( Dirp ){ + closedir(Dirp); + Dirp = NULL; + } + + /* + * Go away if -e or we are a child shell + */ + if (exiterr || child) { + exit(1); + } + + /* + * Reset the state of the input. + * This buffered seek to end of file will also + * clear the while/foreach stack. + */ + btoeof(); + + setq(S_status, onev, &shvhed); + if (tpgrp > 0) + (void) ioctl(FSHTTY, TIOCSPGRP, (char *)&tpgrp); + reset(); /* Unwind */ +} + +/* + * Perror is the shells version of perror which should otherwise + * never be called. + */ +Perror(s) + tchar *s; +{ + char chbuf[BUFSIZ]; + + /* + * Perror uses unit 2, thus if we didn't set up the fd's + * we must set up unit 2 now else the diagnostic will disappear + */ + if (!didfds) { + register int oerrno = errno; + + (void) dcopy(SHDIAG, 2); + errno = oerrno; + } + tstostr(chbuf, s); + perror(chbuf); + error(NULL); /* To exit or unwind */ +} + +bferr(cp) + char *cp; +{ + + flush(); + haderr = 1; + if( bname) printf("%t: ", bname); + error("%s", gettext(cp)); +} + +/* + * 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, + * e.g. in process. + */ +seterr(s) + char *s; +{ + + if (err == 0) + err = s, errspl = 0; +} + +/* Set err to a splice of cp and dp, to be freed later in error() */ +seterr2(cp, dp) + tchar *cp; + char *dp; +{ + char chbuf[BUFSIZ]; + char *gdp; + + if (err) + return; + + /* Concatinate cp and dp in the allocated space. */ + tstostr(chbuf, cp); + gdp = gettext(dp); + err = (char *)xalloc(strlen(chbuf)+strlen(gdp)+1); + strcpy(err, chbuf); + strcat(err, gdp); + + errspl++;/* Remember to xfree(err). */ +} + +/* Set err to a splice of cp with a string form of character d */ +seterrc(cp, d) + char *cp; + tchar d; +{ + char chbuf[MB_LEN_MAX+1]; + + /* don't overwrite an existing error message */ + if (err) + return; + +#ifdef MBCHAR + { + wchar_t wcd=(wchar_t)(d&TRIM); + int i; + + i = wctomb(chbuf, wcd); /* chbuf holds d in multibyte representation. */ + chbuf[(i>0)?i:0] = (char) 0; + } +#else + chbuf[0]=(char)(d&TRIM); chbuf[1]=(char)0; +#endif + + + /* Concatinate cp and d in the allocated space. */ + err = (char *)xalloc(strlen(cp)+strlen(chbuf)+1); + strcpy(err, cp); + strcat(err, chbuf); + + errspl++; /* Remember to xfree(err). */ +} |
