316 lines
7.0 KiB
C
316 lines
7.0 KiB
C
/*
|
||
* CDE - Common Desktop Environment
|
||
*
|
||
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
||
*
|
||
* These libraries and programs are free software; you can
|
||
* redistribute them and/or modify them under the terms of the GNU
|
||
* Lesser General Public License as published by the Free Software
|
||
* Foundation; either version 2 of the License, or (at your option)
|
||
* any later version.
|
||
*
|
||
* These libraries and programs are distributed in the hope that
|
||
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
||
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
* PURPOSE. See the GNU Lesser General Public License for more
|
||
* details.
|
||
*
|
||
* You should have received a copy of the GNU Lesser General Public
|
||
* License along with these librararies and programs; if not, write
|
||
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
||
* Floor, Boston, MA 02110-1301 USA
|
||
*/
|
||
/*
|
||
* @OSF_COPYRIGHT@
|
||
* COPYRIGHT NOTICE
|
||
* Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc.
|
||
* ALL RIGHTS RESERVED (MOTIF). See the file named COPYRIGHT.MOTIF for
|
||
* the full copyright text.
|
||
*/
|
||
/*
|
||
* HISTORY
|
||
*/
|
||
#ifdef REV_INFO
|
||
#ifndef lint
|
||
static char rcsid[] = "$XConsortium: UilP2Reslv.c /main/11 1995/07/14 09:36:35 drk $"
|
||
#endif
|
||
#endif
|
||
|
||
/*
|
||
* (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
|
||
|
||
/*
|
||
**++
|
||
** FACILITY:
|
||
**
|
||
** User Interface Language Compiler (UIL)
|
||
**
|
||
** ABSTRACT:
|
||
**
|
||
** This module contain the second pass routines for resolving forward
|
||
** references.
|
||
**
|
||
**--
|
||
**/
|
||
|
||
|
||
/*
|
||
**
|
||
** INCLUDE FILES
|
||
**
|
||
**/
|
||
|
||
#include "UilDefI.h"
|
||
|
||
|
||
/*
|
||
**
|
||
** DEFINE and MACRO DEFINITIONS
|
||
**
|
||
**/
|
||
|
||
|
||
|
||
/*
|
||
**
|
||
** EXTERNAL VARIABLE DECLARATIONS
|
||
**
|
||
**/
|
||
|
||
|
||
/*
|
||
**
|
||
** GLOBAL VARIABLE DECLARATIONS
|
||
**
|
||
**/
|
||
|
||
|
||
|
||
/*
|
||
**
|
||
** OWN VARIABLE DECLARATIONS
|
||
**
|
||
**/
|
||
|
||
|
||
/*
|
||
**++
|
||
** FUNCTIONAL DESCRIPTION:
|
||
**
|
||
** This function processes forward references from the first pass.
|
||
**
|
||
** FORMAL PARAMETERS:
|
||
**
|
||
** none
|
||
**
|
||
** IMPLICIT INPUTS:
|
||
**
|
||
** sym_az_forward_ref_chain
|
||
** sym_az_val_forward_ref_chain
|
||
**
|
||
** IMPLICIT OUTPUTS:
|
||
**
|
||
** none
|
||
**
|
||
** FUNCTION VALUE:
|
||
**
|
||
** void
|
||
**
|
||
** SIDE EFFECTS:
|
||
**
|
||
** error messages may be issued for objects that are still undefined
|
||
** or of the wrong type
|
||
**
|
||
**--
|
||
**/
|
||
|
||
void sem_resolve_forward_refs()
|
||
|
||
{
|
||
sym_forward_ref_entry_type * fwd_entry;
|
||
sym_forward_ref_entry_type * next_fwd_entry;
|
||
sym_val_forward_ref_entry_type * fwd_val_entry;
|
||
sym_val_forward_ref_entry_type * next_fwd_val_entry;
|
||
sym_widget_entry_type ** target_obj_entry;
|
||
sym_value_entry_type ** target_val_entry;
|
||
sym_parent_list_type * parent_node;
|
||
sym_parent_list_type * parent_ptr;
|
||
int found;
|
||
|
||
/*
|
||
** Forward references are placed on a chain by the first pass of
|
||
** the compiler. This routine walks the chain checking that
|
||
** 1) name is now defined
|
||
** 2) name points to the correct type of object
|
||
*/
|
||
|
||
for (fwd_entry = sym_az_forward_ref_chain;
|
||
fwd_entry != NULL;
|
||
fwd_entry = next_fwd_entry)
|
||
{
|
||
sym_name_entry_type * name_entry;
|
||
sym_widget_entry_type * object_entry;
|
||
unsigned short int object_type;
|
||
|
||
|
||
/*
|
||
** Save the pointer to the next forward entry so we can free the current
|
||
** entry after it is processed.
|
||
*/
|
||
next_fwd_entry = fwd_entry->az_next_ref;
|
||
|
||
|
||
/*
|
||
** Call the Status callback routine to report our progress.
|
||
*/
|
||
/* %COMPLETE */
|
||
Uil_percent_complete = 60;
|
||
if (Uil_cmd_z_command.status_cb != (Uil_continue_type(*)())NULL)
|
||
diag_report_status();
|
||
|
||
|
||
object_type = fwd_entry->header.b_type;
|
||
name_entry = fwd_entry->az_name;
|
||
object_entry = (sym_widget_entry_type *) name_entry->az_object;
|
||
|
||
if (object_entry == NULL)
|
||
{
|
||
diag_issue_diagnostic
|
||
( d_never_def,
|
||
_sar_source_pos2 (fwd_entry),
|
||
diag_object_text( object_type ),
|
||
name_entry->c_text );
|
||
continue;
|
||
}
|
||
|
||
/*
|
||
** Make sure object references are to correct type of object.
|
||
** A forward reference naming a widget class may be correctly
|
||
** resolved by the corresponding gadget class, and vice versa.
|
||
*/
|
||
if ((object_entry->header.b_type!=object_type) &&
|
||
(uil_gadget_variants[object_entry->header.b_type]!=object_type) &&
|
||
(uil_gadget_variants[object_type]!=object_entry->header.b_type))
|
||
{
|
||
diag_issue_diagnostic
|
||
(d_ctx_req,
|
||
_sar_source_pos2(fwd_entry),
|
||
diag_object_text(object_type),
|
||
diag_object_text(object_entry->header.b_type));
|
||
continue;
|
||
}
|
||
|
||
target_obj_entry =
|
||
(sym_widget_entry_type * *) fwd_entry->a_update_location;
|
||
*target_obj_entry = object_entry;
|
||
|
||
/*
|
||
** Update objects on forward refernce chain so that their parent_lists point
|
||
** to the objects which reference them
|
||
*/
|
||
if (fwd_entry -> parent != NULL)
|
||
{
|
||
found = FALSE;
|
||
for (parent_ptr = object_entry -> parent_list;
|
||
((parent_ptr != NULL) && (found == FALSE));
|
||
parent_ptr = parent_ptr -> next)
|
||
{
|
||
if (parent_ptr -> parent == fwd_entry -> parent)
|
||
found = TRUE;
|
||
}
|
||
if (found == FALSE)
|
||
{
|
||
parent_node = (sym_parent_list_type *)
|
||
sem_allocate_node (sym_k_parent_list_entry,
|
||
sym_k_parent_list_size);
|
||
parent_node -> next = object_entry -> parent_list;
|
||
object_entry -> parent_list = parent_node;
|
||
parent_node -> parent = fwd_entry -> parent;
|
||
}
|
||
}
|
||
|
||
|
||
/*
|
||
** Free the Forward reference entry now that it is no longer needed
|
||
*/
|
||
sem_free_node(( sym_entry_type *)fwd_entry);
|
||
|
||
}
|
||
|
||
|
||
/*
|
||
** Now resolve the forward references to values
|
||
**/
|
||
|
||
/*
|
||
** Forward references are placed on a chain by the first pass of
|
||
** the compiler. This routine walks the chain checking that
|
||
** 1) name is now defined
|
||
** 2) name points to the correct type of value
|
||
*/
|
||
|
||
for (fwd_val_entry = sym_az_val_forward_ref_chain;
|
||
fwd_val_entry != NULL;
|
||
fwd_val_entry = next_fwd_val_entry)
|
||
{
|
||
sym_name_entry_type * name_entry;
|
||
sym_value_entry_type * value_entry;
|
||
sym_obj_entry_type * obj_entry;
|
||
|
||
|
||
/*
|
||
** Save the pointer to the next forward entry so we can free the current
|
||
** entry after it is processed.
|
||
*/
|
||
next_fwd_val_entry = fwd_val_entry->az_next_ref;
|
||
|
||
|
||
/*
|
||
** Call the Status callback routine to report our progress.
|
||
*/
|
||
/* %COMPLETE */
|
||
Uil_percent_complete = 60;
|
||
if (Uil_cmd_z_command.status_cb != (Uil_continue_type(*)())NULL)
|
||
diag_report_status();
|
||
|
||
name_entry = fwd_val_entry->az_name;
|
||
value_entry = (sym_value_entry_type *) name_entry->az_object;
|
||
obj_entry = (sym_obj_entry_type *) name_entry->az_object;
|
||
|
||
if (value_entry == NULL)
|
||
{
|
||
diag_issue_diagnostic
|
||
( d_never_def,
|
||
_sar_source_pos2 (fwd_val_entry),
|
||
"value",
|
||
name_entry->c_text );
|
||
continue;
|
||
}
|
||
|
||
switch (fwd_val_entry->fwd_ref_flags)
|
||
{
|
||
case (sym_k_patch_add):
|
||
case (sym_k_patch_list_add):
|
||
{
|
||
target_val_entry =
|
||
(sym_value_entry_type * *) fwd_val_entry->a_update_location;
|
||
*target_val_entry = value_entry;
|
||
break;
|
||
}
|
||
default:
|
||
_assert(FALSE, "Illegal forward reference");
|
||
}
|
||
|
||
|
||
/*
|
||
** Free the Forward reference entry now that it is no longer needed
|
||
*/
|
||
sem_free_node(( sym_entry_type *)fwd_val_entry);
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|