chiark / gitweb /
Implement the s3.13 compatibility casefolding transformation as
[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, *pnext;
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 = pnext) {
67     /* We must be able to cope with eventlog_remove() being called from inside
68      * the callback */
69     pnext = p->next;
70     p->fn(d.vec, p->user);
71   }
72 }
73
74 void eventlog_raw(const char *keyword, const char *raw, ...) {
75   va_list ap;
76
77   va_start(ap, raw);
78   veventlog(keyword, raw, ap);
79   va_end(ap);
80 }
81
82 void eventlog(const char *keyword, ...) {
83   va_list ap;
84
85   va_start(ap, keyword);
86   veventlog(keyword, 0, ap);
87   va_end(ap);
88 }
89
90 /*
91 Local Variables:
92 c-basic-offset:2
93 comment-column:40
94 fill-column:79
95 End:
96 */