2023-02-13 08:45:50 -05:00
|
|
|
/* $Revision: 1.12 $
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "unroff.h"
|
|
|
|
|
|
|
|
static char *progname = "(whoami?)";
|
|
|
|
|
|
|
|
void set_progname(char *s) {
|
|
|
|
char *p;
|
|
|
|
|
|
|
|
progname = (p = strrchr(s, '/')) ? p+1 : s;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *get_progname(void) {
|
|
|
|
return progname;
|
|
|
|
}
|
|
|
|
|
|
|
|
void warn(char *fmt, ...) {
|
|
|
|
va_list args;
|
|
|
|
|
|
|
|
fprintf(stderr, "%s: ", progname);
|
|
|
|
if (istream_is_open())
|
|
|
|
fprintf(stderr, "%s:%lu: ", curr_istream_target(), curr_istream_lno());
|
|
|
|
fprintf(stderr, "warning: ");
|
|
|
|
va_start(args, fmt);
|
|
|
|
vfprintf(stderr, fmt, args);
|
|
|
|
fprintf(stderr, ".\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
void fatal_error(char *fmt, ...) {
|
|
|
|
va_list args;
|
|
|
|
|
|
|
|
fprintf(stderr, "%s: ", progname);
|
|
|
|
va_start(args, fmt);
|
|
|
|
vfprintf(stderr, fmt, args);
|
|
|
|
fprintf(stderr, ".\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2023-02-15 07:36:40 -05:00
|
|
|
static const char *strerr(void) {
|
2023-02-13 08:45:50 -05:00
|
|
|
return errno > 0 && errno < sys_nerr ?
|
|
|
|
sys_errlist[errno] : "unknown error";
|
|
|
|
}
|
|
|
|
|
|
|
|
void read_error(char *s) {
|
|
|
|
fatal_error("reading %s: %s", s, strerr());
|
|
|
|
}
|
|
|
|
|
|
|
|
void write_error(char *s) {
|
|
|
|
fatal_error("writing %s: %s", s, strerr());
|
|
|
|
}
|
|
|
|
|
|
|
|
void open_error(char *fn) {
|
|
|
|
fatal_error("%s: %s", fn, strerr());
|
|
|
|
}
|
|
|
|
|
|
|
|
char *printable_string(char *s, int len) {
|
|
|
|
static Buffer *bp;
|
|
|
|
char c[4];
|
|
|
|
|
|
|
|
if (!bp)
|
|
|
|
bp = buffer_new(0);
|
|
|
|
buffer_clear(bp);
|
|
|
|
for ( ; len > 0; len--, s++) {
|
|
|
|
if (isprint(UCHAR(*s)) || *s == ' ') {
|
|
|
|
buffer_putc(bp, *s);
|
|
|
|
} else {
|
|
|
|
buffer_putc(bp, '\\');
|
|
|
|
switch (*s) {
|
|
|
|
case '\n':
|
|
|
|
buffer_putc(bp, 'n'); break;
|
|
|
|
case '\t':
|
|
|
|
buffer_putc(bp, 't'); break;
|
|
|
|
case '\b':
|
|
|
|
buffer_putc(bp, 'b'); break;
|
|
|
|
default:
|
|
|
|
sprintf(c, "%03o", *s);
|
|
|
|
buffer_puts(bp, c, 3);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
buffer_putc(bp, '\0');
|
|
|
|
return bp->data;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *printable_char(char c) {
|
|
|
|
return printable_string(&c, 1);
|
|
|
|
}
|