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;
}