err.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "defaults.h"
  2. #include "progname.h"
  3. #include "compat.h"
  4. #include "error.h"
  5. #include <util/generic/scope.h>
  6. #include <util/system/compat.h>
  7. #include <util/stream/printf.h>
  8. #include <util/stream/output.h>
  9. #include <cstdlib>
  10. void vwarnx(const char* fmt, va_list args) {
  11. Cerr << GetProgramName() << ": ";
  12. if (fmt) {
  13. Printf(Cerr, fmt, args);
  14. }
  15. Cerr << '\n';
  16. }
  17. void vwarn(const char* fmt, va_list args) {
  18. int curErrNo = errno;
  19. auto curErrText = LastSystemErrorText();
  20. Y_DEFER {
  21. errno = curErrNo;
  22. };
  23. Cerr << GetProgramName() << ": ";
  24. if (fmt) {
  25. Printf(Cerr, fmt, args);
  26. Cerr << ": ";
  27. }
  28. Cerr << curErrText << '\n';
  29. }
  30. void warn(const char* fmt, ...) {
  31. va_list args;
  32. va_start(args, fmt);
  33. vwarn(fmt, args);
  34. va_end(args);
  35. }
  36. void warnx(const char* fmt, ...) {
  37. va_list args;
  38. va_start(args, fmt);
  39. vwarnx(fmt, args);
  40. va_end(args);
  41. }
  42. [[noreturn]] void verr(int status, const char* fmt, va_list args) {
  43. vwarn(fmt, args);
  44. std::exit(status);
  45. }
  46. [[noreturn]] void err(int status, const char* fmt, ...) {
  47. va_list args;
  48. va_start(args, fmt);
  49. verr(status, fmt, args);
  50. va_end(args);
  51. }
  52. [[noreturn]] void verrx(int status, const char* fmt, va_list args) {
  53. vwarnx(fmt, args);
  54. std::exit(status);
  55. }
  56. [[noreturn]] void errx(int status, const char* fmt, ...) {
  57. va_list args;
  58. va_start(args, fmt);
  59. verrx(status, fmt, args);
  60. va_end(args);
  61. }