Blame tools/wml/wmlresolve.c

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
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: wmlresolve.c /main/9 1995/08/29 11:11:05 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
*  (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * This module contains all routines which perform semantic analysis of
Packit b099d7
 * the parsed WML specification. It is responsible for building all
Packit b099d7
 * ordered structures which can be directly translated into literal
Packit b099d7
 * code values for the various .h files. It is responsible for performing
Packit b099d7
 * inheritance of resources for all classes.
Packit b099d7
 *
Packit b099d7
 * Input:
Packit b099d7
 *	the ordered list of syntactic objects in wml_synobj_ptr
Packit b099d7
 *
Packit b099d7
 * Output:
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
#include "wml.h"
Packit b099d7
Packit b099d7
#if defined(__STDC__)
Packit b099d7
#include <stdlib.h>
Packit b099d7
#endif
Packit b099d7
#include <stdio.h>
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Routines used only in this module
Packit b099d7
 */
Packit b099d7
void wmlResolveGenerateSymK ();
Packit b099d7
void wmlResolveValidateClass ();
Packit b099d7
void wmlResolvePrintReport ();
Packit b099d7
Packit b099d7
void wmlResolveSymKDataType ();
Packit b099d7
void wmlResolveSymKChild ();
Packit b099d7
void wmlResolveSymKEnumVal ();
Packit b099d7
void wmlResolveSymKEnumSet ();
Packit b099d7
void wmlResolveSymKReason ();
Packit b099d7
void wmlResolveSymKArgument ();
Packit b099d7
void wmlResolveSymKRelated ();
Packit b099d7
void wmlResolveSymKClass ();
Packit b099d7
void wmlResolveSymKCtrlList ();
Packit b099d7
void wmlResolveSymKCharSet ();
Packit b099d7
Packit b099d7
void wmlResolveClassInherit ();
Packit b099d7
void wmlResolveClearRefPointers ();
Packit b099d7
void wmlResolveInitRefObj ();
Packit b099d7
void wmlResolveInitChildRefObj ();
Packit b099d7
Packit b099d7
void wmlResolvePrintClass ();
Packit b099d7
void wmlResolvePrintClassArgs ();
Packit b099d7
void wmlResolvePrintClassReasons ();
Packit b099d7
Packit b099d7
ObjectPtr wmlResolveFindObject ();
Packit b099d7
void wmlIssueReferenceError ();
Packit b099d7
void wmlIssueIllegalReferenceError ();
Packit b099d7
void wmlIssueError ();
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * The control routine for semantic analysis. It calls the various phases.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveDescriptors ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Perform the code assignment pass. This results in assignment of sym_k_...
Packit b099d7
 * codes to all entities. Also, all objects and cross-linking are validated.
Packit b099d7
 */
Packit b099d7
wmlResolveGenerateSymK ();
Packit b099d7
printf ("\nInitial validation and reference resolution complete");
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Perform class inheritance and validation
Packit b099d7
 */
Packit b099d7
wmlResolveValidateClass ();
Packit b099d7
printf ("\nClass validation and inheritance complete");
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Print a report
Packit b099d7
 */
Packit b099d7
if ( wml_err_count > 0 ) return;
Packit b099d7
wmlResolvePrintReport ();
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to linearize and assign sym_k... literals for objects. Simply
Packit b099d7
 * a dispatching routine.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveGenerateSymK ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Process the datatype objects
Packit b099d7
 */
Packit b099d7
wmlResolveSymKDataType ();
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Process the enumeration value and enumeration sets
Packit b099d7
 */
Packit b099d7
wmlResolveSymKEnumVal ();
Packit b099d7
wmlResolveSymKEnumSet ();
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Process the resources, producing argument and reason vectors.
Packit b099d7
 */
Packit b099d7
wmlResolveSymKReason ();
Packit b099d7
wmlResolveSymKArgument ();
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Bind related arguments
Packit b099d7
 */
Packit b099d7
wmlResolveSymKRelated ();
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Process the class definitions
Packit b099d7
 */
Packit b099d7
wmlResolveSymKClass ();
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Process the controls list definitions
Packit b099d7
 */
Packit b099d7
wmlResolveSymKCtrlList ();
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Process the charset objects
Packit b099d7
 */
Packit b099d7
wmlResolveSymKCharSet ();
Packit b099d7
Packit b099d7
/* Process the child definitions. */
Packit b099d7
wmlResolveSymKChild();
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to linearize data types
Packit b099d7
 *
Packit b099d7
 * - Generate the wml_obj_datatype... vector of resolved data type objects,
Packit b099d7
 *   ordered lexicographically.
Packit b099d7
 *   Do name processing, and acquire links to any other objects named in
Packit b099d7
 *   the syntactic descriptor.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveSymKDataType ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
WmlSynDataTypeDefPtr	cursyn;		/* current syntactic object */
Packit b099d7
WmlDataTypeDefPtr	newobj;		/* new resolved object */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Initialize the object vector. Then process the syntactic vector,
Packit b099d7
 * processing each datatype object encountered (the vector is ordered).
Packit b099d7
 * create and append a resolved object for each one encountered. This
Packit b099d7
 * will be ordered as well.
Packit b099d7
 */
Packit b099d7
wmlInitHList (wml_obj_datatype_ptr, 50, TRUE);
Packit b099d7
for ( ndx=0 ; ndx<wml_synobj_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    cursyn = (WmlSynDataTypeDefPtr) wml_synobj_ptr->hvec[ndx].objptr;
Packit b099d7
    if ( cursyn->validation != WmlDataTypeDefValid ) continue;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Create and initialize new object. Append to resolved object vector.
Packit b099d7
 */
Packit b099d7
    newobj = (WmlDataTypeDefPtr) malloc (sizeof(WmlDataTypeDef));
Packit b099d7
    newobj->syndef = cursyn;
Packit b099d7
    cursyn->rslvdef = newobj;
Packit b099d7
    if ( cursyn->int_lit != NULL )
Packit b099d7
	newobj->tkname = cursyn->int_lit;
Packit b099d7
    else
Packit b099d7
	newobj->tkname = cursyn->name;
Packit b099d7
    wmlInsertInHList (wml_obj_datatype_ptr, newobj->tkname, (ObjectPtr)newobj);
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Validate any object references in the syntactic object
Packit b099d7
 */
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to linearize children
Packit b099d7
 *
Packit b099d7
 * - Generate the wml_obj_child... vector of resolved child objects,
Packit b099d7
 *   ordered lexicographically.  Assign sym_k_... values while doing so.
Packit b099d7
 *   Link child to its class. 
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveSymKChild ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
WmlSynChildDefPtr	cursyn;		/* current syntactic object */
Packit b099d7
WmlChildDefPtr		newobj;		/* new resolved object */
Packit b099d7
int			code;		/* assigned sym_k code value */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Initialize the object vector. Then process the syntactic vector,
Packit b099d7
 * processing each child object encountered (the vector is ordered).
Packit b099d7
 * create and append a resolved object for each one encountered. This
Packit b099d7
 * will be ordered as well.
Packit b099d7
 */
Packit b099d7
wmlInitHList (wml_obj_child_ptr, 50, TRUE);
Packit b099d7
for ( ndx=0 ; ndx<wml_synobj_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    cursyn = (WmlSynChildDefPtr) wml_synobj_ptr->hvec[ndx].objptr;
Packit b099d7
    if ( cursyn->validation != WmlChildDefValid ) continue;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Create and initialize new object. Append to resolved object vector.
Packit b099d7
 */
Packit b099d7
    newobj = (WmlChildDefPtr) malloc (sizeof(WmlChildDef));
Packit b099d7
    newobj->syndef = cursyn;
Packit b099d7
    cursyn->rslvdef = newobj;
Packit b099d7
    newobj->tkname = cursyn->name;
Packit b099d7
    wmlInsertInHList (wml_obj_child_ptr, newobj->tkname, (ObjectPtr)newobj);
Packit b099d7
Packit b099d7
/* Link class to the resolved object. */
Packit b099d7
if (cursyn->class != NULL)
Packit b099d7
  newobj->class = (WmlClassDefPtr)
Packit b099d7
    wmlResolveFindObject(cursyn->class, WmlClassDefValid, cursyn->name);
Packit b099d7
  }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * All objects are in the vector. The order is the code order, so
Packit b099d7
 * process it again and assign codes to each object
Packit b099d7
 */
Packit b099d7
code = 1;
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_child_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    newobj = (WmlChildDefPtr) wml_obj_child_ptr->hvec[ndx].objptr;
Packit b099d7
    newobj->sym_code = code;
Packit b099d7
    code += 1;
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to linearize and assign sym_k values to enumeration values
Packit b099d7
 *
Packit b099d7
 * - Generate the wml_obj_datatype... vector of resolved data type objects,
Packit b099d7
 *   ordered lexicographically. No sym_k_... values are needed for
Packit b099d7
 *   enumeration values, so don't assign any.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveSymKEnumVal ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
WmlSynEnumSetDefPtr	cures;		/* current enumeration set */
Packit b099d7
WmlSynEnumSetValDefPtr	curesv;		/* current enum set value */
Packit b099d7
WmlSynEnumValueDefPtr	cursyn;		/* current syntactic object */
Packit b099d7
WmlEnumValueDefPtr	newobj;		/* new resolved object */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
int			code;		/* sym_k_... code */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Perform defaulting. Process all the enumeration sets, and define a
Packit b099d7
 * syntactic object for every enumeration value named in an enumeration set
Packit b099d7
 * which has no syntactic entry. If there is an error in a name, then
Packit b099d7
 * this error won't be detected until we attempt to compile the output .h files.
Packit b099d7
 */
Packit b099d7
for ( ndx=0 ; ndx<wml_synobj_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    cures = (WmlSynEnumSetDefPtr) wml_synobj_ptr->hvec[ndx].objptr;
Packit b099d7
    if ( cures->validation != WmlEnumSetDefValid ) continue;
Packit b099d7
    for (curesv=cures->values ; curesv!=NULL ; curesv=curesv->next)
Packit b099d7
	if ( wmlFindInHList(wml_synobj_ptr,curesv->name) < 0 )
Packit b099d7
	    wmlCreateEnumValue (curesv->name);
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Initialize the object vector. Then process the syntactic vector,
Packit b099d7
 * processing each enumeration value object encountered (the vector is ordered).
Packit b099d7
 * create and append a resolved object for each one encountered. This
Packit b099d7
 * will be ordered as well.
Packit b099d7
 */
Packit b099d7
wmlInitHList (wml_obj_enumval_ptr, 50, TRUE);
Packit b099d7
for ( ndx=0 ; ndx<wml_synobj_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    cursyn = (WmlSynEnumValueDefPtr) wml_synobj_ptr->hvec[ndx].objptr;
Packit b099d7
    if ( cursyn->validation != WmlEnumValueDefValid ) continue;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Create and initialize new object. Append to resolved object vector.
Packit b099d7
 */
Packit b099d7
    newobj = (WmlEnumValueDefPtr) malloc (sizeof(WmlEnumValueDef));
Packit b099d7
    newobj->syndef = cursyn;
Packit b099d7
    cursyn->rslvdef = newobj;
Packit b099d7
    wmlInsertInHList (wml_obj_enumval_ptr, cursyn->name, (ObjectPtr)newobj);
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * All objects are in the vector. That order is the code order, so
Packit b099d7
 * process it again and assign codes to each object
Packit b099d7
 */
Packit b099d7
code = 1;
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_enumval_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    newobj = (WmlEnumValueDefPtr) wml_obj_enumval_ptr->hvec[ndx].objptr;
Packit b099d7
    newobj->sym_code = code;
Packit b099d7
    code += 1;
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to linearize and assign sym_k values to enumeration sets
Packit b099d7
 *
Packit b099d7
 * - Generate the wml_obj_datatype... vector of resolved data type objects,
Packit b099d7
 *   ordered lexicographically. No sym_k_... values are needed for
Packit b099d7
 *   enumeration values, so don't assign any.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveSymKEnumSet ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
WmlSynEnumSetDefPtr	cursyn;		/* current syntactic object */
Packit b099d7
WmlEnumSetDefPtr	newobj;		/* new resolved object */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
int			code;		/* sym_k_... code */
Packit b099d7
WmlSynEnumSetValDefPtr	esvelm;		/* current syntactic list element */
Packit b099d7
WmlEnumValueDefPtr	evobj;		/* current enumeration value */
Packit b099d7
WmlEnumSetValDefPtr	esvobj;		/* current list element */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Initialize the object vector. Then process the syntactic vector,
Packit b099d7
 * processing each enumeration set object encountered (the vector is ordered).
Packit b099d7
 * create and append a resolved object for each one encountered. This
Packit b099d7
 * will be ordered as well.
Packit b099d7
 */
Packit b099d7
wmlInitHList (wml_obj_enumset_ptr, 20, TRUE);
Packit b099d7
for ( ndx=0 ; ndx<wml_synobj_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    cursyn = (WmlSynEnumSetDefPtr) wml_synobj_ptr->hvec[ndx].objptr;
Packit b099d7
    if ( cursyn->validation != WmlEnumSetDefValid ) continue;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Create and initialize new object. Append to resolved object vector.
Packit b099d7
 */
Packit b099d7
    newobj = (WmlEnumSetDefPtr) malloc (sizeof(WmlEnumSetDef));
Packit b099d7
    newobj->syndef = cursyn;
Packit b099d7
    cursyn->rslvdef = newobj;
Packit b099d7
    newobj->tkname = cursyn->name;
Packit b099d7
    newobj->dtype_def = (WmlDataTypeDefPtr)
Packit b099d7
	wmlResolveFindObject (cursyn->datatype,
Packit b099d7
			      WmlDataTypeDefValid,
Packit b099d7
			      cursyn->name);
Packit b099d7
    wmlInsertInHList (wml_obj_enumset_ptr, newobj->tkname, (ObjectPtr)newobj);
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * All objects are in the vector. That order is the code order, so
Packit b099d7
 * process it again and assign codes to each object. Simultaneously construct
Packit b099d7
 * a vector of resolved enumeration values, and count them.
Packit b099d7
 */
Packit b099d7
code = 1;
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_enumset_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    newobj = (WmlEnumSetDefPtr) wml_obj_enumset_ptr->hvec[ndx].objptr;
Packit b099d7
    newobj->sym_code = code;
Packit b099d7
    code += 1;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Validate and construct a resolved enumeration value list
Packit b099d7
 */
Packit b099d7
    cursyn = newobj->syndef;
Packit b099d7
    newobj->values_cnt = 0;
Packit b099d7
    newobj->values = NULL;
Packit b099d7
    for ( esvelm=cursyn->values ; esvelm!=NULL ; esvelm=esvelm->next )
Packit b099d7
	{
Packit b099d7
	evobj = (WmlEnumValueDefPtr)
Packit b099d7
	    wmlResolveFindObject (esvelm->name,
Packit b099d7
				  WmlEnumValueDefValid,
Packit b099d7
				  cursyn->name);
Packit b099d7
	if ( evobj == NULL ) continue;
Packit b099d7
	esvobj = (WmlEnumSetValDefPtr) malloc (sizeof(WmlEnumSetValDef));
Packit b099d7
	esvobj->value = evobj;
Packit b099d7
	esvobj->next = newobj->values;
Packit b099d7
	newobj->values = esvobj;
Packit b099d7
	newobj->values_cnt += 1;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to linearize and assign sym_k values to reasons.
Packit b099d7
 *
Packit b099d7
 * - Generate the wml_obj_reason... vector of resolved reason objects,
Packit b099d7
 *   ordered lexicographically. Assign a sym_k_... value as this is done.
Packit b099d7
 *   Do name processing, and acquire links to any other objects named in
Packit b099d7
 *   the syntactic descriptor.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveSymKReason ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
WmlSynResourceDefPtr	cursyn;		/* current syntactic object */
Packit b099d7
WmlResourceDefPtr	newobj;		/* new resolved object */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
int			code;		/* assigned sym_k code value */
Packit b099d7
char			errmsg[300];
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Initialize the object vector. Then process the syntactic vector,
Packit b099d7
 * processing each reason resource object encountered (the vector is ordered).
Packit b099d7
 * create and append a resolved object for each one encountered. This
Packit b099d7
 * will be ordered as well.
Packit b099d7
 */
Packit b099d7
wmlInitHList (wml_obj_reason_ptr, 100, TRUE);
Packit b099d7
for ( ndx=0 ; ndx<wml_synobj_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    cursyn = (WmlSynResourceDefPtr) wml_synobj_ptr->hvec[ndx].objptr;
Packit b099d7
    if ( cursyn->validation != WmlResourceDefValid ) continue;
Packit b099d7
    if ( cursyn->type != WmlResourceTypeReason ) continue;
Packit b099d7
    newobj = (WmlResourceDefPtr) malloc (sizeof(WmlResourceDef));
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Create and initialize new object. Append to resolved object vector.
Packit b099d7
 */
Packit b099d7
    newobj->syndef = cursyn;
Packit b099d7
    cursyn->rslvdef = newobj;
Packit b099d7
    if ( cursyn->int_lit != NULL )
Packit b099d7
	newobj->tkname = cursyn->int_lit;
Packit b099d7
    else
Packit b099d7
	newobj->tkname = cursyn->name;
Packit b099d7
    newobj->dtype_def = NULL;
Packit b099d7
    newobj->enumset_def = NULL;
Packit b099d7
    newobj->related_code = 0;
Packit b099d7
    wmlInsertInHList (wml_obj_reason_ptr, newobj->tkname, (ObjectPtr)newobj);
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Validate any object references in the syntactic object
Packit b099d7
 * Reason can't bind to some objects.
Packit b099d7
 */
Packit b099d7
    if ( cursyn->datatype != NULL )
Packit b099d7
	wmlIssueIllegalReferenceError (cursyn->name, "DataType");
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * All objects are in the vector. That order is the code order, so
Packit b099d7
 * process it again and assign codes to each object
Packit b099d7
 */
Packit b099d7
code = 1;
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_reason_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    newobj = (WmlResourceDefPtr) wml_obj_reason_ptr->hvec[ndx].objptr;
Packit b099d7
    newobj->sym_code = code;
Packit b099d7
    code += 1;
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to linearize and assign sym_k values to arguments.
Packit b099d7
 *
Packit b099d7
 * - Generate the wml_obj_arg... vector of resovled reason objects,
Packit b099d7
 *   ordered lexicographically. Assign a sym_k_... values while doing so.
Packit b099d7
 *   validate the data type for each argument, and link it to its data type
Packit b099d7
 *   object.
Packit b099d7
 *   Do name processing, and acquire links to any other objects named in
Packit b099d7
 *   the syntactic descriptor.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveSymKArgument ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
Packit b099d7
WmlSynResourceDefPtr	cursyn;		/* current syntactic object */
Packit b099d7
WmlResourceDefPtr	newobj;		/* new resolved object */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
int			code;		/* assigned sym_k code value */
Packit b099d7
char			errmsg[300];
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Initialize the object vector. Then process the syntactic vector,
Packit b099d7
 * processing each reason resource object encountered (the vector is ordered).
Packit b099d7
 * create and append a resolved object for each one encountered. This
Packit b099d7
 * will be ordered as well.
Packit b099d7
 */
Packit b099d7
wmlInitHList (wml_obj_arg_ptr, 500, TRUE);
Packit b099d7
for ( ndx=0 ; ndx<wml_synobj_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    cursyn = (WmlSynResourceDefPtr) wml_synobj_ptr->hvec[ndx].objptr;
Packit b099d7
    if ( cursyn->validation != WmlResourceDefValid ) continue;
Packit b099d7
    if ( cursyn->type == WmlResourceTypeReason ) continue;
Packit b099d7
    newobj = (WmlResourceDefPtr) malloc (sizeof(WmlResourceDef));
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Create and initialize new object. Append to resolved object vector.
Packit b099d7
 */
Packit b099d7
    newobj->syndef = cursyn;
Packit b099d7
    cursyn->rslvdef = newobj;
Packit b099d7
    if ( cursyn->int_lit != NULL )
Packit b099d7
	newobj->tkname = cursyn->int_lit;
Packit b099d7
    else
Packit b099d7
	newobj->tkname = cursyn->name;
Packit b099d7
    newobj->related_code = 0;
Packit b099d7
    newobj->enumset_def = NULL;
Packit b099d7
    wmlInsertInHList (wml_obj_arg_ptr, newobj->tkname, (ObjectPtr)newobj);
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Validate any object references in the syntactic object
Packit b099d7
 */
Packit b099d7
    newobj->dtype_def = (WmlDataTypeDefPtr)
Packit b099d7
	wmlResolveFindObject (cursyn->datatype,
Packit b099d7
			      WmlDataTypeDefValid,
Packit b099d7
			      cursyn->name);
Packit b099d7
    if ( cursyn->enumset != NULL )
Packit b099d7
	newobj->enumset_def = (WmlEnumSetDefPtr)
Packit b099d7
	    wmlResolveFindObject (cursyn->enumset,
Packit b099d7
				  WmlEnumSetDefValid,
Packit b099d7
				  cursyn->name);
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * All objects are in the vector. The order is the code order, so
Packit b099d7
 * process it again and assign codes to each object
Packit b099d7
 */
Packit b099d7
code = 1;
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_arg_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    newobj = (WmlResourceDefPtr) wml_obj_arg_ptr->hvec[ndx].objptr;
Packit b099d7
    newobj->sym_code = code;
Packit b099d7
    code += 1;
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to resolve related argument references.
Packit b099d7
 *
Packit b099d7
 * Search the argument vector for any argument with its related
Packit b099d7
 * argument set. Find the related argument, and bind the relation.
Packit b099d7
 * The binding only goes one way.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveSymKRelated ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
WmlResourceDefPtr	srcobj;		/* object with related reference */
Packit b099d7
WmlResourceDefPtr	dstobj;		/* other object in binding */
Packit b099d7
WmlSynResourceDefPtr	srcsynobj;	/* source syntactic object */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Scan all arguments for related argument bindings.
Packit b099d7
 */
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_arg_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    srcobj = (WmlResourceDefPtr) wml_obj_arg_ptr->hvec[ndx].objptr;
Packit b099d7
    srcsynobj = srcobj->syndef;
Packit b099d7
    if ( srcsynobj->related != NULL )
Packit b099d7
	{
Packit b099d7
	dstobj = (WmlResourceDefPtr)
Packit b099d7
	    wmlResolveFindObject (srcsynobj->related,
Packit b099d7
				  WmlResourceDefValid,
Packit b099d7
				  srcsynobj->name);
Packit b099d7
	if ( dstobj != NULL )
Packit b099d7
	    srcobj->related_code = dstobj->sym_code;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
 
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to linearize and assign sym_k values to classes
Packit b099d7
 *
Packit b099d7
 * There are two linearizations of classes:
Packit b099d7
 *	- all classes in wml_obj_allclass...
Packit b099d7
 *	- all widgets and gadgets in wml_obj_class...
Packit b099d7
 * Create and linearize all class objects into these vectors. Assign sym_k
Packit b099d7
 * codes. Link all subclasses to their superclasses. Perform name processing
Packit b099d7
 * and link to any other named object.
Packit b099d7
 *
Packit b099d7
 * Resources are not inherited and linked at this time.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveSymKClass ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
WmlSynClassDefPtr	cursyn;		/* current syntactic object */
Packit b099d7
WmlClassDefPtr		newobj;		/* new resolved object */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
int			code;		/* assigned sym_k code value */
Packit b099d7
char			errmsg[300];
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Initialize the object vectors. Then process the syntactic vector,
Packit b099d7
 * processing each class object encountered (the vector is ordered).
Packit b099d7
 * create and append a resolved object for each one encountered. This
Packit b099d7
 * will be ordered as well.
Packit b099d7
 */
Packit b099d7
wmlInitHList (wml_obj_allclass_ptr, 200, TRUE);
Packit b099d7
wmlInitHList (wml_obj_class_ptr, 200, TRUE);
Packit b099d7
for ( ndx=0 ; ndx<wml_synobj_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    cursyn = (WmlSynClassDefPtr) wml_synobj_ptr->hvec[ndx].objptr;
Packit b099d7
    if ( cursyn->validation != WmlClassDefValid ) continue;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Create and initialize new object. Append to resolved object vector.
Packit b099d7
 */
Packit b099d7
    newobj = (WmlClassDefPtr) malloc (sizeof(WmlClassDef));
Packit b099d7
    newobj->syndef = cursyn;
Packit b099d7
    cursyn->rslvdef = newobj;
Packit b099d7
    newobj->superclass = NULL;
Packit b099d7
    newobj->parentclass = NULL;
Packit b099d7
    if ( cursyn->int_lit != NULL )
Packit b099d7
	newobj->tkname = cursyn->int_lit;
Packit b099d7
    else
Packit b099d7
	newobj->tkname = cursyn->name;
Packit b099d7
    newobj->inherit_done = FALSE;
Packit b099d7
    newobj->arguments = NULL;
Packit b099d7
    newobj->reasons = NULL;
Packit b099d7
    newobj->controls = NULL;
Packit b099d7
    newobj->children = NULL;
Packit b099d7
    newobj->variant = NULL;
Packit b099d7
    newobj->nondialog = NULL;
Packit b099d7
    newobj->ctrlmapto = NULL;
Packit b099d7
    switch ( cursyn->type )
Packit b099d7
	{
Packit b099d7
	case WmlClassTypeMetaclass:
Packit b099d7
	    wmlInsertInHList
Packit b099d7
		(wml_obj_allclass_ptr, newobj->tkname, (ObjectPtr)newobj);
Packit b099d7
	    break;
Packit b099d7
	case WmlClassTypeGadget:
Packit b099d7
	case WmlClassTypeWidget:
Packit b099d7
	    wmlInsertInHList
Packit b099d7
		(wml_obj_allclass_ptr, newobj->tkname, (ObjectPtr)newobj);
Packit b099d7
	    wmlInsertInHList
Packit b099d7
		(wml_obj_class_ptr, newobj->tkname, (ObjectPtr)newobj);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Require a convenience function name
Packit b099d7
 */
Packit b099d7
    if ( cursyn->type != WmlClassTypeMetaclass )
Packit b099d7
	if ( cursyn->convfunc == NULL )
Packit b099d7
	    {
Packit b099d7
	    sprintf (errmsg, "Class %s does not have a convenience function",
Packit b099d7
		     cursyn->name);
Packit b099d7
	    wmlIssueError (errmsg);
Packit b099d7
	    }	
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Validate any object references in the syntactic object
Packit b099d7
 */
Packit b099d7
    if ( cursyn->ctrlmapto != NULL )
Packit b099d7
	newobj->ctrlmapto = (WmlResourceDefPtr)
Packit b099d7
	    wmlResolveFindObject (cursyn->ctrlmapto,
Packit b099d7
				  WmlResourceDefValid,
Packit b099d7
				  cursyn->name);
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * All objects are in the vector. That order is the code order, so
Packit b099d7
 * process it again and assign codes to each object
Packit b099d7
 */
Packit b099d7
code = 1;
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_class_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    newobj = (WmlClassDefPtr) wml_obj_class_ptr->hvec[ndx].objptr;
Packit b099d7
    newobj->sym_code = code;
Packit b099d7
    code += 1;
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to validate controls lists
Packit b099d7
 *
Packit b099d7
 * Construct and linearize resolved controls lists. The linearized list
Packit b099d7
 * is used to resolve references.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveSymKCtrlList ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
WmlSynCtrlListDefPtr	cursyn;		/* current syntactic object */
Packit b099d7
WmlCtrlListDefPtr	newobj;		/* new resolved object */
Packit b099d7
WmlSynClassCtrlDefPtr	refptr;		/* current controls reference */
Packit b099d7
WmlClassCtrlDefPtr	ctrlobj;	/* resolved control reference */
Packit b099d7
WmlClassDefPtr		classobj;	/* the controlled class */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Process each control list. Construct a resolved control list for each
Packit b099d7
 */
Packit b099d7
wmlInitHList (wml_obj_ctrlist_ptr, 20, TRUE);
Packit b099d7
for ( ndx=0 ; ndx<wml_synobj_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    cursyn = (WmlSynCtrlListDefPtr) wml_synobj_ptr->hvec[ndx].objptr;
Packit b099d7
    if ( cursyn->validation != WmlCtrlListDefValid ) continue;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Create and initialize new object. Append to resolved object vector.
Packit b099d7
 */
Packit b099d7
    newobj = (WmlCtrlListDefPtr) malloc (sizeof(WmlCtrlListDef));
Packit b099d7
    newobj->syndef = cursyn;
Packit b099d7
    cursyn->rslvdef = newobj;
Packit b099d7
    newobj->controls = NULL;
Packit b099d7
    wmlInsertInHList (wml_obj_ctrlist_ptr, cursyn->name, (ObjectPtr)newobj);
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Validate and construct a resolved controls reference list.
Packit b099d7
 */
Packit b099d7
    for ( refptr=cursyn->controls ; refptr!=NULL ; refptr=refptr->next )
Packit b099d7
	{
Packit b099d7
	classobj = (WmlClassDefPtr)
Packit b099d7
	    wmlResolveFindObject (refptr->name,
Packit b099d7
				  WmlClassDefValid,
Packit b099d7
				  cursyn->name);
Packit b099d7
	if ( classobj == NULL ) continue;
Packit b099d7
	ctrlobj = (WmlClassCtrlDefPtr) malloc (sizeof(WmlClassCtrlDef));
Packit b099d7
	ctrlobj->next = newobj->controls;
Packit b099d7
	newobj->controls = ctrlobj;
Packit b099d7
	ctrlobj->ctrl = classobj;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to linearize and assign sym_k values to character sets
Packit b099d7
 *
Packit b099d7
 * - Generate the wml_obj_charset... vector of resolved data type objects,
Packit b099d7
 *   ordered lexicographically. Assign a sym_k... value as this is done.
Packit b099d7
 *   Do name processing, and acquire links to any other objects named in
Packit b099d7
 *   the syntactic descriptor.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveSymKCharSet ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
WmlSynCharSetDefPtr	cursyn;		/* current syntactic object */
Packit b099d7
WmlCharSetDefPtr	newobj;		/* new resolved object */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
int			code;		/* assigned sym_k code value */
Packit b099d7
char			errmsg[300];
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Initialize the object vector. Then process the syntactic vector,
Packit b099d7
 * processing each charset object encountered (the vector is ordered).
Packit b099d7
 * create and append a resolved object for each one encountered. This
Packit b099d7
 * will be ordered as well.
Packit b099d7
 */
Packit b099d7
wmlInitHList (wml_obj_charset_ptr, 50, TRUE);
Packit b099d7
for ( ndx=0 ; ndx<wml_synobj_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    cursyn = (WmlSynCharSetDefPtr) wml_synobj_ptr->hvec[ndx].objptr;
Packit b099d7
    if ( cursyn->validation != WmlCharSetDefValid ) continue;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Create and initialize new object. Append to resolved object vector.
Packit b099d7
 */
Packit b099d7
    newobj = (WmlCharSetDefPtr) malloc (sizeof(WmlCharSetDef));
Packit b099d7
    newobj->syndef = cursyn;
Packit b099d7
    cursyn->rslvdef = newobj;
Packit b099d7
    if ( cursyn->int_lit != NULL )
Packit b099d7
	newobj->tkname = cursyn->int_lit;
Packit b099d7
    else
Packit b099d7
	newobj->tkname = cursyn->name;
Packit b099d7
    wmlInsertInHList (wml_obj_charset_ptr, newobj->tkname, (ObjectPtr)newobj);
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Parsing direction defaults to writing direction if unspecified
Packit b099d7
 */
Packit b099d7
    if ( cursyn->parsedirection == WmlAttributeUnspecified )
Packit b099d7
	cursyn->parsedirection = cursyn->direction;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Require StandardsName attribute for character set
Packit b099d7
 */
Packit b099d7
    if ( cursyn->xms_name == NULL )
Packit b099d7
	{
Packit b099d7
	sprintf (errmsg, "CharacterSet %s does not have a StandardsName",
Packit b099d7
		 cursyn->name);
Packit b099d7
	wmlIssueError (errmsg);
Packit b099d7
	}	
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * All objects are in the vector. That order is the code order, so
Packit b099d7
 * process it again and assign codes to each object. We start at code
Packit b099d7
 * 2 since 1 is reserved for sym_k_userdefined_charset
Packit b099d7
 */
Packit b099d7
code = 2;
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_charset_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    newobj = (WmlCharSetDefPtr) wml_obj_charset_ptr->hvec[ndx].objptr;
Packit b099d7
    newobj->sym_code = code;
Packit b099d7
    code += 1;
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to perform class inheritance and validation.
Packit b099d7
 *
Packit b099d7
 * This routine has two major phases:
Packit b099d7
 *	- Complete resolution of class references, and expand out
Packit b099d7
 *	  controls list.
Packit b099d7
 *	- Perform inheritance of resources, partitioning them into
Packit b099d7
 *	  into arguments and reasons. When complete, the class has
Packit b099d7
 *	  a list of all its resources, including copies from a 
Packit b099d7
 *	  superclass and possibly a parentclass.
Packit b099d7
 *	  Excluded resources remain in the list, and are simply marked.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveValidateClass ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
int			max;		/* maximum code value */
Packit b099d7
WmlClassDefPtr		clsobj;		/* current class object */
Packit b099d7
WmlSynClassDefPtr	synobj;		/* syntactic class object */
Packit b099d7
WmlClassDefPtr		superobj;	/* superclass */
Packit b099d7
WmlClassDefPtr		parentobj;	/* parentclass */
Packit b099d7
WmlClassDefPtr		widgobj;	/* gadget's widget class */
Packit b099d7
WmlSynClassCtrlDefPtr	refptr;		/* current controls reference */
Packit b099d7
WmlClassCtrlDefPtr	ctrlobj;	/* resolved control reference */
Packit b099d7
int			refndx;		/* index in vector */
Packit b099d7
WmlClassDefPtr		refcls;		/* referenced class object */
Packit b099d7
WmlCtrlListDefPtr	reflist;	/* controls list object */
Packit b099d7
WmlClassCtrlDefPtr	listelem;	/* control reference in list */
Packit b099d7
char			errmsg[300];
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Acquire the superclass pointer for each widget and gadget class
Packit b099d7
 */
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_allclass_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    clsobj = (WmlClassDefPtr) wml_obj_allclass_ptr->hvec[ndx].objptr;
Packit b099d7
    synobj = clsobj->syndef;
Packit b099d7
    if ( synobj->superclass != NULL )
Packit b099d7
	{
Packit b099d7
	superobj = (WmlClassDefPtr)
Packit b099d7
	    wmlResolveFindObject (synobj->superclass,
Packit b099d7
				  WmlClassDefValid,
Packit b099d7
				  synobj->name);
Packit b099d7
	if ( superobj == NULL ) continue;
Packit b099d7
	clsobj->superclass = superobj;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Acquire the parentclass pointer (if one exists),
Packit b099d7
 * for each widget and gadget class
Packit b099d7
 */
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_allclass_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    clsobj = (WmlClassDefPtr) wml_obj_allclass_ptr->hvec[ndx].objptr;
Packit b099d7
    synobj = clsobj->syndef;
Packit b099d7
    if ( synobj->parentclass != NULL )
Packit b099d7
	{
Packit b099d7
	parentobj = (WmlClassDefPtr)
Packit b099d7
	    wmlResolveFindObject (synobj->parentclass,
Packit b099d7
				  WmlClassDefValid,
Packit b099d7
				  synobj->name);
Packit b099d7
	if ( parentobj == NULL ) continue;
Packit b099d7
	clsobj->parentclass = parentobj;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Link each gadget class with its widget class (both ways).
Packit b099d7
 * Link any class with a non-dialog version to the non-dialog class.
Packit b099d7
 */
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_class_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    clsobj = (WmlClassDefPtr) wml_obj_class_ptr->hvec[ndx].objptr;
Packit b099d7
    synobj = clsobj->syndef;
Packit b099d7
    if ( synobj->type == WmlClassTypeGadget )
Packit b099d7
	{
Packit b099d7
	if ( synobj->widgetclass == NULL )
Packit b099d7
	    {
Packit b099d7
	    sprintf (errmsg, "Gadget class %s has no widgetclass reference",
Packit b099d7
		     synobj->name);
Packit b099d7
	    wmlIssueError (errmsg);
Packit b099d7
	    }
Packit b099d7
	else
Packit b099d7
	    {
Packit b099d7
	    widgobj = (WmlClassDefPtr)
Packit b099d7
		wmlResolveFindObject
Packit b099d7
		    (synobj->widgetclass,
Packit b099d7
		     WmlClassDefValid,
Packit b099d7
		     synobj->name);
Packit b099d7
	    if ( widgobj != NULL )
Packit b099d7
		{
Packit b099d7
		clsobj->variant = widgobj;
Packit b099d7
		widgobj->variant = clsobj;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    if ( synobj->dialog == TRUE )
Packit b099d7
	{
Packit b099d7
	clsobj->nondialog = clsobj->superclass;
Packit b099d7
	while ( clsobj->nondialog->syndef->dialog == TRUE )
Packit b099d7
	    clsobj->nondialog = clsobj->nondialog->superclass;
Packit b099d7
	}
Packit b099d7
    else
Packit b099d7
	if ( clsobj->superclass != NULL )
Packit b099d7
	    {
Packit b099d7
	    synobj->dialog = clsobj->superclass->syndef->dialog;
Packit b099d7
	    clsobj->nondialog = clsobj->superclass->nondialog;
Packit b099d7
	    }
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Construct the list of resolved controls. Control lists are expanded
Packit b099d7
 * in place.
Packit b099d7
 */
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_class_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    clsobj = (WmlClassDefPtr) wml_obj_class_ptr->hvec[ndx].objptr;
Packit b099d7
    synobj = clsobj->syndef;
Packit b099d7
    for ( refptr=synobj->controls ; refptr!= NULL ; refptr=refptr->next )
Packit b099d7
	{
Packit b099d7
	refndx = wmlFindInHList (wml_obj_class_ptr, refptr->name);
Packit b099d7
	if ( refndx >= 0 )
Packit b099d7
	    {
Packit b099d7
	    refcls = (WmlClassDefPtr) wml_obj_class_ptr->hvec[refndx].objptr;
Packit b099d7
	    ctrlobj = (WmlClassCtrlDefPtr) malloc (sizeof(WmlClassCtrlDef));
Packit b099d7
	    ctrlobj->next = clsobj->controls;
Packit b099d7
	    clsobj->controls = ctrlobj;
Packit b099d7
	    ctrlobj->ctrl = refcls;
Packit b099d7
	    continue;
Packit b099d7
	    }
Packit b099d7
	refndx = wmlFindInHList (wml_obj_ctrlist_ptr, refptr->name);
Packit b099d7
	if ( refndx >= 0 )
Packit b099d7
	    {
Packit b099d7
	    reflist = (WmlCtrlListDefPtr)
Packit b099d7
		wml_obj_ctrlist_ptr->hvec[refndx].objptr;
Packit b099d7
	    for ( listelem=reflist->controls ;
Packit b099d7
		  listelem!=NULL ;
Packit b099d7
		  listelem=listelem->next)
Packit b099d7
		{
Packit b099d7
		ctrlobj = (WmlClassCtrlDefPtr)
Packit b099d7
		    malloc (sizeof(WmlClassCtrlDef));
Packit b099d7
		ctrlobj->next = clsobj->controls;
Packit b099d7
		clsobj->controls = ctrlobj;
Packit b099d7
		ctrlobj->ctrl = listelem->ctrl;
Packit b099d7
		}
Packit b099d7
	    continue;
Packit b099d7
	    }
Packit b099d7
	wmlIssueReferenceError (synobj->name, refptr->name);
Packit b099d7
	continue;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Perform resource inheritance for each class. This constructs the
Packit b099d7
 * arguments and reasons reference vectors.
Packit b099d7
 */
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_allclass_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    clsobj = (WmlClassDefPtr) wml_obj_allclass_ptr->hvec[ndx].objptr;
Packit b099d7
    wmlResolveClassInherit (clsobj);
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to perform resource inheritance for a class.
Packit b099d7
 *
Packit b099d7
 * This routine constructs the argument and reason resource and child reference
Packit b099d7
 * vectors for a class. It first ensures the superclass (if any) has
Packit b099d7
 * been inited. It then makes a copy of the superclass lists. It repeats this
Packit b099d7
 * procedure for the parentclass (if any.) Finally, it
Packit b099d7
 * merges in the resources from the syntactic object. It uses the
Packit b099d7
 * resolved resource or child object to point to the matching reference object 
Packit b099d7
 * in the list being created as an aid to search doing overrides. This also
Packit b099d7
 * detects whether a resource or child is already in the list (if so, it is 
Packit b099d7
 * assumed to be inherited).
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveClassInherit (clsobj)
Packit b099d7
    WmlClassDefPtr		clsobj;
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
WmlClassDefPtr		superobj;	/* superclass object */
Packit b099d7
WmlClassDefPtr		parentobj;	/* parentclass object */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
WmlResourceDefPtr	resobj;		/* current resource object */
Packit b099d7
WmlClassResDefPtr	refobj;		/* current resource reference */
Packit b099d7
WmlClassResDefPtr	srcref;		/* source of copy */
Packit b099d7
WmlChildDefPtr		childobj;	/* current child object */
Packit b099d7
WmlClassChildDefPtr	crefobj;	/* current child reference */
Packit b099d7
WmlClassChildDefPtr	csrcref;	/* child source of copy */
Packit b099d7
WmlSynClassDefPtr	synobj;		/* this class' syntactic object */
Packit b099d7
WmlSynClassResDefPtr	refptr;		/* syntactic resource reference */
Packit b099d7
WmlSynClassChildDefPtr	crefptr;	/* syntactic child reference */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Done if inheritance previously performed. Ensure the superclass is
Packit b099d7
 * done.
Packit b099d7
 */
Packit b099d7
if ( clsobj == NULL ) return;
Packit b099d7
if ( clsobj->inherit_done ) return;
Packit b099d7
superobj = clsobj->superclass;
Packit b099d7
wmlResolveClassInherit (superobj);
Packit b099d7
parentobj = clsobj->parentclass;
Packit b099d7
wmlResolveClassInherit (parentobj);
Packit b099d7
synobj = clsobj->syndef;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Clear the active reference pointer in the resolved resource objects.
Packit b099d7
 */
Packit b099d7
wmlResolveClearRefPointers ();
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Copy the superclass resources, setting the reference pointer as we go.
Packit b099d7
 */
Packit b099d7
if ( superobj != NULL )
Packit b099d7
    {
Packit b099d7
    for ( srcref=superobj->arguments ; srcref!=NULL ; srcref=srcref->next )
Packit b099d7
	{
Packit b099d7
	refobj = (WmlClassResDefPtr) malloc (sizeof(WmlClassResDef));
Packit b099d7
	refobj->next = clsobj->arguments;
Packit b099d7
	clsobj->arguments = refobj;
Packit b099d7
	wmlResolveInitRefObj (refobj, srcref);
Packit b099d7
	}
Packit b099d7
    for ( srcref=superobj->reasons ; srcref!=NULL ; srcref=srcref->next )
Packit b099d7
	{
Packit b099d7
	refobj = (WmlClassResDefPtr) malloc (sizeof(WmlClassResDef));
Packit b099d7
	refobj->next = clsobj->reasons;
Packit b099d7
	clsobj->reasons = refobj;
Packit b099d7
	wmlResolveInitRefObj (refobj, srcref);
Packit b099d7
	}
Packit b099d7
    for (csrcref = superobj->children ; csrcref!=NULL ; csrcref=csrcref->next)
Packit b099d7
      {
Packit b099d7
	crefobj = (WmlClassChildDefPtr) malloc (sizeof(WmlClassChildDef));
Packit b099d7
	crefobj->next = clsobj->children;
Packit b099d7
	clsobj->children = crefobj;
Packit b099d7
	wmlResolveInitChildRefObj (crefobj, csrcref);
Packit b099d7
      }
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Copy the parentclass resources, setting the reference pointer as we go.
Packit b099d7
 */
Packit b099d7
if ( parentobj != NULL )
Packit b099d7
    {
Packit b099d7
    for ( srcref=parentobj->arguments ; srcref!=NULL ; srcref=srcref->next )
Packit b099d7
	{
Packit b099d7
	  if (srcref->act_resource->ref_ptr == NULL)
Packit b099d7
	    {
Packit b099d7
	      refobj = (WmlClassResDefPtr) malloc (sizeof(WmlClassResDef));
Packit b099d7
	      refobj->next = clsobj->arguments;
Packit b099d7
	      clsobj->arguments = refobj;
Packit b099d7
	      wmlResolveInitRefObj (refobj, srcref);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    for ( srcref=parentobj->reasons ; srcref!=NULL ; srcref=srcref->next )
Packit b099d7
	{
Packit b099d7
	  if (srcref->act_resource->ref_ptr == NULL)
Packit b099d7
	    {
Packit b099d7
	      refobj = (WmlClassResDefPtr) malloc (sizeof(WmlClassResDef));
Packit b099d7
	      refobj->next = clsobj->reasons;
Packit b099d7
	      clsobj->reasons = refobj;
Packit b099d7
	      wmlResolveInitRefObj (refobj, srcref);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    for (csrcref = parentobj->children ; csrcref!=NULL ; csrcref=csrcref->next)
Packit b099d7
      {
Packit b099d7
	if (csrcref->act_child->ref_ptr == NULL)
Packit b099d7
	  {
Packit b099d7
	    crefobj = (WmlClassChildDefPtr) malloc (sizeof(WmlClassChildDef));
Packit b099d7
	    crefobj->next = clsobj->children;
Packit b099d7
	    clsobj->children = crefobj;
Packit b099d7
	    wmlResolveInitChildRefObj (crefobj, csrcref);
Packit b099d7
	  }
Packit b099d7
      }
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Process the resources belonging to this class. They may either be
Packit b099d7
 * new resources, or override ones already in the list. Partition them
Packit b099d7
 * into arguments and reasons.
Packit b099d7
 */
Packit b099d7
for ( refptr=synobj->resources ; refptr!=NULL ; refptr=refptr->next )
Packit b099d7
    {
Packit b099d7
    resobj = (WmlResourceDefPtr) wmlResolveFindObject (refptr->name,
Packit b099d7
						       WmlResourceDefValid,
Packit b099d7
						       synobj->name);
Packit b099d7
    if ( resobj == NULL ) continue;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Acquire the resolved resource object, and the resource reference.
Packit b099d7
     * New references are linked in to the proper list, and have their
Packit b099d7
     * defaults set.
Packit b099d7
     */
Packit b099d7
    if ( resobj->ref_ptr != NULL )
Packit b099d7
	refobj = resobj->ref_ptr;
Packit b099d7
    else
Packit b099d7
	{
Packit b099d7
	refobj = (WmlClassResDefPtr) malloc (sizeof(WmlClassResDef));
Packit b099d7
	refobj->act_resource = resobj;
Packit b099d7
	resobj->ref_ptr = refobj;
Packit b099d7
	refobj->over_dtype = NULL;
Packit b099d7
	refobj->dflt = NULL;
Packit b099d7
	refobj->exclude = WmlAttributeUnspecified;
Packit b099d7
	if ( resobj->syndef->type == WmlResourceTypeReason )
Packit b099d7
	    {
Packit b099d7
	    refobj->next = clsobj->reasons;
Packit b099d7
	    clsobj->reasons = refobj;
Packit b099d7
	    }
Packit b099d7
	else
Packit b099d7
	    {
Packit b099d7
	    refobj->next = clsobj->arguments;
Packit b099d7
	    clsobj->arguments = refobj;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Override any values in the reference which are explicit in the
Packit b099d7
     * syntactic reference.
Packit b099d7
     */
Packit b099d7
    if ( refptr->type != NULL )
Packit b099d7
	refobj->over_dtype = (WmlDataTypeDefPtr)
Packit b099d7
	    wmlResolveFindObject (refptr->type,
Packit b099d7
				  WmlDataTypeDefValid,
Packit b099d7
				  synobj->name);
Packit b099d7
    if ( refptr->dflt != NULL )
Packit b099d7
	refobj->dflt = refptr->dflt;
Packit b099d7
    if ( refptr->exclude != WmlAttributeUnspecified )
Packit b099d7
	refobj->exclude = refptr->exclude;
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Process the children belonging to this class. 
Packit b099d7
 */
Packit b099d7
for ( crefptr = synobj->children ; crefptr!=NULL ; crefptr = crefptr->next )
Packit b099d7
  {
Packit b099d7
    childobj = (WmlChildDefPtr) wmlResolveFindObject (crefptr->name,
Packit b099d7
						     WmlChildDefValid,
Packit b099d7
						     synobj->name);
Packit b099d7
    if ( childobj == NULL ) continue;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Acquire the resolved child object, and the child reference.
Packit b099d7
     * New references are linked in to the proper list, and have their
Packit b099d7
     * defaults set.
Packit b099d7
     */
Packit b099d7
    if ( childobj->ref_ptr != NULL )
Packit b099d7
	crefobj = childobj->ref_ptr;
Packit b099d7
    else
Packit b099d7
      {
Packit b099d7
	crefobj = (WmlClassChildDefPtr) malloc (sizeof(WmlClassChildDef));
Packit b099d7
	crefobj->act_child = childobj;
Packit b099d7
	childobj->ref_ptr = crefobj;
Packit b099d7
	crefobj->next = clsobj->children;
Packit b099d7
	clsobj->children = crefobj;
Packit b099d7
      }
Packit b099d7
  }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * inheritance complete
Packit b099d7
 */
Packit b099d7
clsobj->inherit_done = TRUE;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to copy a resource reference
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveInitRefObj (dstobj, srcobj)
Packit b099d7
    WmlClassResDefPtr		dstobj;
Packit b099d7
    WmlClassResDefPtr		srcobj;
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
WmlResourceDefPtr	resobj;
Packit b099d7
Packit b099d7
Packit b099d7
resobj = srcobj->act_resource;
Packit b099d7
dstobj->act_resource = resobj;
Packit b099d7
resobj->ref_ptr = dstobj;
Packit b099d7
dstobj->over_dtype = srcobj->over_dtype;
Packit b099d7
dstobj->dflt = srcobj->dflt;
Packit b099d7
dstobj->exclude = srcobj->exclude;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to copy a child reference
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveInitChildRefObj (dstobj, srcobj)
Packit b099d7
    WmlClassChildDefPtr		dstobj;
Packit b099d7
    WmlClassChildDefPtr		srcobj;
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
WmlChildDefPtr	childobj;
Packit b099d7
Packit b099d7
childobj = srcobj->act_child;
Packit b099d7
dstobj->act_child = childobj;
Packit b099d7
childobj->ref_ptr = dstobj;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to print a report in a file.
Packit b099d7
 *
Packit b099d7
 * This routine dumps the developed database into the file 'wml.report'
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolvePrintReport ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
FILE			*outfil;	/* output file */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
WmlClassDefPtr		clsobj;		/* current class */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Open the output file.
Packit b099d7
 */
Packit b099d7
outfil = fopen ( "wml.report", "w");
Packit b099d7
if ( outfil == NULL )
Packit b099d7
    {
Packit b099d7
    printf ("\nCouldn't open wml.report");
Packit b099d7
    return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Go through all classes. Print basic information, then dump their
Packit b099d7
 * resources. The main purpose of this report is to show the actual
Packit b099d7
 * resources and controls for the class.
Packit b099d7
 */
Packit b099d7
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_allclass_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    clsobj = (WmlClassDefPtr) wml_obj_allclass_ptr->hvec[ndx].objptr;
Packit b099d7
    wmlMarkReferencePointers (clsobj);
Packit b099d7
    wmlResolvePrintClass (outfil, clsobj);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * close the output file
Packit b099d7
 */
Packit Service 1f15c3
fprintf (outfil, "\n\n");
Packit b099d7
printf ("\nCreated report file wml.report");
Packit b099d7
fclose (outfil);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Print the information for a class
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolvePrintClass (outfil, clsobj)
Packit b099d7
    FILE			*outfil;
Packit b099d7
    WmlClassDefPtr		clsobj;
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
WmlSynClassDefPtr	synobj;		/* syntactic object */
Packit b099d7
WmlClassCtrlDefPtr	ctrlref;	/* controls reference */
Packit b099d7
WmlClassDefPtr		ctrlobj;	/* current class in control */
Packit b099d7
Packit b099d7
Packit b099d7
synobj = clsobj->syndef;
Packit b099d7
fprintf (outfil, "\n\n\nClass %s:", synobj->name);
Packit b099d7
switch ( synobj->type )
Packit b099d7
    {
Packit b099d7
    case WmlClassTypeMetaclass:
Packit Service 1f15c3
        fprintf (outfil, "\n  Type: Metaclass\t");
Packit b099d7
	if ( synobj->superclass != NULL )
Packit b099d7
	    fprintf (outfil, "Superclass: %s\t", synobj->superclass);
Packit b099d7
	if ( synobj->parentclass != NULL )
Packit b099d7
	    fprintf (outfil, "Parentclass: %s\t", synobj->parentclass);
Packit b099d7
	break;
Packit b099d7
    case WmlClassTypeWidget:
Packit Service 1f15c3
	fprintf (outfil, "\n  Type: Widget\t");
Packit b099d7
	if ( synobj->superclass != NULL )
Packit b099d7
	    fprintf (outfil, "Superclass: %s\t", synobj->superclass);
Packit b099d7
	if ( synobj->parentclass != NULL )
Packit b099d7
	    fprintf (outfil, "Parentclass: %s\t", synobj->parentclass);
Packit b099d7
	if ( clsobj->variant != NULL )
Packit b099d7
	    fprintf (outfil, "\n  Associated gadget class: %s\t",
Packit b099d7
		     clsobj->variant->syndef->name);
Packit b099d7
	if ( synobj->convfunc != NULL )
Packit b099d7
	    fprintf (outfil, "Convenience function: %s", synobj->convfunc);
Packit b099d7
	break;
Packit b099d7
    case WmlClassTypeGadget:
Packit Service 1f15c3
	fprintf (outfil, "\n  Type: Gadget\t");
Packit b099d7
	if ( synobj->superclass != NULL )
Packit b099d7
	    fprintf (outfil, "Superclass: %s\t", synobj->superclass);
Packit b099d7
	if ( synobj->parentclass != NULL )
Packit b099d7
	    fprintf (outfil, "Parentclass: %s\t", synobj->parentclass);
Packit b099d7
	if ( clsobj->variant != NULL )
Packit b099d7
	    fprintf (outfil, "\n  Associated widget class: %s\t",
Packit b099d7
		     clsobj->variant->syndef->name);
Packit b099d7
	if ( synobj->convfunc != NULL )
Packit b099d7
	    fprintf (outfil, "Convenience function: %s", synobj->convfunc);
Packit b099d7
	break;
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Print associated non-dialog class
Packit b099d7
 */
Packit b099d7
if ( clsobj->nondialog != NULL )
Packit b099d7
    fprintf (outfil, "\n  DialogClass: True\tNon-dialog ancestor: %s\t",
Packit b099d7
	     clsobj->nondialog->syndef->name);
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Print the arguments valid in the class. First the new resources for the
Packit b099d7
 * class are printed, then each ancestor's contribution is printed. This
Packit b099d7
 * is intended to match the way resources are printed in the toolkit manual,
Packit b099d7
 * so that checking is as easy as possible.
Packit b099d7
 */
Packit Service 1f15c3
fprintf (outfil, "\n  Arguments:");
Packit b099d7
wmlResolvePrintClassArgs (outfil, clsobj);
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Print the reasons valid in the class
Packit b099d7
 */
Packit Service 1f15c3
fprintf (outfil, "\n  Reasons:");
Packit b099d7
wmlResolvePrintClassReasons (outfil, clsobj);
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Print the controls valid in the class
Packit b099d7
 */
Packit Service 1f15c3
fprintf (outfil, "\n  Controls:");
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_class_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    ctrlobj = (WmlClassDefPtr) wml_obj_class_ptr->hvec[ndx].objptr;
Packit b099d7
    if ( ctrlobj->ref_ptr == NULL ) continue;
Packit b099d7
    fprintf (outfil, "\n    %s", ctrlobj->syndef->name);
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to print the arguments for a class
Packit b099d7
 *
Packit b099d7
 * This routine prints out the currently marked arguments which are
Packit b099d7
 * present in this class. Each argument which is printed is remarked
Packit b099d7
 * so that it won't be printed again. This routine first prints the
Packit b099d7
 * superclass arguments, so that the printing order becomes the top-down
Packit b099d7
 * inheritance order.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolvePrintClassArgs (outfil, clsobj)
Packit b099d7
    FILE			*outfil;
Packit b099d7
    WmlClassDefPtr		clsobj;
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
int			prthdr = TRUE;	/* print header line */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
WmlSynClassDefPtr	synobj;		/* syntactic object */
Packit b099d7
WmlClassResDefPtr	resref;		/* resource reference */
Packit b099d7
int			constr = FALSE;	/* check for constraints */
Packit b099d7
WmlResourceDefPtr	resobj;		/* current resource */
Packit b099d7
WmlSynResourceDefPtr	synres;		/* syntactic resource object */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Print the superclass arguments
Packit b099d7
 */
Packit b099d7
if ( clsobj->superclass != NULL )
Packit b099d7
    wmlResolvePrintClassArgs (outfil, clsobj->superclass);
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Print the parentclass arguments
Packit b099d7
 */
Packit b099d7
if ( clsobj->parentclass != NULL )
Packit b099d7
    wmlResolvePrintClassArgs (outfil, clsobj->parentclass);
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Print the arguments for this class. Unmark the reference so it won't
Packit b099d7
 * be printed again.
Packit b099d7
 */
Packit b099d7
synobj = clsobj->syndef;
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_arg_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    resobj = (WmlResourceDefPtr) wml_obj_arg_ptr->hvec[ndx].objptr;
Packit b099d7
    resref = resobj->ref_ptr;
Packit b099d7
    if ( resref == NULL ) continue;
Packit b099d7
    if ( wmlResolveResIsMember(resobj,clsobj->arguments) == NULL ) continue;
Packit b099d7
    synres = resobj->syndef;
Packit b099d7
    switch ( synres->type )
Packit b099d7
	{
Packit b099d7
	case WmlResourceTypeArgument:
Packit b099d7
	case WmlResourceTypeSubResource:
Packit b099d7
	    break;
Packit b099d7
	case WmlResourceTypeConstraint:
Packit b099d7
	    constr = TRUE;
Packit b099d7
	    break;
Packit b099d7
	default:
Packit b099d7
	    continue;
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
    if ( prthdr )
Packit b099d7
	{
Packit b099d7
	fprintf (outfil, "\n    %s argument set:", synobj->name);
Packit b099d7
	prthdr = FALSE;
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
    fprintf (outfil, "\n      %s", synres->name);
Packit b099d7
    fprintf (outfil, "\n\tType = %s", resobj->dtype_def->syndef->name);
Packit b099d7
    if ( strcmp(synres->name,synres->resliteral) != 0 )
Packit b099d7
	fprintf (outfil, "\tResourceLiteral = %s", synres->resliteral);
Packit b099d7
    switch ( resref->exclude )
Packit b099d7
	{
Packit b099d7
	case WmlAttributeTrue:
Packit Service 1f15c3
	    fprintf (outfil, "\n\tExclude = True;");
Packit b099d7
	    break;
Packit b099d7
	case WmlAttributeFalse:
Packit Service 1f15c3
	    fprintf (outfil, "\n\tExclude = False;");
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
    if ( resref->dflt != NULL )
Packit b099d7
	fprintf (outfil, "\n\tDefault = \"%s\"", resref->dflt);
Packit b099d7
    else
Packit b099d7
	if ( synres->dflt != NULL )
Packit b099d7
	    fprintf (outfil, "\n\tDefault = \"%s\"", synres->dflt);
Packit b099d7
    resobj->ref_ptr = NULL;
Packit b099d7
    }
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Print the constraints valid in the class
Packit b099d7
 */
Packit b099d7
if ( constr )
Packit b099d7
    {
Packit b099d7
    prthdr = TRUE;
Packit b099d7
    for ( ndx=0 ; ndx<wml_obj_arg_ptr->cnt ; ndx++ )
Packit b099d7
	{
Packit b099d7
	resobj = (WmlResourceDefPtr) wml_obj_arg_ptr->hvec[ndx].objptr;
Packit b099d7
	resref = resobj->ref_ptr;
Packit b099d7
	if ( resref == NULL ) continue;
Packit b099d7
	if ( wmlResolveResIsMember(resobj,clsobj->arguments) == NULL ) continue;
Packit b099d7
	synres = resobj->syndef;
Packit b099d7
	switch ( synres->type )
Packit b099d7
	    {
Packit b099d7
	    case WmlResourceTypeConstraint:
Packit b099d7
	        break;
Packit b099d7
	    default:
Packit b099d7
		continue;
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
	if ( prthdr )
Packit b099d7
	    {
Packit b099d7
	    fprintf (outfil, "\n    %s constraint set:", synobj->name);
Packit b099d7
	    prthdr = FALSE;
Packit b099d7
	    }
Packit b099d7
	fprintf (outfil, "\n      %s", synres->name);
Packit b099d7
	if ( strcmp(synres->name,synres->resliteral) != 0 )
Packit b099d7
	    fprintf (outfil, "\tResourceLiteral = %s", synres->resliteral);
Packit b099d7
	switch ( resref->exclude )
Packit b099d7
	    {
Packit b099d7
	    case WmlAttributeTrue:
Packit Service 1f15c3
	        fprintf (outfil, "\n\tExclude = True;");
Packit b099d7
		break;
Packit b099d7
	    case WmlAttributeFalse:
Packit Service 1f15c3
		fprintf (outfil, "\n\tExclude = False;");
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
	if ( resref->dflt != NULL )
Packit b099d7
	    fprintf (outfil, "\n\tDefault = \"%s\"", resref->dflt);
Packit b099d7
	else
Packit b099d7
	    if ( synres->dflt != NULL )
Packit b099d7
		fprintf (outfil, "\n\tDefault = \"%s\"", synres->dflt);
Packit b099d7
	resobj->ref_ptr = NULL;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to print reasons in a class.
Packit b099d7
 *
Packit b099d7
 * Like printing arguments, only reasons instead.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolvePrintClassReasons (outfil, clsobj)
Packit b099d7
    FILE			*outfil;
Packit b099d7
    WmlClassDefPtr		clsobj;
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
int			prthdr = TRUE;	/* print header flag */
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
WmlSynClassDefPtr	synobj;		/* syntactic object */
Packit b099d7
WmlClassResDefPtr	resref;		/* resource reference */
Packit b099d7
WmlResourceDefPtr	resobj;		/* current resource */
Packit b099d7
WmlSynResourceDefPtr	synres;		/* syntactic resource object */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Print the superclass reasons
Packit b099d7
 */
Packit b099d7
if ( clsobj->superclass != NULL )
Packit b099d7
    wmlResolvePrintClassReasons (outfil, clsobj->superclass);
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Print the parentclass reasons
Packit b099d7
 */
Packit b099d7
if ( clsobj->parentclass != NULL )
Packit b099d7
    wmlResolvePrintClassReasons (outfil, clsobj->parentclass);
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Print the reasons for this class. Unmark the reference so it won't
Packit b099d7
 * be printed again.
Packit b099d7
 */
Packit b099d7
synobj = clsobj->syndef;
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_reason_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    resobj = (WmlResourceDefPtr) wml_obj_reason_ptr->hvec[ndx].objptr;
Packit b099d7
    resref = resobj->ref_ptr;
Packit b099d7
    if ( resref == NULL ) continue;
Packit b099d7
    if ( wmlResolveResIsMember(resobj,clsobj->reasons) == NULL ) continue;
Packit b099d7
    synres = resobj->syndef;
Packit b099d7
    if ( prthdr )
Packit b099d7
	{
Packit b099d7
	fprintf (outfil, "\n    %s reason set:", synobj->name);
Packit b099d7
	prthdr = FALSE;
Packit b099d7
	}
Packit b099d7
    fprintf (outfil, "\n      %s", synres->name);
Packit b099d7
    if ( strcmp(synres->name,synres->resliteral) != 0 )
Packit b099d7
	fprintf (outfil, "\tResourceLiteral = %s", synres->resliteral);
Packit b099d7
    switch ( resref->exclude )
Packit b099d7
	{
Packit b099d7
	case WmlAttributeTrue:
Packit Service 1f15c3
	    fprintf (outfil, "\n\tExclude = True;");
Packit b099d7
	    break;
Packit b099d7
	case WmlAttributeFalse:
Packit Service 1f15c3
	    fprintf (outfil, "\n\tExclude = False;");
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
    resobj->ref_ptr = NULL;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to mark reference pointers for a class
Packit b099d7
 *
Packit b099d7
 * This routine clears all reference pointers, then marks the class and
Packit b099d7
 * resource objects to flag those contained in the current class. This
Packit b099d7
 * allows processing of the widget and resource vectors in order to produce
Packit b099d7
 * bit masks or reports.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlMarkReferencePointers (clsobj)
Packit b099d7
    WmlClassDefPtr		clsobj;
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
WmlClassDefPtr		mrkcls;		/* class object to mark */
Packit b099d7
WmlResourceDefPtr	mrkres;		/* resource object to mark */
Packit b099d7
WmlClassResDefPtr	resref;		/* resource reference */
Packit b099d7
WmlClassCtrlDefPtr	ctrlref;	/* controls reference */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Clear the reference pointers. Then go through the arguments, reasons,
Packit b099d7
 * and controls lists, and mark the referenced classes.
Packit b099d7
 */
Packit b099d7
wmlResolveClearRefPointers ();
Packit b099d7
for ( resref=clsobj->arguments ; resref!= NULL ; resref=resref->next )
Packit b099d7
    resref->act_resource->ref_ptr = resref;
Packit b099d7
for ( resref=clsobj->reasons ; resref!= NULL ; resref=resref->next )
Packit b099d7
    resref->act_resource->ref_ptr = resref;
Packit b099d7
for ( ctrlref=clsobj->controls ; ctrlref!=NULL ; ctrlref=ctrlref->next )
Packit b099d7
    ctrlref->ctrl->ref_ptr = ctrlref;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to clear reference pointers
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlResolveClearRefPointers ()
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
int			ndx;		/* loop index */
Packit b099d7
WmlClassDefPtr		mrkcls;		/* class object to mark */
Packit b099d7
WmlResourceDefPtr	mrkres;		/* resource object to mark */
Packit b099d7
WmlChildDefPtr		mrkcld;		/* child object to mark */
Packit b099d7
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_allclass_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    mrkcls = (WmlClassDefPtr) wml_obj_allclass_ptr->hvec[ndx].objptr;
Packit b099d7
    mrkcls->ref_ptr = NULL;
Packit b099d7
    }
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_reason_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    mrkres = (WmlResourceDefPtr) wml_obj_reason_ptr->hvec[ndx].objptr;
Packit b099d7
    mrkres->ref_ptr = NULL;
Packit b099d7
    }
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_arg_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    mrkres = (WmlResourceDefPtr) wml_obj_arg_ptr->hvec[ndx].objptr;
Packit b099d7
    mrkres->ref_ptr = NULL;
Packit b099d7
    }
Packit b099d7
for ( ndx=0 ; ndx<wml_obj_child_ptr->cnt ; ndx++ )
Packit b099d7
    {
Packit b099d7
    mrkcld = (WmlChildDefPtr) wml_obj_child_ptr->hvec[ndx].objptr;
Packit b099d7
    mrkcld->ref_ptr = NULL;
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * Routine to find an object for binding. The name is always looked
Packit b099d7
 * in the syntactic object list, since all references made by the
Packit b099d7
 * user are in that list (resolved objects may be entered under
Packit b099d7
 * an internal literal, and not be found). This routine always attempts to
Packit b099d7
 * return a resolved object (which depends on object type). It also guarantees
Packit b099d7
 * that the object it finds matches the given type.
Packit b099d7
 *
Packit b099d7
 *	name		the object to be found
Packit b099d7
 *	type		type the object should match
Packit b099d7
 *	requester	requester name, for error messages
Packit b099d7
 *
Packit b099d7
 * Returns:	pointer to the object found
Packit b099d7
 */
Packit b099d7
Packit b099d7
ObjectPtr wmlResolveFindObject (name, type, requester)
Packit b099d7
    char			*name;
Packit b099d7
    int				type;
Packit b099d7
    char			*requester;
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
int			objndx;		/* the object index in the list */
Packit b099d7
WmlSynDefPtr		synobj;		/* syntactic object */
Packit b099d7
char			errmsg[300];
Packit b099d7
Packit b099d7
Packit b099d7
objndx = wmlFindInHList (wml_synobj_ptr, name);
Packit b099d7
if ( objndx < 0 )
Packit b099d7
    {
Packit b099d7
    wmlIssueReferenceError (requester, name);
Packit b099d7
    return NULL;
Packit b099d7
    }
Packit b099d7
synobj = (WmlSynDefPtr) wml_synobj_ptr ->hvec[objndx].objptr;
Packit b099d7
if ( synobj->validation != type )
Packit b099d7
    {
Packit b099d7
    sprintf (errmsg,
Packit b099d7
	     "Object %s references object %s\n\tin a context where a different type of object is required",
Packit b099d7
	    requester, name);
Packit b099d7
    wmlIssueError (errmsg);
Packit b099d7
    return NULL;
Packit b099d7
    }
Packit b099d7
switch ( synobj->validation )
Packit b099d7
    {
Packit b099d7
    case WmlClassDefValid:
Packit b099d7
    case WmlResourceDefValid:
Packit b099d7
    case WmlDataTypeDefValid:
Packit b099d7
    case WmlCtrlListDefValid:
Packit b099d7
    case WmlEnumSetDefValid:
Packit b099d7
    case WmlEnumValueDefValid:
Packit b099d7
    case WmlChildDefValid:
Packit b099d7
        return (ObjectPtr) synobj->rslvdef;
Packit b099d7
	break;
Packit b099d7
    default:
Packit b099d7
	return (ObjectPtr) synobj;
Packit b099d7
    }
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Report an object reference error
Packit b099d7
 *
Packit b099d7
 *	srcname		the object making the reference
Packit b099d7
 *	badname		the missing object
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlIssueReferenceError (srcname, badname)
Packit b099d7
    char			*srcname;
Packit b099d7
    char			*badname;
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
printf ("\nObject %s references undefined object %s", srcname, badname);
Packit b099d7
wml_err_count += 1;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Report an attempt to make a reference which is not supported.
Packit b099d7
 */
Packit b099d7
Packit b099d7
void wmlIssueIllegalReferenceError (srcname, badname)
Packit b099d7
    char			*srcname;
Packit b099d7
    char			*badname;
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
printf ("\nObject %s cannot reference a %s object", srcname, badname);
Packit b099d7
wml_err_count += 1;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Report an error string.
Packit b099d7
 */
Packit b099d7
void wmlIssueError (errstg)
Packit b099d7
    char			*errstg;
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
printf ("\n%s", errstg);
Packit b099d7
wml_err_count += 1;
Packit b099d7
Packit b099d7
}