// Copyright 2016 The Fuchsia Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include #define PCBUFMAX 126 // buffer is two larger to leave room for a \0 and room // for a \r that may be added after a \n typedef struct { int off; char16_t buf[PCBUFMAX + 2]; } _pcstate; static int _printf_console_out(const char* str, size_t len, void* _state) { _pcstate* state = _state; char16_t* buf = state->buf; int i = state->off; int n = len; while (n > 0) { if (*str == '\n') { buf[i++] = '\r'; } buf[i++] = *str++; if (i >= PCBUFMAX) { buf[i] = 0; gConOut->OutputString(gConOut, buf); i = 0; } n--; } state->off = i; return len; } int _printf(const char* fmt, ...) { va_list ap; _pcstate state; int r; state.off = 0; va_start(ap, fmt); r = _printf_engine(_printf_console_out, &state, fmt, ap); va_end(ap); if (state.off) { state.buf[state.off] = 0; gConOut->OutputString(gConOut, state.buf); } return r; } int puts16(char16_t* str) { return gConOut->OutputString(gConOut, str) == EFI_SUCCESS ? 0 : -1; }