1 /*
2  * Copyright (c) 2003, 2007-14 Matteo Frigo
3  * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology
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,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  *
19  */
20 
21 #include "api/api.h"
22 
23 typedef struct {
24      printer super;
25      size_t *cnt;
26 } P_cnt;
27 
putchr_cnt(printer * p_,char c)28 static void putchr_cnt(printer * p_, char c)
29 {
30      P_cnt *p = (P_cnt *) p_;
31      UNUSED(c);
32      ++*p->cnt;
33 }
34 
X(mkprinter_cnt)35 printer *X(mkprinter_cnt)(size_t *cnt)
36 {
37      P_cnt *p = (P_cnt *) X(mkprinter)(sizeof(P_cnt), putchr_cnt, 0);
38      p->cnt = cnt;
39      *cnt = 0;
40      return &p->super;
41 }
42 
43 typedef struct {
44      printer super;
45      char *s;
46 } P_str;
47 
putchr_str(printer * p_,char c)48 static void putchr_str(printer * p_, char c)
49 {
50      P_str *p = (P_str *) p_;
51      *p->s++ = c;
52      *p->s = 0;
53 }
54 
X(mkprinter_str)55 printer *X(mkprinter_str)(char *s)
56 {
57      P_str *p = (P_str *) X(mkprinter)(sizeof(P_str), putchr_str, 0);
58      p->s = s;
59      *s = 0;
60      return &p->super;
61 }
62