Blame tests/lib/Geometry/geoTattler.c

Packit b099d7
/* $XConsortium: geoTattler.c /main/4 1995/07/15 21:13:42 drk $ */
Packit b099d7
/*
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */
Packit b099d7
/*
Packit b099d7
 * HISTORY
Packit b099d7
 */
Packit b099d7
#include "IntrinsicI.h"      /* for the class_name field */
Packit b099d7
#include "VarargsI.h"        /* for _GeoPrintTrace */
Packit b099d7
#include <X11/StringDefs.h>  /* XtRBoolean .. */
Packit b099d7
#include "geoTattler.h"
Packit b099d7
Packit b099d7
Packit b099d7
/**************************************************************************
Packit b099d7
 GeoTattler API:
Packit b099d7
  
Packit b099d7
  if those lines are found in the resource database:
Packit b099d7
Packit b099d7
    myapp*draw.XmScale.geoTattler: ON
Packit b099d7
    *XmScrollBar.geoTattler:ON
Packit b099d7
    *XmRowColumn.exit_button.geoTattler:ON
Packit b099d7
Packit b099d7
   then:
Packit b099d7
Packit b099d7
    all the XmScale children of the widget named draw,
Packit b099d7
    all the XmScrollBars,
Packit b099d7
    the widget named exit_button in any XmRowColumn
Packit b099d7
Packit b099d7
   will return True to the function _GeoIsTattled(), and will generate
Packit b099d7
   outlined trace in stdout.
Packit b099d7
Packit b099d7
*************************************************************************/
Packit b099d7
Packit b099d7
typedef struct {   Boolean   geo_tattler ;} GeoDataRec ;
Packit b099d7
Packit b099d7
Packit b099d7
static XtResource geo_resources[] = {
Packit b099d7
    { XtNgeoTattler, XtCGeoTattler, XtRBoolean, sizeof(Boolean),
Packit b099d7
      XtOffsetOf(GeoDataRec, geo_tattler), 
Packit b099d7
      XtRImmediate, (caddr_t) False }
Packit b099d7
};
Packit b099d7
Packit b099d7
/* Now define a simple cache mechanism to be used in the main function */
Packit b099d7
Packit b099d7
typedef struct _GeoTatCache
Packit b099d7
{
Packit b099d7
   Widget widget;
Packit b099d7
   String widget_name;
Packit b099d7
   String class_name;
Packit b099d7
   Boolean is_geotattled ;
Packit b099d7
   struct _GeoTatCache * next;
Packit b099d7
} GeoTatCache;
Packit b099d7
Packit b099d7
static GeoTatCache * geotat_cache = NULL;
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************************
Packit b099d7
  This function return True is the widget is already in the cache,
Packit b099d7
  False otherwise. It also return the current value if True */
Packit b099d7
Boolean 
Packit b099d7
#if NeedFunctionPrototypes
Packit b099d7
_GeoIsCached (Widget widget, Boolean* is_geotattled)
Packit b099d7
#else
Packit b099d7
_GeoIsCached (widget, is_geotattled)
Packit b099d7
Widget widget;
Packit b099d7
Boolean * is_geotattled ;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    register GeoTatCache * cache_ptr;
Packit b099d7
    
Packit b099d7
    for (cache_ptr = geotat_cache; cache_ptr; cache_ptr = cache_ptr->next) {
Packit b099d7
	if ((cache_ptr->widget == widget) &&
Packit b099d7
	    (strcmp (cache_ptr->widget_name, XtName(widget)) == 0)  &&
Packit b099d7
	    (strcmp (cache_ptr->class_name, XtClassName(widget)) == 0)) {
Packit b099d7
	    /* if something found return its state and True */
Packit b099d7
Packit b099d7
	    *is_geotattled = cache_ptr->is_geotattled ;
Packit b099d7
	    return (True);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    return (False);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************************
Packit b099d7
   This function looks for a widget in the cache and if found, assigns
Packit b099d7
   a new value for the is_geotattled field 
Packit b099d7
   It is used for dynamic change (e.g. editres stuff) */
Packit b099d7
void 
Packit b099d7
#if NeedFunctionPrototypes
Packit b099d7
_GeoChangeCache (Widget widget, Boolean geo_tat)
Packit b099d7
#else
Packit b099d7
_GeoChangeCache (widget, geo_tat)
Packit b099d7
Widget widget;
Packit b099d7
Boolean geo_tat ;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    register GeoTatCache * cache_ptr;
Packit b099d7
Packit b099d7
    for (cache_ptr = geotat_cache; cache_ptr; cache_ptr = cache_ptr->next) {
Packit b099d7
	if ((cache_ptr->widget == widget) &&
Packit b099d7
	    (strcmp (cache_ptr->widget_name, XtName(widget)) == 0)  &&
Packit b099d7
	    (strcmp (cache_ptr->class_name, XtClassName(widget)) == 0)) {
Packit b099d7
	    /* if something found, change the value */
Packit b099d7
Packit b099d7
	    cache_ptr->is_geotattled = geo_tat;
Packit b099d7
	    return ;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    return ;
Packit b099d7
}
Packit b099d7
Packit b099d7
/****************************************************************
Packit b099d7
   This function adds an entry in the cache, based on the given widget
Packit b099d7
   and bool */
Packit b099d7
Packit b099d7
void 
Packit b099d7
#if NeedFunctionPrototypes
Packit b099d7
_GeoCache (Widget widget, Boolean geo_tat)
Packit b099d7
#else
Packit b099d7
_GeoCache (widget, geo_tat)
Packit b099d7
Widget widget;
Packit b099d7
Boolean geo_tat ;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    register GeoTatCache * cache_ptr;
Packit b099d7
Packit b099d7
    /* create a new entry in the geo cache */
Packit b099d7
Packit b099d7
    cache_ptr = XtNew (GeoTatCache);
Packit b099d7
    cache_ptr->next = geotat_cache;
Packit b099d7
    geotat_cache = cache_ptr;
Packit b099d7
Packit b099d7
    /* fill it, please, regular */
Packit b099d7
Packit b099d7
    cache_ptr->widget = widget ;
Packit b099d7
    cache_ptr->widget_name = XtNewString(XtName(widget));
Packit b099d7
    cache_ptr->class_name = XtNewString(XtClassName(widget));
Packit b099d7
    cache_ptr->is_geotattled = geo_tat ;
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
  This function uses XtGetSubresources to find out if a widget
Packit b099d7
  needs to be geo-spied by the caller.
Packit b099d7
  Since XtGetSubresources is expensive, it also uses a cache. */
Packit b099d7
Packit b099d7
Boolean 
Packit b099d7
#if NeedFunctionPrototypes
Packit b099d7
_GeoIsTattled (Widget widget)
Packit b099d7
#else
Packit b099d7
_GeoIsTattled (widget)
Packit b099d7
Widget widget;
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    GeoDataRec geo_data ;
Packit b099d7
    Boolean is_geotattled, cach ;
Packit b099d7
Packit b099d7
       /* First check for a matching widget  */
Packit b099d7
    if (_GeoIsCached (widget, &is_geotattled)) return is_geotattled ;
Packit b099d7
Packit b099d7
       /* no widget found in the cache, look in the database and cache */
Packit b099d7
    XtGetSubresources(widget, (XtPointer)&geo_data,
Packit b099d7
                      (String)NULL, (String)NULL, 
Packit b099d7
		      geo_resources, XtNumber(geo_resources), 
Packit b099d7
		      NULL, 0);
Packit b099d7
    
Packit b099d7
       /* add in the cache */
Packit b099d7
    _GeoCache(widget, geo_data.geo_tattler) ;
Packit b099d7
Packit b099d7
    return geo_data.geo_tattler;
Packit b099d7
Packit b099d7
}  /* _GeoIsTattled */
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
  Trace stuff now */
Packit b099d7
Packit b099d7
static n_tab = 0 ;
Packit b099d7
Packit b099d7
void 
Packit b099d7
#if NeedFunctionPrototypes
Packit b099d7
_GeoTabTrace (void)
Packit b099d7
#else
Packit b099d7
_GeoTabTrace ()
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    n_tab ++ ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
void
Packit b099d7
#if NeedFunctionPrototypes
Packit b099d7
_GeoUnTabTrace (void)
Packit b099d7
#else
Packit b099d7
_GeoUnTabTrace ()
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    n_tab -- ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
void 
Packit b099d7
#if NeedFunctionPrototypes
Packit b099d7
_GeoPrintTab (void)
Packit b099d7
#else
Packit b099d7
_GeoPrintTab ()
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    int i ;
Packit b099d7
Packit b099d7
    for (i=0; i
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
void 
Packit b099d7
#if NeedVarargsPrototypes
Packit b099d7
_GeoPrintTrace (Widget widget, ...)
Packit b099d7
#else
Packit b099d7
_GeoPrintTrace (widget, va_alist)
Packit b099d7
Widget widget;
Packit b099d7
va_dcl
Packit b099d7
#endif
Packit b099d7
{
Packit b099d7
    va_list args;
Packit b099d7
    char *fmt;
Packit b099d7
Packit b099d7
    if (_GeoIsTattled(widget)) {
Packit b099d7
	Va_start(args, widget);
Packit b099d7
	fmt = va_arg(args, char *);
Packit b099d7
	_GeoPrintTab ();
Packit b099d7
	(void) vprintf(fmt, args);
Packit b099d7
	va_end(args);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7