* Implement a different way to delete a password from the cache.
[alpine.git] / web / src / alpined.d / color.c
blob517212f106c4e1dd0c7e06bd6e9741df4e755d7a
1 /* ========================================================================
2 * Copyright 2006-2007 University of Washington
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * ========================================================================
13 #include <system.h>
14 #include <general.h>
16 #include "../../../pith/osdep/color.h"
17 #include "../../../pith/osdep/collate.h"
20 static COLOR_PAIR *the_rev_color;
21 static char *_nfcolor, *_nbcolor, *_rfcolor, *_rbcolor;
22 static char *_last_fg_color, *_last_bg_color;
23 static int _force_fg_color_change, _force_bg_color_change;
26 /* * * * * * * PITH-REQUIRED COLOR ROUTINES * * * * * * */
28 /* internal prototypes */
29 char *alpine_color_name(char *);
30 int alpine_valid_rgb(char *s);
32 int
33 pico_usingcolor(void)
35 return(TRUE);
39 int
40 pico_hascolor(void)
42 return(TRUE);
47 * Web Alpine Color Table
49 static struct color_table {
50 int number;
51 char *rgb;
52 struct {
53 char *s,
55 } name;
56 } webcoltab[] = {
57 {COL_BLACK, " 0, 0, 0", {"black", 5}},
58 {COL_RED, "255, 0, 0", {"red", 3}},
59 {COL_GREEN, " 0,255, 0", {"green", 5}},
60 {COL_YELLOW, "255,255, 0", {"yellow", 6}},
61 {COL_BLUE, " 0, 0,255", {"blue", 4}},
62 {COL_MAGENTA, "255, 0,255", {"magenta", 7}},
63 {COL_CYAN, " 0,255,255", {"cyan", 4}},
64 {COL_WHITE, "255,255,255", {"white", 5}},
65 {8, "192,192,192", {"color008", 8}}, /* light gray */
66 {9, "128,128,128", {"color009", 8}}, /* gray */
67 {10, " 64, 64, 64", {"color010", 8}}, /* dark gray */
68 {COL_YELLOW, "255,255, 0", {"color011", 8}},
69 {COL_BLUE, " 0, 0,255", {"color012", 8}},
70 {COL_MAGENTA, "255, 0,255", {"color013", 8}},
71 {COL_CYAN, " 0,255,255", {"color014", 8}},
72 {COL_WHITE, "255,255,255", {"color015", 8}},
73 {8, "192,192,192", {"colorlgr", 8}}, /* light gray */
74 {9, "128,128,128", {"colormgr", 8}}, /* gray */
75 {10, " 64, 64, 64", {"colordgr", 8}}, /* dark gray */
76 {16, "000,000,000", {"color016", 8}},
77 {17, "000,000,095", {"color017", 8}},
78 {18, "000,000,135", {"color018", 8}},
79 {19, "000,000,175", {"color019", 8}},
80 {20, "000,000,215", {"color020", 8}},
81 {21, "000,000,255", {"color021", 8}},
82 {22, "000,095,000", {"color022", 8}},
83 {23, "000,095,095", {"color023", 8}},
84 {24, "000,095,135", {"color024", 8}},
85 {25, "000,095,175", {"color025", 8}},
86 {26, "000,095,215", {"color026", 8}},
87 {27, "000,095,255", {"color027", 8}},
88 {28, "000,135,000", {"color028", 8}},
89 {29, "000,135,095", {"color029", 8}},
90 {30, "000,135,135", {"color030", 8}},
91 {31, "000,135,175", {"color031", 8}},
92 {32, "000,135,215", {"color032", 8}},
93 {33, "000,135,255", {"color033", 8}},
94 {34, "000,175,000", {"color034", 8}},
95 {35, "000,175,095", {"color035", 8}},
96 {36, "000,175,135", {"color036", 8}},
97 {37, "000,175,175", {"color037", 8}},
98 {38, "000,175,215", {"color038", 8}},
99 {39, "000,175,255", {"color039", 8}},
100 {40, "000,215,000", {"color040", 8}},
101 {41, "000,215,095", {"color041", 8}},
102 {42, "000,215,135", {"color042", 8}},
103 {43, "000,215,175", {"color043", 8}},
104 {44, "000,215,215", {"color044", 8}},
105 {45, "000,215,255", {"color045", 8}},
106 {46, "000,255,000", {"color046", 8}},
107 {47, "000,255,095", {"color047", 8}},
108 {48, "000,255,135", {"color048", 8}},
109 {49, "000,255,175", {"color049", 8}},
110 {50, "000,255,215", {"color050", 8}},
111 {51, "000,255,255", {"color051", 8}},
112 {52, "095,000,000", {"color052", 8}},
113 {53, "095,000,095", {"color053", 8}},
114 {54, "095,000,135", {"color054", 8}},
115 {55, "095,000,175", {"color055", 8}},
116 {56, "095,000,215", {"color056", 8}},
117 {57, "095,000,255", {"color057", 8}},
118 {58, "095,095,000", {"color058", 8}},
119 {59, "095,095,095", {"color059", 8}},
120 {60, "095,095,135", {"color060", 8}},
121 {61, "095,095,175", {"color061", 8}},
122 {62, "095,095,215", {"color062", 8}},
123 {63, "095,095,255", {"color063", 8}},
124 {64, "095,135,000", {"color064", 8}},
125 {65, "095,135,095", {"color065", 8}},
126 {66, "095,135,135", {"color066", 8}},
127 {67, "095,135,175", {"color067", 8}},
128 {68, "095,135,215", {"color068", 8}},
129 {69, "095,135,255", {"color069", 8}},
130 {70, "095,175,000", {"color070", 8}},
131 {71, "095,175,095", {"color071", 8}},
132 {72, "095,175,135", {"color072", 8}},
133 {73, "095,175,175", {"color073", 8}},
134 {74, "095,175,215", {"color074", 8}},
135 {75, "095,175,255", {"color075", 8}},
136 {76, "095,215,000", {"color076", 8}},
137 {77, "095,215,095", {"color077", 8}},
138 {78, "095,215,135", {"color078", 8}},
139 {79, "095,215,175", {"color079", 8}},
140 {80, "095,215,215", {"color080", 8}},
141 {81, "095,215,255", {"color081", 8}},
142 {82, "095,255,000", {"color082", 8}},
143 {83, "095,255,095", {"color083", 8}},
144 {84, "095,255,135", {"color084", 8}},
145 {85, "095,255,175", {"color085", 8}},
146 {86, "095,255,215", {"color086", 8}},
147 {87, "095,255,255", {"color087", 8}},
148 {88, "135,000,000", {"color088", 8}},
149 {89, "135,000,095", {"color089", 8}},
150 {90, "135,000,135", {"color090", 8}},
151 {91, "135,000,175", {"color091", 8}},
152 {92, "135,000,215", {"color092", 8}},
153 {93, "135,000,255", {"color093", 8}},
154 {94, "135,095,000", {"color094", 8}},
155 {95, "135,095,095", {"color095", 8}},
156 {96, "135,095,135", {"color096", 8}},
157 {97, "135,095,175", {"color097", 8}},
158 {98, "135,095,215", {"color098", 8}},
159 {99, "135,095,255", {"color099", 8}},
160 {100, "135,135,000", {"color100", 8}},
161 {101, "135,135,095", {"color101", 8}},
162 {102, "135,135,135", {"color102", 8}},
163 {103, "135,135,175", {"color103", 8}},
164 {104, "135,135,215", {"color104", 8}},
165 {105, "135,135,255", {"color105", 8}},
166 {106, "135,175,000", {"color106", 8}},
167 {107, "135,175,095", {"color107", 8}},
168 {108, "135,175,135", {"color108", 8}},
169 {109, "135,175,175", {"color109", 8}},
170 {110, "135,175,215", {"color110", 8}},
171 {111, "135,175,255", {"color111", 8}},
172 {112, "135,215,000", {"color112", 8}},
173 {113, "135,215,095", {"color113", 8}},
174 {114, "135,215,135", {"color114", 8}},
175 {115, "135,215,175", {"color115", 8}},
176 {116, "135,215,215", {"color116", 8}},
177 {117, "135,215,255", {"color117", 8}},
178 {118, "135,255,000", {"color118", 8}},
179 {119, "135,255,095", {"color119", 8}},
180 {120, "135,255,135", {"color120", 8}},
181 {121, "135,255,175", {"color121", 8}},
182 {122, "135,255,215", {"color122", 8}},
183 {123, "135,255,255", {"color123", 8}},
184 {124, "175,000,000", {"color124", 8}},
185 {125, "175,000,095", {"color125", 8}},
186 {126, "175,000,135", {"color126", 8}},
187 {127, "175,000,175", {"color127", 8}},
188 {128, "175,000,215", {"color128", 8}},
189 {129, "175,000,255", {"color129", 8}},
190 {130, "175,095,000", {"color130", 8}},
191 {131, "175,095,095", {"color131", 8}},
192 {132, "175,095,135", {"color132", 8}},
193 {133, "175,095,175", {"color133", 8}},
194 {134, "175,095,215", {"color134", 8}},
195 {135, "175,095,255", {"color135", 8}},
196 {136, "175,135,000", {"color136", 8}},
197 {137, "175,135,095", {"color137", 8}},
198 {138, "175,135,135", {"color138", 8}},
199 {139, "175,135,175", {"color139", 8}},
200 {140, "175,135,215", {"color140", 8}},
201 {141, "175,135,255", {"color141", 8}},
202 {142, "175,175,000", {"color142", 8}},
203 {143, "175,175,095", {"color143", 8}},
204 {144, "175,175,135", {"color144", 8}},
205 {145, "175,175,175", {"color145", 8}},
206 {146, "175,175,215", {"color146", 8}},
207 {147, "175,175,255", {"color147", 8}},
208 {148, "175,215,000", {"color148", 8}},
209 {149, "175,215,095", {"color149", 8}},
210 {150, "175,215,135", {"color150", 8}},
211 {151, "175,215,175", {"color151", 8}},
212 {152, "175,215,215", {"color152", 8}},
213 {153, "175,215,255", {"color153", 8}},
214 {154, "175,255,000", {"color154", 8}},
215 {155, "175,255,095", {"color155", 8}},
216 {156, "175,255,135", {"color156", 8}},
217 {157, "175,255,175", {"color157", 8}},
218 {158, "175,255,215", {"color158", 8}},
219 {159, "175,255,255", {"color159", 8}},
220 {160, "215,000,000", {"color160", 8}},
221 {161, "215,000,095", {"color161", 8}},
222 {162, "215,000,135", {"color162", 8}},
223 {163, "215,000,175", {"color163", 8}},
224 {164, "215,000,215", {"color164", 8}},
225 {165, "215,000,255", {"color165", 8}},
226 {166, "215,095,000", {"color166", 8}},
227 {167, "215,095,095", {"color167", 8}},
228 {168, "215,095,135", {"color168", 8}},
229 {169, "215,095,175", {"color169", 8}},
230 {170, "215,095,215", {"color170", 8}},
231 {171, "215,095,255", {"color171", 8}},
232 {172, "215,135,000", {"color172", 8}},
233 {173, "215,135,095", {"color173", 8}},
234 {174, "215,135,135", {"color174", 8}},
235 {175, "215,135,175", {"color175", 8}},
236 {176, "215,135,215", {"color176", 8}},
237 {177, "215,135,255", {"color177", 8}},
238 {178, "215,175,000", {"color178", 8}},
239 {179, "215,175,095", {"color179", 8}},
240 {180, "215,175,135", {"color180", 8}},
241 {181, "215,175,175", {"color181", 8}},
242 {182, "215,175,215", {"color182", 8}},
243 {183, "215,175,255", {"color183", 8}},
244 {184, "215,215,000", {"color184", 8}},
245 {185, "215,215,095", {"color185", 8}},
246 {186, "215,215,135", {"color186", 8}},
247 {187, "215,215,175", {"color187", 8}},
248 {188, "215,215,215", {"color188", 8}},
249 {189, "215,215,255", {"color189", 8}},
250 {190, "215,255,000", {"color190", 8}},
251 {191, "215,255,095", {"color191", 8}},
252 {192, "215,255,135", {"color192", 8}},
253 {193, "215,255,175", {"color193", 8}},
254 {194, "215,255,215", {"color194", 8}},
255 {195, "215,255,255", {"color195", 8}},
256 {196, "255,000,000", {"color196", 8}},
257 {197, "255,000,095", {"color197", 8}},
258 {198, "255,000,135", {"color198", 8}},
259 {199, "255,000,175", {"color199", 8}},
260 {200, "255,000,215", {"color200", 8}},
261 {201, "255,000,255", {"color201", 8}},
262 {202, "255,095,000", {"color202", 8}},
263 {203, "255,095,095", {"color203", 8}},
264 {204, "255,095,135", {"color204", 8}},
265 {205, "255,095,175", {"color205", 8}},
266 {206, "255,095,215", {"color206", 8}},
267 {207, "255,095,255", {"color207", 8}},
268 {208, "255,135,000", {"color208", 8}},
269 {209, "255,135,095", {"color209", 8}},
270 {210, "255,135,135", {"color210", 8}},
271 {211, "255,135,175", {"color211", 8}},
272 {212, "255,135,215", {"color212", 8}},
273 {213, "255,135,255", {"color213", 8}},
274 {214, "255,175,000", {"color214", 8}},
275 {215, "255,175,095", {"color215", 8}},
276 {216, "255,175,135", {"color216", 8}},
277 {217, "255,175,175", {"color217", 8}},
278 {218, "255,175,215", {"color218", 8}},
279 {219, "255,175,255", {"color219", 8}},
280 {220, "255,215,000", {"color220", 8}},
281 {221, "255,215,095", {"color221", 8}},
282 {222, "255,215,135", {"color222", 8}},
283 {223, "255,215,175", {"color223", 8}},
284 {224, "255,215,215", {"color224", 8}},
285 {225, "255,215,255", {"color225", 8}},
286 {226, "255,255,000", {"color226", 8}},
287 {227, "255,255,095", {"color227", 8}},
288 {228, "255,255,135", {"color228", 8}},
289 {229, "255,255,175", {"color229", 8}},
290 {230, "255,255,215", {"color230", 8}},
291 {231, "255,255,255", {"color231", 8}}
295 char *
296 colorx(int color)
298 int i;
299 static char cbuf[12];
301 for(i = 0; i < sizeof(webcoltab) / sizeof(struct color_table); i++)
302 if(color == webcoltab[i].number)
303 return(webcoltab[i].rgb);
305 sprintf(cbuf, "color%3.3d", color);
306 return(cbuf);
311 * Return a pointer to an rgb string for the input color. The output is 11
312 * characters long and looks like rrr,ggg,bbb.
314 * Args colorName -- The color to convert to ascii rgb.
316 * Returns Pointer to a static buffer containing the rgb string.
318 char *
319 color_to_asciirgb(char *colorName)
321 int i;
322 static char c_to_a_buf[3][RGBLEN+1];
323 static int whichbuf = 0;
325 whichbuf = (whichbuf + 1) % 3;
327 for(i = 0; i < sizeof(webcoltab) / sizeof(struct color_table); i++)
328 if(!strucmp(webcoltab[i].name.s, colorName))
329 return(webcoltab[i].rgb);
332 * If we didn't find the color it could be that it is the
333 * normal color (MATCH_NORM_COLOR) or the none color
334 * (MATCH_NONE_COLOR). If that is the case, this strncpy thing
335 * will work out correctly because those two strings are
336 * RGBLEN long. Otherwise we're in a bit of trouble. This
337 * most likely means that the user is using the same pinerc on
338 * two terminals, one with more colors than the other. We didn't
339 * find a match because this color isn't present on this terminal.
340 * Since the return value of this function is assumed to be
341 * RGBLEN long, we'd better make it that long.
342 * It still won't work correctly because colors will be screwed up,
343 * but at least the embedded colors in filter.c will get properly
344 * sucked up when they're encountered.
346 strncpy(c_to_a_buf[whichbuf], "xxxxxxxxxxx", RGBLEN); /* RGBLEN is 11 */
347 i = strlen(colorName);
348 strncpy(c_to_a_buf[whichbuf], colorName, (i < RGBLEN) ? i : RGBLEN);
349 c_to_a_buf[whichbuf][RGBLEN] = '\0';
350 return(c_to_a_buf[whichbuf]);
356 pico_is_good_color(char *s)
358 return(alpine_color_name(s) != NULL || alpine_valid_rgb(s));
363 alpine_valid_rgb(char *s)
365 int i, j;
367 /* has to be three spaces or decimal digits followed by a dot.*/
369 for(i = 0; i < 3; i++){
370 int n = 0;
372 for(j = 0; j < 3; j++, s++) {
373 if(*s == ' '){
374 if(n)
375 return(FALSE);
377 else if(isdigit((unsigned char) *s)){
378 n = (n * 10) + (*s - '0');
380 else
381 return(FALSE);
384 if (i < 2 && *s++ != ',')
385 return(FALSE);
388 return (TRUE);
393 char *
394 alpine_color_name(char *s)
396 if(s){
397 int i;
399 if(!struncmp(s, MATCH_NORM_COLOR, RGBLEN) || !struncmp(s, MATCH_NONE_COLOR, RGBLEN))
400 return(s);
401 else if(*s == ' ' || isdigit(*s)){
402 /* check for rgb string instead of name */
403 for(i = 0; i < sizeof(webcoltab) / sizeof(struct color_table); i++)
404 if(!strncmp(webcoltab[i].rgb, s, RGBLEN))
405 return(webcoltab[i].name.s);
407 else{
408 for(i = 0; i < sizeof(webcoltab) / sizeof(struct color_table); i++)
409 if(!struncmp(webcoltab[i].name.s, s, webcoltab[i].name.l))
410 return(webcoltab[i].name.s);
414 return(NULL);
419 * Sets color to (fg,bg).
420 * Flags == PSC_NONE No alternate default if fg,bg fails.
421 * == PSC_NORM Set it to Normal color on failure.
422 * == PSC_REV Set it to Reverse color on failure.
424 * If flag PSC_RET is set, returns an allocated copy of the previous
425 * color pair, otherwise returns NULL.
427 COLOR_PAIR *
428 pico_set_colors(char *fg, char *bg, int flags)
430 int uc;
431 COLOR_PAIR *cp = NULL, *rev = NULL;
433 if(flags & PSC_RET)
434 cp = pico_get_cur_color();
436 if(!((uc = pico_usingcolor())
437 && fg && bg
438 && pico_set_fg_color(fg) && pico_set_bg_color(bg))){
440 if(uc && flags & PSC_NORM){
441 pico_set_normal_color();
443 else if(flags & PSC_REV){
444 if((rev = pico_get_rev_color()) != NULL){
445 pico_set_fg_color(rev->fg); /* these will succeed */
446 pico_set_bg_color(rev->bg);
451 return(cp);
456 void
457 pico_nfcolor(char *s)
459 if(_nfcolor){
460 free(_nfcolor);
461 _nfcolor = NULL;
464 if(s){
465 _nfcolor = (char *)malloc(strlen(s)+1);
466 if(_nfcolor)
467 strcpy(_nfcolor, s);
472 void
473 pico_nbcolor(char *s)
475 if(_nbcolor){
476 free(_nbcolor);
477 _nbcolor = NULL;
480 if(s){
481 _nbcolor = (char *)malloc(strlen(s)+1);
482 if(_nbcolor)
483 strcpy(_nbcolor, s);
487 void
488 pico_rfcolor(char *s)
490 if(_rfcolor){
491 free(_rfcolor);
492 _rfcolor = NULL;
495 if(s){
496 _rfcolor = (char *)malloc(strlen(s)+1);
497 if(_rfcolor)
498 strcpy(_rfcolor, s);
500 if(the_rev_color)
501 strcpy(the_rev_color->fg, _rfcolor);
503 else if(the_rev_color)
504 free_color_pair(&the_rev_color);
507 void
508 pico_rbcolor(char *s)
510 if(_rbcolor){
511 free(_rbcolor);
512 _rbcolor = NULL;
515 if(s){
516 _rbcolor = (char *)malloc(strlen(s)+1);
517 if(_rbcolor)
518 strcpy(_rbcolor, s);
520 if(the_rev_color)
521 strcpy(the_rev_color->bg, _rbcolor);
523 else if(the_rev_color)
524 free_color_pair(&the_rev_color);
528 void
529 pico_endcolor(void)
531 if(_nfcolor){
532 free(_nfcolor);
533 _nfcolor = NULL;
536 if(_nbcolor){
537 free(_nbcolor);
538 _nbcolor = NULL;
541 if(_rfcolor){
542 free(_rfcolor);
543 _rfcolor = NULL;
546 if(_rbcolor){
547 free(_rbcolor);
548 _rbcolor = NULL;
551 if(the_rev_color)
552 free_color_pair(&the_rev_color);
556 COLOR_PAIR *
557 pico_get_cur_color(void)
559 return(new_color_pair(_last_fg_color, _last_bg_color));
563 * If inverse is a color, returns a pointer to that color.
564 * If not, returns NULL.
566 * NOTE: Don't free this!
568 COLOR_PAIR *
569 pico_get_rev_color(void)
571 if(pico_usingcolor() && _rfcolor && _rbcolor &&
572 pico_is_good_color(_rfcolor) && pico_is_good_color(_rbcolor)){
573 if(!the_rev_color)
574 the_rev_color = new_color_pair(_rfcolor, _rbcolor);
576 return(the_rev_color);
578 else
579 return(NULL);
584 pico_set_fg_color(char *s)
586 if(pico_is_good_color(s)){
587 if(!struncmp(s, MATCH_NORM_COLOR, RGBLEN))
588 s = _nfcolor;
589 else if(!struncmp(s, MATCH_NONE_COLOR, RGBLEN))
590 return(TRUE);
592 /* already set correctly */
593 if(!_force_fg_color_change
594 && _last_fg_color
595 && !strcmp(_last_fg_color, s))
596 return(TRUE);
598 _force_fg_color_change = 0;
599 if(_last_fg_color)
600 free(_last_fg_color);
602 if((_last_fg_color = (char *) malloc(strlen(s) + 1)) != NULL)
603 strcpy(_last_fg_color, s);
605 return(TRUE);
608 return(FALSE);
613 pico_set_bg_color(char *s)
615 if(pico_is_good_color(s)){
616 if(!struncmp(s, MATCH_NORM_COLOR, RGBLEN))
617 s = _nbcolor;
618 else if(!struncmp(s, MATCH_NONE_COLOR, RGBLEN))
619 return(TRUE);
621 /* already set correctly */
622 if(!_force_bg_color_change
623 && _last_bg_color
624 && !strcmp(_last_bg_color, s))
625 return(TRUE);
627 _force_bg_color_change = 0;
628 if(_last_bg_color)
629 free(_last_bg_color);
631 if((_last_bg_color = (char *) malloc(strlen(s) + 1)) != NULL)
632 strcpy(_last_bg_color, s);
634 return(TRUE);
637 return(FALSE);
641 void
642 pico_set_normal_color(void)
644 if(!_nfcolor || !_nbcolor ||
645 !pico_set_fg_color(_nfcolor) || !pico_set_bg_color(_nbcolor)){
646 (void)pico_set_fg_color(DEFAULT_NORM_FORE_RGB);
647 (void)pico_set_bg_color(DEFAULT_NORM_BACK_RGB);
652 char *
653 pico_get_last_fg_color(void)
655 char *ret = NULL;
657 if(_last_fg_color)
658 if((ret = (char *)malloc(strlen(_last_fg_color)+1)) != NULL)
659 strcpy(ret, _last_fg_color);
661 return(ret);
664 char *
665 pico_get_last_bg_color(void)
667 char *ret = NULL;
669 if(_last_bg_color)
670 if((ret = (char *)malloc(strlen(_last_bg_color)+1)) != NULL)
671 strcpy(ret, _last_bg_color);
673 return(ret);