Printer.cpp revision 038ac694b36de2b081e62fcfb9b5f4a8c918c533
1ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin/* 2ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Copyright (C) 2013 The Android Open Source Project 3ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * 4ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 5ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * you may not use this file except in compliance with the License. 6ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * You may obtain a copy of the License at 7ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * 8ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 9ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * 10ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Unless required by applicable law or agreed to in writing, software 11ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 12ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * See the License for the specific language governing permissions and 14ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * limitations under the License. 15ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin */ 16ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 17ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#define LOG_TAG "Printer" 18ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin// #define LOG_NDEBUG 0 19ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 20ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#include <utils/Printer.h> 21ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#include <utils/String8.h> 22ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#include <utils/Log.h> 23ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 24ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#include <string.h> 25ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#include <stdio.h> 26ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#include <stdlib.h> 27ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 28ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#ifndef __BIONIC__ 29ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#define fdprintf dprintf 30ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin#endif 31ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 32ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinnamespace android { 33ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 34ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin/* 35ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Implementation of Printer 36ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin */ 37ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor MurashkinPrinter::Printer() { 38ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Intentionally left empty 39ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin} 40ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 41ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor MurashkinPrinter::~Printer() { 42ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Intentionally left empty 43ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin} 44ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 45ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinvoid Printer::printFormatLine(const char* format, ...) { 46ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin va_list arglist; 47ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin va_start(arglist, format); 48ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 49ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin char* formattedString; 50e65b7ea8801145626504c724c28aedd0e5038a28Igor Murashkin 51e65b7ea8801145626504c724c28aedd0e5038a28Igor Murashkin#ifndef USE_MINGW 52ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin if (vasprintf(&formattedString, format, arglist) < 0) { // returns -1 on error 53ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin ALOGE("%s: Failed to format string", __FUNCTION__); 54ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin return; 55ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin } 56e65b7ea8801145626504c724c28aedd0e5038a28Igor Murashkin#else 57e65b7ea8801145626504c724c28aedd0e5038a28Igor Murashkin return; 58e65b7ea8801145626504c724c28aedd0e5038a28Igor Murashkin#endif 59e65b7ea8801145626504c724c28aedd0e5038a28Igor Murashkin 60ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin va_end(arglist); 61ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 62ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin printLine(formattedString); 63ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin free(formattedString); 64ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin} 65ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 66ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin/* 67ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Implementation of LogPrinter 68ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin */ 69ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor MurashkinLogPrinter::LogPrinter(const char* logtag, 70ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin android_LogPriority priority, 71ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin const char* prefix, 72ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin bool ignoreBlankLines) : 73ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin mLogTag(logtag), 74ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin mPriority(priority), 75ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin mPrefix(prefix ?: ""), 76ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin mIgnoreBlankLines(ignoreBlankLines) { 77ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin} 78ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 79ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinvoid LogPrinter::printLine(const char* string) { 80ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin if (string == NULL) { 81ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin ALOGW("%s: NULL string passed in", __FUNCTION__); 82ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin return; 83ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin } 84ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 85ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin if (mIgnoreBlankLines || (*string)) { 86ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Simple case: Line is not blank, or we don't care about printing blank lines 87ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin printRaw(string); 88ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin } else { 89ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // Force logcat to print empty lines by adding prefixing with a space 90ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin printRaw(" "); 91ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin } 92ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin} 93ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 94ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinvoid LogPrinter::printRaw(const char* string) { 95ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin __android_log_print(mPriority, mLogTag, "%s%s", mPrefix, string); 96ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin} 97ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 98ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 99ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin/* 100ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Implementation of FdPrinter 101ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin */ 102ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor MurashkinFdPrinter::FdPrinter(int fd, unsigned int indent, const char* prefix) : 103ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin mFd(fd), mIndent(indent), mPrefix(prefix ?: "") { 104ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 105ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin if (fd < 0) { 106ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin ALOGW("%s: File descriptor out of range (%d)", __FUNCTION__, fd); 107ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin } 108ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 109ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin // <indent><prefix><line> -- e.g. '%-4s%s\n' for indent=4 110ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin snprintf(mFormatString, sizeof(mFormatString), "%%-%us%%s\n", mIndent); 111ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin} 112ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 113ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinvoid FdPrinter::printLine(const char* string) { 114ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin if (string == NULL) { 115ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin ALOGW("%s: NULL string passed in", __FUNCTION__); 116ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin return; 117ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin } else if (mFd < 0) { 118ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin ALOGW("%s: File descriptor out of range (%d)", __FUNCTION__, mFd); 119ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin return; 120ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin } 121ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 122e65b7ea8801145626504c724c28aedd0e5038a28Igor Murashkin#ifndef USE_MINGW 123ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin fdprintf(mFd, mFormatString, mPrefix, string); 124e65b7ea8801145626504c724c28aedd0e5038a28Igor Murashkin#endif 125ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin} 126ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 127ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin/* 128ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Implementation of String8Printer 129ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin */ 130ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor MurashkinString8Printer::String8Printer(String8* target, const char* prefix) : 131ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin mTarget(target), 132ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin mPrefix(prefix ?: "") { 133ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 134ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin if (target == NULL) { 135ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin ALOGW("%s: Target string was NULL", __FUNCTION__); 136ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin } 137ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin} 138ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 139ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinvoid String8Printer::printLine(const char* string) { 140ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin if (string == NULL) { 141ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin ALOGW("%s: NULL string passed in", __FUNCTION__); 142ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin return; 143ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin } else if (mTarget == NULL) { 144ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin ALOGW("%s: Target string was NULL", __FUNCTION__); 145ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin return; 146ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin } 147ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 148038ac694b36de2b081e62fcfb9b5f4a8c918c533Christopher Ferris mTarget->append(mPrefix); 149ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin mTarget->append(string); 150ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin mTarget->append("\n"); 151ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin} 152ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 153ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin/* 154ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin * Implementation of PrefixPrinter 155ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin */ 156ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor MurashkinPrefixPrinter::PrefixPrinter(Printer& printer, const char* prefix) : 157ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin mPrinter(printer), mPrefix(prefix ?: "") { 158ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin} 159ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 160ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkinvoid PrefixPrinter::printLine(const char* string) { 161ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin mPrinter.printFormatLine("%s%s", mPrefix, string); 162ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin} 163ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin 164ec79ef2e7b6b1d81266637ca0e002b5c0c5a789bIgor Murashkin}; //namespace android 165