#include #include #include #include #include "error.h" static void (*errfunc)(void); /* * These conventions follow those at Toronto. */ char *progname; /* * Return a plausible program name for assignment to ``progname'', * given argv[0]. */ char * mkprogname(char *cp) { char *lp; return(cp == 0 || (lp = strrchr(cp, '/'))==0? cp: lp+1); } /* * Error accepts a printf format and arguments, and prints * an error message on the standard error stream, * possibly preceded by a program name (as formed by mkprogname). */ void error(char *fmt, ...) { va_list args; char *cp; __ERRFN f; if ((cp = progname) != 0 && *cp != '\0') fprintf(stderr, "%s: ", cp); va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); if (strrchr(cp, '\n') == 0) fprintf(stderr, "\n"); if ((f = errfunc) != 0) { errfunc = 0; (*f)(); } exit(1); } FILE* efopen(char *file, char *mode) { FILE *fp; if ((fp = fopen(file, mode)) == NULL) error("can't %s %s\n", *mode == 'r'? "open": "create", file); return fp; } FILE* efreopen(char *file, char *mode, FILE *fp) { if ((fp = freopen(file, mode, fp)) == NULL) error("can't %s %s\n", *mode == 'r'? "open": "create", file); return(fp); } /* * Local to York: */ /* * Set an error handling function; return its previous value. */ void (*errcleanup(__ERRFN f))(void) { __ERRFN oldf; oldf = errfunc; errfunc = f; return(oldf); }