Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274/* * STRTOCLR.C - read color (for color command and other) * * * History: * * 07-Oct-1999 (Paolo Pantaleo) * Started. * */
/* * Only * BOOL StringToColor(LPWORD lpColor, LPTSTR*str) * has to be called. * Other are internal service functions. */
#include "precomp.h"
#define _B FOREGROUND_BLUE#define _G FOREGROUND_GREEN#define _R FOREGROUND_RED#define _I FOREGROUND_INTENSITY
/* Return values for chop_blank */#define CP_OK 0#define CP_BLANK_NOT_FOUND 1#define CP_END_OF_STRING 2
/* NOTE: See the description for these flags in the StringToColor()'s description */#define SC_HEX 0x0100#define SC_TXT 0x0200
typedef struct _CLRTABLE{ LPTSTR name; WORD val;} CLRTABLE;
CLRTABLE clrtable[] ={ {_T("bla"), 0 }, {_T("blu"), _B }, {_T("gre"), _G }, {_T("cya"), _B|_G }, {_T("red"), _R }, {_T("mag"), _B|_R }, {_T("yel"), _R|_G }, {_T("whi"), _R|_G|_B }, {_T("gra"), _I },
{_T("0") , 0 }, {_T("2") , _G }, {_T("3") , _B|_G }, {_T("4") , _R }, {_T("5") , _B|_R }, {_T("6") , _R|_G }, {_T("7") , _R|_G|_B },
{_T("8") , _I }, {_T("9") , _I|_B }, {_T("10") , _I|_G }, {_T("11") , _I|_B|_G }, {_T("12") , _I|_R }, {_T("13") , _I|_B|_R }, {_T("14") , _I|_R|_G }, {_T("15") , _I|_R|_G|_B },
/* * Note that 1 is at the end of list * to avoid to confuse it with 10-15 */ {_T("1") , _B },
/* Cyan synonym */ {_T("aqu"), _B|_G }, /* Magenta synonym */ {_T("pur"), _B|_R },
{_T("") ,0},};
/* * Move string pointer to next word (skip all spaces). * On error return nonzero value. */staticINT chop_blank(LPTSTR *arg_str){ LPTSTR str; str = _tcschr(*arg_str,_T(' ')); if (!str) { str = _tcschr (*arg_str, _T('\0')); if (str != NULL) *arg_str=str; return CP_BLANK_NOT_FOUND; }
while(_istspace(*str)) str++;
if (*str == _T('\0')) { *arg_str=str; return CP_END_OF_STRING; }
*arg_str = str;
return CP_OK;}
/* * Read a color value in hex (like win nt's cmd syntax). * If an error occurs return -1. */staticWORD hex_clr(LPTSTR str){ WORD ret= (WORD)-1; TCHAR ch;
ch = str[1];
if (_istdigit(ch)) ret = ch-_T('0'); else { ch=_totupper(ch);
if ( ch >= _T('A') && ch <= _T('F') ) ret = ch-_T('A')+10; else return (WORD)-1; }
ch = str[0];
if (_istdigit(ch)) ret |= (ch-_T('0')) << 4; else { ch=_totupper(ch);
if ( ch >= _T('A') && ch <= _T('F') ) ret |= (ch-_T('A')+10) <<4; else return (WORD)-1; }
return ret;}
/* * Read a color value from a string (like 4nt's syntax). * If an error occurs return -1. */staticWORD txt_clr(LPTSTR str){ INT i;
for(i = 0; *(clrtable[i].name); i++) if (_tcsnicmp(str, clrtable[i].name, _tcslen(clrtable[i].name)) == 0) return clrtable[i].val;
return (WORD)-1;}
/* Search for "x on y" */staticWORD str_to_color(LPTSTR* arg_str){ LPTSTR str; BOOL bBri;
WORD tmp_clr,ret_clr;
str = *arg_str;
if (!(*str)) return (WORD)-1;
/* foreground */ bBri = FALSE;
if (_tcsnicmp(str,_T("bri"),3) == 0) { bBri = TRUE;
if (chop_blank(&str)) return (WORD)-1; }
if ((tmp_clr = txt_clr(str)) == (WORD)-1) { return (WORD)-1; }
/* skip spaces and "on" keyword */ if (chop_blank(&str) || chop_blank(&str)) return (WORD)-1;
ret_clr = tmp_clr | (bBri << 3);
/* background */ bBri = FALSE;
if (_tcsnicmp(str,_T("bri"),3) == 0 ) { bBri = TRUE;
if (chop_blank(&str)) return (WORD)-1; }
if ( (tmp_clr = txt_clr(str)) == (WORD)-1 ) return (WORD)-1;
chop_blank(&str);
*arg_str = str;
/* NOTE: See the note on SC_HEX in the StringToColor()'s description */ return /* SC_HEX | */ ret_clr | tmp_clr << 4 | bBri << 7;}
/**** Main function ****//* * The only parameter is arg_str, a pointer to a string. * The string is modified so it will begin to first word after * color specification * (only the char* is moved, no chars in the string are modified). * * **** NOTE: The following functionality is deactivated **** * it returns the color in the l.o. byte, plus two flags in the * h.o. byte, they are: * SC_HEX win nt's cmd syntax (for example a0) * SC_TXT 4nt's syntax ( "bri gre on bla" or "10 on 0") * ********************************************************** * * If success also move the LPTSTR to end of * string that specify color. */BOOL StringToColor(LPWORD lpColor, LPTSTR*str){ WORD wRet;
wRet = str_to_color (str); if (wRet == (WORD)-1) { wRet=hex_clr (*str); chop_blank (str); if (wRet == (WORD)-1) return FALSE; }
*lpColor = wRet;
return TRUE;}
/* EOF */