| #include "sam.h" |
| |
| static char *emsg[]={ |
| /* error_s */ |
| "can't open", |
| "can't create", |
| "not in menu:", |
| "changes to", |
| "I/O error:", |
| "can't write while changing:", |
| /* error_c */ |
| "unknown command", |
| "no operand for", |
| "bad delimiter", |
| /* error */ |
| "can't fork", |
| "interrupt", |
| "address", |
| "search", |
| "pattern", |
| "newline expected", |
| "blank expected", |
| "pattern expected", |
| "can't nest X or Y", |
| "unmatched `}'", |
| "command takes no address", |
| "addresses overlap", |
| "substitution", |
| "& match too long", |
| "bad \\ in rhs", |
| "address range", |
| "changes not in sequence", |
| "addresses out of order", |
| "no file name", |
| "unmatched `('", |
| "unmatched `)'", |
| "malformed `[]'", |
| "malformed regexp", |
| "reg. exp. list overflow", |
| "plan 9 command", |
| "can't pipe", |
| "no current file", |
| "string too long", |
| "changed files", |
| "empty string", |
| "file search", |
| "non-unique match for \"\"", |
| "tag match too long", |
| "too many subexpressions", |
| "temporary file too large", |
| "file is append-only", |
| "no destination for plumb message", |
| "internal read error in buffer load" |
| }; |
| static char *wmsg[]={ |
| /* warn_s */ |
| "duplicate file name", |
| "no such file", |
| "write might change good version of", |
| /* warn_S */ |
| "files might be aliased", |
| /* warn */ |
| "null characters elided", |
| "can't run pwd", |
| "last char not newline", |
| "exit status not 0" |
| }; |
| |
| void |
| error(Err s) |
| { |
| char buf[512]; |
| |
| sprint(buf, "?%s", emsg[s]); |
| hiccough(buf); |
| } |
| |
| void |
| error_s(Err s, char *a) |
| { |
| char buf[512]; |
| |
| sprint(buf, "?%s \"%s\"", emsg[s], a); |
| hiccough(buf); |
| } |
| |
| void |
| error_r(Err s, char *a) |
| { |
| char buf[512]; |
| |
| sprint(buf, "?%s \"%s\": %r", emsg[s], a); |
| hiccough(buf); |
| } |
| |
| void |
| error_c(Err s, int c) |
| { |
| char buf[512]; |
| |
| sprint(buf, "?%s `%C'", emsg[s], c); |
| hiccough(buf); |
| } |
| |
| void |
| warn(Warn s) |
| { |
| dprint("?warning: %s\n", wmsg[s]); |
| } |
| |
| void |
| warn_S(Warn s, String *a) |
| { |
| print_s(wmsg[s], a); |
| } |
| |
| void |
| warn_SS(Warn s, String *a, String *b) |
| { |
| print_ss(wmsg[s], a, b); |
| } |
| |
| void |
| warn_s(Warn s, char *a) |
| { |
| dprint("?warning: %s `%s'\n", wmsg[s], a); |
| } |
| |
| void |
| termwrite(char *s) |
| { |
| String *p; |
| |
| if(downloaded){ |
| p = tmpcstr(s); |
| if(cmd) |
| loginsert(cmd, cmdpt, p->s, p->n); |
| else |
| Strinsert(&cmdstr, p, cmdstr.n); |
| cmdptadv += p->n; |
| free(p); |
| }else |
| Write(2, s, strlen(s)); |
| } |