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