VarGet.c revision 1477040f
1444c061aSmrg/* $Xorg: VarGet.c,v 1.4 2001/02/09 02:03:59 xorgcvs Exp $ */ 2444c061aSmrg/* 3444c061aSmrg 41477040fSmrgCopyright 1993 Sun Microsystems, Inc. All rights reserved. 51477040fSmrg 61477040fSmrgPermission is hereby granted, free of charge, to any person obtaining a 71477040fSmrgcopy of this software and associated documentation files (the "Software"), 81477040fSmrgto deal in the Software without restriction, including without limitation 91477040fSmrgthe rights to use, copy, modify, merge, publish, distribute, sublicense, 101477040fSmrgand/or sell copies of the Software, and to permit persons to whom the 111477040fSmrgSoftware is furnished to do so, subject to the following conditions: 121477040fSmrg 131477040fSmrgThe above copyright notice and this permission notice (including the next 141477040fSmrgparagraph) shall be included in all copies or substantial portions of the 151477040fSmrgSoftware. 161477040fSmrg 171477040fSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 181477040fSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 191477040fSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 201477040fSmrgTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 211477040fSmrgLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 221477040fSmrgFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 231477040fSmrgDEALINGS IN THE SOFTWARE. 24444c061aSmrg 25444c061aSmrg*/ 26444c061aSmrg 27444c061aSmrg/* 28444c061aSmrg 29444c061aSmrgCopyright 1985, 1986, 1987, 1988, 1989, 1998 The Open Group 30444c061aSmrg 31444c061aSmrgPermission to use, copy, modify, distribute, and sell this software and its 32444c061aSmrgdocumentation for any purpose is hereby granted without fee, provided that 33444c061aSmrgthe above copyright notice appear in all copies and that both that 34444c061aSmrgcopyright notice and this permission notice appear in supporting 35444c061aSmrgdocumentation. 36444c061aSmrg 37444c061aSmrgThe above copyright notice and this permission notice shall be included in 38444c061aSmrgall copies or substantial portions of the Software. 39444c061aSmrg 40444c061aSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 41444c061aSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 42444c061aSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 43444c061aSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 44444c061aSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 45444c061aSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 46444c061aSmrg 47444c061aSmrgExcept as contained in this notice, the name of The Open Group shall not be 48444c061aSmrgused in advertising or otherwise to promote the sale, use or other dealings 49444c061aSmrgin this Software without prior written authorization from The Open Group. 50444c061aSmrg 51444c061aSmrg*/ 52444c061aSmrg/* $XFree86: xc/lib/Xt/VarGet.c,v 1.7 2001/07/29 05:01:12 tsi Exp $ */ 53444c061aSmrg 54444c061aSmrg#ifdef HAVE_CONFIG_H 55444c061aSmrg#include <config.h> 56444c061aSmrg#endif 57444c061aSmrg#include "IntrinsicI.h" 58444c061aSmrg#include "VarargsI.h" 59444c061aSmrg#include "StringDefs.h" 60444c061aSmrg 61444c061aSmrgstatic String XtNxtGetTypedArg = "xtGetTypedArg"; 62444c061aSmrg 63444c061aSmrgvoid 64444c061aSmrgXtVaGetSubresources( 65444c061aSmrg Widget widget, 66444c061aSmrg XtPointer base, 67444c061aSmrg _Xconst char* name, 68444c061aSmrg _Xconst char* class, 69444c061aSmrg XtResourceList resources, 70444c061aSmrg Cardinal num_resources, 71444c061aSmrg ...) 72444c061aSmrg{ 73444c061aSmrg va_list var; 74444c061aSmrg XtTypedArgList args; 75444c061aSmrg Cardinal num_args; 76444c061aSmrg int total_count, typed_count; 77444c061aSmrg WIDGET_TO_APPCON(widget); 78444c061aSmrg 79444c061aSmrg LOCK_APP(app); 80444c061aSmrg va_start(var, num_resources); 81444c061aSmrg _XtCountVaList(var, &total_count, &typed_count); 82444c061aSmrg va_end(var); 83444c061aSmrg 84444c061aSmrg va_start(var, num_resources); 85444c061aSmrg 86444c061aSmrg _XtVaToTypedArgList(var, total_count, &args, &num_args); 87444c061aSmrg 88444c061aSmrg _XtGetSubresources(widget, base, name, class, resources, num_resources, 89444c061aSmrg NULL, 0, args, num_args); 90444c061aSmrg 91444c061aSmrg if (num_args != 0) { 92444c061aSmrg XtFree((XtPointer)args); 93444c061aSmrg } 94444c061aSmrg 95444c061aSmrg va_end(var); 96444c061aSmrg UNLOCK_APP(app); 97444c061aSmrg} 98444c061aSmrg 99444c061aSmrg 100444c061aSmrgvoid 101444c061aSmrgXtVaGetApplicationResources(Widget widget, XtPointer base, XtResourceList resources, Cardinal num_resources, ...) 102444c061aSmrg{ 103444c061aSmrg va_list var; 104444c061aSmrg XtTypedArgList args; 105444c061aSmrg Cardinal num_args; 106444c061aSmrg int total_count, typed_count; 107444c061aSmrg WIDGET_TO_APPCON(widget); 108444c061aSmrg 109444c061aSmrg LOCK_APP(app); 110444c061aSmrg va_start(var,num_resources); 111444c061aSmrg _XtCountVaList(var, &total_count, &typed_count); 112444c061aSmrg va_end(var); 113444c061aSmrg 114444c061aSmrg va_start(var,num_resources); 115444c061aSmrg 116444c061aSmrg _XtVaToTypedArgList(var, total_count, &args, &num_args); 117444c061aSmrg 118444c061aSmrg _XtGetApplicationResources(widget, base, resources, num_resources, 119444c061aSmrg NULL, 0, args, num_args); 120444c061aSmrg 121444c061aSmrg if (num_args != 0) { 122444c061aSmrg XtFree((XtPointer)args); 123444c061aSmrg } 124444c061aSmrg 125444c061aSmrg va_end(var); 126444c061aSmrg UNLOCK_APP(app); 127444c061aSmrg} 128444c061aSmrg 129444c061aSmrg 130444c061aSmrgstatic void 131444c061aSmrgGetTypedArg( 132444c061aSmrg Widget widget, 133444c061aSmrg XtTypedArgList typed_arg, 134444c061aSmrg XtResourceList resources, 135444c061aSmrg Cardinal num_resources) 136444c061aSmrg{ 137444c061aSmrg String from_type = NULL; 138444c061aSmrg Cardinal from_size = 0; 139444c061aSmrg XrmValue from_val, to_val; 140444c061aSmrg register Cardinal i; 141444c061aSmrg Arg arg; 142444c061aSmrg XtPointer value; 143444c061aSmrg 144444c061aSmrg /* note we presume that the XtResourceList to be un-compiled */ 145444c061aSmrg 146444c061aSmrg for (i = 0; i < num_resources; i++) { 147444c061aSmrg if (StringToName(typed_arg->name) == StringToName(resources[i].resource_name)) { 148444c061aSmrg from_type = resources[i].resource_type; 149444c061aSmrg from_size = resources[i].resource_size; 150444c061aSmrg break; 151444c061aSmrg } 152444c061aSmrg } 153444c061aSmrg 154444c061aSmrg if (i == num_resources) { 155444c061aSmrg XtAppWarningMsg(XtWidgetToApplicationContext(widget), 156444c061aSmrg "unknownType", XtNxtGetTypedArg, XtCXtToolkitError, 157444c061aSmrg "Unable to find type of resource for conversion", 158444c061aSmrg (String *)NULL, (Cardinal *)NULL); 159444c061aSmrg return; 160444c061aSmrg } 161444c061aSmrg 162444c061aSmrg value = ALLOCATE_LOCAL(from_size); 163444c061aSmrg if (value == NULL) _XtAllocError(NULL); 164444c061aSmrg XtSetArg(arg, typed_arg->name, value); 165444c061aSmrg XtGetValues(widget, &arg, 1); 166444c061aSmrg 167444c061aSmrg from_val.size = from_size; 168444c061aSmrg from_val.addr = (XPointer)value; 169444c061aSmrg to_val.addr = (XPointer)typed_arg->value; 170444c061aSmrg to_val.size = typed_arg->size; 171444c061aSmrg 172444c061aSmrg if (!XtConvertAndStore(widget, from_type, &from_val, 173444c061aSmrg typed_arg->type, &to_val)) { 174444c061aSmrg if (to_val.size > (unsigned) typed_arg->size) { 175444c061aSmrg String params[2]; 176444c061aSmrg Cardinal num_params = 2; 177444c061aSmrg params[0] = typed_arg->type; 178444c061aSmrg params[1] = XtName(widget); 179444c061aSmrg XtAppWarningMsg(XtWidgetToApplicationContext(widget), 180444c061aSmrg "insufficientSpace", XtNxtGetTypedArg, XtCXtToolkitError, 181444c061aSmrg "Insufficient space for converted type '%s' in widget '%s'", 182444c061aSmrg params, &num_params); 183444c061aSmrg } 184444c061aSmrg else { 185444c061aSmrg String params[3]; 186444c061aSmrg Cardinal num_params = 3; 187444c061aSmrg params[0] = from_type; 188444c061aSmrg params[1] = typed_arg->type; 189444c061aSmrg params[2] = XtName(widget); 190444c061aSmrg XtAppWarningMsg(XtWidgetToApplicationContext(widget), 191444c061aSmrg "conversionFailed", XtNxtGetTypedArg, XtCXtToolkitError, 192444c061aSmrg "Type conversion (%s to %s) failed for widget '%s'", 193444c061aSmrg params, &num_params); 194444c061aSmrg } 195444c061aSmrg } 196444c061aSmrg DEALLOCATE_LOCAL(value); 197444c061aSmrg} 198444c061aSmrg 199444c061aSmrgstatic int 200444c061aSmrgGetNestedArg( 201444c061aSmrg Widget widget, 202444c061aSmrg XtTypedArgList avlist, 203444c061aSmrg ArgList args, 204444c061aSmrg XtResourceList resources, 205444c061aSmrg Cardinal num_resources) 206444c061aSmrg{ 207444c061aSmrg int count = 0; 208444c061aSmrg 209444c061aSmrg for (; avlist->name != NULL; avlist++) { 210444c061aSmrg if (avlist->type != NULL) { 211444c061aSmrg GetTypedArg(widget, avlist, resources, num_resources); 212444c061aSmrg } else if(strcmp(avlist->name, XtVaNestedList) == 0) { 213444c061aSmrg count += GetNestedArg(widget, (XtTypedArgList)avlist->value, 214444c061aSmrg args, resources, num_resources); 215444c061aSmrg } else { 216444c061aSmrg (args+count)->name = avlist->name; 217444c061aSmrg (args+count)->value = avlist->value; 218444c061aSmrg ++count; 219444c061aSmrg } 220444c061aSmrg } 221444c061aSmrg 222444c061aSmrg return(count); 223444c061aSmrg} 224444c061aSmrg 225444c061aSmrgvoid 226444c061aSmrgXtVaGetValues(Widget widget, ...) 227444c061aSmrg{ 228444c061aSmrg va_list var; 229444c061aSmrg String attr; 230444c061aSmrg ArgList args; 231444c061aSmrg XtTypedArg typed_arg; 232444c061aSmrg XtResourceList resources = (XtResourceList)NULL; 233444c061aSmrg Cardinal num_resources; 234444c061aSmrg int count, total_count, typed_count; 235444c061aSmrg WIDGET_TO_APPCON(widget); 236444c061aSmrg 237444c061aSmrg LOCK_APP(app); 238444c061aSmrg va_start(var,widget); 239444c061aSmrg 240444c061aSmrg _XtCountVaList(var, &total_count, &typed_count); 241444c061aSmrg 242444c061aSmrg if (total_count != typed_count) { 243444c061aSmrg args = (ArgList)__XtMalloc((unsigned)((total_count - typed_count) 244444c061aSmrg * sizeof(Arg))); 245444c061aSmrg } 246444c061aSmrg else args = NULL; /* for lint; really unused */ 247444c061aSmrg va_end(var); 248444c061aSmrg 249444c061aSmrg va_start(var,widget); 250444c061aSmrg for(attr = va_arg(var, String), count = 0 ; attr != NULL; 251444c061aSmrg attr = va_arg(var, String)) { 252444c061aSmrg if (strcmp(attr, XtVaTypedArg) == 0) { 253444c061aSmrg typed_arg.name = va_arg(var, String); 254444c061aSmrg typed_arg.type = va_arg(var, String); 255444c061aSmrg typed_arg.value = va_arg(var, XtArgVal); 256444c061aSmrg typed_arg.size = va_arg(var, int); 257444c061aSmrg 258444c061aSmrg if (resources == NULL) { 259444c061aSmrg XtGetResourceList(XtClass(widget), &resources,&num_resources); 260444c061aSmrg } 261444c061aSmrg 262444c061aSmrg GetTypedArg(widget, &typed_arg, resources, num_resources); 263444c061aSmrg } else if (strcmp(attr, XtVaNestedList) == 0) { 264444c061aSmrg if (resources == NULL) { 265444c061aSmrg XtGetResourceList(XtClass(widget),&resources, &num_resources); 266444c061aSmrg } 267444c061aSmrg 268444c061aSmrg count += GetNestedArg(widget, va_arg(var, XtTypedArgList), 269444c061aSmrg (args+count), resources, num_resources); 270444c061aSmrg } else { 271444c061aSmrg args[count].name = attr; 272444c061aSmrg args[count].value = va_arg(var, XtArgVal); 273444c061aSmrg count ++; 274444c061aSmrg } 275444c061aSmrg } 276444c061aSmrg va_end(var); 277444c061aSmrg 278444c061aSmrg if (resources != (XtResourceList)NULL) { 279444c061aSmrg XtFree((XtPointer)resources); 280444c061aSmrg } 281444c061aSmrg 282444c061aSmrg if (total_count != typed_count) { 283444c061aSmrg XtGetValues(widget, args, count); 284444c061aSmrg XtFree((XtPointer)args); 285444c061aSmrg } 286444c061aSmrg UNLOCK_APP(app); 287444c061aSmrg} 288444c061aSmrg 289444c061aSmrgvoid 290444c061aSmrgXtVaGetSubvalues(XtPointer base,XtResourceList resources, Cardinal num_resources, ...) 291444c061aSmrg{ 292444c061aSmrg va_list var; 293444c061aSmrg ArgList args; 294444c061aSmrg Cardinal num_args; 295444c061aSmrg int total_count, typed_count; 296444c061aSmrg 297444c061aSmrg va_start(var,num_resources); 298444c061aSmrg 299444c061aSmrg _XtCountVaList(var, &total_count, &typed_count); 300444c061aSmrg 301444c061aSmrg if (typed_count != 0) { 302444c061aSmrg XtWarning("XtVaTypedArg is an invalid argument to XtVaGetSubvalues()\n"); 303444c061aSmrg } 304444c061aSmrg va_end(var); 305444c061aSmrg 306444c061aSmrg va_start(var,num_resources); 307444c061aSmrg _XtVaToArgList((Widget)NULL, var, total_count, &args, &num_args); 308444c061aSmrg va_end(var); 309444c061aSmrg 310444c061aSmrg XtGetSubvalues(base, resources, num_resources, args, num_args); 311444c061aSmrg 312444c061aSmrg if (num_args != 0) { 313444c061aSmrg XtFree((XtPointer)args); 314444c061aSmrg } 315444c061aSmrg} 316