error.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3. * See the copyright notice in the ACK home directory, in the file "Copyright".
  4. */
  5. #include <stdarg.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <unistd.h>
  9. #include <out.h>
  10. #include "const.h"
  11. static short nerrors = 0;
  12. static void diag(char *, char *, va_list);
  13. void stop()
  14. {
  15. extern char *outputname;
  16. extern int exitstatus;
  17. if (nerrors) {
  18. unlink(outputname);
  19. exit(nerrors);
  20. }
  21. exit(exitstatus);
  22. }
  23. /* VARARGS1 */
  24. void fatal(char *format, ...)
  25. {
  26. va_list ap;
  27. va_start(ap, format);
  28. nerrors++;
  29. diag("fatal", format, ap);
  30. va_end(ap);
  31. stop();
  32. }
  33. /* VARARGS1 */
  34. void warning(char *format, ...)
  35. {
  36. va_list ap;
  37. va_start(ap, format);
  38. diag("warning", format, ap);
  39. va_end(ap);
  40. }
  41. /* VARARGS1 */
  42. void error(char *format, ...)
  43. {
  44. va_list ap;
  45. va_start(ap, format);
  46. nerrors++;
  47. diag("error", format, ap);
  48. va_end(ap);
  49. }
  50. /* VARARGS1 */
  51. int do_verbose(char *format, ...)
  52. {
  53. va_list ap;
  54. va_start(ap, format);
  55. diag((char *) 0, format, ap);
  56. va_end(ap);
  57. return (0==0);
  58. }
  59. static void diag(char *tail, char *format, va_list ap)
  60. {
  61. extern char *progname, *archname, *modulname;
  62. fprintf(stderr, "%s: ", progname);
  63. if (archname && modulname)
  64. fprintf(stderr, "%s(%.14s): ", archname, modulname);
  65. else if (archname)
  66. fprintf(stderr, "%s: ", archname);
  67. else if (modulname)
  68. fprintf(stderr, "%s: ", modulname);
  69. vfprintf(stderr, format, ap);
  70. if (tail) fprintf(stderr, " (%s)\n", tail);
  71. else putc('\n', stderr);
  72. }