int color2rgb(char *str, double rgb[3]) { static hsbcolor_t *last; char *p,canon[SMALLBUF],buf[BUFSIZ]; hsbcolor_t fake; double hsv[3]; if ((last == NULL)||(last->name[0] != str[0])||(strcmp(last->name,str))) { fake.name = canoncolor(str,canon); last = (hsbcolor_t*) bsearch((void*)&fake,(void*)color_lib,sizeof(color_lib)/sizeof(hsbcolor_t),sizeof(fake),(bsearch_cmpf)colorcmpf); } if (last == NULL) { if (isdigit(canon[0]) == FALSE) return 0; else { for (p = buf; (*p = *str++); p++) if (*p == ',') *p = ' '; sscanf(buf,"%lf%lf%lf",&hsv[0],&hsv[1],&hsv[2]); } } else { hsv[0] = ((double)last->h)/255; hsv[1] = ((double)last->s)/255; hsv[2] = ((double)last->b)/255; } hsv2rgb(&rgb[0],&rgb[1],&rgb[2],hsv[0],hsv[1],hsv[2]); return 1; }
char *colorxlate(char *str, char *buf) { static hsbcolor_t *last; unsigned char canon[128]; char *p; hsbcolor_t fake; if ((last == NULL) || (last->name[0] != str[0]) || (strcmp(last->name, str))) { fake.name = (char *) canoncolor(str, canon); last = (hsbcolor_t *) bsearch(&fake, color_lib, sizeof(color_lib) / sizeof(hsbcolor_t), sizeof(fake), colorcmpf); } if (last == NULL) { if (isdigit(canon[0]) == FALSE) { fprintf(stderr, "warning: %s is not a known color\n", str); strcpy(buf, str); } else for (p = buf; (*p = *str++); p++) if (*p == ',') *p = ' '; } else sprintf(buf, "%.3f %.3f %.3f", ((double) last->h) / 255, ((double) last->s) / 255, ((double) last->b) / 255); return buf; }