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