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