Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!purdue!haven!mimsy!chris From: chris@mimsy.UUCP (Chris Torek) Newsgroups: comp.unix.wizards Subject: Re: error messages (was Re: friendly messages) Message-ID: <16691@mimsy.UUCP> Date: 3 Apr 89 14:27:18 GMT References: <604@marob.MASA.COM> <7555@phoenix.Princeton.EDU> Distribution: usa Organization: U of Maryland, Dept. of Computer Science, Coll. Pk., MD 20742 Lines: 67 In article <7555@phoenix.Princeton.EDU> bernsten@phoenix.Princeton.EDU (Dan Bernstein) writes: > char *err(errno) > int errno; > { > if ... [compressed] > else > return(sys_errlist[errno]); > } This function is in the pANS, where it is called `strerror'. (The implementation details---sys_errlist[], etc.---are not, but the function that does what the one above does is called strerror.) A slightly shorter test for the error number is if ((unsigned)errno >= sys_nerr) else >This is not a high-level routine, nor should it be. Instead of >attempting to build the generality of printf() into the error >message printer, I just reference err(errno) and use printf() >or sprintf() as usual. Why rebuild what's already there? Having an error printer that also exits is more convenient. Since the latter is cheap (using vfprintf), why not provide both? I have the function error(int exitcode, int err, char *fmt, ...) in our C library. It prints to stderr the program name (hidden away in the external `_argv0', set by /lib/crt0.o), the string given by fmt+..., appends strerror(err < 0 ? errno : err) if err != 0, appends a newline, and then does an exit(exitcode) if exitcode != 0. (err is almost always given as -1, and should perhaps be replaced with a boolean. If you want something fancier, strerror() is there.) It is very handy: if (argc < 2) error(2, 0, "usage: %s filename", argv[0]); if ((fd = open(argv[1], mode)) < 0) error(1, -1, "cannot open %s", argv[1]); ... Without it, you need extern int errno; if (argc < 2) { (void) fprintf(stderr, "%s: usage: %s filename\n", argv[0], argv[0]); exit(2); } if ((fd = open(argv[1], mode)) < 0) { (void) fprintf(stderr, "%s: cannot open %s: %s\n", argv[0], argv[1], strerror(errno)); exit(1); } The difference is small, but significant (somewhat like using E- notation for large floating point numbers---1.14E75 is easier to read and write than 1140000000...000). -- In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163) Domain: chris@mimsy.umd.edu Path: uunet!mimsy!chris