errarg.cc 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // -*- C++ -*-
  2. /* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
  3. Written by James Clark (jjc@jclark.com) */
  4. #include <stdio.h>
  5. #include <assert.h>
  6. #include "errarg.h"
  7. #include "lib.h" // for our_itoa()
  8. errarg::errarg(const char *p) : type(STRING)
  9. {
  10. s = p ? p : "(null)";
  11. }
  12. errarg::errarg() : type(EMPTY)
  13. {
  14. }
  15. errarg::errarg(unsigned char cc) : type(CHAR)
  16. {
  17. c = cc;
  18. }
  19. errarg::errarg(int nn) : type(INTEGER)
  20. {
  21. n = nn;
  22. }
  23. errarg::errarg(char cc) : type(CHAR)
  24. {
  25. c = cc;
  26. }
  27. errarg::errarg(double dd) : type(DOUBLE)
  28. {
  29. d = dd;
  30. }
  31. int
  32. errarg::empty() const
  33. {
  34. return type == EMPTY;
  35. }
  36. void
  37. errarg::print() const
  38. {
  39. switch (type) {
  40. case INTEGER:
  41. fputs(our_itoa(n), stderr);
  42. break;
  43. case CHAR:
  44. putc(c, stderr);
  45. break;
  46. case STRING:
  47. fputs(s, stderr);
  48. break;
  49. case DOUBLE:
  50. fprintf(stderr, "%g", d);
  51. break;
  52. case EMPTY:
  53. break;
  54. }
  55. }
  56. errarg empty_errarg;
  57. void
  58. errprint(const char *format,
  59. const errarg &arg1,
  60. const errarg &arg2,
  61. const errarg &arg3)
  62. {
  63. char c;
  64. assert(format != 0);
  65. while ((c = *format++) != '\0')
  66. {
  67. if (c == '%')
  68. {
  69. c = *format++;
  70. switch(c) {
  71. case '%':
  72. fputc('%', stderr);
  73. break;
  74. case '1':
  75. assert(!arg1.empty());
  76. arg1.print();
  77. break;
  78. case '2':
  79. assert(!arg2.empty());
  80. arg2.print();
  81. break;
  82. case '3':
  83. assert(!arg3.empty());
  84. arg3.print();
  85. break;
  86. default:
  87. assert(0);
  88. }
  89. }
  90. else
  91. putc(c, stderr);
  92. }
  93. }