home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / lib / Xt / VarGet.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-13  |  8.2 KB  |  309 lines

  1. /* $XConsortium: VarGet.c,v 1.17 91/06/13 18:07:07 converse Exp $ */
  2. /*
  3.  
  4. Copyright 1985, 1986, 1987, 1988, 1989 by the
  5. Massachusetts Institute of Technology
  6.  
  7. Permission to use, copy, modify, and distribute this
  8. software and its documentation for any purpose and without
  9. fee is hereby granted, provided that the above copyright
  10. notice appear in all copies and that both that copyright
  11. notice and this permission notice appear in supporting
  12. documentation, and that the name of M.I.T. not be used in
  13. advertising or publicity pertaining to distribution of the
  14. software without specific, written prior permission.
  15. M.I.T. makes no representations about the suitability of
  16. this software for any purpose.  It is provided "as is"
  17. without express or implied warranty.
  18.  
  19. */
  20.  
  21. #include "IntrinsicI.h"
  22. #include "VarargsI.h"
  23. #include "StringDefs.h"
  24.  
  25. static String XtNxtGetTypedArg = "xtGetTypedArg";
  26.  
  27. #if NeedVarargsPrototypes
  28. void
  29. XtVaGetSubresources(
  30.     Widget widget,
  31.     XtPointer base,
  32.     _Xconst char* name,
  33.     _Xconst char* class,
  34.     XtResourceList resources,
  35.     Cardinal num_resources,
  36.     ...)
  37. #else
  38. /*VARARGS6*/
  39. void XtVaGetSubresources(widget, base, name, class, resources, num_resources, va_alist)
  40.     Widget widget;
  41.     XtPointer base;
  42.     String name;
  43.     String class;
  44.     XtResourceList resources;
  45.     Cardinal num_resources;
  46.     va_dcl
  47. #endif
  48. {
  49.     va_list                 var;
  50.     ArgList                 args;
  51.     Cardinal                num_args;
  52.     int                total_count, typed_count;
  53.  
  54.     Va_start(var, num_resources);
  55.     _XtCountVaList(var, &total_count, &typed_count);
  56.     va_end(var);
  57.      
  58.     Va_start(var, num_resources);
  59.           
  60.     _XtVaToArgList(widget, var, total_count, &args, &num_args);
  61.  
  62.     XtGetSubresources(widget, base, name, class, resources, num_resources, 
  63.     args, num_args);
  64.  
  65.     if (num_args != 0) {
  66.     XtFree((XtPointer)args);
  67.     }    
  68.  
  69.     va_end(var);
  70. }
  71.  
  72.  
  73. #if NeedVarargsPrototypes
  74. void
  75. XtVaGetApplicationResources(Widget widget, XtPointer base, XtResourceList resources, Cardinal num_resources, ...)
  76. #else
  77. /*VARARGS4*/
  78. void XtVaGetApplicationResources(widget, base, resources, num_resources, va_alist)
  79.     Widget widget;
  80.     XtPointer base;
  81.     XtResourceList resources;
  82.     Cardinal num_resources;
  83.     va_dcl
  84. #endif
  85. {
  86.     va_list                 var;
  87.     ArgList                 args; 
  88.     Cardinal                num_args; 
  89.     int                total_count, typed_count;
  90.  
  91.     Va_start(var,num_resources);
  92.     _XtCountVaList(var, &total_count, &typed_count);
  93.     va_end(var);
  94.     
  95.     Va_start(var,num_resources); 
  96.  
  97.     _XtVaToArgList(widget, var, total_count, &args, &num_args);
  98.                                 
  99.     XtGetApplicationResources(widget, base, resources, num_resources, 
  100.     args, num_args); 
  101.  
  102.     if (num_args != 0) {
  103.     XtFree((XtPointer)args);
  104.     }    
  105.  
  106.     va_end(var);         
  107.  
  108.  
  109. static void
  110. _XtGetTypedArg(widget, typed_arg, resources, num_resources)
  111.     Widget              widget;
  112.     XtTypedArgList    typed_arg;
  113.     XtResourceList      resources;
  114.     Cardinal            num_resources;
  115. {
  116.     String              from_type = NULL;
  117.     Cardinal        from_size = 0;
  118.     XrmValue            from_val, to_val;
  119.     register int        i;
  120.     Arg            arg;
  121.     XtPointer        value;
  122.  
  123.     /* note we presume that the XtResourceList to be un-compiled */
  124.  
  125.     for (i = 0; i < num_resources; i++) {
  126.         if (StringToName(typed_arg->name) == StringToName(resources[i].resource_name)) {
  127.             from_type = resources[i].resource_type;
  128.         from_size = resources[i].resource_size;
  129.             break;
  130.         }
  131.     }    
  132.  
  133.     if (i == num_resources) {
  134.     XtAppWarningMsg(XtWidgetToApplicationContext(widget),
  135.             "unknownType", XtNxtGetTypedArg, XtCXtToolkitError,
  136.             "Unable to find type of resource for conversion",
  137.             (String *)NULL, (Cardinal *)NULL);
  138.      return;
  139.     }
  140.  
  141.     value = ALLOCATE_LOCAL(from_size);
  142.     if (value == NULL) _XtAllocError(NULL);
  143.     XtSetArg(arg, typed_arg->name, value);
  144.     XtGetValues(widget, &arg, 1);
  145.  
  146.     from_val.size = from_size;
  147.     from_val.addr = (XPointer)value;
  148.     to_val.addr = (XPointer)typed_arg->value;
  149.     to_val.size = typed_arg->size;
  150.  
  151.     if (!XtConvertAndStore(widget, from_type, &from_val,
  152.                typed_arg->type, &to_val)) {
  153.     if (to_val.size > typed_arg->size) {
  154.         String params[2];
  155.         Cardinal num_params = 2;
  156.         params[0] = typed_arg->type;
  157.         params[1] = XtName(widget);
  158.         XtAppWarningMsg(XtWidgetToApplicationContext(widget),
  159.         "insufficientSpace", XtNxtGetTypedArg, XtCXtToolkitError,
  160.         "Insufficient space for converted type '%s' in widget '%s'",
  161.         params, &num_params);
  162.     }
  163.     else {
  164.         String params[3];
  165.         Cardinal num_params = 3;
  166.         params[0] = from_type;
  167.         params[1] = typed_arg->type;
  168.         params[2] = XtName(widget);
  169.         XtAppWarningMsg(XtWidgetToApplicationContext(widget),
  170.         "conversionFailed", XtNxtGetTypedArg, XtCXtToolkitError,
  171.         "Type conversion (%s to %s) failed for widget '%s'",
  172.         params, &num_params);
  173.     }
  174.     }
  175.     DEALLOCATE_LOCAL(value);
  176. }
  177.  
  178. static int
  179. _XtGetNestedArg(widget, avlist, args, resources, num_resources)
  180.     Widget              widget;
  181.     XtTypedArgList    avlist;
  182.     ArgList             args;
  183.     XtResourceList      resources;
  184.     Cardinal            num_resources;
  185. {
  186.     int         count = 0;
  187.  
  188.     for (; avlist->name != NULL; avlist++) {
  189.         if (avlist->type != NULL) {
  190.         _XtGetTypedArg(widget, avlist, resources, num_resources);
  191.         } else if(strcmp(avlist->name, XtVaNestedList) == 0) {
  192.             count += _XtGetNestedArg(widget, (XtTypedArgList)avlist->value,
  193.                      args, resources, num_resources);
  194.         } else {
  195.             (args+count)->name = avlist->name;
  196.             (args+count)->value = avlist->value;
  197.             ++count;
  198.         }
  199.     }   
  200.  
  201.     return(count);
  202. }
  203.  
  204. #if NeedVarargsPrototypes
  205. void
  206. XtVaGetValues(Widget widget, ...)
  207. #else
  208. /*VARARGS1*/
  209. void XtVaGetValues(widget, va_alist)
  210.     Widget widget;
  211.     va_dcl
  212. #endif
  213. {
  214.     va_list        var;
  215.     String          attr;
  216.     ArgList            args;
  217.     XtTypedArg        typed_arg;
  218.     XtResourceList      resources = (XtResourceList)NULL;
  219.     Cardinal            num_resources;
  220.     int            count, total_count, typed_count;
  221.  
  222.     Va_start(var,widget);
  223.  
  224.     _XtCountVaList(var, &total_count, &typed_count);
  225.  
  226.     if (total_count != typed_count) {
  227.         args = (ArgList)XtMalloc((unsigned)((total_count - typed_count) 
  228.                 * sizeof(Arg)));
  229.     }
  230.     else args = NULL;        /* for lint; really unused */
  231.     va_end(var);
  232.  
  233.     Va_start(var,widget);
  234.     for(attr = va_arg(var, String), count = 0 ; attr != NULL;
  235.             attr = va_arg(var, String)) {
  236.     if (strcmp(attr, XtVaTypedArg) == 0) {
  237.         typed_arg.name = va_arg(var, String);
  238.         typed_arg.type = va_arg(var, String);
  239.         typed_arg.value = va_arg(var, XtArgVal);
  240.         typed_arg.size = va_arg(var, int);
  241.  
  242.         if (resources == NULL) {
  243.         XtGetResourceList(XtClass(widget), &resources,&num_resources);
  244.         }
  245.  
  246.         _XtGetTypedArg(widget, &typed_arg, resources, num_resources);
  247.     } else if (strcmp(attr, XtVaNestedList) == 0) {
  248.         if (resources == NULL) {
  249.         XtGetResourceList(XtClass(widget),&resources, &num_resources);
  250.         }
  251.  
  252.         count += _XtGetNestedArg(widget, va_arg(var, XtTypedArgList),
  253.                      (args+count), resources, num_resources);
  254.     } else {
  255.         args[count].name = attr;
  256.         args[count].value = va_arg(var, XtArgVal);
  257.         count ++;
  258.     }
  259.     }
  260.     va_end(var);
  261.  
  262.     if (resources != (XtResourceList)NULL) { 
  263.     XtFree((XtPointer)resources); 
  264.     }
  265.  
  266.     if (total_count != typed_count) {
  267.     XtGetValues(widget, args, count);
  268.     XtFree((XtPointer)args);
  269.     }
  270. }
  271.  
  272. #if NeedVarargsPrototypes
  273. void
  274. XtVaGetSubvalues(XtPointer base,XtResourceList  resources, Cardinal num_resources, ...)
  275. #else
  276. /*VARARGS3*/
  277. void XtVaGetSubvalues(base, resources, num_resources, va_alist)
  278.     XtPointer base;
  279.     XtResourceList  resources;
  280.     Cardinal num_resources;
  281.     va_dcl
  282. #endif
  283. {
  284.     va_list    var;
  285.     ArgList        args;
  286.     Cardinal       num_args;
  287.     int        total_count, typed_count;        
  288.  
  289.     Va_start(var,num_resources);
  290.  
  291.     _XtCountVaList(var, &total_count, &typed_count);
  292.  
  293.     if (typed_count != 0) {
  294.     XtWarning("XtVaTypedArg is an invalid argument to XtVaGetSubvalues()\n");
  295.     }
  296.     va_end(var);
  297.  
  298.     Va_start(var,num_resources);
  299.     _XtVaToArgList((Widget)NULL, var, total_count, &args, &num_args);
  300.     va_end(var);
  301.  
  302.     XtGetSubvalues(base, resources, num_resources, args, num_args);
  303.  
  304.     if (num_args != 0) {
  305.         XtFree((XtPointer)args);
  306.     }    
  307. }
  308.