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