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