VarGet.c revision 0568f49b
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 890568f49bSmrg XtFree((XtPointer)args); 90444c061aSmrg 91444c061aSmrg va_end(var); 92444c061aSmrg UNLOCK_APP(app); 93444c061aSmrg} 94444c061aSmrg 95444c061aSmrg 96444c061aSmrgvoid 97444c061aSmrgXtVaGetApplicationResources(Widget widget, XtPointer base, XtResourceList resources, Cardinal num_resources, ...) 98444c061aSmrg{ 99444c061aSmrg va_list var; 100444c061aSmrg XtTypedArgList args; 101444c061aSmrg Cardinal num_args; 102444c061aSmrg int total_count, typed_count; 103444c061aSmrg WIDGET_TO_APPCON(widget); 104444c061aSmrg 105444c061aSmrg LOCK_APP(app); 106444c061aSmrg va_start(var,num_resources); 107444c061aSmrg _XtCountVaList(var, &total_count, &typed_count); 108444c061aSmrg va_end(var); 109444c061aSmrg 110444c061aSmrg va_start(var,num_resources); 111444c061aSmrg 112444c061aSmrg _XtVaToTypedArgList(var, total_count, &args, &num_args); 113444c061aSmrg 114444c061aSmrg _XtGetApplicationResources(widget, base, resources, num_resources, 115444c061aSmrg NULL, 0, args, num_args); 116444c061aSmrg 1170568f49bSmrg XtFree((XtPointer)args); 118444c061aSmrg 119444c061aSmrg va_end(var); 120444c061aSmrg UNLOCK_APP(app); 121444c061aSmrg} 122444c061aSmrg 123444c061aSmrg 124444c061aSmrgstatic void 125444c061aSmrgGetTypedArg( 126444c061aSmrg Widget widget, 127444c061aSmrg XtTypedArgList typed_arg, 128444c061aSmrg XtResourceList resources, 129444c061aSmrg Cardinal num_resources) 130444c061aSmrg{ 131444c061aSmrg String from_type = NULL; 132444c061aSmrg Cardinal from_size = 0; 133444c061aSmrg XrmValue from_val, to_val; 134444c061aSmrg register Cardinal i; 135444c061aSmrg Arg arg; 136444c061aSmrg XtPointer value; 137444c061aSmrg 138444c061aSmrg /* note we presume that the XtResourceList to be un-compiled */ 139444c061aSmrg 140444c061aSmrg for (i = 0; i < num_resources; i++) { 141444c061aSmrg if (StringToName(typed_arg->name) == StringToName(resources[i].resource_name)) { 142444c061aSmrg from_type = resources[i].resource_type; 143444c061aSmrg from_size = resources[i].resource_size; 144444c061aSmrg break; 145444c061aSmrg } 146444c061aSmrg } 147444c061aSmrg 148444c061aSmrg if (i == num_resources) { 149444c061aSmrg XtAppWarningMsg(XtWidgetToApplicationContext(widget), 150444c061aSmrg "unknownType", XtNxtGetTypedArg, XtCXtToolkitError, 151444c061aSmrg "Unable to find type of resource for conversion", 1520568f49bSmrg NULL, NULL); 153444c061aSmrg return; 154444c061aSmrg } 155444c061aSmrg 156444c061aSmrg value = ALLOCATE_LOCAL(from_size); 157444c061aSmrg if (value == NULL) _XtAllocError(NULL); 158444c061aSmrg XtSetArg(arg, typed_arg->name, value); 159444c061aSmrg XtGetValues(widget, &arg, 1); 160444c061aSmrg 161444c061aSmrg from_val.size = from_size; 162444c061aSmrg from_val.addr = (XPointer)value; 163444c061aSmrg to_val.addr = (XPointer)typed_arg->value; 1640568f49bSmrg to_val.size = (unsigned) typed_arg->size; 165444c061aSmrg 166444c061aSmrg if (!XtConvertAndStore(widget, from_type, &from_val, 167444c061aSmrg typed_arg->type, &to_val)) { 168444c061aSmrg if (to_val.size > (unsigned) typed_arg->size) { 169444c061aSmrg String params[2]; 170444c061aSmrg Cardinal num_params = 2; 171444c061aSmrg params[0] = typed_arg->type; 172444c061aSmrg params[1] = XtName(widget); 173444c061aSmrg XtAppWarningMsg(XtWidgetToApplicationContext(widget), 174444c061aSmrg "insufficientSpace", XtNxtGetTypedArg, XtCXtToolkitError, 175444c061aSmrg "Insufficient space for converted type '%s' in widget '%s'", 176444c061aSmrg params, &num_params); 177444c061aSmrg } 178444c061aSmrg else { 179444c061aSmrg String params[3]; 180444c061aSmrg Cardinal num_params = 3; 181444c061aSmrg params[0] = from_type; 182444c061aSmrg params[1] = typed_arg->type; 183444c061aSmrg params[2] = XtName(widget); 184444c061aSmrg XtAppWarningMsg(XtWidgetToApplicationContext(widget), 185444c061aSmrg "conversionFailed", XtNxtGetTypedArg, XtCXtToolkitError, 186444c061aSmrg "Type conversion (%s to %s) failed for widget '%s'", 187444c061aSmrg params, &num_params); 188444c061aSmrg } 189444c061aSmrg } 190444c061aSmrg DEALLOCATE_LOCAL(value); 191444c061aSmrg} 192444c061aSmrg 193444c061aSmrgstatic int 194444c061aSmrgGetNestedArg( 195444c061aSmrg Widget widget, 196444c061aSmrg XtTypedArgList avlist, 197444c061aSmrg ArgList args, 198444c061aSmrg XtResourceList resources, 199444c061aSmrg Cardinal num_resources) 200444c061aSmrg{ 201444c061aSmrg int count = 0; 202444c061aSmrg 203444c061aSmrg for (; avlist->name != NULL; avlist++) { 204444c061aSmrg if (avlist->type != NULL) { 205444c061aSmrg GetTypedArg(widget, avlist, resources, num_resources); 206444c061aSmrg } else if(strcmp(avlist->name, XtVaNestedList) == 0) { 207444c061aSmrg count += GetNestedArg(widget, (XtTypedArgList)avlist->value, 208444c061aSmrg args, resources, num_resources); 209444c061aSmrg } else { 210444c061aSmrg (args+count)->name = avlist->name; 211444c061aSmrg (args+count)->value = avlist->value; 212444c061aSmrg ++count; 213444c061aSmrg } 214444c061aSmrg } 215444c061aSmrg 216444c061aSmrg return(count); 217444c061aSmrg} 218444c061aSmrg 219444c061aSmrgvoid 220444c061aSmrgXtVaGetValues(Widget widget, ...) 221444c061aSmrg{ 222444c061aSmrg va_list var; 223444c061aSmrg String attr; 224444c061aSmrg ArgList args; 225444c061aSmrg XtTypedArg typed_arg; 226444c061aSmrg XtResourceList resources = (XtResourceList)NULL; 227444c061aSmrg Cardinal num_resources; 228444c061aSmrg int count, total_count, typed_count; 229444c061aSmrg WIDGET_TO_APPCON(widget); 230444c061aSmrg 231444c061aSmrg LOCK_APP(app); 232444c061aSmrg va_start(var,widget); 233444c061aSmrg 234444c061aSmrg _XtCountVaList(var, &total_count, &typed_count); 235444c061aSmrg 236444c061aSmrg if (total_count != typed_count) { 2370568f49bSmrg size_t limit = (size_t)(total_count - typed_count); 2380568f49bSmrg args = (ArgList)__XtMalloc((unsigned)(limit * sizeof(Arg))); 239444c061aSmrg } 240444c061aSmrg else args = NULL; /* for lint; really unused */ 241444c061aSmrg va_end(var); 242444c061aSmrg 2430568f49bSmrg if (args != NULL) { 2440568f49bSmrg va_start(var,widget); 2450568f49bSmrg for(attr = va_arg(var, String), count = 0 ; attr != NULL; 2460568f49bSmrg attr = va_arg(var, String)) { 2470568f49bSmrg if (strcmp(attr, XtVaTypedArg) == 0) { 2480568f49bSmrg typed_arg.name = va_arg(var, String); 2490568f49bSmrg typed_arg.type = va_arg(var, String); 2500568f49bSmrg typed_arg.value = va_arg(var, XtArgVal); 2510568f49bSmrg typed_arg.size = va_arg(var, int); 2520568f49bSmrg 2530568f49bSmrg if (resources == NULL) { 2540568f49bSmrg XtGetResourceList(XtClass(widget), &resources,&num_resources); 2550568f49bSmrg } 2560568f49bSmrg 2570568f49bSmrg GetTypedArg(widget, &typed_arg, resources, num_resources); 2580568f49bSmrg } else if (strcmp(attr, XtVaNestedList) == 0) { 2590568f49bSmrg if (resources == NULL) { 2600568f49bSmrg XtGetResourceList(XtClass(widget),&resources, &num_resources); 2610568f49bSmrg } 2620568f49bSmrg 2630568f49bSmrg count += GetNestedArg(widget, va_arg(var, XtTypedArgList), 2640568f49bSmrg (args+count), resources, num_resources); 2650568f49bSmrg } else { 2660568f49bSmrg args[count].name = attr; 2670568f49bSmrg args[count].value = va_arg(var, XtArgVal); 2680568f49bSmrg count ++; 269444c061aSmrg } 270444c061aSmrg } 2710568f49bSmrg va_end(var); 272444c061aSmrg } 273444c061aSmrg 2740568f49bSmrg XtFree((XtPointer)resources); 275444c061aSmrg 2760568f49bSmrg if (args != NULL) { 2770568f49bSmrg XtGetValues(widget, args, (Cardinal) count); 278444c061aSmrg XtFree((XtPointer)args); 279444c061aSmrg } 280444c061aSmrg UNLOCK_APP(app); 281444c061aSmrg} 282444c061aSmrg 283444c061aSmrgvoid 284444c061aSmrgXtVaGetSubvalues(XtPointer base,XtResourceList resources, Cardinal num_resources, ...) 285444c061aSmrg{ 286444c061aSmrg va_list var; 287444c061aSmrg ArgList args; 288444c061aSmrg Cardinal num_args; 289444c061aSmrg int total_count, typed_count; 290444c061aSmrg 291444c061aSmrg va_start(var,num_resources); 292444c061aSmrg 293444c061aSmrg _XtCountVaList(var, &total_count, &typed_count); 294444c061aSmrg 295444c061aSmrg if (typed_count != 0) { 296444c061aSmrg XtWarning("XtVaTypedArg is an invalid argument to XtVaGetSubvalues()\n"); 297444c061aSmrg } 298444c061aSmrg va_end(var); 299444c061aSmrg 300444c061aSmrg va_start(var,num_resources); 301444c061aSmrg _XtVaToArgList((Widget)NULL, var, total_count, &args, &num_args); 302444c061aSmrg va_end(var); 303444c061aSmrg 304444c061aSmrg XtGetSubvalues(base, resources, num_resources, args, num_args); 305444c061aSmrg 3060568f49bSmrg XtFree((XtPointer)args); 307444c061aSmrg} 308