|
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 |
}
|