File: | StrToCurs.c |
Location: | line 239, column 11 |
Description: | Function call argument is an uninitialized value |
1 | /* | ||
2 | |||
3 | Copyright 1987, 1988, 1998 The Open Group | ||
4 | |||
5 | Permission to use, copy, modify, distribute, and sell this software and its | ||
6 | documentation for any purpose is hereby granted without fee, provided that | ||
7 | the above copyright notice appear in all copies and that both that | ||
8 | copyright notice and this permission notice appear in supporting | ||
9 | documentation. | ||
10 | |||
11 | The above copyright notice and this permission notice shall be included in | ||
12 | all copies or substantial portions of the Software. | ||
13 | |||
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
17 | OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN | ||
18 | AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||
19 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
20 | |||
21 | Except as contained in this notice, the name of The Open Group shall not be | ||
22 | used in advertising or otherwise to promote the sale, use or other dealings | ||
23 | in this Software without prior written authorization from The Open Group. | ||
24 | |||
25 | */ | ||
26 | |||
27 | /*********************************************************** | ||
28 | |||
29 | Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts. | ||
30 | |||
31 | All Rights Reserved | ||
32 | |||
33 | Permission to use, copy, modify, and distribute this software and its | ||
34 | documentation for any purpose and without fee is hereby granted, | ||
35 | provided that the above copyright notice appear in all copies and that | ||
36 | both that copyright notice and this permission notice appear in | ||
37 | supporting documentation, and that the name of Digital not be | ||
38 | used in advertising or publicity pertaining to distribution of the | ||
39 | software without specific, written prior permission. | ||
40 | |||
41 | DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING | ||
42 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL | ||
43 | DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR | ||
44 | ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | ||
45 | WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, | ||
46 | ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS | ||
47 | SOFTWARE. | ||
48 | |||
49 | ******************************************************************/ | ||
50 | |||
51 | #ifdef HAVE_CONFIG_H1 | ||
52 | #include <config.h> | ||
53 | #endif | ||
54 | #include <X11/Intrinsic.h> | ||
55 | #include <X11/StringDefs.h> | ||
56 | #include <X11/Xmu/Converters.h> | ||
57 | #include <X11/Xmu/Drawing.h> | ||
58 | #include <X11/Xmu/CurUtil.h> | ||
59 | #include <X11/Xmu/CharSet.h> | ||
60 | |||
61 | #ifndef X_NOT_POSIX | ||
62 | #include <stdlib.h> | ||
63 | #ifdef _POSIX_SOURCE1 | ||
64 | #include <limits.h> | ||
65 | #else | ||
66 | #define _POSIX_SOURCE1 | ||
67 | #include <limits.h> | ||
68 | #undef _POSIX_SOURCE1 | ||
69 | #endif | ||
70 | #endif /* X_NOT_POSIX */ | ||
71 | #ifndef PATH_MAX4096 | ||
72 | #ifdef WIN32 | ||
73 | #define PATH_MAX4096 512 | ||
74 | #else | ||
75 | #include <sys/param.h> | ||
76 | #endif | ||
77 | #ifndef PATH_MAX4096 | ||
78 | #ifdef MAXPATHLEN | ||
79 | #define PATH_MAX4096 MAXPATHLEN | ||
80 | #else | ||
81 | #define PATH_MAX4096 1024 | ||
82 | #endif | ||
83 | #endif | ||
84 | #endif /* PATH_MAX */ | ||
85 | |||
86 | /* Kludge source to avoid encountering broken shared library linkers | ||
87 | which insist on resolving references unused by the application, | ||
88 | and broken object file formats that don't correctly distinguish | ||
89 | references to procedures from references to data. | ||
90 | */ | ||
91 | #if defined(SUNSHLIB) || defined(SVR4) | ||
92 | #define XMU_KLUDGE | ||
93 | #endif | ||
94 | |||
95 | /* | ||
96 | * XmuConvertStringToCursor: | ||
97 | * | ||
98 | * allows String to specify a standard cursor name (from cursorfont.h), a | ||
99 | * font name and glyph index of the form "FONT fontname index [[font] index]", | ||
100 | * or a bitmap file name (absolute, or relative to the global resource | ||
101 | * bitmapFilePath, class BitmapFilePath). If the resource is not | ||
102 | * defined, the default value is the build symbol BITMAPDIR. | ||
103 | * | ||
104 | * shares lots of code with XmuCvtStringToPixmap, but unfortunately | ||
105 | * can't use it as the hotspot info is lost. | ||
106 | * | ||
107 | * To use, include the following in your ClassInitialize procedure: | ||
108 | |||
109 | static XtConvertArgRec screenConvertArg[] = { | ||
110 | {XtBaseOffset, (XtPointer) XtOffsetOf(WidgetRec, core.screen), | ||
111 | sizeof(Screen *)} | ||
112 | }; | ||
113 | |||
114 | XtAddConverter(XtRString, XtRCursor, XmuCvtStringToCursor, | ||
115 | screenConvertArg, XtNumber(screenConvertArg)); | ||
116 | * | ||
117 | */ | ||
118 | |||
119 | #define done(address, type){ (*toVal).size = sizeof(type); (*toVal).addr = (XPointer) address ; } \ | ||
120 | { (*toVal).size = sizeof(type); (*toVal).addr = (XPointer) address; } | ||
121 | |||
122 | #define FONTSPECIFIER"FONT " "FONT " | ||
123 | |||
124 | /*ARGSUSED*/ | ||
125 | void | ||
126 | XmuCvtStringToCursor(XrmValuePtr args, Cardinal *num_args, | ||
127 | XrmValuePtr fromVal, XrmValuePtr toVal) | ||
128 | { | ||
129 | static Cursor cursor; /* static for cvt magic */ | ||
130 | char *name = (char *)fromVal->addr; | ||
131 | Screen *screen; | ||
132 | register int i; | ||
133 | char maskname[PATH_MAX4096]; | ||
134 | Pixmap source, mask = 0; | ||
135 | /* XXX - make fg/bg resources */ | ||
136 | static XColor bgColor = {0, 0xffff, 0xffff, 0xffff}; | ||
137 | static XColor fgColor = {0, 0, 0, 0}; | ||
138 | int xhot, yhot; | ||
139 | int len; | ||
140 | |||
141 | |||
142 | if (*num_args != 1) | ||
| |||
143 | XtErrorMsg("wrongParameters","cvtStringToCursor","XtToolkitError", | ||
144 | "String to cursor conversion needs screen argument", | ||
145 | (String *)NULL((void*)0), (Cardinal *)NULL((void*)0)); | ||
146 | |||
147 | if (XmuCompareISOLatin1(name, "None") == 0) | ||
| |||
148 | { | ||
149 | cursor = None0L; | ||
150 | done(&cursor, Cursor){ (*toVal).size = sizeof(Cursor); (*toVal).addr = (XPointer) & cursor; }; | ||
151 | return; | ||
152 | } | ||
153 | |||
154 | screen = *((Screen **) args[0].addr); | ||
155 | |||
156 | if (0 == strncmp(FONTSPECIFIER"FONT ", name, strlen(FONTSPECIFIER"FONT "))) { | ||
| |||
157 | char source_name[PATH_MAX4096], mask_name[PATH_MAX4096]; | ||
158 | int source_char, mask_char, fields = 0; | ||
159 | Font source_font, mask_font; | ||
160 | XrmValue fromString, toFont; | ||
161 | XrmValue cvtArg; | ||
162 | Boolean success; | ||
163 | Display *dpy = DisplayOfScreen(screen)((screen)->display); | ||
164 | char *strspec = NULL((void*)0); | ||
165 | int strspeclen; | ||
166 | #ifdef XMU_KLUDGE | ||
167 | Cardinal num; | ||
168 | #endif | ||
169 | |||
170 | strspeclen = strlen("FONT %s %d %s %d") + 21; | ||
171 | strspec = XtMalloc(strspeclen); | ||
172 | if (strspec != NULL((void*)0)) { | ||
| |||
| |||
173 | snprintf(strspec, strspeclen, "FONT %%%lds %%d %%%lds %%d", | ||
174 | (unsigned long)sizeof(source_name) - 1, | ||
175 | (unsigned long)sizeof(mask_name) - 1); | ||
176 | fields = sscanf(name, strspec, | ||
177 | source_name, &source_char, | ||
178 | mask_name, &mask_char); | ||
179 | XtFree(strspec); | ||
180 | } | ||
181 | if (fields < 2) { | ||
| |||
| |||
182 | XtStringConversionWarning(name, XtRCursor((char*)&XtStrings[1611])); | ||
183 | return; | ||
184 | } | ||
185 | |||
186 | fromString.addr = source_name; | ||
187 | fromString.size = strlen(source_name) + 1; | ||
188 | toFont.addr = (XPointer) &source_font; | ||
189 | toFont.size = sizeof(Font); | ||
190 | cvtArg.addr = (XPointer) &dpy; | ||
191 | cvtArg.size = sizeof(Display *); | ||
192 | /* XXX using display of screen argument as message display */ | ||
193 | #ifdef XMU_KLUDGE | ||
194 | /* XXX Sacrifice caching */ | ||
195 | num = 1; | ||
196 | success = XtCvtStringToFont(dpy, &cvtArg, &num, &fromString, &toFont, | ||
197 | NULL((void*)0)); | ||
198 | #else | ||
199 | success = XtCallConverter(dpy, XtCvtStringToFont, &cvtArg, | ||
200 | (Cardinal)1, &fromString, &toFont, NULL((void*)0)); | ||
201 | #endif | ||
202 | if (!success) { | ||
| |||
| |||
203 | XtStringConversionWarning(name, XtRCursor((char*)&XtStrings[1611])); | ||
204 | return; | ||
205 | } | ||
206 | |||
207 | switch (fields) { | ||
| |||
208 | case 2: /* defaulted mask font & char */ | ||
209 | mask_font = source_font; | ||
210 | mask_char = source_char; | ||
211 | break; | ||
212 | |||
213 | case 3: /* defaulted mask font */ | ||
214 | mask_font = source_font; | ||
215 | mask_char = atoi(mask_name); | ||
216 | break; | ||
217 | |||
218 | case 4: /* specified mask font & char */ | ||
219 | fromString.addr = mask_name; | ||
220 | fromString.size = strlen(mask_name) + 1; | ||
221 | toFont.addr = (XPointer) &mask_font; | ||
222 | toFont.size = sizeof(Font); | ||
223 | /* XXX using display of screen argument as message display */ | ||
224 | #ifdef XMU_KLUDGE | ||
225 | /* XXX Sacrifice caching */ | ||
226 | num = 1; | ||
227 | success = XtCvtStringToFont(dpy, &cvtArg, &num, &fromString, | ||
228 | &toFont, NULL((void*)0)); | ||
229 | #else | ||
230 | success = XtCallConverter(dpy, XtCvtStringToFont, &cvtArg, | ||
231 | (Cardinal)1, &fromString, &toFont, NULL((void*)0)); | ||
232 | #endif | ||
233 | if (!success) { | ||
234 | XtStringConversionWarning(name, XtRCursor((char*)&XtStrings[1611])); | ||
235 | return; | ||
236 | } | ||
237 | } | ||
238 | |||
239 | cursor = XCreateGlyphCursor( DisplayOfScreen(screen)((screen)->display), source_font, | ||
| |||
240 | mask_font, source_char, mask_char, | ||
241 | &fgColor, &bgColor ); | ||
242 | done(&cursor, Cursor){ (*toVal).size = sizeof(Cursor); (*toVal).addr = (XPointer) & cursor; }; | ||
243 | return; | ||
244 | } | ||
245 | |||
246 | i = XmuCursorNameToIndex (name); | ||
247 | if (i != -1) { | ||
248 | cursor = XCreateFontCursor (DisplayOfScreen(screen)((screen)->display), i); | ||
249 | done(&cursor, Cursor){ (*toVal).size = sizeof(Cursor); (*toVal).addr = (XPointer) & cursor; }; | ||
250 | return; | ||
251 | } | ||
252 | |||
253 | if ((source = XmuLocateBitmapFile (screen, name, | ||
254 | maskname, (sizeof maskname) - 4, | ||
255 | NULL((void*)0), NULL((void*)0), &xhot, &yhot)) == None0L) { | ||
256 | XtStringConversionWarning (name, XtRCursor((char*)&XtStrings[1611])); | ||
257 | cursor = None0L; | ||
258 | done(&cursor, Cursor){ (*toVal).size = sizeof(Cursor); (*toVal).addr = (XPointer) & cursor; }; | ||
259 | return; | ||
260 | } | ||
261 | len = strlen (maskname); | ||
262 | for (i = 0; i < 2; i++) { | ||
263 | strcpy (maskname + len, i == 0 ? "Mask" : "msk"); | ||
264 | if ((mask = XmuLocateBitmapFile (screen, maskname, NULL((void*)0), 0, | ||
265 | NULL((void*)0), NULL((void*)0), NULL((void*)0), NULL((void*)0))) != None0L) | ||
266 | break; | ||
267 | } | ||
268 | |||
269 | cursor = XCreatePixmapCursor( DisplayOfScreen(screen)((screen)->display), source, mask, | ||
270 | &fgColor, &bgColor, xhot, yhot ); | ||
271 | XFreePixmap( DisplayOfScreen(screen)((screen)->display), source ); | ||
272 | if (mask != None0L) XFreePixmap( DisplayOfScreen(screen)((screen)->display), mask ); | ||
273 | |||
274 | done(&cursor, Cursor){ (*toVal).size = sizeof(Cursor); (*toVal).addr = (XPointer) & cursor; }; | ||
275 | } | ||
276 | |||
277 | #define new_done(type, value){ if (toVal->addr != ((void*)0)) { if (toVal->size < sizeof(type)) { toVal->size = sizeof(type); return 0; } * (type*)(toVal->addr) = (value); } else { static type static_val ; static_val = (value); toVal->addr = (XPointer)&static_val ; } toVal->size = sizeof(type); return 1; } \ | ||
278 | { \ | ||
279 | if (toVal->addr != NULL((void*)0)) { \ | ||
280 | if (toVal->size < sizeof(type)) { \ | ||
281 | toVal->size = sizeof(type); \ | ||
282 | return False0; \ | ||
283 | } \ | ||
284 | *(type*)(toVal->addr) = (value); \ | ||
285 | } \ | ||
286 | else { \ | ||
287 | static type static_val; \ | ||
288 | static_val = (value); \ | ||
289 | toVal->addr = (XPointer)&static_val; \ | ||
290 | } \ | ||
291 | toVal->size = sizeof(type); \ | ||
292 | return True1; \ | ||
293 | } | ||
294 | |||
295 | /* Function Name: XmuCvtStringToColorCursor | ||
296 | * Description: Converts a string into a colored cursor. | ||
297 | * Arguments: dpy | ||
298 | * args - an argument list (see below). | ||
299 | * num_args - number of elements in the argument list. | ||
300 | * fromVal - value to convert from. | ||
301 | * toVal - value to convert to. | ||
302 | * data | ||
303 | * Returns: True or False | ||
304 | */ | ||
305 | |||
306 | /*ARGSUSED*/ | ||
307 | Boolean | ||
308 | XmuCvtStringToColorCursor(Display *dpy, XrmValuePtr args, Cardinal *num_args, | ||
309 | XrmValuePtr fromVal, XrmValuePtr toVal, | ||
310 | XtPointer *converter_data) | ||
311 | { | ||
312 | Cursor cursor; | ||
313 | Screen *screen; | ||
314 | Pixel fg, bg; | ||
315 | Colormap c_map; | ||
316 | XColor colors[2]; | ||
317 | Cardinal number; | ||
318 | XrmValue ret_val; | ||
319 | |||
320 | if (*num_args != 4) { | ||
321 | XtAppWarningMsg(XtDisplayToApplicationContext(dpy), | ||
322 | "wrongParameters","cvtStringToColorCursor","XmuError", | ||
323 | "String to color cursor conversion needs four arguments", | ||
324 | (String *)NULL((void*)0), (Cardinal *)NULL((void*)0)); | ||
325 | return False0; | ||
326 | } | ||
327 | |||
328 | screen = *((Screen **) args[0].addr); | ||
329 | fg = *((Pixel *) args[1].addr); | ||
330 | bg = *((Pixel *) args[2].addr); | ||
331 | c_map = *((Colormap *) args[3].addr); | ||
332 | |||
333 | number = 1; | ||
334 | XmuCvtStringToCursor(args, &number, fromVal, &ret_val); | ||
335 | |||
336 | cursor = *((Cursor *) ret_val.addr); | ||
337 | |||
338 | if (cursor == None0L || (fg == BlackPixelOfScreen(screen)((screen)->black_pixel) | ||
339 | && bg == WhitePixelOfScreen(screen)((screen)->white_pixel))) | ||
340 | new_done(Cursor, cursor){ if (toVal->addr != ((void*)0)) { if (toVal->size < sizeof(Cursor)) { toVal->size = sizeof(Cursor); return 0; } *(Cursor*)(toVal->addr) = (cursor); } else { static Cursor static_val; static_val = (cursor); toVal->addr = (XPointer )&static_val; } toVal->size = sizeof(Cursor); return 1 ; }; | ||
341 | |||
342 | colors[0].pixel = fg; | ||
343 | colors[1].pixel = bg; | ||
344 | |||
345 | XQueryColors (dpy, c_map, colors, 2); | ||
346 | XRecolorCursor(dpy, cursor, colors, colors + 1); | ||
347 | new_done(Cursor, cursor){ if (toVal->addr != ((void*)0)) { if (toVal->size < sizeof(Cursor)) { toVal->size = sizeof(Cursor); return 0; } *(Cursor*)(toVal->addr) = (cursor); } else { static Cursor static_val; static_val = (cursor); toVal->addr = (XPointer )&static_val; } toVal->size = sizeof(Cursor); return 1 ; }; | ||
348 | } | ||
349 | |||
350 | |||
351 |