13e12c5d1SDavid du Colombier #include "sam.h" 23e12c5d1SDavid du Colombier 33e12c5d1SDavid du Colombier static char *emsg[]={ 43e12c5d1SDavid du Colombier /* error_s */ 53e12c5d1SDavid du Colombier "can't open", 63e12c5d1SDavid du Colombier "can't create", 73e12c5d1SDavid du Colombier "not in menu:", 83e12c5d1SDavid du Colombier "changes to", 93e12c5d1SDavid du Colombier "I/O error:", 103e12c5d1SDavid du Colombier /* error_c */ 113e12c5d1SDavid du Colombier "unknown command", 123e12c5d1SDavid du Colombier "no operand for", 133e12c5d1SDavid du Colombier "bad delimiter", 143e12c5d1SDavid du Colombier /* error */ 153e12c5d1SDavid du Colombier "can't fork", 163e12c5d1SDavid du Colombier "interrupt", 173e12c5d1SDavid du Colombier "address", 183e12c5d1SDavid du Colombier "search", 193e12c5d1SDavid du Colombier "pattern", 203e12c5d1SDavid du Colombier "newline expected", 213e12c5d1SDavid du Colombier "blank expected", 223e12c5d1SDavid du Colombier "pattern expected", 233e12c5d1SDavid du Colombier "can't nest X or Y", 243e12c5d1SDavid du Colombier "unmatched `}'", 253e12c5d1SDavid du Colombier "command takes no address", 263e12c5d1SDavid du Colombier "addresses overlap", 273e12c5d1SDavid du Colombier "substitution", 283e12c5d1SDavid du Colombier "& match too long", 293e12c5d1SDavid du Colombier "bad \\ in rhs", 303e12c5d1SDavid du Colombier "address range", 313e12c5d1SDavid du Colombier "changes not in sequence", 323e12c5d1SDavid du Colombier "addresses out of order", 333e12c5d1SDavid du Colombier "no file name", 343e12c5d1SDavid du Colombier "unmatched `('", 353e12c5d1SDavid du Colombier "unmatched `)'", 363e12c5d1SDavid du Colombier "malformed `[]'", 373e12c5d1SDavid du Colombier "malformed regexp", 383e12c5d1SDavid du Colombier "reg. exp. list overflow", 393e12c5d1SDavid du Colombier "plan 9 command", 403e12c5d1SDavid du Colombier "can't pipe", 413e12c5d1SDavid du Colombier "no current file", 423e12c5d1SDavid du Colombier "string too long", 433e12c5d1SDavid du Colombier "changed files", 443e12c5d1SDavid du Colombier "empty string", 453e12c5d1SDavid du Colombier "file search", 463e12c5d1SDavid du Colombier "non-unique match for \"\"", 473e12c5d1SDavid du Colombier "tag match too long", 483e12c5d1SDavid du Colombier "too many subexpressions", 493e12c5d1SDavid du Colombier "temporary file too large", 50*219b2ee8SDavid du Colombier "file is append-only", 513e12c5d1SDavid du Colombier }; 523e12c5d1SDavid du Colombier static char *wmsg[]={ 533e12c5d1SDavid du Colombier /* warn_s */ 543e12c5d1SDavid du Colombier "duplicate file name", 553e12c5d1SDavid du Colombier "no such file", 563e12c5d1SDavid du Colombier "write might change good version of", 57bd389b36SDavid du Colombier /* warn_S */ 58bd389b36SDavid du Colombier "files might be aliased", 593e12c5d1SDavid du Colombier /* warn */ 603e12c5d1SDavid du Colombier "null characters elided", 613e12c5d1SDavid du Colombier "can't run pwd", 623e12c5d1SDavid du Colombier "last char not newline", 633e12c5d1SDavid du Colombier "exit status not 0", 643e12c5d1SDavid du Colombier }; 653e12c5d1SDavid du Colombier 663e12c5d1SDavid du Colombier void 673e12c5d1SDavid du Colombier error(Err s) 683e12c5d1SDavid du Colombier { 693e12c5d1SDavid du Colombier char buf[512]; 703e12c5d1SDavid du Colombier 713e12c5d1SDavid du Colombier sprint(buf, "?%s", emsg[s]); 723e12c5d1SDavid du Colombier hiccough(buf); 733e12c5d1SDavid du Colombier } 743e12c5d1SDavid du Colombier 753e12c5d1SDavid du Colombier void 763e12c5d1SDavid du Colombier error_s(Err s, char *a) 773e12c5d1SDavid du Colombier { 783e12c5d1SDavid du Colombier char buf[512]; 793e12c5d1SDavid du Colombier 803e12c5d1SDavid du Colombier sprint(buf, "?%s \"%s\"", emsg[s], a); 813e12c5d1SDavid du Colombier hiccough(buf); 823e12c5d1SDavid du Colombier } 833e12c5d1SDavid du Colombier 843e12c5d1SDavid du Colombier void 853e12c5d1SDavid du Colombier error_c(Err s, int c) 863e12c5d1SDavid du Colombier { 873e12c5d1SDavid du Colombier char buf[512]; 883e12c5d1SDavid du Colombier 893e12c5d1SDavid du Colombier sprint(buf, "?%s `%C'", emsg[s], c); 903e12c5d1SDavid du Colombier hiccough(buf); 913e12c5d1SDavid du Colombier } 923e12c5d1SDavid du Colombier 933e12c5d1SDavid du Colombier void 943e12c5d1SDavid du Colombier warn(Warn s) 953e12c5d1SDavid du Colombier { 963e12c5d1SDavid du Colombier dprint("?warning: %s\n", wmsg[s]); 973e12c5d1SDavid du Colombier } 983e12c5d1SDavid du Colombier 993e12c5d1SDavid du Colombier void 1003e12c5d1SDavid du Colombier warn_S(Warn s, String *a) 1013e12c5d1SDavid du Colombier { 102bd389b36SDavid du Colombier print_s(wmsg[s], a); 103bd389b36SDavid du Colombier } 1043e12c5d1SDavid du Colombier 105bd389b36SDavid du Colombier void 106bd389b36SDavid du Colombier warn_SS(Warn s, String *a, String *b) 107bd389b36SDavid du Colombier { 108bd389b36SDavid du Colombier print_ss(wmsg[s], a, b); 1093e12c5d1SDavid du Colombier } 1103e12c5d1SDavid du Colombier 1113e12c5d1SDavid du Colombier void 1123e12c5d1SDavid du Colombier warn_s(Warn s, char *a) 1133e12c5d1SDavid du Colombier { 1143e12c5d1SDavid du Colombier dprint("?warning: %s `%s'\n", wmsg[s], a); 1153e12c5d1SDavid du Colombier } 1163e12c5d1SDavid du Colombier 1173e12c5d1SDavid du Colombier void 1183e12c5d1SDavid du Colombier termwrite(char *s) 1193e12c5d1SDavid du Colombier { 1203e12c5d1SDavid du Colombier String *p; 1213e12c5d1SDavid du Colombier 1223e12c5d1SDavid du Colombier if(downloaded){ 1233e12c5d1SDavid du Colombier p = tmpcstr(s); 1243e12c5d1SDavid du Colombier if(cmd) 1253e12c5d1SDavid du Colombier Finsert(cmd, p, cmdpt); 1263e12c5d1SDavid du Colombier else 1273e12c5d1SDavid du Colombier Strinsert(&cmdstr, p, cmdstr.n); 1283e12c5d1SDavid du Colombier cmdptadv += p->n; 1293e12c5d1SDavid du Colombier }else 1303e12c5d1SDavid du Colombier Write(2, s, strlen(s)); 1313e12c5d1SDavid du Colombier } 132