Colorful Print In C

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdarg.h>
#include <sys/time.h>
#include <time.h>

#define LENGTH_32                        32

#define DBG_MAX_BUFFER                  4096
#define DBG_MAX_MESSAGE_BUF             1024

#define SYS_INFO_PRINTF                 0x12345678

#define COLOR_TYPE_NONE                 0
#define COLOR_TYPE_TIME                 1
#define COLOR_TYPE_MSG                  2
        
#define PRINT_TYPE_SCREEN               0
#define PRINT_TYPE_FILE                 1
        
#define COLOR_FMT_NONE                  "\033[0m"
#define COLOR_FMT_DARK_GRAY             "\033[1;30m"    //深灰色
#define COLOR_FMT_RED                   "\033[0;31m"    //红色
#define COLOR_FMT_LIGHT_RED             "\033[1;31m"    //亮红色
#define COLOR_FMT_GREEN                 "\033[0;32m"    //绿色
#define COLOR_FMT_LIGHT_GREEN           "\033[1;32m"    //亮绿色
#define COLOR_FMT_YELLOW                "\033[0;33m"    //黄色
#define COLOR_FMT_LIGHT_YELLOW          "\033[1;33m"    //亮黄色
#define COLOR_FMT_BLUE                  "\033[0;34m"    //蓝色
#define COLOR_FMT_LIGHT_BLUE            "\033[1;34m"    //亮蓝色
#define COLOR_FMT_PURPLE                "\033[0;35m"    //紫色
#define COLOR_FMT_LIGHT_PURPLE          "\033[1;35m"    //亮紫色
#define COLOR_FMT_CYAN                  "\033[0;36m"    //青色
#define COLOR_FMT_LIGHT_CYAN            "\033[1;36m"    //亮青色
#define COLOR_FMT_LIGHT_GRAY            "\033[0;37m"    //浅灰色
#define COLOR_FMT_WHITE                 "\033[1;37m"    //白色
#define COLOR_FMT_GREEN_92_0            "\033[92;0m"    //绿色0
#define COLOR_FMT_GREEN_92_1            "\033[92;1m"    //绿色1
#define COLOR_FMT_GREEN_92_2            "\033[92;2m"    //绿色2
#define COLOR_FMT_GREEN_92_3            "\033[92;3m"    //绿色3
#define COLOR_FMT_GREEN_92_4            "\033[92;4m"    //绿色4
#define COLOR_FMT_GREEN_92_5            "\033[92;5m"    //绿色5

int Zunnajim_GetTime(char* _pBuf, int _iLen)
{
    time_t now;
    struct tm stTmNow;
    struct timeval tv;

    /*格式化时间戳*/
    //now = time(&now);
    (void)gettimeofday(&tv, NULL);

    now = tv.tv_sec;
    (void)localtime_r(&now, &stTmNow);

    (void)snprintf(_pBuf, _iLen, "[%04d/%02d/%02d %02d:%02d:%02d.%03d %d]",
                  stTmNow.tm_year+1900,
                  stTmNow.tm_mon+1,
                  stTmNow.tm_mday,
                  (stTmNow.tm_hour)%24,
                  stTmNow.tm_min,
                  stTmNow.tm_sec,
                  (int)tv.tv_usec/1000,
                  (int)getpid());

    return 0;
}

int Zunnajim_print(int _iType,char* _pcColorHead, char* fmt, ...)
{
    int iRet = 0;
    int iPosition = 0;
    
    if(NULL == _pcColorHead)
    {
        printf("%s%s %d INPUT PARAM INVALID!%s",COLOR_FMT_LIGHT_RED, __FUNCTION__, __LINE__, COLOR_FMT_LIGHT_RED);
    }

    va_list va;

    char cFormat[DBG_MAX_MESSAGE_BUF];
    char cString[DBG_MAX_BUFFER];
    char cMessage[DBG_MAX_MESSAGE_BUF];
    char cTimeInfo[DBG_MAX_MESSAGE_BUF];

    int iColorType = 0;
    int iPrinttype = 0;

    char* cColorHead = "";
    char* cColorTail = COLOR_FMT_NONE;

    (void)memset(cFormat, 0, sizeof(cFormat));
    (void)memset(cString, 0, sizeof(cString));
    (void)memset(cMessage, 0, sizeof(cMessage));
    (void)memset(cTimeInfo, 0, sizeof(cTimeInfo));

    /*调整行尾字符*/
    iPosition = snprintf(cFormat,sizeof(cFormat)-1,"%s",fmt);
    if ((iPosition<=0) || (iPosition+3>=(int)(sizeof(cFormat))))
    {
        return -1;
    }

    if (cFormat[iPosition-1]=='\n')
    {
        cFormat[iPosition] = cFormat[iPosition-2]=='\r' ?'\0':'\r';
    }
    else if(cFormat[iPosition-1]=='\r')
    {
        cFormat[iPosition] = cFormat[iPosition-2]=='\n' ?'\0':'\n';
    }
    else
    {
        cFormat[iPosition] = '\r';
        cFormat[iPosition+1] = '\n';
    }

    struct timeval tv;
    (void)gettimeofday(&tv, NULL);

    /*格式化时间戳*/
    Zunnajim_GetTime(cTimeInfo, sizeof(cTimeInfo));

    /*格式化打印信息*/
    va_start(va, fmt);
    (void)vsnprintf(cMessage,sizeof(cMessage)-1,cFormat,va);
    va_end(va);

    /*处理颜色参数*/
    switch (_iType)
    {
        case 0:
            iPrinttype = PRINT_TYPE_SCREEN;
            iColorType = COLOR_TYPE_TIME;
            cColorHead = COLOR_FMT_LIGHT_YELLOW;
            break;

        case 0xFF0000:
            iPrinttype = PRINT_TYPE_SCREEN;
            iColorType = COLOR_TYPE_TIME;
            cColorHead = COLOR_FMT_LIGHT_RED;
            break;

        case 0xFF00FF:
            iPrinttype = PRINT_TYPE_SCREEN;
            iColorType = COLOR_TYPE_TIME;
            cColorHead = COLOR_FMT_LIGHT_PURPLE;
            break;

        case SYS_INFO_PRINTF:
            iPrinttype = PRINT_TYPE_SCREEN;
            iColorType = COLOR_TYPE_MSG;
            cColorHead = COLOR_FMT_LIGHT_CYAN;
            break;

        default:
            iPrinttype = PRINT_TYPE_SCREEN;
            iColorType = COLOR_TYPE_NONE;
            cColorHead = "";
            break;
    }

    /*输出全部信息*/
    if (COLOR_TYPE_TIME==iColorType)
    {
        (void)snprintf(cString,sizeof(cString)-1,"%s%s%s%s%s%s",cColorHead,cTimeInfo,cColorTail, _pcColorHead, cMessage, cColorTail);
    }
    else if (COLOR_TYPE_MSG==iColorType)
    {
        (void)snprintf(cString,sizeof(cString)-1,"%s%s%s%s%s%s",cColorHead,cTimeInfo,cColorTail, _pcColorHead, cMessage, cColorTail);
    }
    else
    {
        (void)snprintf(cString,sizeof(cString)-1,"%s%s",cTimeInfo,cMessage);
    }

    if (PRINT_TYPE_SCREEN==iPrinttype)
    {
        (void)printf("%s",cString);
    }
    else            /* print to file */
    {
        /* To be Implemeted! */
    }

END:
    return iRet;
}

int main()
{
    char cColors[][LENGTH_32] = {
            COLOR_FMT_NONE,             "默认",
            COLOR_FMT_DARK_GRAY,        "[1;30m 深灰色",
            COLOR_FMT_RED,              "[0;31m 红色",
            COLOR_FMT_LIGHT_RED,        "[1;31m 亮红色",
            COLOR_FMT_GREEN,            "[0;32m 绿色",
            COLOR_FMT_LIGHT_GREEN,      "[1;32m 亮绿色",
            COLOR_FMT_YELLOW,           "[0;33m 黄色",
            COLOR_FMT_LIGHT_YELLOW,     "[1;33m 亮黄色",
            COLOR_FMT_BLUE,             "[0;34m 蓝色",
            COLOR_FMT_LIGHT_BLUE,       "[1;34m 亮蓝色",
            COLOR_FMT_PURPLE,           "[0;35m 紫色",
            COLOR_FMT_LIGHT_PURPLE,     "[1;35m 亮紫色",
            COLOR_FMT_CYAN,             "[0;36m 青色",
            COLOR_FMT_LIGHT_CYAN,       "[1;36m 亮青色",
            COLOR_FMT_LIGHT_GRAY,       "[0;37m 浅灰色",
            COLOR_FMT_WHITE,            "[1;37m 白色",
            COLOR_FMT_GREEN_92_0,       "[92;0m 绿色0",
            COLOR_FMT_GREEN_92_1,       "[92;1m 绿色1",
            COLOR_FMT_GREEN_92_2,       "[92;2m 绿色2",
            COLOR_FMT_GREEN_92_3,       "[92;3m 绿色3",
            COLOR_FMT_GREEN_92_4,       "[92;4m 绿色4",
            COLOR_FMT_GREEN_92_5,       "[92;5m 绿色5",

    };        
    int iColorNum = sizeof(cColors) / sizeof(cColors[0]);
    printf("\033[31;5m************************************************ Print Start! ************************************************************ \n\033[00m");
    for(int iIndex = 0; iIndex < iColorNum; iIndex+=2)
    {
        (void)Zunnajim_print(0xFF00FF, cColors[iIndex], "LOG_LEVEL:DEBUG COLORTYPE:%s", cColors[iIndex + 1]);
    }
    printf("\033[31;5m************************************************ Print End! ************************************************************** \n\033[00m");
    return 0;
}
07-12 00:01