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