chiark / gitweb /
cope with "NN - " as well as "NN" in track names
[disorder] / lib / eventlog.c
1 /*
2  * This file is part of DisOrder
3  * Copyright (C) 2005 Richard Kettlewell
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18  * USA
19  */
20
21 #include <config.h>
22 #include "types.h"
23
24 #include <stdarg.h>
25 #include <stdio.h>
26 #include <string.h>
27
28 #include "mem.h"
29 #include "vector.h"
30 #include "printf.h"
31 #include "eventlog.h"
32 #include "split.h"
33
34 static struct eventlog_output *outputs;
35
36 void eventlog_add(struct eventlog_output *lo) {
37   lo->next = outputs;
38   outputs = lo;
39 }
40
41 void eventlog_remove(struct eventlog_output *lo) {
42   struct eventlog_output *p, **pp;
43
44   for(pp = &outputs; (p = *pp) && p != lo; pp = &p->next)
45     ;
46   if(p == lo)
47     *pp = lo->next;
48 }
49
50 static void veventlog(const char *keyword, const char *raw, va_list ap) {
51   struct eventlog_output *p;
52   struct dynstr d;
53   const char *param;
54
55   dynstr_init(&d);
56   dynstr_append_string(&d, keyword);
57   while((param = va_arg(ap, const char *))) {
58     dynstr_append(&d, ' ');
59     dynstr_append_string(&d, quoteutf8(param));
60   }
61   if(raw) {
62     dynstr_append(&d, ' ');
63     dynstr_append_string(&d, raw);
64   }
65   dynstr_terminate(&d);
66   for(p = outputs; p; p = p->next)
67     p->fn(d.vec, p->user);
68 }
69
70 void eventlog_raw(const char *keyword, const char *raw, ...) {
71   va_list ap;
72
73   va_start(ap, raw);
74   veventlog(keyword, raw, ap);
75   va_end(ap);
76 }
77
78 void eventlog(const char *keyword, ...) {
79   va_list ap;
80
81   va_start(ap, keyword);
82   veventlog(keyword, 0, ap);
83   va_end(ap);
84 }
85
86 /*
87 Local Variables:
88 c-basic-offset:2
89 comment-column:40
90 fill-column:79
91 End:
92 */