C++程序  |  170行  |  3.8 KB

/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "print.h"

#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>

#include "util.h"

bool g_stdoutIsTty;
char const* g_escapeBold;
char const* g_escapeRedBold;
char const* g_escapeGreenBold;
char const* g_escapeYellowBold;
char const* g_escapeUnderline;
char const* g_escapeEndColor;
char const* g_escapeClearLine;

void
init_print()
{
    if (isatty(fileno(stdout))) {
		g_stdoutIsTty = true;
		g_escapeBold = "\033[1m";
		g_escapeRedBold = "\033[91m\033[1m";
		g_escapeGreenBold = "\033[92m\033[1m";
		g_escapeYellowBold = "\033[93m\033[1m";
		g_escapeUnderline = "\033[4m";
		g_escapeEndColor = "\033[0m";
		g_escapeClearLine = "\033[K";
	} else {
		g_stdoutIsTty = false;
		g_escapeBold = "";
		g_escapeRedBold = "";
		g_escapeGreenBold = "";
		g_escapeYellowBold = "";
		g_escapeUnderline = "";
		g_escapeEndColor = "";
		g_escapeClearLine = "";
    }
}

void
print_status(const char* format, ...)
{
    printf("\n%s%s", g_escapeBold, g_escapeUnderline);

    va_list args;
    va_start(args, format);
    vfprintf(stdout, format, args);
    va_end(args);

    printf("%s\n", g_escapeEndColor);
}

void
print_command(const Command& command)
{
    fputs(g_escapeBold, stdout);
    for (map<string,string>::const_iterator it=command.env.begin(); it!=command.env.end(); it++) {
        fputs(it->first.c_str(), stdout);
        fputc('=', stdout);
        fputs(escape_for_commandline(it->second.c_str()).c_str(), stdout);
        putc(' ', stdout);
    }
    fputs(command.prog.c_str(), stdout);
    for (vector<string>::const_iterator it=command.args.begin(); it!=command.args.end(); it++) {
        putc(' ', stdout);
        fputs(escape_for_commandline(it->c_str()).c_str(), stdout);
    }
    fputs(g_escapeEndColor, stdout);
    fputc('\n', stdout);
}

void
print_error(const char* format, ...)
{
    fputs(g_escapeRedBold, stderr);

    va_list args;
    va_start(args, format);
    vfprintf(stderr, format, args);
    va_end(args);

    fputs(g_escapeEndColor, stderr);
    fputc('\n', stderr);
}

void
print_warning(const char* format, ...)
{
    fputs(g_escapeYellowBold, stderr);

    va_list args;
    va_start(args, format);
    vfprintf(stderr, format, args);
    va_end(args);

    fputs(g_escapeEndColor, stderr);
    fputc('\n', stderr);
}

void
print_info(const char* format, ...)
{
    fputs(g_escapeBold, stdout);

    va_list args;
    va_start(args, format);
    vfprintf(stdout, format, args);
    va_end(args);

    fputs(g_escapeEndColor, stdout);
    fputc('\n', stdout);
}

void
print_one_line(const char* format, ...)
{
    if (g_stdoutIsTty) {
        struct winsize ws;
        ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);
        int size = ws.ws_col + 1;
        char* buf = (char*)malloc(size);

        va_list args;
        va_start(args, format);
        vsnprintf(buf, size, format, args);
        va_end(args);

        printf("%s%s\r", buf, g_escapeClearLine);
        free(buf);

        fflush(stdout);
    } else {
        va_list args;
        va_start(args, format);
        vfprintf(stdout, format, args);
        va_end(args);
        printf("\n");
    }
}

void
check_error(int err)
{
    if (err != 0) {
        fputc('\n', stderr);
        print_error("Stopping due to errors.");
        exit(1);
    }
}