| 26 | static volatile LogHandler mHandler; |
| 27 | public: |
| 28 | static void format(Level level, const char *tag, const char *fmt, ...) |
| 29 | __attribute__ ((__format__ (__printf__, 3, 4))) { |
| 30 | va_list varg1; |
| 31 | va_list varg2; |
| 32 | LogHandler h = mHandler; |
| 33 | if (h == nullptr || fmt == nullptr) { |
| 34 | return; |
| 35 | } |
| 36 | va_start(varg1, fmt); |
| 37 | va_copy(varg2, varg1); |
| 38 | int size = vsnprintf(nullptr, 0, fmt, varg1) + 4; |
| 39 | va_end(varg1); |
| 40 | if (size <= 0) { |
| 41 | return; |
| 42 | } |
| 43 | void *buffer = malloc(size); |
| 44 | if (buffer == nullptr) { |
| 45 | return; |
| 46 | } |
| 47 | va_start(varg2, fmt); |
| 48 | vsnprintf((char *) buffer, size, fmt, varg2); |
| 49 | va_end(varg2); |
| 50 | h(level, tag, static_cast<const char *>(buffer)); |
| 51 | free(buffer); |
| 52 | } |
| 53 | |
| 54 | static void logBuffer(Level level, const char *tag, const char *msg) { |
| 55 | LogHandler h = mHandler; |
no outgoing calls
no test coverage detected