MCPcopy Create free account
hub / github.com/CE-Programming/CEmu / writeConsole

Method writeConsole

gui/qt/emuthread.cpp:73–129  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

71}
72
73void EmuThread::writeConsole(int console, const char *format, va_list args) {
74 if (type != console) {
75 write.acquire(CONSOLE_BUFFER_SIZE);
76 type = console;
77 write.release(CONSOLE_BUFFER_SIZE);
78 }
79 int available = write.available();
80 int remaining = CONSOLE_BUFFER_SIZE - writePos;
81 int space = available < remaining ? available : remaining;
82 int size;
83 va_list argsCopy;
84 va_copy(argsCopy, args);
85 size = vsnprintf(buffer + writePos, space, format, argsCopy);
86 va_end(argsCopy);
87 if (size >= 0 && size < space) {
88 if (size == 0) {
89 return;
90 }
91 write.acquire(size);
92 writePos += size;
93 read.release(size);
94 emit consoleStr();
95 } else {
96 if (size < 0) {
97 va_copy(argsCopy, args);
98 size = vsnprintf(nullptr, 0, format, argsCopy);
99 va_end(argsCopy);
100 if (size <= 0) {
101 return;
102 }
103 }
104 char *tmp = size < available - remaining ? buffer : new char[size + 1];
105 if (tmp && vsnprintf(tmp, size + 1, format, args) >= 0) {
106 int tmpPos = 0;
107 while (size >= remaining) {
108 write.acquire(remaining);
109 memcpy(buffer + writePos, tmp + tmpPos, remaining);
110 tmpPos += remaining;
111 size -= remaining;
112 writePos = 0;
113 read.release(remaining);
114 remaining = CONSOLE_BUFFER_SIZE;
115 emit consoleStr();
116 }
117 if (size) {
118 write.acquire(size);
119 memmove(buffer + writePos, tmp + tmpPos, size);
120 writePos += size;
121 read.release(size);
122 emit consoleStr();
123 }
124 }
125 if (tmp != buffer) {
126 delete [] tmp;
127 }
128 }
129}
130

Callers 2

gui_console_printfFunction · 0.80
gui_console_err_printfFunction · 0.80

Calls 1

releaseMethod · 0.80

Tested by

no test coverage detected