File: ColorTblCvt.c

package info (click to toggle)
gridengine 6.2-4
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 51,532 kB
  • ctags: 51,172
  • sloc: ansic: 418,155; java: 37,080; sh: 22,593; jsp: 7,699; makefile: 5,292; csh: 4,244; xml: 2,901; cpp: 2,086; perl: 1,895; tcl: 1,188; lisp: 669; ruby: 642; yacc: 393; lex: 266
file content (171 lines) | stat: -rw-r--r-- 4,461 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/* 
 * Motif Tools Library, Version 3.1
 * $Id$
 * 
 * Written by David Flanagan.
 * Copyright (c) 1992-2001 by David Flanagan.
 * All Rights Reserved.  See the file COPYRIGHT for details.
 * This is open source software.  See the file LICENSE for details.
 * There is no warranty for this software.  See NO_WARRANTY for details.
 *
 * $Log$
 * Revision 1.1.1.1  2001/07/18 11:06:02  root
 * Initial checkin.
 *
 * Revision 1.2  2001/06/12 16:25:28  andre
 * *** empty log message ***
 *
 *
 */

#include <ctype.h>
#include <Xmt/Xmt.h>
#include <Xmt/Color.h>
#include <Xmt/ConvertersP.h>
#include <Xmt/Lexer.h>
#include <Xmt/LookupP.h>
#include <X11/IntrinsicP.h>

/* ARGSUSED */
#if NeedFunctionPrototypes
Boolean XmtConvertStringToColorTable(Display *dpy,
				     XrmValue *args, Cardinal *num_args,
				     XrmValue *from, XrmValue *to,
				     XtPointer *data)
#else
Boolean XmtConvertStringToColorTable(dpy, args, num_args, from, to, data)
Display *dpy;
XrmValue *args;
Cardinal *num_args;
XrmValue *from;
XrmValue *to;
XtPointer *data;
#endif
{
    static XmtLexer l = NULL;
    XmtColorTable parent = *((XmtColorTable *)args[0].addr);
    Screen *screen = *((Screen **)args[1].addr);
    String s = (String)from->addr;
    XmtColorTable table;
    String symbol, color;
    XmtLexerToken token;

    /*
     * First, check if this is a symbolic color table name.
     * If so, look it up, and recurse to parse its value
     */
    if (s[0] == '$') {
	String value;
	XrmValue new_from;
	s++;
	while(isspace(*s)) s++;

	/*
	 * lookup value of that symbolic name under:
	 *   _Colortables_.palette.visual.depth
	 * Note that we don't have to free the return value.
	 */
	value = _XmtLookupResource(screen, "TVDp", s);
	
	/* if no value defined, warn and fail */
	if (!value) {
	    XmtWarningMsg("XmtConvertStringToColorTable", "nosymbol",
			  "No color table named '%s' defined in resource file under _ColorTables_",
			  s);
	    XtDisplayStringConversionWarning(dpy, from->addr,
					     XmtRXmtColorTable);
	    return False;
	}

	/*
	 * Otherwise, recurse to convert the definition we've found 
	 * The programmer must be smart enough to avoid infinite recursion
	 */
	new_from.addr = (XPointer) value;
	new_from.size = strlen(value) + 1;
	return XmtConvertStringToColorTable(dpy, args, num_args,
					    &new_from, to, data);

    }

    table = XmtCreateColorTable(parent);
    
    if (l == NULL) l = XmtLexerCreate(NULL, 0);
    XmtLexerInit(l, s);

    for(;;) {
	symbol = color = NULL;
	if (XmtLexerGetToken(l) != XmtLexerIdent) goto error;
	symbol = XmtLexerStrValue(l);
	XmtLexerConsumeToken(l);
	if (XmtLexerGetToken(l) != XmtLexerEqual) goto error;
	XmtLexerConsumeToken(l);
	token = XmtLexerGetToken(l);
	if ((token != XmtLexerString) && (token != XmtLexerIdent)) goto error;
	color = XmtLexerStrValue(l);
	XmtLexerConsumeToken(l);
	XmtRegisterColor(table, symbol, color);
	XtFree(symbol);
	XtFree(color);
	if (XmtLexerGetToken(l) == XmtLexerComma)
	    XmtLexerConsumeToken(l);
	else
	    break;
    }

    if (XmtLexerGetToken(l) == XmtLexerEndOfString)
	done(XmtColorTable, table);

 error:
    XmtWarningMsg("XmtConvertStringToColorTable", "syntax", "syntax error");
    XtDisplayStringConversionWarning(dpy, from->addr, XmtRXmtColorTable);
    XtFree(symbol);
    XtFree(color);
    XmtDestroyColorTable(table);
    return False;
}


/* ARGSUSED */
#if NeedFunctionPrototypes
static void FreeConvertedColorTable(XtAppContext app, XrmValue *to,
				    XtPointer closure,
				    XrmValue *args, Cardinal *num_args)
#else
static void FreeConvertedColorTable(app, to, closure, args, num_args)
XtAppContext app;
XrmValue *to;
XtPointer closure;
XrmValue *args;
Cardinal *num_args;
#endif
{
    XmtDestroyColorTable(*((XmtColorTable *) to->addr));
}

static XtConvertArgRec color_table_args[] = {
    {XtProcedureArg, (XtPointer)_XmtFetchColorTable, 0},
    {XtWidgetBaseOffset, (XtPointer)XtOffsetOf(WidgetRec, core.screen),
     sizeof(Screen *)},
};

#if NeedFunctionPrototypes
void XmtRegisterColorTableConverter(void)
#else
void XmtRegisterColorTableConverter()
#endif
{
    static Boolean registered = False;

    if (!registered) {
	XtSetTypeConverter(XtRString, XmtRXmtColorTable,
			   XmtConvertStringToColorTable,
			   color_table_args, XtNumber(color_table_args),
			   XtCacheNone | XtCacheRefCount,
			   FreeConvertedColorTable);
	_XmtColorTableConverter = XmtConvertStringToColorTable;
	registered = True;
    }
}