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