Subversion Repositories Games.Descent

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * This file is part of the DXX-Rebirth project <https://www.dxx-rebirth.com/>.
  3.  * It is copyright by its individual contributors, as recorded in the
  4.  * project's Git history.  See COPYING.txt at the top level for license
  5.  * terms and a link to the Git history.
  6.  */
  7. /* Console */
  8.  
  9. #pragma once
  10.  
  11. #include <cstddef>
  12. #include <cstring>
  13. #include <type_traits>
  14. #include "pstypes.h"
  15. #include "dxxsconf.h"
  16. #include "fmtcheck.h"
  17. #include "cli.h"
  18. #include "cmd.h"
  19. #include "d_srcloc.h"
  20.  
  21. #ifdef __cplusplus
  22.  
  23. /* Priority levels */
  24. enum con_priority
  25. {
  26.         CON_CRITICAL = -3,
  27.         CON_URGENT,
  28.         CON_HUD,
  29.         CON_NORMAL,
  30.         CON_VERBOSE,
  31.         CON_DEBUG
  32. };
  33.  
  34. constexpr std::integral_constant<std::size_t, 2048> CON_LINE_LENGTH{};
  35.  
  36. struct console_buffer
  37. {
  38.         char line[CON_LINE_LENGTH];
  39.         int priority;
  40. };
  41.  
  42. /* Define to 1 to capture the __FILE__, __LINE__ of callers to
  43.  * con_printf, con_puts, and show the captured value in `gamelog.txt`.
  44.  */
  45. #ifndef DXX_CONSOLE_SHOW_FILE_LINE
  46. #define DXX_CONSOLE_SHOW_FILE_LINE      0
  47. #endif
  48.  
  49. using con_priority_wrapper = location_value_wrapper<con_priority, DXX_CONSOLE_SHOW_FILE_LINE>;
  50.  
  51. #undef DXX_CONSOLE_SHOW_FILE_LINE
  52.  
  53. void con_init(void);
  54. void con_puts(con_priority_wrapper level, char *str, size_t len) __attribute_nonnull();
  55. void con_puts(con_priority_wrapper level, const char *str, size_t len) __attribute_nonnull();
  56.  
  57. template <typename T>
  58. static inline void con_puts(const con_priority_wrapper level, T &&str)
  59. {
  60.         using rr = typename std::remove_reference<T>::type;
  61.         constexpr std::size_t len = std::extent<rr>::value;
  62.         con_puts(level, str, len && std::is_const<rr>::value ? len - 1 : strlen(str));
  63. }
  64.  
  65. void con_printf(con_priority_wrapper level, const char *fmt, ...) __attribute_format_printf(2, 3);
  66. #ifdef DXX_CONSTANT_TRUE
  67. #define DXX_CON_PRINTF_CHECK_TRAILING_NEWLINE(F)        \
  68.         (DXX_CONSTANT_TRUE(sizeof((F)) > 1 && (F)[sizeof((F)) - 2] == '\n') &&  \
  69.                 (DXX_ALWAYS_ERROR_FUNCTION(dxx_trap_trailing_newline, "trailing literal newline on con_printf"), 0)),
  70. #else
  71. #define DXX_CON_PRINTF_CHECK_TRAILING_NEWLINE(C)
  72. #endif
  73. #define con_printf(A1,F,...)    \
  74.         DXX_CON_PRINTF_CHECK_TRAILING_NEWLINE(F)        \
  75.         dxx_call_printf_checked(con_printf,con_puts,(A1),(F),##__VA_ARGS__)
  76. void con_showup(void);
  77.  
  78. #endif
  79.