/******************************************************************************
 *
 * theme.c - slurm theme engine
 *
 ******************************************************************************
 * $Id: theme.c,v 1.5 2004/09/28 14:23:02 hscholz Exp $
 *****************************************************************************/

#ifndef _THEME_C
#define _THEME_C

/******************************************************************************
 *
 * theme_setdefault()
 *
 * set default theme
 *
 *****************************************************************************/

void theme_setdefault(theme *t)
{
	if (t == NULL)
		error(ERR_FATAL, "theme_setdefault() received NULL pointer");

	t->background	= COLOR_TRANSPARENT;
	t->rx			= COLOR_GREEN;
	t->tx			= COLOR_RED;
	t->text			= COLOR_WHITE;
	t->var			= COLOR_WHITE;
	t->title		= COLOR_WHITE;
	t->rx_attrib	= COL_BOLD;
	t->tx_attrib	= COL_BOLD;
	t->text_attrib	= COL_NORMAL;
	t->var_attrib	= COL_BOLD;
	t->title_attrib	= COL_BOLD;
	t->complete		= E_ALL;
}

/******************************************************************************
 *
 * theme_readfile()
 *
 * read color definitions from the given file and store in theme struct
 *
 *****************************************************************************/

int theme_readfile(theme *t, char *name)
{
	FILE *f;
	char buf[BUFSIZ+1];
	char filename[BUFSIZ+1];
	char *p, *val, *key;

	t->complete = E_NULL;

	/* search for the theme:
	 *  - in the local directory
	 *  - in ~/.slurm
	 *  - in /usr/local/share/slurm
	 *    (make this /usr/share/slurm for Debian systems by specifing
	 *     -D__Debian__)
	 */

	bzero(&filename, BUFSIZ);
	snprintf(filename, BUFSIZ, "%s.theme", name);
	if ((f = fopen(filename, "r")) == NULL)
	{
		bzero(&filename, BUFSIZ);
		snprintf(filename, BUFSIZ, "%s/.slurm/%s.theme", getenv("HOME"), name);
		if ((f = fopen(filename, "r")) == NULL)
		{
			bzero(&filename, BUFSIZ);
#ifdef __NetBSD__
			snprintf(filename, BUFSIZ, "/usr/pkg/share/slurm/%s.theme", name);
#elif __Debian__
			snprintf(filename, BUFSIZ, "/usr/share/slurm/%s.theme", name);
#else
			snprintf(filename, BUFSIZ, "/usr/local/share/slurm/%s.theme", name);
#endif
			if ((f = fopen(filename, "r")) == NULL)
				error(ERR_FATAL, "cannot find theme '%s'", name);
		}
	}

	while (fgets(buf, BUFSIZ, f) != NULL)
	{
		if (!strncmp(buf,"#",1)) continue; /* comment */
		p = buf;
		while (isspace((int) *p) && (*p+1 != '\0')) p++;
		key = p;
		while (isalpha((int) *p) && (*p+1 != '\0')) p++;
		if (isspace((int) *p))
		{
			*p++ = '\0';
			while (isspace((int) *p) && (*p+1 != '\0')) p++;
			if (*p != '=') continue;
			p++;
			while (isspace((int) *p) && (*p+1 != '\0')) p++;
		}
		else if (*p == '=')
		{
			*p++ = '\0';
			while (isspace((int) *p) && (*p+1 != '\0')) p++;
		}
		else
			continue;
		val = p;
		while (isalpha((int) *p) && (*p+1 != '\0')) p++;
		*p++ = '\0';

		switch (theme_mapkey(key))
		{
			case E_BACKGROUND:
				t->background = theme_mapcolor(val);
				t->complete |= E_BACKGROUND;
				break;
            case E_RX:
                t->rx = theme_mapcolor(val);
                t->complete |= E_RX;
                break;
            case E_TX:
                t->tx = theme_mapcolor(val);
                t->complete |= E_TX;
                break;
            case E_TEXT:
                t->text = theme_mapcolor(val);
                t->complete |= E_TEXT;
                break;
            case E_TITLE:
                t->title = theme_mapcolor(val);
                t->complete |= E_TITLE;
                break;
            case E_TEXTVAR:
                t->var = theme_mapcolor(val);
                t->complete |= E_TEXTVAR;
                break;
            case E_RXATTR:
                t->rx_attrib = theme_mapattrib(val);
                t->complete |= E_RXATTR;
                break;
            case E_TXATTR:
                t->tx_attrib = theme_mapattrib(val);
                t->complete |= E_TXATTR;
                break;
            case E_TEXTATTR:
                t->text_attrib = theme_mapattrib(val);
                t->complete |= E_TEXTATTR;
                break;
            case E_TEXTVARATTR:
                t->var_attrib = theme_mapattrib(val);
                t->complete |= E_TEXTVARATTR;
                break;
            case E_TITLEATTR:
                t->title_attrib = theme_mapattrib(val);
                t->complete |= E_TITLEATTR;
                break;
			default:
				error(ERR_WARNING, "unknown key '%s' in theme '%s'",
					key, filename);
		}
	}
	fclose(f);
	return (t->complete == E_ALL)? 1 : 0;
}

/******************************************************************************
 *
 * theme_mapattrib()
 *
 * map entity attribute to coresponding curses attribute
 *
 *****************************************************************************/

int theme_mapattrib(char *str)
{
	int val = COL_BOLD;
	char buf[32];
	int i;

	if (strlen(str) > 31) return val;
	bzero(&buf, 31);
	for (i = 0; i < strlen(str); i++)
		buf[i] = toupper((int) str[i]);
	buf[i+1] = '\0';

		 if (!strcmp(buf, "BOLD"))			val = COL_BOLD;
	else if (!strcmp(buf, "NORMAL"))		val = COL_NORMAL;
	else if (!strcmp(buf, "DIM"))			val = COL_DIM;

	return val;
}

/******************************************************************************
 *
 * theme_mapcolor()
 *
 * map color name to coresponding curses color name
 *
 *****************************************************************************/

int theme_mapcolor(char *str)
{
	int val = COLOR_GREEN;
	char buf[32];
	int i;

	if (strlen(str) > 31) return val;
	bzero(&buf, 31);
	for (i = 0; i < strlen(str); i++)
		buf[i] = toupper((int) str[i]);
	buf[i+1] = '\0';

		 if (!strcmp(buf, "BLACK"))			val = COLOR_BLACK;
	else if (!strcmp(buf, "RED"))			val = COLOR_RED;
	else if (!strcmp(buf, "GREEN"))			val = COLOR_GREEN;
	else if (!strcmp(buf, "YELLOW"))		val = COLOR_YELLOW;
	else if (!strcmp(buf, "BLUE"))			val = COLOR_BLUE;
	else if (!strcmp(buf, "MAGENTA"))		val = COLOR_MAGENTA;
	else if (!strcmp(buf, "CYAN"))			val = COLOR_CYAN;
	else if (!strcmp(buf, "WHITE"))			val = COLOR_WHITE;
	else if (!strcmp(buf, "TRANSPARENT"))	val = COLOR_TRANSPARENT;

	return val;
}

/******************************************************************************
 *
 * theme_mapkey()
 *
 * map entity name to internal name
 *
 *****************************************************************************/

int theme_mapkey(char *str)
{
	int e = 0;
	char buf[32];
	int i;

	if (strlen(str) > 31) return e;
	bzero(&buf, 31);
	for (i = 0; i < strlen(str); i++)
		buf[i] = toupper((int) str[i]);
	buf[i+1] = '\0';

		 if (!strcmp(buf, "BACKGROUND"))	e = E_BACKGROUND;
	else if (!strcmp(buf, "RX"))			e = E_RX;
	else if (!strcmp(buf, "TX"))			e = E_TX;
	else if (!strcmp(buf, "TEXT"))			e = E_TEXT;
	else if (!strcmp(buf, "TITLE"))			e = E_TITLE;
	else if (!strcmp(buf, "TEXTVAR"))		e = E_TEXTVAR;
	else if (!strcmp(buf, "RXATTR"))		e = E_RXATTR;
	else if (!strcmp(buf, "TXATTR"))		e = E_TXATTR;
	else if (!strcmp(buf, "TEXTATTR"))		e = E_TEXTATTR;
	else if (!strcmp(buf, "TEXTVARATTR"))	e = E_TEXTVARATTR;
	else if (!strcmp(buf, "TITLEATTR"))		e = E_TITLEATTR;
	return e;
}
#endif


syntax highlighted by Code2HTML, v. 0.9.1