11d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// Copyright 2015 Google Inc. All rights reserved 21d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// 31d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// Licensed under the Apache License, Version 2.0 (the "License"); 41d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// you may not use this file except in compliance with the License. 51d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// You may obtain a copy of the License at 61d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// 71d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// http://www.apache.org/licenses/LICENSE-2.0 81d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// 91d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// Unless required by applicable law or agreed to in writing, software 101d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// distributed under the License is distributed on an "AS IS" BASIS, 111d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// See the License for the specific language governing permissions and 131d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// limitations under the License. 141d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji 15776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#ifndef LOG_H_ 16776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#define LOG_H_ 17776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 18776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include <errno.h> 19776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include <stdio.h> 20776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include <stdlib.h> 21776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include <string.h> 22776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 2354e52dd010583fcc5b0e528d26a5dbb5c2dbe603Shinichiro Hamaji#include "flags.h" 24e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen#include "log.h" 259db4cb8f6a0cc68faf43242bcc1d4c6108a5d94bShinichiro Hamaji#include "stringprintf.h" 269db4cb8f6a0cc68faf43242bcc1d4c6108a5d94bShinichiro Hamaji 27e9f7e6731eacbdc7bd7717e3f98e511e2e35f2f0Shinichiro Hamajiusing namespace std; 28e9f7e6731eacbdc7bd7717e3f98e511e2e35f2f0Shinichiro Hamaji 29e9f7e6731eacbdc7bd7717e3f98e511e2e35f2f0Shinichiro Hamajiextern bool g_log_no_exit; 30e9f7e6731eacbdc7bd7717e3f98e511e2e35f2f0Shinichiro Hamajiextern string* g_last_error; 31e9f7e6731eacbdc7bd7717e3f98e511e2e35f2f0Shinichiro Hamaji 328d503017f7fdb54fb6b522e0415751d7e172662fShinichiro Hamaji// Useful for logging-only arguments. 338d503017f7fdb54fb6b522e0415751d7e172662fShinichiro Hamaji#define UNUSED __attribute__((unused)) 348d503017f7fdb54fb6b522e0415751d7e172662fShinichiro Hamaji 356f04aed67d68992c7b5c635b6c1f7aa83fdeb1b7Shinichiro Hamaji#ifdef NOLOG 366f04aed67d68992c7b5c635b6c1f7aa83fdeb1b7Shinichiro Hamaji#define LOG(args...) 376f04aed67d68992c7b5c635b6c1f7aa83fdeb1b7Shinichiro Hamaji#else 389db4cb8f6a0cc68faf43242bcc1d4c6108a5d94bShinichiro Hamaji#define LOG(args...) do { \ 399db4cb8f6a0cc68faf43242bcc1d4c6108a5d94bShinichiro Hamaji fprintf(stderr, "*kati*: %s\n", StringPrintf(args).c_str()); \ 40776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji } while(0) 416f04aed67d68992c7b5c635b6c1f7aa83fdeb1b7Shinichiro Hamaji#endif 42776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 4354e52dd010583fcc5b0e528d26a5dbb5c2dbe603Shinichiro Hamaji#define LOG_STAT(args...) do { \ 44003d06ede28997fcfbda65a14907b3ca17fb2d39Shinichiro Hamaji if (g_flags.enable_stat_logs) \ 4554e52dd010583fcc5b0e528d26a5dbb5c2dbe603Shinichiro Hamaji fprintf(stderr, "*kati*: %s\n", StringPrintf(args).c_str()); \ 4654e52dd010583fcc5b0e528d26a5dbb5c2dbe603Shinichiro Hamaji } while(0) 4754e52dd010583fcc5b0e528d26a5dbb5c2dbe603Shinichiro Hamaji 487cf1935749d789e83403b242c6a270fa24f1a730Shinichiro Hamaji#define PLOG(...) do { \ 499db4cb8f6a0cc68faf43242bcc1d4c6108a5d94bShinichiro Hamaji fprintf(stderr, "%s: %s\n", StringPrintf(__VA_ARGS__).c_str(), \ 509db4cb8f6a0cc68faf43242bcc1d4c6108a5d94bShinichiro Hamaji strerror(errno)); \ 517cf1935749d789e83403b242c6a270fa24f1a730Shinichiro Hamaji } while (0) 527cf1935749d789e83403b242c6a270fa24f1a730Shinichiro Hamaji 537cf1935749d789e83403b242c6a270fa24f1a730Shinichiro Hamaji#define PERROR(...) do { \ 547cf1935749d789e83403b242c6a270fa24f1a730Shinichiro Hamaji PLOG(__VA_ARGS__); \ 559db4cb8f6a0cc68faf43242bcc1d4c6108a5d94bShinichiro Hamaji exit(1); \ 56776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji } while (0) 57776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 589db4cb8f6a0cc68faf43242bcc1d4c6108a5d94bShinichiro Hamaji#define WARN(...) do { \ 599db4cb8f6a0cc68faf43242bcc1d4c6108a5d94bShinichiro Hamaji fprintf(stderr, "%s\n", StringPrintf(__VA_ARGS__).c_str()); \ 606cb1c25696baa9484023e561de2cbc2aec749e14Shinichiro Hamaji } while (0) 616cb1c25696baa9484023e561de2cbc2aec749e14Shinichiro Hamaji 62644d6b9b5e0ffa14e38e7c2212e1a686b248c1cdShinichiro Hamaji#define KATI_WARN(...) do { \ 63644d6b9b5e0ffa14e38e7c2212e1a686b248c1cdShinichiro Hamaji if (g_flags.enable_kati_warnings) \ 64644d6b9b5e0ffa14e38e7c2212e1a686b248c1cdShinichiro Hamaji fprintf(stderr, "%s\n", StringPrintf(__VA_ARGS__).c_str()); \ 65644d6b9b5e0ffa14e38e7c2212e1a686b248c1cdShinichiro Hamaji } while (0) 66644d6b9b5e0ffa14e38e7c2212e1a686b248c1cdShinichiro Hamaji 67383cfe0344b5058512a2a7c0ceba87860bdf81abShinichiro Hamaji#define ERROR(...) do { \ 68383cfe0344b5058512a2a7c0ceba87860bdf81abShinichiro Hamaji if (!g_log_no_exit) { \ 69383cfe0344b5058512a2a7c0ceba87860bdf81abShinichiro Hamaji fprintf(stderr, "%s\n", StringPrintf(__VA_ARGS__).c_str()); \ 70383cfe0344b5058512a2a7c0ceba87860bdf81abShinichiro Hamaji exit(1); \ 71383cfe0344b5058512a2a7c0ceba87860bdf81abShinichiro Hamaji } \ 72383cfe0344b5058512a2a7c0ceba87860bdf81abShinichiro Hamaji g_last_error = new string(StringPrintf(__VA_ARGS__)); \ 73776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji } while (0) 74776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 75776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#define CHECK(c) if (!(c)) ERROR("%s:%d: %s", __FILE__, __LINE__, #c) 76776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji 77e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen// Set of logging functions that will automatically colorize lines that have 78e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen// location information when --color_warnings is set. 79e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsenvoid ColorWarnLog(const char* file, int line, const char *msg); 80e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsenvoid ColorErrorLog(const char* file, int line, const char *msg); 81e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen 82e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen#define WARN_LOC(loc, ...) do { \ 83e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen ColorWarnLog(LOCF(loc), StringPrintf(__VA_ARGS__).c_str()); \ 84e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen } while (0) 85e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen 86e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen#define KATI_WARN_LOC(loc, ...) do { \ 87e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen if (g_flags.enable_kati_warnings) \ 88e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen ColorWarnLog(LOCF(loc), StringPrintf(__VA_ARGS__).c_str()); \ 89e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen } while(0) 90e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen 91e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen#define ERROR_LOC(loc, ...) do { \ 92e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen ColorErrorLog(LOCF(loc), StringPrintf(__VA_ARGS__).c_str()); \ 93e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen } while (0) 94e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen 95776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#endif // LOG_H_ 96