xref: /dragonfly/tools/tools/ath/athstats/statfoo.c (revision df052c2a)
1cde9b937SSascha Wildner /*-
2cde9b937SSascha Wildner  * Copyright (c) 2002-2007 Sam Leffler, Errno Consulting
3cde9b937SSascha Wildner  * All rights reserved.
4cde9b937SSascha Wildner  *
5cde9b937SSascha Wildner  * Redistribution and use in source and binary forms, with or without
6cde9b937SSascha Wildner  * modification, are permitted provided that the following conditions
7cde9b937SSascha Wildner  * are met:
8cde9b937SSascha Wildner  * 1. Redistributions of source code must retain the above copyright
9cde9b937SSascha Wildner  *    notice, this list of conditions and the following disclaimer,
10cde9b937SSascha Wildner  *    without modification.
11cde9b937SSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12cde9b937SSascha Wildner  *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
13cde9b937SSascha Wildner  *    redistribution must be conditioned upon including a substantially
14cde9b937SSascha Wildner  *    similar Disclaimer requirement for further binary redistribution.
15cde9b937SSascha Wildner  *
16cde9b937SSascha Wildner  * NO WARRANTY
17cde9b937SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18cde9b937SSascha Wildner  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*df052c2aSSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTABILITY
20cde9b937SSascha Wildner  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21cde9b937SSascha Wildner  * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
22cde9b937SSascha Wildner  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23cde9b937SSascha Wildner  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24cde9b937SSascha Wildner  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25cde9b937SSascha Wildner  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26cde9b937SSascha Wildner  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27cde9b937SSascha Wildner  * THE POSSIBILITY OF SUCH DAMAGES.
28cde9b937SSascha Wildner  *
29cde9b937SSascha Wildner  * $FreeBSD: src/tools/tools/ath/athstats/statfoo.c,v 1.5 2009/02/13 05:42:25 sam Exp $
30cde9b937SSascha Wildner  */
31cde9b937SSascha Wildner 
32cde9b937SSascha Wildner #include <stdio.h>
33cde9b937SSascha Wildner #include <string.h>
34cde9b937SSascha Wildner 
35cde9b937SSascha Wildner #include "statfoo.h"
36cde9b937SSascha Wildner 
37cde9b937SSascha Wildner static void
statfoo_setfmt(struct statfoo * sf,const char * fmt0)38cde9b937SSascha Wildner statfoo_setfmt(struct statfoo *sf, const char *fmt0)
39cde9b937SSascha Wildner {
40cde9b937SSascha Wildner #define	N(a)	(sizeof(a)/sizeof(a[0]))
41cde9b937SSascha Wildner 	char fmt[4096];
42cde9b937SSascha Wildner 	char *fp, *tok;
43cde9b937SSascha Wildner 	int i, j;
44cde9b937SSascha Wildner 
45cde9b937SSascha Wildner 	j = 0;
46cde9b937SSascha Wildner 	strlcpy(fmt, fmt0, sizeof(fmt));
47cde9b937SSascha Wildner 	for (fp = fmt; (tok = strsep(&fp, ", ")) != NULL;) {
48cde9b937SSascha Wildner 		for (i = 0; i < sf->nstats; i++)
49cde9b937SSascha Wildner 			if (strcasecmp(tok, sf->stats[i].name) == 0)
50cde9b937SSascha Wildner 				break;
51cde9b937SSascha Wildner 		if (i >= sf->nstats) {
52cde9b937SSascha Wildner 			fprintf(stderr, "%s: unknown statistic name \"%s\" "
53cde9b937SSascha Wildner 				"skipped\n", sf->name, tok);
54cde9b937SSascha Wildner 			continue;
55cde9b937SSascha Wildner 		}
56cde9b937SSascha Wildner 		if (j+3 > sizeof(sf->fmts)) {
57cde9b937SSascha Wildner 			fprintf(stderr, "%s: not enough room for all stats; "
58cde9b937SSascha Wildner 				"stopped at %s\n", sf->name, tok);
59cde9b937SSascha Wildner 			break;
60cde9b937SSascha Wildner 		}
61cde9b937SSascha Wildner 		if (j != 0)
62cde9b937SSascha Wildner 			sf->fmts[j++] = ' ';
63cde9b937SSascha Wildner 		sf->fmts[j++] = 0x80 | i;
64cde9b937SSascha Wildner 	}
65cde9b937SSascha Wildner 	sf->fmts[j] = '\0';
66cde9b937SSascha Wildner #undef N
67cde9b937SSascha Wildner }
68cde9b937SSascha Wildner 
69cde9b937SSascha Wildner static void
statfoo_collect(struct statfoo * sf)70cde9b937SSascha Wildner statfoo_collect(struct statfoo *sf)
71cde9b937SSascha Wildner {
72cde9b937SSascha Wildner 	fprintf(stderr, "%s: don't know how to collect data\n", sf->name);
73cde9b937SSascha Wildner }
74cde9b937SSascha Wildner 
75cde9b937SSascha Wildner static void
statfoo_update_tot(struct statfoo * sf)76cde9b937SSascha Wildner statfoo_update_tot(struct statfoo *sf)
77cde9b937SSascha Wildner {
78cde9b937SSascha Wildner 	fprintf(stderr, "%s: don't know how to update total data\n", sf->name);
79cde9b937SSascha Wildner }
80cde9b937SSascha Wildner 
81cde9b937SSascha Wildner static int
statfoo_get(struct statfoo * sf,int s,char b[],size_t bs)82cde9b937SSascha Wildner statfoo_get(struct statfoo *sf, int s, char b[], size_t bs)
83cde9b937SSascha Wildner {
84cde9b937SSascha Wildner 	fprintf(stderr, "%s: don't know how to get stat #%u\n", sf->name, s);
85cde9b937SSascha Wildner 	return 0;
86cde9b937SSascha Wildner }
87cde9b937SSascha Wildner 
88cde9b937SSascha Wildner static void
statfoo_print_header(struct statfoo * sf,FILE * fd)89cde9b937SSascha Wildner statfoo_print_header(struct statfoo *sf, FILE *fd)
90cde9b937SSascha Wildner {
91cde9b937SSascha Wildner 	const unsigned char *cp;
92cde9b937SSascha Wildner 
93cde9b937SSascha Wildner 	for (cp = sf->fmts; *cp != '\0'; cp++) {
94cde9b937SSascha Wildner 		if (*cp & 0x80) {
95cde9b937SSascha Wildner 			const struct fmt *f = &sf->stats[*cp &~ 0x80];
96cde9b937SSascha Wildner 			fprintf(fd, "%*s", f->width, f->label);
97cde9b937SSascha Wildner 		} else
98cde9b937SSascha Wildner 			putc(*cp, fd);
99cde9b937SSascha Wildner 	}
100cde9b937SSascha Wildner 	putc('\n', fd);
101cde9b937SSascha Wildner }
102cde9b937SSascha Wildner 
103cde9b937SSascha Wildner static void
statfoo_print_current(struct statfoo * sf,FILE * fd)104cde9b937SSascha Wildner statfoo_print_current(struct statfoo *sf, FILE *fd)
105cde9b937SSascha Wildner {
106cde9b937SSascha Wildner 	char buf[32];
107cde9b937SSascha Wildner 	const unsigned char *cp;
108cde9b937SSascha Wildner 
109cde9b937SSascha Wildner 	for (cp = sf->fmts; *cp != '\0'; cp++) {
110cde9b937SSascha Wildner 		if (*cp & 0x80) {
111cde9b937SSascha Wildner 			const struct fmt *f = &sf->stats[*cp &~ 0x80];
112cde9b937SSascha Wildner 			if (sf->get_curstat(sf, *cp &~ 0x80, buf, sizeof(buf)))
113cde9b937SSascha Wildner 				fprintf(fd, "%*s", f->width, buf);
114cde9b937SSascha Wildner 		} else
115cde9b937SSascha Wildner 			putc(*cp, fd);
116cde9b937SSascha Wildner 	}
117cde9b937SSascha Wildner 	putc('\n', fd);
118cde9b937SSascha Wildner }
119cde9b937SSascha Wildner 
120cde9b937SSascha Wildner static void
statfoo_print_total(struct statfoo * sf,FILE * fd)121cde9b937SSascha Wildner statfoo_print_total(struct statfoo *sf, FILE *fd)
122cde9b937SSascha Wildner {
123cde9b937SSascha Wildner 	char buf[32];
124cde9b937SSascha Wildner 	const unsigned char *cp;
125cde9b937SSascha Wildner 
126cde9b937SSascha Wildner 	for (cp = sf->fmts; *cp != '\0'; cp++) {
127cde9b937SSascha Wildner 		if (*cp & 0x80) {
128cde9b937SSascha Wildner 			const struct fmt *f = &sf->stats[*cp &~ 0x80];
129cde9b937SSascha Wildner 			if (sf->get_totstat(sf, *cp &~ 0x80, buf, sizeof(buf)))
130cde9b937SSascha Wildner 				fprintf(fd, "%*s", f->width, buf);
131cde9b937SSascha Wildner 		} else
132cde9b937SSascha Wildner 			putc(*cp, fd);
133cde9b937SSascha Wildner 	}
134cde9b937SSascha Wildner 	putc('\n', fd);
135cde9b937SSascha Wildner }
136cde9b937SSascha Wildner 
137cde9b937SSascha Wildner static void
statfoo_print_verbose(struct statfoo * sf,FILE * fd)138cde9b937SSascha Wildner statfoo_print_verbose(struct statfoo *sf, FILE *fd)
139cde9b937SSascha Wildner {
140cde9b937SSascha Wildner 	const struct fmt *f;
141cde9b937SSascha Wildner 	char s[32];
142cde9b937SSascha Wildner 	int i, width;
143cde9b937SSascha Wildner 
144cde9b937SSascha Wildner 	width = 0;
145cde9b937SSascha Wildner 	for (i = 0; i < sf->nstats; i++) {
146cde9b937SSascha Wildner 		f = &sf->stats[i];
147cde9b937SSascha Wildner 		if (f->width > width)
148cde9b937SSascha Wildner 			width = f->width;
149cde9b937SSascha Wildner 	}
150cde9b937SSascha Wildner 	for (i = 0; i < sf->nstats; i++) {
151cde9b937SSascha Wildner 		f = &sf->stats[i];
152cde9b937SSascha Wildner 		if (sf->get_totstat(sf, i, s, sizeof(s)) && strcmp(s, "0"))
153cde9b937SSascha Wildner 			fprintf(fd, "%-*s %s\n", width, s, f->desc);
154cde9b937SSascha Wildner 	}
155cde9b937SSascha Wildner }
156cde9b937SSascha Wildner 
157cde9b937SSascha Wildner static void
statfoo_print_fields(struct statfoo * sf,FILE * fd)158cde9b937SSascha Wildner statfoo_print_fields(struct statfoo *sf, FILE *fd)
159cde9b937SSascha Wildner {
160cde9b937SSascha Wildner 	int i, w, width;
161cde9b937SSascha Wildner 
162cde9b937SSascha Wildner 	width = 0;
163cde9b937SSascha Wildner 	for (i = 0; i < sf->nstats; i++) {
164cde9b937SSascha Wildner 		w = strlen(sf->stats[i].name);
165cde9b937SSascha Wildner 		if (w > width)
166cde9b937SSascha Wildner 			width = w;
167cde9b937SSascha Wildner 	}
168cde9b937SSascha Wildner 	for (i = 0; i < sf->nstats; i++) {
169cde9b937SSascha Wildner 		const struct fmt *f = &sf->stats[i];
170cde9b937SSascha Wildner 		if (f->width != 0)
171cde9b937SSascha Wildner 			fprintf(fd, "%-*s %s\n", width, f->name, f->desc);
172cde9b937SSascha Wildner 	}
173cde9b937SSascha Wildner }
174cde9b937SSascha Wildner 
175cde9b937SSascha Wildner void
statfoo_init(struct statfoo * sf,const char * name,const struct fmt * stats,int nstats)176cde9b937SSascha Wildner statfoo_init(struct statfoo *sf, const char *name, const struct fmt *stats, int nstats)
177cde9b937SSascha Wildner {
178cde9b937SSascha Wildner 	sf->name = name;
179cde9b937SSascha Wildner 	sf->stats = stats;
180cde9b937SSascha Wildner 	sf->nstats = nstats;
181cde9b937SSascha Wildner 	sf->setfmt = statfoo_setfmt;
182cde9b937SSascha Wildner 	sf->collect_cur = statfoo_collect;
183cde9b937SSascha Wildner 	sf->collect_tot = statfoo_collect;
184cde9b937SSascha Wildner 	sf->update_tot = statfoo_update_tot;
185cde9b937SSascha Wildner 	sf->get_curstat = statfoo_get;
186cde9b937SSascha Wildner 	sf->get_totstat = statfoo_get;
187cde9b937SSascha Wildner 	sf->print_header = statfoo_print_header;
188cde9b937SSascha Wildner 	sf->print_current = statfoo_print_current;
189cde9b937SSascha Wildner 	sf->print_total = statfoo_print_total;
190cde9b937SSascha Wildner 	sf->print_verbose = statfoo_print_verbose;
191cde9b937SSascha Wildner 	sf->print_fields = statfoo_print_fields;
192cde9b937SSascha Wildner }
193