Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #ifdef _WIN32
  2. #include <iostream>
  3. #include "windows.hxx"
  4. #include "conversion.hxx"
  5. #include "terminal.hxx"
  6. using namespace std;
  7. namespace replxx {
  8. WinAttributes WIN_ATTR;
  9. template<typename T>
  10. T* HandleEsc(HANDLE out_, T* p, T* end) {
  11. if (*p == '[') {
  12. int code = 0;
  13. int thisBackground( WIN_ATTR._defaultBackground );
  14. for (++p; p < end; ++p) {
  15. char32_t c = *p;
  16. if ('0' <= c && c <= '9') {
  17. code = code * 10 + (c - '0');
  18. } else if (c == 'm' || c == ';') {
  19. switch (code) {
  20. case 0:
  21. WIN_ATTR._consoleAttribute = WIN_ATTR._defaultAttribute;
  22. WIN_ATTR._consoleColor = WIN_ATTR._defaultColor | thisBackground;
  23. break;
  24. case 1: // BOLD
  25. case 5: // BLINK
  26. WIN_ATTR._consoleAttribute = (WIN_ATTR._defaultAttribute ^ FOREGROUND_INTENSITY) & INTENSITY;
  27. break;
  28. case 22:
  29. WIN_ATTR._consoleAttribute = WIN_ATTR._defaultAttribute;
  30. break;
  31. case 30:
  32. case 90:
  33. WIN_ATTR._consoleColor = thisBackground;
  34. break;
  35. case 31:
  36. case 91:
  37. WIN_ATTR._consoleColor = FOREGROUND_RED | thisBackground;
  38. break;
  39. case 32:
  40. case 92:
  41. WIN_ATTR._consoleColor = FOREGROUND_GREEN | thisBackground;
  42. break;
  43. case 33:
  44. case 93:
  45. WIN_ATTR._consoleColor = FOREGROUND_RED | FOREGROUND_GREEN | thisBackground;
  46. break;
  47. case 34:
  48. case 94:
  49. WIN_ATTR._consoleColor = FOREGROUND_BLUE | thisBackground;
  50. break;
  51. case 35:
  52. case 95:
  53. WIN_ATTR._consoleColor = FOREGROUND_BLUE | FOREGROUND_RED | thisBackground;
  54. break;
  55. case 36:
  56. case 96:
  57. WIN_ATTR._consoleColor = FOREGROUND_BLUE | FOREGROUND_GREEN | thisBackground;
  58. break;
  59. case 37:
  60. case 97:
  61. WIN_ATTR._consoleColor = FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | thisBackground;
  62. break;
  63. case 101:
  64. thisBackground = BACKGROUND_RED;
  65. break;
  66. }
  67. if ( ( code >= 90 ) && ( code <= 97 ) ) {
  68. WIN_ATTR._consoleAttribute = (WIN_ATTR._defaultAttribute ^ FOREGROUND_INTENSITY) & INTENSITY;
  69. }
  70. code = 0;
  71. }
  72. if (*p == 'm') {
  73. ++p;
  74. break;
  75. }
  76. }
  77. } else {
  78. ++p;
  79. }
  80. SetConsoleTextAttribute(
  81. out_,
  82. WIN_ATTR._consoleAttribute | WIN_ATTR._consoleColor
  83. );
  84. return p;
  85. }
  86. int win_write( HANDLE out_, bool autoEscape_, char const* str_, int size_ ) {
  87. int count( 0 );
  88. if ( tty::out ) {
  89. DWORD nWritten( 0 );
  90. if ( autoEscape_ ) {
  91. WriteConsoleA( out_, str_, size_, &nWritten, nullptr );
  92. count = nWritten;
  93. } else {
  94. char const* s( str_ );
  95. char const* e( str_ + size_ );
  96. while ( str_ < e ) {
  97. if ( *str_ == 27 ) {
  98. if ( s < str_ ) {
  99. int toWrite( static_cast<int>( str_ - s ) );
  100. WriteConsoleA( out_, s, static_cast<DWORD>( toWrite ), &nWritten, nullptr );
  101. count += nWritten;
  102. if ( nWritten != toWrite ) {
  103. s = str_ = nullptr;
  104. break;
  105. }
  106. }
  107. s = HandleEsc( out_, str_ + 1, e );
  108. int escaped( static_cast<int>( s - str_ ) );
  109. count += escaped;
  110. str_ = s;
  111. } else {
  112. ++ str_;
  113. }
  114. }
  115. if ( s < str_ ) {
  116. WriteConsoleA( out_, s, static_cast<DWORD>( str_ - s ), &nWritten, nullptr );
  117. count += nWritten;
  118. }
  119. }
  120. } else {
  121. count = _write( 1, str_, size_ );
  122. }
  123. return ( count );
  124. }
  125. }
  126. #endif