xref: /minix3/external/bsd/top/dist/color.c (revision b89261ba018da33f0bd8cd05f5a1fe9e7a9c837b)
1*b89261baSDavid van Moolenbroek /*
2*b89261baSDavid van Moolenbroek  * Copyright (c) 1984 through 2008, William LeFebvre
3*b89261baSDavid van Moolenbroek  * All rights reserved.
4*b89261baSDavid van Moolenbroek  *
5*b89261baSDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
6*b89261baSDavid van Moolenbroek  * modification, are permitted provided that the following conditions are met:
7*b89261baSDavid van Moolenbroek  *
8*b89261baSDavid van Moolenbroek  *     * Redistributions of source code must retain the above copyright
9*b89261baSDavid van Moolenbroek  * notice, this list of conditions and the following disclaimer.
10*b89261baSDavid van Moolenbroek  *
11*b89261baSDavid van Moolenbroek  *     * Redistributions in binary form must reproduce the above
12*b89261baSDavid van Moolenbroek  * copyright notice, this list of conditions and the following disclaimer
13*b89261baSDavid van Moolenbroek  * in the documentation and/or other materials provided with the
14*b89261baSDavid van Moolenbroek  * distribution.
15*b89261baSDavid van Moolenbroek  *
16*b89261baSDavid van Moolenbroek  *     * Neither the name of William LeFebvre nor the names of other
17*b89261baSDavid van Moolenbroek  * contributors may be used to endorse or promote products derived from
18*b89261baSDavid van Moolenbroek  * this software without specific prior written permission.
19*b89261baSDavid van Moolenbroek  *
20*b89261baSDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*b89261baSDavid van Moolenbroek  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*b89261baSDavid van Moolenbroek  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*b89261baSDavid van Moolenbroek  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24*b89261baSDavid van Moolenbroek  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25*b89261baSDavid van Moolenbroek  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26*b89261baSDavid van Moolenbroek  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*b89261baSDavid van Moolenbroek  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*b89261baSDavid van Moolenbroek  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*b89261baSDavid van Moolenbroek  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30*b89261baSDavid van Moolenbroek  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*b89261baSDavid van Moolenbroek  */
32*b89261baSDavid van Moolenbroek 
33*b89261baSDavid van Moolenbroek /*
34*b89261baSDavid van Moolenbroek  *  Top users/processes display for Unix
35*b89261baSDavid van Moolenbroek  *  Version 3
36*b89261baSDavid van Moolenbroek  */
37*b89261baSDavid van Moolenbroek 
38*b89261baSDavid van Moolenbroek /*
39*b89261baSDavid van Moolenbroek  * This file handles color definitions and access for augmenting
40*b89261baSDavid van Moolenbroek  * the output with ansi color sequences.
41*b89261baSDavid van Moolenbroek  *
42*b89261baSDavid van Moolenbroek  * The definition of a color setting is as follows, separated by
43*b89261baSDavid van Moolenbroek  * colons:
44*b89261baSDavid van Moolenbroek  *
45*b89261baSDavid van Moolenbroek  * tag=minimum,maximum#code
46*b89261baSDavid van Moolenbroek  *
47*b89261baSDavid van Moolenbroek  * "tag" is the name of the value to display with color.
48*b89261baSDavid van Moolenbroek  *
49*b89261baSDavid van Moolenbroek  * "minimum" and "maximum" are positive integer values defining a range:
50*b89261baSDavid van Moolenbroek  * when the value is within this range it will be shown with the
51*b89261baSDavid van Moolenbroek  * specified color.  A missing value indicates that no check should be
52*b89261baSDavid van Moolenbroek  * made (i.e.: ",25" is n <= 25; "25,50" is 25 <= n <= 50; and "50,"
53*b89261baSDavid van Moolenbroek  * is 50 <= n).
54*b89261baSDavid van Moolenbroek  *
55*b89261baSDavid van Moolenbroek  * "code" is the ansi sequence that defines the color to use with the
56*b89261baSDavid van Moolenbroek  * escape sequence "[m".  Semi-colons are allowed in this string to
57*b89261baSDavid van Moolenbroek  * combine attributes.
58*b89261baSDavid van Moolenbroek  */
59*b89261baSDavid van Moolenbroek 
60*b89261baSDavid van Moolenbroek #include "os.h"
61*b89261baSDavid van Moolenbroek #include "display.h"
62*b89261baSDavid van Moolenbroek #include "message.h"
63*b89261baSDavid van Moolenbroek #include "color.h"
64*b89261baSDavid van Moolenbroek #include "utils.h"
65*b89261baSDavid van Moolenbroek 
66*b89261baSDavid van Moolenbroek typedef struct color_entry {
67*b89261baSDavid van Moolenbroek     char *tag;
68*b89261baSDavid van Moolenbroek     int min;
69*b89261baSDavid van Moolenbroek     int max;
70*b89261baSDavid van Moolenbroek     char color;
71*b89261baSDavid van Moolenbroek     struct color_entry *next;
72*b89261baSDavid van Moolenbroek     struct color_entry *tagnext;
73*b89261baSDavid van Moolenbroek } color_entry;
74*b89261baSDavid van Moolenbroek 
75*b89261baSDavid van Moolenbroek static color_entry *entries = NULL;
76*b89261baSDavid van Moolenbroek 
77*b89261baSDavid van Moolenbroek static color_entry **bytag = NULL;
78*b89261baSDavid van Moolenbroek static char **bytag_names = NULL;
79*b89261baSDavid van Moolenbroek static int totaltags = 0;
80*b89261baSDavid van Moolenbroek static int tagcnt = 0;
81*b89261baSDavid van Moolenbroek static int color_off = 0;
82*b89261baSDavid van Moolenbroek 
83*b89261baSDavid van Moolenbroek static char **color_ansi = NULL;
84*b89261baSDavid van Moolenbroek static int num_color_ansi = 0;
85*b89261baSDavid van Moolenbroek static int max_color_ansi = 0;
86*b89261baSDavid van Moolenbroek 
87*b89261baSDavid van Moolenbroek static int
color_slot(const char * str)88*b89261baSDavid van Moolenbroek color_slot(const char *str)
89*b89261baSDavid van Moolenbroek 
90*b89261baSDavid van Moolenbroek {
91*b89261baSDavid van Moolenbroek     int i;
92*b89261baSDavid van Moolenbroek 
93*b89261baSDavid van Moolenbroek     for (i = 0; i < num_color_ansi; i++)
94*b89261baSDavid van Moolenbroek     {
95*b89261baSDavid van Moolenbroek 	if (strcmp(color_ansi[i], str) == 0)
96*b89261baSDavid van Moolenbroek 	{
97*b89261baSDavid van Moolenbroek 	    return i;
98*b89261baSDavid van Moolenbroek 	}
99*b89261baSDavid van Moolenbroek     }
100*b89261baSDavid van Moolenbroek 
101*b89261baSDavid van Moolenbroek     /* need a new slot */
102*b89261baSDavid van Moolenbroek     if (num_color_ansi >= max_color_ansi)
103*b89261baSDavid van Moolenbroek     {
104*b89261baSDavid van Moolenbroek 	max_color_ansi += COLOR_ANSI_SLOTS;
105*b89261baSDavid van Moolenbroek 	color_ansi = erealloc(color_ansi, max_color_ansi * sizeof(char *));
106*b89261baSDavid van Moolenbroek     }
107*b89261baSDavid van Moolenbroek     color_ansi[num_color_ansi] = estrdup(str);
108*b89261baSDavid van Moolenbroek     return num_color_ansi++;
109*b89261baSDavid van Moolenbroek }
110*b89261baSDavid van Moolenbroek 
111*b89261baSDavid van Moolenbroek /*
112*b89261baSDavid van Moolenbroek  * int color_env_parse(char *env)
113*b89261baSDavid van Moolenbroek  *
114*b89261baSDavid van Moolenbroek  * Parse a color specification "env" (such as one found in the environment) and
115*b89261baSDavid van Moolenbroek  * add them to the list of entries.  Always returns 0.  Should only be called
116*b89261baSDavid van Moolenbroek  * once.
117*b89261baSDavid van Moolenbroek  */
118*b89261baSDavid van Moolenbroek 
119*b89261baSDavid van Moolenbroek int
color_env_parse(char * env)120*b89261baSDavid van Moolenbroek color_env_parse(char *env)
121*b89261baSDavid van Moolenbroek 
122*b89261baSDavid van Moolenbroek {
123*b89261baSDavid van Moolenbroek     char *p;
124*b89261baSDavid van Moolenbroek     char *min;
125*b89261baSDavid van Moolenbroek     char *max;
126*b89261baSDavid van Moolenbroek     char *str;
127*b89261baSDavid van Moolenbroek     int len;
128*b89261baSDavid van Moolenbroek     color_entry *ce;
129*b89261baSDavid van Moolenbroek 
130*b89261baSDavid van Moolenbroek     /* initialization */
131*b89261baSDavid van Moolenbroek     color_ansi = emalloc(COLOR_ANSI_SLOTS * sizeof(char *));
132*b89261baSDavid van Moolenbroek     max_color_ansi = COLOR_ANSI_SLOTS;
133*b89261baSDavid van Moolenbroek 
134*b89261baSDavid van Moolenbroek     /* color slot 0 is always "0" */
135*b89261baSDavid van Moolenbroek     color_slot("0");
136*b89261baSDavid van Moolenbroek 
137*b89261baSDavid van Moolenbroek     if (env != NULL)
138*b89261baSDavid van Moolenbroek     {
139*b89261baSDavid van Moolenbroek 	p = strtok(env, ":");
140*b89261baSDavid van Moolenbroek 	while (p != NULL)
141*b89261baSDavid van Moolenbroek 	{
142*b89261baSDavid van Moolenbroek 	    if ((min = strchr(p, '=')) != NULL &&
143*b89261baSDavid van Moolenbroek 		(max = strchr(min, ',')) != NULL &&
144*b89261baSDavid van Moolenbroek 		(str = strchr(max, '#')) != NULL)
145*b89261baSDavid van Moolenbroek 	    {
146*b89261baSDavid van Moolenbroek 		ce = emalloc(sizeof(color_entry));
147*b89261baSDavid van Moolenbroek 		len = min - p;
148*b89261baSDavid van Moolenbroek 		ce->tag = emalloc(len + 1);
149*b89261baSDavid van Moolenbroek 		strncpy(ce->tag, p, len);
150*b89261baSDavid van Moolenbroek 		ce->tag[len] = '\0';
151*b89261baSDavid van Moolenbroek 		ce->min = atoi(++min);
152*b89261baSDavid van Moolenbroek 		ce->max = atoi(++max);
153*b89261baSDavid van Moolenbroek 		ce->color = color_slot(++str);
154*b89261baSDavid van Moolenbroek 		ce->next = entries;
155*b89261baSDavid van Moolenbroek 		entries = ce;
156*b89261baSDavid van Moolenbroek 	    }
157*b89261baSDavid van Moolenbroek 	    else
158*b89261baSDavid van Moolenbroek 	    {
159*b89261baSDavid van Moolenbroek 		if (min != NULL)
160*b89261baSDavid van Moolenbroek 		{
161*b89261baSDavid van Moolenbroek 		    len = min - p;
162*b89261baSDavid van Moolenbroek 		}
163*b89261baSDavid van Moolenbroek 		else
164*b89261baSDavid van Moolenbroek 		{
165*b89261baSDavid van Moolenbroek 		    len = strlen(p);
166*b89261baSDavid van Moolenbroek 		}
167*b89261baSDavid van Moolenbroek 		message_error(" %.*s: bad color entry", len, p);
168*b89261baSDavid van Moolenbroek 	    }
169*b89261baSDavid van Moolenbroek 	    p = strtok(NULL, ":");
170*b89261baSDavid van Moolenbroek 	}
171*b89261baSDavid van Moolenbroek     }
172*b89261baSDavid van Moolenbroek     return 0;
173*b89261baSDavid van Moolenbroek }
174*b89261baSDavid van Moolenbroek 
175*b89261baSDavid van Moolenbroek /*
176*b89261baSDavid van Moolenbroek  * int color_tag(char *tag)
177*b89261baSDavid van Moolenbroek  *
178*b89261baSDavid van Moolenbroek  * Declare "tag" as a color tag.  Return a tag index to use when testing
179*b89261baSDavid van Moolenbroek  * a value against the tests for this tag.  Should not be called before
180*b89261baSDavid van Moolenbroek  * color_env_parse.
181*b89261baSDavid van Moolenbroek  */
182*b89261baSDavid van Moolenbroek 
183*b89261baSDavid van Moolenbroek int
color_tag(const char * tag)184*b89261baSDavid van Moolenbroek color_tag(const char *tag)
185*b89261baSDavid van Moolenbroek 
186*b89261baSDavid van Moolenbroek {
187*b89261baSDavid van Moolenbroek     color_entry *entryp;
188*b89261baSDavid van Moolenbroek     color_entry *tp;
189*b89261baSDavid van Moolenbroek 
190*b89261baSDavid van Moolenbroek     /* check for absurd arguments */
191*b89261baSDavid van Moolenbroek     if (tag == NULL || *tag == '\0')
192*b89261baSDavid van Moolenbroek     {
193*b89261baSDavid van Moolenbroek 	return -1;
194*b89261baSDavid van Moolenbroek     }
195*b89261baSDavid van Moolenbroek 
196*b89261baSDavid van Moolenbroek     dprintf("color_tag(%s)\n", tag);
197*b89261baSDavid van Moolenbroek 
198*b89261baSDavid van Moolenbroek     /* initial allocation */
199*b89261baSDavid van Moolenbroek     if (bytag == NULL)
200*b89261baSDavid van Moolenbroek     {
201*b89261baSDavid van Moolenbroek 	totaltags = 10;
202*b89261baSDavid van Moolenbroek 	bytag = emalloc(totaltags * sizeof(color_entry *));
203*b89261baSDavid van Moolenbroek 	bytag_names = emalloc(totaltags * sizeof(char *));
204*b89261baSDavid van Moolenbroek     }
205*b89261baSDavid van Moolenbroek 
206*b89261baSDavid van Moolenbroek     /* if we dont have enough room then reallocate */
207*b89261baSDavid van Moolenbroek     if (tagcnt >= totaltags)
208*b89261baSDavid van Moolenbroek     {
209*b89261baSDavid van Moolenbroek 	totaltags *= 2;
210*b89261baSDavid van Moolenbroek 	bytag = erealloc(bytag, totaltags * sizeof(color_entry *));
211*b89261baSDavid van Moolenbroek 	bytag_names = erealloc(bytag_names, totaltags * sizeof(char *));
212*b89261baSDavid van Moolenbroek     }
213*b89261baSDavid van Moolenbroek 
214*b89261baSDavid van Moolenbroek     /* initialize scan */
215*b89261baSDavid van Moolenbroek     entryp = entries;
216*b89261baSDavid van Moolenbroek     tp = NULL;
217*b89261baSDavid van Moolenbroek 
218*b89261baSDavid van Moolenbroek     /* look for tag in the list of entries */
219*b89261baSDavid van Moolenbroek     while (entryp != NULL)
220*b89261baSDavid van Moolenbroek     {
221*b89261baSDavid van Moolenbroek 	if (strcmp(entryp->tag, tag) == 0)
222*b89261baSDavid van Moolenbroek 	{
223*b89261baSDavid van Moolenbroek 	    entryp->tagnext = tp;
224*b89261baSDavid van Moolenbroek 	    tp = entryp;
225*b89261baSDavid van Moolenbroek 	}
226*b89261baSDavid van Moolenbroek 	entryp = entryp->next;
227*b89261baSDavid van Moolenbroek     }
228*b89261baSDavid van Moolenbroek 
229*b89261baSDavid van Moolenbroek     /* we track names in the array bytag */
230*b89261baSDavid van Moolenbroek     bytag[tagcnt] = tp;
231*b89261baSDavid van Moolenbroek     bytag_names[tagcnt] = estrdup(tag);
232*b89261baSDavid van Moolenbroek 
233*b89261baSDavid van Moolenbroek     /* return this index number as a reference */
234*b89261baSDavid van Moolenbroek     dprintf("color_tag: returns %d\n", tagcnt);
235*b89261baSDavid van Moolenbroek     return (tagcnt++);
236*b89261baSDavid van Moolenbroek }
237*b89261baSDavid van Moolenbroek 
238*b89261baSDavid van Moolenbroek /*
239*b89261baSDavid van Moolenbroek  * int color_test(int tagidx, int value)
240*b89261baSDavid van Moolenbroek  *
241*b89261baSDavid van Moolenbroek  * Test "value" against tests for tag "tagidx", a number previously returned
242*b89261baSDavid van Moolenbroek  * by color_tag.  Return the correct color number to use when highlighting.
243*b89261baSDavid van Moolenbroek  * If there is no match, return 0 (color 0).
244*b89261baSDavid van Moolenbroek  */
245*b89261baSDavid van Moolenbroek 
246*b89261baSDavid van Moolenbroek int
color_test(int tagidx,int value)247*b89261baSDavid van Moolenbroek color_test(int tagidx, int value)
248*b89261baSDavid van Moolenbroek 
249*b89261baSDavid van Moolenbroek {
250*b89261baSDavid van Moolenbroek     color_entry *ce;
251*b89261baSDavid van Moolenbroek 
252*b89261baSDavid van Moolenbroek     /* sanity check */
253*b89261baSDavid van Moolenbroek     if (tagidx < 0 || tagidx >= tagcnt || color_off)
254*b89261baSDavid van Moolenbroek     {
255*b89261baSDavid van Moolenbroek 	return 0;
256*b89261baSDavid van Moolenbroek     }
257*b89261baSDavid van Moolenbroek 
258*b89261baSDavid van Moolenbroek     ce = bytag[tagidx];
259*b89261baSDavid van Moolenbroek 
260*b89261baSDavid van Moolenbroek     while (ce != NULL)
261*b89261baSDavid van Moolenbroek     {
262*b89261baSDavid van Moolenbroek 	if ((!ce->min || ce->min <= value) &&
263*b89261baSDavid van Moolenbroek 	    (!ce->max || ce->max >= value))
264*b89261baSDavid van Moolenbroek 	{
265*b89261baSDavid van Moolenbroek 	    return ce->color;
266*b89261baSDavid van Moolenbroek 	}
267*b89261baSDavid van Moolenbroek 	ce = ce->tagnext;
268*b89261baSDavid van Moolenbroek     }
269*b89261baSDavid van Moolenbroek 
270*b89261baSDavid van Moolenbroek     return 0;
271*b89261baSDavid van Moolenbroek }
272*b89261baSDavid van Moolenbroek 
273*b89261baSDavid van Moolenbroek /*
274*b89261baSDavid van Moolenbroek  * char *color_setstr(int color)
275*b89261baSDavid van Moolenbroek  *
276*b89261baSDavid van Moolenbroek  * Return ANSI string to set the terminal for color number "color".
277*b89261baSDavid van Moolenbroek  */
278*b89261baSDavid van Moolenbroek 
279*b89261baSDavid van Moolenbroek char *
color_setstr(int color)280*b89261baSDavid van Moolenbroek color_setstr(int color)
281*b89261baSDavid van Moolenbroek 
282*b89261baSDavid van Moolenbroek {
283*b89261baSDavid van Moolenbroek     static char v[32];
284*b89261baSDavid van Moolenbroek 
285*b89261baSDavid van Moolenbroek     v[0] = '\0';
286*b89261baSDavid van Moolenbroek     if (color >= 0 && color < num_color_ansi)
287*b89261baSDavid van Moolenbroek     {
288*b89261baSDavid van Moolenbroek 	snprintf(v, sizeof(v), "\033[%sm", color_ansi[color]);
289*b89261baSDavid van Moolenbroek     }
290*b89261baSDavid van Moolenbroek     return v;
291*b89261baSDavid van Moolenbroek }
292*b89261baSDavid van Moolenbroek 
293*b89261baSDavid van Moolenbroek void
color_dump(FILE * f)294*b89261baSDavid van Moolenbroek color_dump(FILE *f)
295*b89261baSDavid van Moolenbroek 
296*b89261baSDavid van Moolenbroek {
297*b89261baSDavid van Moolenbroek     color_entry *ep;
298*b89261baSDavid van Moolenbroek     int i;
299*b89261baSDavid van Moolenbroek     int col;
300*b89261baSDavid van Moolenbroek     int len;
301*b89261baSDavid van Moolenbroek 
302*b89261baSDavid van Moolenbroek     fputs("These color tags are available:", f);
303*b89261baSDavid van Moolenbroek     col = 81;
304*b89261baSDavid van Moolenbroek     for (i = 0; i < tagcnt; i++)
305*b89261baSDavid van Moolenbroek     {
306*b89261baSDavid van Moolenbroek 	len = strlen(bytag_names[i]) + 1;
307*b89261baSDavid van Moolenbroek 	if (len + col > 79)
308*b89261baSDavid van Moolenbroek 	{
309*b89261baSDavid van Moolenbroek 	    fputs("\n  ", f);
310*b89261baSDavid van Moolenbroek 	    col = 2;
311*b89261baSDavid van Moolenbroek 	}
312*b89261baSDavid van Moolenbroek 	fprintf(f, " %s", bytag_names[i]);
313*b89261baSDavid van Moolenbroek 	col += len;
314*b89261baSDavid van Moolenbroek     }
315*b89261baSDavid van Moolenbroek 
316*b89261baSDavid van Moolenbroek     fputs("\n\nTop color settings:\n", f);
317*b89261baSDavid van Moolenbroek 
318*b89261baSDavid van Moolenbroek     for (i = 0; i < tagcnt; i++)
319*b89261baSDavid van Moolenbroek     {
320*b89261baSDavid van Moolenbroek 	ep = bytag[i];
321*b89261baSDavid van Moolenbroek 	while (ep != NULL)
322*b89261baSDavid van Moolenbroek 	{
323*b89261baSDavid van Moolenbroek 	    fprintf(f, "   %s (%d-", ep->tag, ep->min);
324*b89261baSDavid van Moolenbroek 	    if (ep->max != 0)
325*b89261baSDavid van Moolenbroek 	    {
326*b89261baSDavid van Moolenbroek 		fprintf(f, "%d", ep->max);
327*b89261baSDavid van Moolenbroek 	    }
328*b89261baSDavid van Moolenbroek 	    fprintf(f, "): ansi color %s, %sSample Text",
329*b89261baSDavid van Moolenbroek 		    color_ansi[(int)ep->color],
330*b89261baSDavid van Moolenbroek 		    color_setstr(ep->color));
331*b89261baSDavid van Moolenbroek 	    fprintf(f, "%s\n", color_setstr(0));
332*b89261baSDavid van Moolenbroek 	    ep = ep -> tagnext;
333*b89261baSDavid van Moolenbroek 	}
334*b89261baSDavid van Moolenbroek     }
335*b89261baSDavid van Moolenbroek }
336*b89261baSDavid van Moolenbroek 
337*b89261baSDavid van Moolenbroek #ifdef notdef
338*b89261baSDavid van Moolenbroek void
color_debug(FILE * f)339*b89261baSDavid van Moolenbroek color_debug(FILE *f)
340*b89261baSDavid van Moolenbroek {
341*b89261baSDavid van Moolenbroek     color_entry *ep;
342*b89261baSDavid van Moolenbroek     int i;
343*b89261baSDavid van Moolenbroek 
344*b89261baSDavid van Moolenbroek     fprintf(f, "color debug dump\n");
345*b89261baSDavid van Moolenbroek     ep = entries;
346*b89261baSDavid van Moolenbroek     while (ep != NULL)
347*b89261baSDavid van Moolenbroek     {
348*b89261baSDavid van Moolenbroek 	fprintf(f, "%s(%d,%d): slot %d, ansi %s, %sSample Text",
349*b89261baSDavid van Moolenbroek 		ep->tag, ep->min, ep->max, ep->color, color_ansi[(int)ep->color],
350*b89261baSDavid van Moolenbroek 	       color_setstr(ep->color));
351*b89261baSDavid van Moolenbroek 	fprintf(f, "%s\n", color_setstr(0));
352*b89261baSDavid van Moolenbroek 	ep = ep -> next;
353*b89261baSDavid van Moolenbroek     }
354*b89261baSDavid van Moolenbroek 
355*b89261baSDavid van Moolenbroek     fprintf(f, "\ntags:");
356*b89261baSDavid van Moolenbroek     for (i = 0; i < tagcnt; i++)
357*b89261baSDavid van Moolenbroek     {
358*b89261baSDavid van Moolenbroek 	fprintf(f, " %s", bytag_names[i]);
359*b89261baSDavid van Moolenbroek     }
360*b89261baSDavid van Moolenbroek     fprintf(f, "\n");
361*b89261baSDavid van Moolenbroek }
362*b89261baSDavid van Moolenbroek #endif
363*b89261baSDavid van Moolenbroek 
364*b89261baSDavid van Moolenbroek int
color_activate(int i)365*b89261baSDavid van Moolenbroek color_activate(int i)
366*b89261baSDavid van Moolenbroek 
367*b89261baSDavid van Moolenbroek {
368*b89261baSDavid van Moolenbroek     if (i == -1)
369*b89261baSDavid van Moolenbroek     {
370*b89261baSDavid van Moolenbroek 	color_off = !color_off;
371*b89261baSDavid van Moolenbroek     }
372*b89261baSDavid van Moolenbroek     else
373*b89261baSDavid van Moolenbroek     {
374*b89261baSDavid van Moolenbroek 	color_off = !i;
375*b89261baSDavid van Moolenbroek     }
376*b89261baSDavid van Moolenbroek     return color_off;
377*b89261baSDavid van Moolenbroek }
378