aboutsummaryrefslogtreecommitdiffstats
path: root/src/ckerrlog.c
blob: 9a63ffdf21cfc4e8bd4cca3159521ded94174edd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/* ckerrlog.c - Error report and logging for ck ------------------------*- C -*-
 *
 * This file is part of ck, the config keeper
 *
 * -----------------------------------------------------------------------------
 *
 * Copyright (C) 2018  Anastasis Grammenos
 * GPLv3 (see LICENCE for the full notice)
 *
 * -------------------------------------------------------------------------- */
#include <time.h>

#include "ckerrlog.h"
#include "ckutil.h"
#include "cklist.h"

ERRLOG(ckerrlog);

static int loglvl;
static char buf[STR_M];

#define X(stream) static cklist *stream;
CK_STREAMS
#undef X

char * get_time() {
  time_t rawtime;
  struct tm * timeinfo;
  time (&rawtime);
  timeinfo = localtime (&rawtime);
  strftime (buf,80,"[%c]",timeinfo);
  return buf;
}

void initialize_errlog() {
#define X(stream) stream = NULL;
  CK_STREAMS
#undef X
  loglvl = 0;
  cklog("%s Log session started", get_time());
}

#define X(stream)                                               \
  void add_ ## stream ## _with_delim(char *delim, char *txt,    \
                                     va_list args) {            \
    char tmp[STR_L];                                            \
    vsprintf(tmp, txt, args);                                   \
    if (stream) {                                               \
      list_add(stream, tmp);                                    \
      list_add(stream, delim);                                  \
      return;                                                   \
    }                                                           \
    stream = list_make_and_add(tmp);                            \
    list_add(stream, delim);                                    \
  }
CK_STREAMS
#undef X

#define X(stream)                                       \
  void ck## stream(char *txt, ...) {                    \
    va_list args;                                       \
    va_start(args, txt);                                \
    add_## stream ##_with_delim("\n", txt, args);       \
    va_end(args);                                       \
  }
CK_STREAMS
#undef X

#define X(stream)                               \
  void reset_## stream() {                      \
    list_free(stream);                          \
    stream = NULL;                              \
  }
CK_STREAMS
#undef X

#define X(stream)                                \
  void report_## stream() {                      \
    list_print_concat(stream);                   \
    reset_## stream();                           \
  }
CK_STREAMS
#undef X

void report_errlog() {
  if (!loglvl) {
#define X(stream)                               \
    if (stream) {                               \
      reset_##stream();                         \
    }
    CK_STREAMS
#undef X
      return;
  }
#define X(stream)                               \
  if (stream) {                                 \
    printf("%s:\n", #stream);                   \
    report_##stream();                          \
  }
  CK_STREAMS
#undef X
}

void ckerr_add_component(char *txt, ...) {
  va_list args;
  va_start(args, txt);
  add_err_with_delim(" ", txt, args);
  va_end(args);
}

extern void errlog_set_verbose(int level) {
  loglvl = level;
}