1 /* $Revision: 1.12 $
2  */
3 
4 #include "unroff.h"
5 
6 static char *progname = "(whoami?)";
7 
set_progname(char * s)8 void set_progname(char *s) {
9     char *p;
10 
11     progname = (p = strrchr(s, '/')) ? p+1 : s;
12 }
13 
get_progname(void)14 char *get_progname(void) {
15     return progname;
16 }
17 
warn(char * fmt,...)18 void warn(char *fmt, ...) {
19     va_list args;
20 
21     fprintf(stderr, "%s: ", progname);
22     if (istream_is_open())
23 	fprintf(stderr, "%s:%lu: ", curr_istream_target(), curr_istream_lno());
24     fprintf(stderr, "warning: ");
25     va_start(args, fmt);
26     vfprintf(stderr, fmt, args);
27     fprintf(stderr, ".\n");
28 }
29 
fatal_error(char * fmt,...)30 void fatal_error(char *fmt, ...) {
31     va_list args;
32 
33     fprintf(stderr, "%s: ", progname);
34     va_start(args, fmt);
35     vfprintf(stderr, fmt, args);
36     fprintf(stderr, ".\n");
37     exit(1);
38 }
39 
strerr(void)40 static char *strerr(void) {
41 #ifndef BSD
42     extern int sys_nerr;
43     extern char *sys_errlist[];
44 #endif
45 
46     return errno > 0 && errno < sys_nerr ?
47 	sys_errlist[errno] : "unknown error";
48 }
49 
read_error(char * s)50 void read_error(char *s) {
51     fatal_error("reading %s: %s", s, strerr());
52 }
53 
write_error(char * s)54 void write_error(char *s) {
55     fatal_error("writing %s: %s", s, strerr());
56 }
57 
open_error(char * fn)58 void open_error(char *fn) {
59     fatal_error("%s: %s", fn, strerr());
60 }
61 
printable_string(char * s,int len)62 char *printable_string(char *s, int len) {
63     static Buffer *bp;
64     char c[4];
65 
66     if (!bp)
67 	bp = buffer_new(0);
68     buffer_clear(bp);
69     for ( ; len > 0; len--, s++) {
70 	if (isprint(UCHAR(*s)) || *s == ' ') {
71 	    buffer_putc(bp, *s);
72 	} else {
73 	    buffer_putc(bp, '\\');
74 	    switch (*s) {
75 	    case '\n':
76 		buffer_putc(bp, 'n'); break;
77 	    case '\t':
78 		buffer_putc(bp, 't'); break;
79 	    case '\b':
80 		buffer_putc(bp, 'b'); break;
81 	    default:
82 		sprintf(c, "%03o", *s);
83 		buffer_puts(bp, c, 3);
84 	    }
85 	}
86     }
87     buffer_putc(bp, '\0');
88     return bp->data;
89 }
90 
printable_char(char c)91 char *printable_char(char c) {
92     return printable_string(&c, 1);
93 }
94