1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2019 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "src/sksl/SkSLOutputStream.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include <memory> 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_cinamespace SkSL { 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_civoid OutputStream::writeString(const String& s) { 15cb93a386Sopenharmony_ci this->write(s.c_str(), s.size()); 16cb93a386Sopenharmony_ci} 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_civoid OutputStream::printf(const char format[], ...) { 19cb93a386Sopenharmony_ci va_list args; 20cb93a386Sopenharmony_ci va_start(args, format); 21cb93a386Sopenharmony_ci this->appendVAList(format, args); 22cb93a386Sopenharmony_ci va_end(args); 23cb93a386Sopenharmony_ci} 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_civoid OutputStream::appendVAList(const char format[], va_list args) { 26cb93a386Sopenharmony_ci char buffer[kBufferSize]; 27cb93a386Sopenharmony_ci va_list copy; 28cb93a386Sopenharmony_ci va_copy(copy, args); 29cb93a386Sopenharmony_ci int length = vsnprintf(buffer, kBufferSize, format, args); 30cb93a386Sopenharmony_ci if (length > (int) kBufferSize) { 31cb93a386Sopenharmony_ci std::unique_ptr<char[]> bigBuffer(new char[length + 1]); 32cb93a386Sopenharmony_ci vsnprintf(bigBuffer.get(), length + 1, format, copy); 33cb93a386Sopenharmony_ci this->write(bigBuffer.get(), length); 34cb93a386Sopenharmony_ci } else { 35cb93a386Sopenharmony_ci this->write(buffer, length); 36cb93a386Sopenharmony_ci } 37cb93a386Sopenharmony_ci va_end(copy); 38cb93a386Sopenharmony_ci} 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci} // namespace SkSL 41